summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.cmake.conf4
-rw-r--r--.prev_CMakeLists.txt19
-rw-r--r--.qmake.conf6
-rw-r--r--CMakeLists.txt16
-rw-r--r--LICENSE.GPL3-EXCEPT704
-rw-r--r--LICENSE.GPLv2292
-rw-r--r--LICENSE.GPLv3686
-rw-r--r--LICENSE.LGPLv21514
-rw-r--r--LICENSE.LGPLv3175
-rw-r--r--LICENSES/BSD-3-Clause.txt9
-rw-r--r--LICENSES/GFDL-1.3-no-invariants-only.txt (renamed from LICENSE.FDL)23
-rw-r--r--LICENSES/GPL-2.0-only.txt (renamed from LICENSE.GPL2)0
-rw-r--r--LICENSES/GPL-3.0-only.txt (renamed from LICENSE.GPL3)0
-rw-r--r--LICENSES/LGPL-3.0-only.txt (renamed from LICENSE.LGPL3)0
-rw-r--r--LICENSES/LicenseRef-Qt-Commercial.txt8
-rw-r--r--LICENSES/Qt-GPL-exception-1.0.txt22
-rw-r--r--cmake/FindLibmng.cmake38
-rw-r--r--cmake/FindWrapJasper.cmake10
-rw-r--r--cmake/FindWrapWebP.cmake26
-rw-r--r--coin/axivion/ci_config_linux.json40
-rw-r--r--configure.cmake24
-rw-r--r--configure.json5
-rw-r--r--dependencies.yaml2
-rw-r--r--dist/changes-5.12.1024
-rw-r--r--dist/changes-5.15.120
-rw-r--r--dist/changes-5.15.220
-rw-r--r--dist/changes-6.0.017
-rw-r--r--licenseRule.json84
-rw-r--r--qt_cmdline.cmake1
-rw-r--r--qtimageformats.pro3
-rw-r--r--src/3rdparty/libtiff.pri5
-rw-r--r--src/3rdparty/libtiff/ChangeLog6249
-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.c186
-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.h375
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_config.h-vms46
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_config.h.cmake.in139
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_config.h.in269
-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.c3615
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_dir.h465
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_dirinfo.c2150
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_dirread.c12671
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_dirwrite.c5608
-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.c2771
-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.c2776
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_lzma.c796
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_lzw.c2298
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_next.c301
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_ojpeg.c4845
-rw-r--r--src/3rdparty/libtiff/libtiff/tif_open.c1239
-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.c881
-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.h1298
-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)132
-rw-r--r--src/3rdparty/libtiff/libtiff/tiffconf.h.in40
-rw-r--r--src/3rdparty/libtiff/libtiff/tiffconf.wince.h110
-rw-r--r--src/3rdparty/libtiff/libtiff/tiffio.h871
-rw-r--r--src/3rdparty/libtiff/libtiff/tiffio.hxx33
-rw-r--r--src/3rdparty/libtiff/libtiff/tiffiop.h687
-rw-r--r--src/3rdparty/libtiff/libtiff/tiffvers.h31
-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.json9
-rw-r--r--src/3rdparty/libwebp.pri11
-rw-r--r--src/3rdparty/libwebp/AUTHORS22
-rw-r--r--src/3rdparty/libwebp/ChangeLog726
-rw-r--r--src/3rdparty/libwebp/NEWS88
-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.json5
-rw-r--r--src/3rdparty/libwebp/sharpyuv/sharpyuv.c574
-rw-r--r--src/3rdparty/libwebp/sharpyuv/sharpyuv.h172
-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.c104
-rw-r--r--src/3rdparty/libwebp/sharpyuv/sharpyuv_dsp.h28
-rw-r--r--src/3rdparty/libwebp/sharpyuv/sharpyuv_gamma.c419
-rw-r--r--src/3rdparty/libwebp/sharpyuv/sharpyuv_gamma.h38
-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.c63
-rw-r--r--src/3rdparty/libwebp/src/dec/buffer_dec.c12
-rw-r--r--src/3rdparty/libwebp/src/dec/frame_dec.c2
-rw-r--r--src/3rdparty/libwebp/src/dec/idec_dec.c50
-rw-r--r--src/3rdparty/libwebp/src/dec/io_dec.c151
-rw-r--r--src/3rdparty/libwebp/src/dec/tree_dec.c3
-rw-r--r--src/3rdparty/libwebp/src/dec/vp8_dec.c38
-rw-r--r--src/3rdparty/libwebp/src/dec/vp8_dec.h17
-rw-r--r--src/3rdparty/libwebp/src/dec/vp8i_dec.h13
-rw-r--r--src/3rdparty/libwebp/src/dec/vp8l_dec.c245
-rw-r--r--src/3rdparty/libwebp/src/dec/vp8li_dec.h30
-rw-r--r--src/3rdparty/libwebp/src/dec/webp_dec.c100
-rw-r--r--src/3rdparty/libwebp/src/dec/webpi_dec.h10
-rw-r--r--src/3rdparty/libwebp/src/demux/anim_decode.c85
-rw-r--r--src/3rdparty/libwebp/src/demux/demux.c26
-rw-r--r--src/3rdparty/libwebp/src/dsp/alpha_processing.c74
-rw-r--r--src/3rdparty/libwebp/src/dsp/alpha_processing_neon.c27
-rw-r--r--src/3rdparty/libwebp/src/dsp/alpha_processing_sse2.c93
-rw-r--r--src/3rdparty/libwebp/src/dsp/alpha_processing_sse41.c8
-rw-r--r--src/3rdparty/libwebp/src/dsp/cost.c5
-rw-r--r--src/3rdparty/libwebp/src/dsp/cost_neon.c4
-rw-r--r--src/3rdparty/libwebp/src/dsp/cpu.c65
-rw-r--r--src/3rdparty/libwebp/src/dsp/cpu.h269
-rw-r--r--src/3rdparty/libwebp/src/dsp/dec.c32
-rw-r--r--src/3rdparty/libwebp/src/dsp/dec_mips32.c56
-rw-r--r--src/3rdparty/libwebp/src/dsp/dec_mips_dsp_r2.c16
-rw-r--r--src/3rdparty/libwebp/src/dsp/dec_msa.c10
-rw-r--r--src/3rdparty/libwebp/src/dsp/dec_neon.c87
-rw-r--r--src/3rdparty/libwebp/src/dsp/dec_sse2.c127
-rw-r--r--src/3rdparty/libwebp/src/dsp/dec_sse41.c2
-rw-r--r--src/3rdparty/libwebp/src/dsp/dsp.h265
-rw-r--r--src/3rdparty/libwebp/src/dsp/enc.c28
-rw-r--r--src/3rdparty/libwebp/src/dsp/enc_mips32.c20
-rw-r--r--src/3rdparty/libwebp/src/dsp/enc_mips_dsp_r2.c4
-rw-r--r--src/3rdparty/libwebp/src/dsp/enc_neon.c18
-rw-r--r--src/3rdparty/libwebp/src/dsp/enc_sse2.c293
-rw-r--r--src/3rdparty/libwebp/src/dsp/filters.c40
-rw-r--r--src/3rdparty/libwebp/src/dsp/filters_mips_dsp_r2.c26
-rw-r--r--src/3rdparty/libwebp/src/dsp/filters_msa.c22
-rw-r--r--src/3rdparty/libwebp/src/dsp/filters_neon.c26
-rw-r--r--src/3rdparty/libwebp/src/dsp/filters_sse2.c31
-rw-r--r--src/3rdparty/libwebp/src/dsp/lossless.c109
-rw-r--r--src/3rdparty/libwebp/src/dsp/lossless.h42
-rw-r--r--src/3rdparty/libwebp/src/dsp/lossless_common.h21
-rw-r--r--src/3rdparty/libwebp/src/dsp/lossless_enc.c244
-rw-r--r--src/3rdparty/libwebp/src/dsp/lossless_enc_mips32.c22
-rw-r--r--src/3rdparty/libwebp/src/dsp/lossless_enc_neon.c2
-rw-r--r--src/3rdparty/libwebp/src/dsp/lossless_enc_sse2.c143
-rw-r--r--src/3rdparty/libwebp/src/dsp/lossless_enc_sse41.c175
-rw-r--r--src/3rdparty/libwebp/src/dsp/lossless_mips_dsp_r2.c37
-rw-r--r--src/3rdparty/libwebp/src/dsp/lossless_neon.c28
-rw-r--r--src/3rdparty/libwebp/src/dsp/lossless_sse2.c130
-rw-r--r--src/3rdparty/libwebp/src/dsp/lossless_sse41.c133
-rw-r--r--src/3rdparty/libwebp/src/dsp/mips_macro.h42
-rw-r--r--src/3rdparty/libwebp/src/dsp/msa_macro.h37
-rw-r--r--src/3rdparty/libwebp/src/dsp/neon.h11
-rw-r--r--src/3rdparty/libwebp/src/dsp/quant.h16
-rw-r--r--src/3rdparty/libwebp/src/dsp/rescaler.c12
-rw-r--r--src/3rdparty/libwebp/src/dsp/rescaler_neon.c2
-rw-r--r--src/3rdparty/libwebp/src/dsp/rescaler_sse2.c6
-rw-r--r--src/3rdparty/libwebp/src/dsp/ssim.c3
-rw-r--r--src/3rdparty/libwebp/src/dsp/upsampling.c11
-rw-r--r--src/3rdparty/libwebp/src/dsp/upsampling_neon.c2
-rw-r--r--src/3rdparty/libwebp/src/dsp/upsampling_sse2.c14
-rw-r--r--src/3rdparty/libwebp/src/dsp/upsampling_sse41.c8
-rw-r--r--src/3rdparty/libwebp/src/dsp/yuv.c85
-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.c39
-rw-r--r--src/3rdparty/libwebp/src/enc/analysis_enc.c72
-rw-r--r--src/3rdparty/libwebp/src/enc/backward_references_cost_enc.c75
-rw-r--r--src/3rdparty/libwebp/src/enc/backward_references_enc.c248
-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.c41
-rw-r--r--src/3rdparty/libwebp/src/enc/histogram_enc.c253
-rw-r--r--src/3rdparty/libwebp/src/enc/histogram_enc.h30
-rw-r--r--src/3rdparty/libwebp/src/enc/picture_csp_enc.c512
-rw-r--r--src/3rdparty/libwebp/src/enc/picture_enc.c46
-rw-r--r--src/3rdparty/libwebp/src/enc/picture_rescale_enc.c119
-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.c8
-rw-r--r--src/3rdparty/libwebp/src/enc/vp8i_enc.h33
-rw-r--r--src/3rdparty/libwebp/src/enc/vp8l_enc.c946
-rw-r--r--src/3rdparty/libwebp/src/enc/vp8li_enc.h30
-rw-r--r--src/3rdparty/libwebp/src/enc/webp_enc.c16
-rw-r--r--src/3rdparty/libwebp/src/mux/anim_encode.c58
-rw-r--r--src/3rdparty/libwebp/src/mux/muxedit.c20
-rw-r--r--src/3rdparty/libwebp/src/mux/muxi.h2
-rw-r--r--src/3rdparty/libwebp/src/mux/muxinternal.c9
-rw-r--r--src/3rdparty/libwebp/src/mux/muxread.c35
-rw-r--r--src/3rdparty/libwebp/src/utils/bit_reader_inl_utils.h13
-rw-r--r--src/3rdparty/libwebp/src/utils/bit_reader_utils.c3
-rw-r--r--src/3rdparty/libwebp/src/utils/bit_reader_utils.h3
-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/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.c102
-rw-r--r--src/3rdparty/libwebp/src/utils/huffman_utils.h34
-rw-r--r--src/3rdparty/libwebp/src/utils/palette.c402
-rw-r--r--src/3rdparty/libwebp/src/utils/palette.h60
-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/utils.c79
-rw-r--r--src/3rdparty/libwebp/src/utils/utils.h43
-rw-r--r--src/3rdparty/libwebp/src/webp/config.h16
-rw-r--r--src/3rdparty/libwebp/src/webp/decode.h123
-rw-r--r--src/3rdparty/libwebp/src/webp/demux.h46
-rw-r--r--src/3rdparty/libwebp/src/webp/encode.h95
-rw-r--r--src/3rdparty/libwebp/src/webp/format_constants.h2
-rw-r--r--src/3rdparty/libwebp/src/webp/mux.h91
-rw-r--r--src/3rdparty/libwebp/src/webp/mux_types.h3
-rw-r--r--src/3rdparty/libwebp/src/webp/types.h31
-rw-r--r--src/CMakeLists.txt3
-rw-r--r--src/imageformats/CMakeLists.txt8
-rw-r--r--src/imageformats/configure.cmake16
-rw-r--r--src/imageformats/configure.json183
-rw-r--r--src/imageformats/doc/src/qtimageformats.qdoc37
-rw-r--r--src/imageformats/imageformats.pro3
-rw-r--r--src/imageformats/qt_cmdline.cmake7
-rw-r--r--src/plugins/CMakeLists.txt3
-rw-r--r--src/plugins/imageformats/.prev_CMakeLists.txt25
-rw-r--r--src/plugins/imageformats/CMakeLists.txt7
-rw-r--r--src/plugins/imageformats/dds/dds.pro16
-rw-r--r--src/plugins/imageformats/dds/ddsheader.cpp42
-rw-r--r--src/plugins/imageformats/dds/ddsheader.h42
-rw-r--r--src/plugins/imageformats/dds/main.cpp42
-rw-r--r--src/plugins/imageformats/dds/qddshandler.cpp42
-rw-r--r--src/plugins/imageformats/dds/qddshandler.h42
-rw-r--r--src/plugins/imageformats/icns/.prev_CMakeLists.txt22
-rw-r--r--src/plugins/imageformats/icns/CMakeLists.txt12
-rw-r--r--src/plugins/imageformats/icns/icns.pro16
-rw-r--r--src/plugins/imageformats/icns/main.cpp42
-rw-r--r--src/plugins/imageformats/icns/qicnshandler.cpp78
-rw-r--r--src/plugins/imageformats/icns/qicnshandler_p.h44
-rw-r--r--src/plugins/imageformats/imageformats.pro23
-rw-r--r--src/plugins/imageformats/jp2/.prev_CMakeLists.txt22
-rw-r--r--src/plugins/imageformats/jp2/CMakeLists.txt12
-rw-r--r--src/plugins/imageformats/jp2/jp2.pro15
-rw-r--r--src/plugins/imageformats/jp2/main.cpp42
-rw-r--r--src/plugins/imageformats/jp2/qjp2handler.cpp97
-rw-r--r--src/plugins/imageformats/jp2/qjp2handler_p.h42
-rw-r--r--src/plugins/imageformats/macheif/.prev_CMakeLists.txt27
-rw-r--r--src/plugins/imageformats/macheif/CMakeLists.txt23
-rw-r--r--src/plugins/imageformats/macheif/macheif.pro20
-rw-r--r--src/plugins/imageformats/macheif/main.cpp41
-rw-r--r--src/plugins/imageformats/macheif/qmacheifhandler.cpp41
-rw-r--r--src/plugins/imageformats/macheif/qmacheifhandler.h44
-rw-r--r--src/plugins/imageformats/macjp2/CMakeLists.txt14
-rw-r--r--src/plugins/imageformats/macjp2/macjp2.pro20
-rw-r--r--src/plugins/imageformats/macjp2/main.cpp40
-rw-r--r--src/plugins/imageformats/macjp2/qmacjp2handler.cpp42
-rw-r--r--src/plugins/imageformats/macjp2/qmacjp2handler.h40
-rw-r--r--src/plugins/imageformats/mng/CMakeLists.txt14
-rw-r--r--src/plugins/imageformats/mng/main.cpp40
-rw-r--r--src/plugins/imageformats/mng/mng.pro15
-rw-r--r--src/plugins/imageformats/mng/qmnghandler.cpp71
-rw-r--r--src/plugins/imageformats/mng/qmnghandler_p.h40
-rw-r--r--src/plugins/imageformats/shared/qiiofhelpers.cpp52
-rw-r--r--src/plugins/imageformats/shared/qiiofhelpers_p.h44
-rw-r--r--src/plugins/imageformats/tga/.prev_CMakeLists.txt20
-rw-r--r--src/plugins/imageformats/tga/CMakeLists.txt12
-rw-r--r--src/plugins/imageformats/tga/main.cpp40
-rw-r--r--src/plugins/imageformats/tga/qtgafile.cpp62
-rw-r--r--src/plugins/imageformats/tga/qtgafile.h40
-rw-r--r--src/plugins/imageformats/tga/qtgahandler.cpp41
-rw-r--r--src/plugins/imageformats/tga/qtgahandler.h40
-rw-r--r--src/plugins/imageformats/tga/tga.pro13
-rw-r--r--src/plugins/imageformats/tiff/.prev_CMakeLists.txt93
-rw-r--r--src/plugins/imageformats/tiff/CMakeLists.txt42
-rw-r--r--src/plugins/imageformats/tiff/main.cpp40
-rw-r--r--src/plugins/imageformats/tiff/qtiffhandler.cpp482
-rw-r--r--src/plugins/imageformats/tiff/qtiffhandler_p.h44
-rw-r--r--src/plugins/imageformats/tiff/tiff.pro18
-rw-r--r--src/plugins/imageformats/wbmp/.prev_CMakeLists.txt19
-rw-r--r--src/plugins/imageformats/wbmp/CMakeLists.txt12
-rw-r--r--src/plugins/imageformats/wbmp/main.cpp40
-rw-r--r--src/plugins/imageformats/wbmp/qwbmphandler.cpp44
-rw-r--r--src/plugins/imageformats/wbmp/qwbmphandler_p.h40
-rw-r--r--src/plugins/imageformats/wbmp/wbmp.pro11
-rw-r--r--src/plugins/imageformats/webp/.prev_CMakeLists.txt24
-rw-r--r--src/plugins/imageformats/webp/CMakeLists.txt177
-rw-r--r--src/plugins/imageformats/webp/main.cpp40
-rw-r--r--src/plugins/imageformats/webp/qwebphandler.cpp78
-rw-r--r--src/plugins/imageformats/webp/qwebphandler_p.h40
-rw-r--r--src/plugins/imageformats/webp/webp.pro18
-rw-r--r--src/plugins/plugins.pro2
-rw-r--r--src/src.pro4
-rw-r--r--sync.profile2
-rw-r--r--tests/.prev_CMakeLists.txt7
-rw-r--r--tests/CMakeLists.txt3
-rw-r--r--tests/auto/CMakeLists.txt11
-rw-r--r--tests/auto/auto.pro11
-rw-r--r--tests/auto/dds/CMakeLists.txt260
-rw-r--r--tests/auto/dds/dds.pro8
-rw-r--r--tests/auto/dds/tst_qdds.cpp31
-rw-r--r--tests/auto/heif/CMakeLists.txt20
-rw-r--r--tests/auto/heif/heif.pro8
-rw-r--r--tests/auto/heif/tst_qheif.cpp29
-rw-r--r--tests/auto/icns/CMakeLists.txt71
-rw-r--r--tests/auto/icns/icns.pro8
-rw-r--r--tests/auto/icns/tst_qicns.cpp56
-rw-r--r--tests/auto/jp2/CMakeLists.txt20
-rw-r--r--tests/auto/jp2/jp2.pro8
-rw-r--r--tests/auto/jp2/tst_qjp2.cpp31
-rw-r--r--tests/auto/mng/CMakeLists.txt35
-rw-r--r--tests/auto/mng/mng.pro8
-rw-r--r--tests/auto/mng/tst_qmng.cpp29
-rw-r--r--tests/auto/tga/CMakeLists.txt15
-rw-r--r--tests/auto/tga/tga.pro8
-rw-r--r--tests/auto/tga/tst_qtga.cpp29
-rw-r--r--tests/auto/tiff/CMakeLists.txt292
-rw-r--r--tests/auto/tiff/tiff.pro8
-rw-r--r--tests/auto/tiff/tst_qtiff.cpp49
-rw-r--r--tests/auto/wbmp/CMakeLists.txt20
-rw-r--r--tests/auto/wbmp/tst_qwbmp.cpp29
-rw-r--r--tests/auto/wbmp/wbmp.pro8
-rw-r--r--tests/auto/webp/CMakeLists.txt9
-rw-r--r--tests/auto/webp/tst_qwebp.cpp29
-rw-r--r--tests/auto/webp/webp.pro8
-rw-r--r--tests/auto/webp/webp.qrc9
-rw-r--r--tests/benchmarks/CMakeLists.txt4
-rw-r--r--tests/benchmarks/mng/CMakeLists.txt35
-rw-r--r--tests/benchmarks/mng/tst_qmng.cpp29
-rw-r--r--tests/benchmarks/tiff/CMakeLists.txt290
-rw-r--r--tests/benchmarks/tiff/tst_qtiff.cpp29
-rw-r--r--tests/shared/images/dds.qrc54
-rw-r--r--tests/shared/images/heif.qrc6
-rw-r--r--tests/shared/images/heif/col320x480.heicbin29004 -> 105313 bytes
-rw-r--r--tests/shared/images/icns.qrc16
-rw-r--r--tests/shared/images/jp2.qrc6
-rw-r--r--tests/shared/images/tga.qrc5
-rw-r--r--tests/shared/images/tiff.qrc1
-rw-r--r--tests/shared/images/tiff/teapot_cmyk.tiffbin0 -> 327972 bytes
-rw-r--r--tests/shared/images/wbmp.qrc6
-rw-r--r--tests/tests.pro2
376 files changed, 56861 insertions, 44412 deletions
diff --git a/.cmake.conf b/.cmake.conf
new file mode 100644
index 0000000..62cb061
--- /dev/null
+++ b/.cmake.conf
@@ -0,0 +1,4 @@
+set(QT_REPO_MODULE_VERSION "6.8.0")
+set(QT_REPO_MODULE_PRERELEASE_VERSION_SEGMENT "alpha1")
+set(QT_EXTRA_INTERNAL_TARGET_DEFINES "QT_NO_AS_CONST=1")
+list(APPEND QT_EXTRA_INTERNAL_TARGET_DEFINES "QT_NO_FOREACH=1")
diff --git a/.prev_CMakeLists.txt b/.prev_CMakeLists.txt
deleted file mode 100644
index cb76c1f..0000000
--- a/.prev_CMakeLists.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-# Generated from qtimageformats.pro.
-
-cmake_minimum_required(VERSION 3.15.0)
-
-project(imageformats_FIXME
- VERSION 6.0.0
- DESCRIPTION "Qt imageformats_FIXME Libraries"
- HOMEPAGE_URL "https://qt.io/"
- LANGUAGES CXX C
-)
-
-find_package(Qt6 ${PROJECT_VERSION} CONFIG REQUIRED COMPONENTS BuildInternals Core SET_ME_TO_SOMETHING_USEFUL)
-find_package(Qt6 ${PROJECT_VERSION} CONFIG OPTIONAL_COMPONENTS SET_ME_TO_SOMETHING_USEFUL)
-
-if(NOT TARGET Qt::Gui)
- message(NOTICE "Skipping the build as the condition \"TARGET Qt::Gui\" is not met.")
- return()
-endif()
-qt_build_repo()
diff --git a/.qmake.conf b/.qmake.conf
deleted file mode 100644
index 032e212..0000000
--- a/.qmake.conf
+++ /dev/null
@@ -1,6 +0,0 @@
-load(qt_build_config)
-
-DEFINES += QT_NO_FOREACH QT_NO_JAVA_STYLE_ITERATORS
-
-MODULE_VERSION = 6.0.0
-
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 961585c..97a9b9d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,15 +1,19 @@
-# Generated from qtimageformats.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
-cmake_minimum_required(VERSION 3.15.0)
+cmake_minimum_required(VERSION 3.16)
-project(QtImageFormats # special case
- VERSION 6.0.0
- DESCRIPTION "Qt ImageFormats Libraries" # special case
+include(.cmake.conf)
+project(QtImageFormats
+ VERSION "${QT_REPO_MODULE_VERSION}"
+ DESCRIPTION "Qt ImageFormats Libraries"
HOMEPAGE_URL "https://qt.io/"
LANGUAGES CXX C
)
-find_package(Qt6 ${PROJECT_VERSION} CONFIG REQUIRED COMPONENTS BuildInternals Gui) # special case
+find_package(Qt6 ${PROJECT_VERSION} CONFIG REQUIRED COMPONENTS BuildInternals Core)
+find_package(Qt6 ${PROJECT_VERSION} QUIET CONFIG OPTIONAL_COMPONENTS Gui)
+qt_internal_project_setup()
if(NOT TARGET Qt::Gui)
message(NOTICE "Skipping the build as the condition \"TARGET Qt::Gui\" is not met.")
diff --git a/LICENSE.GPL3-EXCEPT b/LICENSE.GPL3-EXCEPT
deleted file mode 100644
index b1cb1be..0000000
--- a/LICENSE.GPL3-EXCEPT
+++ /dev/null
@@ -1,704 +0,0 @@
-This is the GNU General Public License version 3, annotated with The
-Qt Company GPL Exception 1.0:
-
--------------------------------------------------------------------------
-
-The Qt Company GPL Exception 1.0
-
-Exception 1:
-
-As a special exception you may create a larger work which contains the
-output of this application and distribute that work under terms of your
-choice, so long as the work is not otherwise derived from or based on
-this application and so long as the work does not in itself generate
-output that contains the output from this application in its original
-or modified form.
-
-Exception 2:
-
-As a special exception, you have permission to combine this application
-with Plugins licensed under the terms of your choice, to produce an
-executable, and to copy and distribute the resulting executable under
-the terms of your choice. However, the executable must be accompanied
-by a prominent notice offering all users of the executable the entire
-source code to this application, excluding the source code of the
-independent modules, but including any changes you have made to this
-application, under the terms of this license.
-
-
--------------------------------------------------------------------------
-
- GNU GENERAL PUBLIC LICENSE
- Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The GNU General Public License is a free, copyleft license for
-software and other kinds of works.
-
- The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works. By contrast,
-the GNU General Public License is intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users. We, the Free Software Foundation, use the
-GNU General Public License for most of our software; it applies also to
-any other work released this way by its authors. You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
- To protect your rights, we need to prevent others from denying you
-these rights or asking you to surrender the rights. Therefore, you have
-certain responsibilities if you distribute copies of the software, or if
-you modify it: responsibilities to respect the freedom of others.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must pass on to the recipients the same
-freedoms that you received. You must make sure that they, too, receive
-or can get the source code. And you must show them these terms so they
-know their rights.
-
- Developers that use the GNU GPL protect your rights with two steps:
-(1) assert copyright on the software, and (2) offer you this License
-giving you legal permission to copy, distribute and/or modify it.
-
- For the developers' and authors' protection, the GPL clearly explains
-that there is no warranty for this free software. For both users' and
-authors' sake, the GPL requires that modified versions be marked as
-changed, so that their problems will not be attributed erroneously to
-authors of previous versions.
-
- Some devices are designed to deny users access to install or run
-modified versions of the software inside them, although the manufacturer
-can do so. This is fundamentally incompatible with the aim of
-protecting users' freedom to change the software. The systematic
-pattern of such abuse occurs in the area of products for individuals to
-use, which is precisely where it is most unacceptable. Therefore, we
-have designed this version of the GPL to prohibit the practice for those
-products. If such problems arise substantially in other domains, we
-stand ready to extend this provision to those domains in future versions
-of the GPL, as needed to protect the freedom of users.
-
- Finally, every program is threatened constantly by software patents.
-States should not allow patents to restrict development and use of
-software on general-purpose computers, but in those that do, we wish to
-avoid the special danger that patents applied to a free program could
-make it effectively proprietary. To prevent this, the GPL assures that
-patents cannot be used to render the program non-free.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- TERMS AND CONDITIONS
-
- 0. Definitions.
-
- "This License" refers to version 3 of the GNU General Public License.
-
- "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
- "The Program" refers to any copyrightable work licensed under this
-License. Each licensee is addressed as "you". "Licensees" and
-"recipients" may be individuals or organizations.
-
- To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy. The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
- A "covered work" means either the unmodified Program or a work based
-on the Program.
-
- To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy. Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
- To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies. Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
- An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License. If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
- 1. Source Code.
-
- The "source code" for a work means the preferred form of the work
-for making modifications to it. "Object code" means any non-source
-form of a work.
-
- A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
- The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form. A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
- The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities. However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work. For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
- The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
- The Corresponding Source for a work in source code form is that
-same work.
-
- 2. Basic Permissions.
-
- All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met. This License explicitly affirms your unlimited
-permission to run the unmodified Program. The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work. This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
- You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force. You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright. Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
- Conveying under any other circumstances is permitted solely under
-the conditions stated below. Sublicensing is not allowed; section 10
-makes it unnecessary.
-
- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
- No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
- When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
- 4. Conveying Verbatim Copies.
-
- You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
- You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
- 5. Conveying Modified Source Versions.
-
- You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
- a) The work must carry prominent notices stating that you modified
- it, and giving a relevant date.
-
- b) The work must carry prominent notices stating that it is
- released under this License and any conditions added under section
- 7. This requirement modifies the requirement in section 4 to
- "keep intact all notices".
-
- c) You must license the entire work, as a whole, under this
- License to anyone who comes into possession of a copy. This
- License will therefore apply, along with any applicable section 7
- additional terms, to the whole of the work, and all its parts,
- regardless of how they are packaged. This License gives no
- permission to license the work in any other way, but it does not
- invalidate such permission if you have separately received it.
-
- d) If the work has interactive user interfaces, each must display
- Appropriate Legal Notices; however, if the Program has interactive
- interfaces that do not display Appropriate Legal Notices, your
- work need not make them do so.
-
- A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit. Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
- 6. Conveying Non-Source Forms.
-
- You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
- a) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by the
- Corresponding Source fixed on a durable physical medium
- customarily used for software interchange.
-
- b) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by a
- written offer, valid for at least three years and valid for as
- long as you offer spare parts or customer support for that product
- model, to give anyone who possesses the object code either (1) a
- copy of the Corresponding Source for all the software in the
- product that is covered by this License, on a durable physical
- medium customarily used for software interchange, for a price no
- more than your reasonable cost of physically performing this
- conveying of source, or (2) access to copy the
- Corresponding Source from a network server at no charge.
-
- c) Convey individual copies of the object code with a copy of the
- written offer to provide the Corresponding Source. This
- alternative is allowed only occasionally and noncommercially, and
- only if you received the object code with such an offer, in accord
- with subsection 6b.
-
- d) Convey the object code by offering access from a designated
- place (gratis or for a charge), and offer equivalent access to the
- Corresponding Source in the same way through the same place at no
- further charge. You need not require recipients to copy the
- Corresponding Source along with the object code. If the place to
- copy the object code is a network server, the Corresponding Source
- may be on a different server (operated by you or a third party)
- that supports equivalent copying facilities, provided you maintain
- clear directions next to the object code saying where to find the
- Corresponding Source. Regardless of what server hosts the
- Corresponding Source, you remain obligated to ensure that it is
- available for as long as needed to satisfy these requirements.
-
- e) Convey the object code using peer-to-peer transmission, provided
- you inform other peers where the object code and Corresponding
- Source of the work are being offered to the general public at no
- charge under subsection 6d.
-
- A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
- A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling. In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage. For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product. A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
- "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source. The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
- If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information. But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
- The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed. Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
- Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
- 7. Additional Terms.
-
- "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law. If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
- When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it. (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.) You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
- Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
- a) Disclaiming warranty or limiting liability differently from the
- terms of sections 15 and 16 of this License; or
-
- b) Requiring preservation of specified reasonable legal notices or
- author attributions in that material or in the Appropriate Legal
- Notices displayed by works containing it; or
-
- c) Prohibiting misrepresentation of the origin of that material, or
- requiring that modified versions of such material be marked in
- reasonable ways as different from the original version; or
-
- d) Limiting the use for publicity purposes of names of licensors or
- authors of the material; or
-
- e) Declining to grant rights under trademark law for use of some
- trade names, trademarks, or service marks; or
-
- f) Requiring indemnification of licensors and authors of that
- material by anyone who conveys the material (or modified versions of
- it) with contractual assumptions of liability to the recipient, for
- any liability that these contractual assumptions directly impose on
- those licensors and authors.
-
- All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10. If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term. If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
- If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
- Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
- 8. Termination.
-
- You may not propagate or modify a covered work except as expressly
-provided under this License. Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
- However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
- Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
- Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License. If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
- 9. Acceptance Not Required for Having Copies.
-
- You are not required to accept this License in order to receive or
-run a copy of the Program. Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance. However,
-nothing other than this License grants you permission to propagate or
-modify any covered work. These actions infringe copyright if you do
-not accept this License. Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
- 10. Automatic Licensing of Downstream Recipients.
-
- Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License. You are not responsible
-for enforcing compliance by third parties with this License.
-
- An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations. If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
- You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License. For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
- 11. Patents.
-
- A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based. The
-work thus licensed is called the contributor's "contributor version".
-
- A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version. For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
- Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
- In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement). To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
- If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients. "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
- If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
- A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License. You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
- Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
- 12. No Surrender of Others' Freedom.
-
- If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all. For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
- 13. Use with the GNU Affero General Public License.
-
- Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU Affero General Public License into a single
-combined work, and to convey the resulting work. The terms of this
-License will continue to apply to the part which is the covered work,
-but the special requirements of the GNU Affero General Public License,
-section 13, concerning interaction through a network will apply to the
-combination as such.
-
- 14. Revised Versions of this License.
-
- The Free Software Foundation may publish revised and/or new versions of
-the GNU General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
- Each version is given a distinguishing version number. If the
-Program specifies that a certain numbered version of the GNU General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation. If the Program does not specify a version number of the
-GNU General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
- If the Program specifies that a proxy can decide which future
-versions of the GNU General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
- Later license versions may give you additional or different
-permissions. However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
- 15. Disclaimer of Warranty.
-
- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. Limitation of Liability.
-
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
- 17. Interpretation of Sections 15 and 16.
-
- If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-Also add information on how to contact you by electronic and paper mail.
-
- If the program does terminal interaction, make it output a short
-notice like this when it starts in an interactive mode:
-
- <program> Copyright (C) <year> <name of author>
- This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, your program's commands
-might be different; for a GUI interface, you would use an "about box".
-
- You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU GPL, see
-<http://www.gnu.org/licenses/>.
-
- The GNU General Public License does not permit incorporating your program
-into proprietary programs. If your program is a subroutine library, you
-may consider it more useful to permit linking proprietary applications with
-the library. If this is what you want to do, use the GNU Lesser General
-Public License instead of this License. But first, please read
-<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/LICENSE.GPLv2 b/LICENSE.GPLv2
deleted file mode 100644
index a424477..0000000
--- a/LICENSE.GPLv2
+++ /dev/null
@@ -1,292 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
-
- The Qt Toolkit is Copyright (C) 2015 The Qt Company Ltd.
- Contact: http://www.qt.io/licensing/
-
- You may use, distribute and copy the Qt Toolkit under the terms of
- GNU General Public License version 2, which is displayed below.
-
--------------------------------------------------------------------------
-
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
-
-Everyone is permitted to copy and distribute verbatim copies of this
-license document, but changing it is not allowed.
-
-Preamble
-
- The licenses for most software are designed to take away your freedom
-to share and change it. By contrast, the GNU General Public License is
-intended to guarantee your freedom to share and change free software
---to make sure the software is free for all its users. This General
-Public License applies to most of the Free Software Foundation's
-software and to any other program whose authors commit to using it.
-(Some other Free Software Foundation software is covered by the GNU
-Lesser General Public License instead.) You can apply it to your
-programs, too.
-
-When we speak of free software, we are referring to freedom, not price.
-Our General Public Licenses are designed to make sure that you have the
-freedom to distribute copies of free software (and charge for this
-service if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs; and that you know you can do these things.
-
-To protect your rights, we need to make restrictions that forbid anyone
-to deny you these rights or to ask you to surrender the rights. These
-restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-For example, if you distribute copies of such a program, whether gratis
- or for a fee, you must give the recipients all the rights that you
-have. You must make sure that they, too, receive or can get the source
-code. And you must show them these terms so they know their rights.
-
-We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-Finally, any free program is threatened constantly by software patents.
-We wish to avoid the danger that redistributors of a free program will
-individually obtain patent licenses, in effect making the program
-proprietary. To prevent this, we have made it clear that any patent
-must be licensed for everyone's free use or not licensed at all.
-
-The precise terms and conditions for copying, distribution and
-modification follow.
-
-TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-0. This License applies to any program or other work which contains a
-notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of running
-the Program is not restricted, and the output from the Program is
-covered only if its contents constitute a work based on the Program
-(independent of having been made by running the Program). Whether that
-is true depends on what the Program does.
-
-1. You may copy and distribute verbatim copies of the Program's source
-code as you receive it, in any medium, provided that you conspicuously
-and appropriately publish on each copy an appropriate copyright notice
-and disclaimer of warranty; keep intact all the notices that refer to
-this License and to the absence of any warranty; and give any other
-recipients of the Program a copy of this License along with the
-Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-2. You may modify your copy or copies of the Program or any portion of
-it, thus forming a work based on the Program, and copy and distribute
-such modifications or work under the terms of Section 1 above, provided
-that you also meet all of these conditions:
-
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
- b) You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
- c) If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but does
- not normally print such an announcement, your work based on the
- Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of a
-storage or distribution medium does not bring the other work under the
-scope of this License.
-
-3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
- a) Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software
- interchange; or,
-
- b) Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your cost
- of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
-
- c) Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to control
-compilation and installation of the executable. However, as a special
-exception, the source code distributed need not include anything that
-is normally distributed (in either source or binary form) with the
-major components (compiler, kernel, and so on) of the operating system
-on which the executable runs, unless that component itself accompanies
-the executable.
-
-If distribution of executable or object code is made by offering access
-to copy from a designated place, then offering equivalent access to
-copy the source code from the same place counts as distribution of the
-source code, even though third parties are not compelled to copy the
-source along with the object code.
-
-4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt otherwise
-to copy, modify, sublicense or distribute the Program is void, and will
-automatically terminate your rights under this License. However,
-parties who have received copies, or rights, from you under this License
-will not have their licenses terminated so long as such parties remain
-in full compliance.
-
-5. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further restrictions
-on the recipients' exercise of the rights granted herein. You are not
-responsible for enforcing compliance by third parties to this License.
-
-7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent license
-would not permit royalty-free redistribution of the Program by all
-those who receive copies directly or indirectly through you, then the
-only way you could satisfy both it and this License would be to refrain
-entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License may
-add an explicit geographical distribution limitation excluding those
-countries, so that distribution is permitted only in or among countries
-not thus excluded. In such case, this License incorporates the limitation
-as if written in the body of this License.
-
-9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail
-to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Program does not specify a version
-number of this License, you may choose any version ever published by
-the Free Software Foundation.
-
-10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the
-author to ask for permission. For software which is copyrighted by
-the Free Software Foundation, write to the Free Software Foundation;
-we sometimes make exceptions for this. Our decision will be guided by
-the two goals of preserving the free status of all derivatives of our
-free software and of promoting the sharing and reuse of software
-generally.
-
-NO WARRANTY
-
-11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND,
-EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
-ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH
-YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
-NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY
-MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE
-TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
-END OF TERMS AND CONDITIONS
diff --git a/LICENSE.GPLv3 b/LICENSE.GPLv3
deleted file mode 100644
index 71c4ad4..0000000
--- a/LICENSE.GPLv3
+++ /dev/null
@@ -1,686 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
-
- The Qt Toolkit is Copyright (C) 2015 The Qt Company Ltd.
- Contact: http://www.qt.io/licensing/
-
- You may use, distribute and copy the Qt Toolkit under the terms of
- GNU Lesser General Public License version 3. That license references
- the General Public License version 3, that is displayed below. Other
- portions of the Qt Toolkit may be licensed directly under this license.
-
--------------------------------------------------------------------------
-
- GNU GENERAL PUBLIC LICENSE
- Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The GNU General Public License is a free, copyleft license for
-software and other kinds of works.
-
- The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works. By contrast,
-the GNU General Public License is intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users. We, the Free Software Foundation, use the
-GNU General Public License for most of our software; it applies also to
-any other work released this way by its authors. You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
- To protect your rights, we need to prevent others from denying you
-these rights or asking you to surrender the rights. Therefore, you have
-certain responsibilities if you distribute copies of the software, or if
-you modify it: responsibilities to respect the freedom of others.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must pass on to the recipients the same
-freedoms that you received. You must make sure that they, too, receive
-or can get the source code. And you must show them these terms so they
-know their rights.
-
- Developers that use the GNU GPL protect your rights with two steps:
-(1) assert copyright on the software, and (2) offer you this License
-giving you legal permission to copy, distribute and/or modify it.
-
- For the developers' and authors' protection, the GPL clearly explains
-that there is no warranty for this free software. For both users' and
-authors' sake, the GPL requires that modified versions be marked as
-changed, so that their problems will not be attributed erroneously to
-authors of previous versions.
-
- Some devices are designed to deny users access to install or run
-modified versions of the software inside them, although the manufacturer
-can do so. This is fundamentally incompatible with the aim of
-protecting users' freedom to change the software. The systematic
-pattern of such abuse occurs in the area of products for individuals to
-use, which is precisely where it is most unacceptable. Therefore, we
-have designed this version of the GPL to prohibit the practice for those
-products. If such problems arise substantially in other domains, we
-stand ready to extend this provision to those domains in future versions
-of the GPL, as needed to protect the freedom of users.
-
- Finally, every program is threatened constantly by software patents.
-States should not allow patents to restrict development and use of
-software on general-purpose computers, but in those that do, we wish to
-avoid the special danger that patents applied to a free program could
-make it effectively proprietary. To prevent this, the GPL assures that
-patents cannot be used to render the program non-free.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- TERMS AND CONDITIONS
-
- 0. Definitions.
-
- "This License" refers to version 3 of the GNU General Public License.
-
- "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
- "The Program" refers to any copyrightable work licensed under this
-License. Each licensee is addressed as "you". "Licensees" and
-"recipients" may be individuals or organizations.
-
- To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy. The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
- A "covered work" means either the unmodified Program or a work based
-on the Program.
-
- To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy. Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
- To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies. Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
- An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License. If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
- 1. Source Code.
-
- The "source code" for a work means the preferred form of the work
-for making modifications to it. "Object code" means any non-source
-form of a work.
-
- A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
- The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form. A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
- The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities. However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work. For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
- The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
- The Corresponding Source for a work in source code form is that
-same work.
-
- 2. Basic Permissions.
-
- All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met. This License explicitly affirms your unlimited
-permission to run the unmodified Program. The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work. This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
- You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force. You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright. Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
- Conveying under any other circumstances is permitted solely under
-the conditions stated below. Sublicensing is not allowed; section 10
-makes it unnecessary.
-
- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
- No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
- When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
- 4. Conveying Verbatim Copies.
-
- You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
- You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
- 5. Conveying Modified Source Versions.
-
- You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
- a) The work must carry prominent notices stating that you modified
- it, and giving a relevant date.
-
- b) The work must carry prominent notices stating that it is
- released under this License and any conditions added under section
- 7. This requirement modifies the requirement in section 4 to
- "keep intact all notices".
-
- c) You must license the entire work, as a whole, under this
- License to anyone who comes into possession of a copy. This
- License will therefore apply, along with any applicable section 7
- additional terms, to the whole of the work, and all its parts,
- regardless of how they are packaged. This License gives no
- permission to license the work in any other way, but it does not
- invalidate such permission if you have separately received it.
-
- d) If the work has interactive user interfaces, each must display
- Appropriate Legal Notices; however, if the Program has interactive
- interfaces that do not display Appropriate Legal Notices, your
- work need not make them do so.
-
- A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit. Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
- 6. Conveying Non-Source Forms.
-
- You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
- a) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by the
- Corresponding Source fixed on a durable physical medium
- customarily used for software interchange.
-
- b) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by a
- written offer, valid for at least three years and valid for as
- long as you offer spare parts or customer support for that product
- model, to give anyone who possesses the object code either (1) a
- copy of the Corresponding Source for all the software in the
- product that is covered by this License, on a durable physical
- medium customarily used for software interchange, for a price no
- more than your reasonable cost of physically performing this
- conveying of source, or (2) access to copy the
- Corresponding Source from a network server at no charge.
-
- c) Convey individual copies of the object code with a copy of the
- written offer to provide the Corresponding Source. This
- alternative is allowed only occasionally and noncommercially, and
- only if you received the object code with such an offer, in accord
- with subsection 6b.
-
- d) Convey the object code by offering access from a designated
- place (gratis or for a charge), and offer equivalent access to the
- Corresponding Source in the same way through the same place at no
- further charge. You need not require recipients to copy the
- Corresponding Source along with the object code. If the place to
- copy the object code is a network server, the Corresponding Source
- may be on a different server (operated by you or a third party)
- that supports equivalent copying facilities, provided you maintain
- clear directions next to the object code saying where to find the
- Corresponding Source. Regardless of what server hosts the
- Corresponding Source, you remain obligated to ensure that it is
- available for as long as needed to satisfy these requirements.
-
- e) Convey the object code using peer-to-peer transmission, provided
- you inform other peers where the object code and Corresponding
- Source of the work are being offered to the general public at no
- charge under subsection 6d.
-
- A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
- A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling. In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage. For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product. A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
- "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source. The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
- If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information. But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
- The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed. Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
- Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
- 7. Additional Terms.
-
- "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law. If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
- When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it. (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.) You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
- Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
- a) Disclaiming warranty or limiting liability differently from the
- terms of sections 15 and 16 of this License; or
-
- b) Requiring preservation of specified reasonable legal notices or
- author attributions in that material or in the Appropriate Legal
- Notices displayed by works containing it; or
-
- c) Prohibiting misrepresentation of the origin of that material, or
- requiring that modified versions of such material be marked in
- reasonable ways as different from the original version; or
-
- d) Limiting the use for publicity purposes of names of licensors or
- authors of the material; or
-
- e) Declining to grant rights under trademark law for use of some
- trade names, trademarks, or service marks; or
-
- f) Requiring indemnification of licensors and authors of that
- material by anyone who conveys the material (or modified versions of
- it) with contractual assumptions of liability to the recipient, for
- any liability that these contractual assumptions directly impose on
- those licensors and authors.
-
- All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10. If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term. If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
- If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
- Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
- 8. Termination.
-
- You may not propagate or modify a covered work except as expressly
-provided under this License. Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
- However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
- Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
- Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License. If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
- 9. Acceptance Not Required for Having Copies.
-
- You are not required to accept this License in order to receive or
-run a copy of the Program. Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance. However,
-nothing other than this License grants you permission to propagate or
-modify any covered work. These actions infringe copyright if you do
-not accept this License. Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
- 10. Automatic Licensing of Downstream Recipients.
-
- Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License. You are not responsible
-for enforcing compliance by third parties with this License.
-
- An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations. If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
- You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License. For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
- 11. Patents.
-
- A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based. The
-work thus licensed is called the contributor's "contributor version".
-
- A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version. For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
- Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
- In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement). To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
- If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients. "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
- If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
- A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License. You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
- Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
- 12. No Surrender of Others' Freedom.
-
- If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all. For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
- 13. Use with the GNU Affero General Public License.
-
- Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU Affero General Public License into a single
-combined work, and to convey the resulting work. The terms of this
-License will continue to apply to the part which is the covered work,
-but the special requirements of the GNU Affero General Public License,
-section 13, concerning interaction through a network will apply to the
-combination as such.
-
- 14. Revised Versions of this License.
-
- The Free Software Foundation may publish revised and/or new versions of
-the GNU General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
- Each version is given a distinguishing version number. If the
-Program specifies that a certain numbered version of the GNU General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation. If the Program does not specify a version number of the
-GNU General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
- If the Program specifies that a proxy can decide which future
-versions of the GNU General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
- Later license versions may give you additional or different
-permissions. However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
- 15. Disclaimer of Warranty.
-
- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. Limitation of Liability.
-
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
- 17. Interpretation of Sections 15 and 16.
-
- If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-Also add information on how to contact you by electronic and paper mail.
-
- If the program does terminal interaction, make it output a short
-notice like this when it starts in an interactive mode:
-
- <program> Copyright (C) <year> <name of author>
- This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, your program's commands
-might be different; for a GUI interface, you would use an "about box".
-
- You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU GPL, see
-<http://www.gnu.org/licenses/>.
-
- The GNU General Public License does not permit incorporating your program
-into proprietary programs. If your program is a subroutine library, you
-may consider it more useful to permit linking proprietary applications with
-the library. If this is what you want to do, use the GNU Lesser General
-Public License instead of this License. But first, please read
-<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/LICENSE.LGPLv21 b/LICENSE.LGPLv21
deleted file mode 100644
index dfcab5e..0000000
--- a/LICENSE.LGPLv21
+++ /dev/null
@@ -1,514 +0,0 @@
- GNU LESSER GENERAL PUBLIC LICENSE
-
- The Qt Toolkit is Copyright (C) 2015 The Qt Company Ltd.
- Contact: http://www.qt.io/licensing/
-
- You may use, distribute and copy the Qt Toolkit under the terms of
- GNU Lesser General Public License version 2.1, which is displayed below.
-
--------------------------------------------------------------------------
-
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it. You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-not price. Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
- You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
- 2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
- If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run time a
- copy of the library already present on the user's computer system,
- rather than copying library functions into the executable, and (2)
- will operate properly with a modified version of the library, if
- the user installs one, as long as the modified version is
- interface-compatible with the version that the work was made with.
-
- c) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- d) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- e) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License. However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
- 9. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
- 11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded. In such case, this License incorporates the limitation as if
-written in the body of this License.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission. For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this. Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
- NO WARRANTY
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Libraries
-
- If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
- To apply these terms, attach the following notices to the library. It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
- <one line to give the library's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the
- library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
- <signature of Ty Coon>, 1 April 1990
- Ty Coon, President of Vice
-
-That's all there is to it!
-
-
diff --git a/LICENSE.LGPLv3 b/LICENSE.LGPLv3
deleted file mode 100644
index 6bf924c..0000000
--- a/LICENSE.LGPLv3
+++ /dev/null
@@ -1,175 +0,0 @@
- GNU LESSER GENERAL PUBLIC LICENSE
-
- The Qt Toolkit is Copyright (C) 2015 The Qt Company Ltd.
- Contact: http://www.qt.io/licensing/
-
- You may use, distribute and copy the Qt Toolkit under the terms of
- GNU Lesser General Public License version 3, which is displayed below.
- This license makes reference to the version 3 of the GNU General
- Public License, which you can find in the LICENSE.GPLv3 file.
-
--------------------------------------------------------------------------
-
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 3, 29 June 2007
-
- Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/>
-Everyone is permitted to copy and distribute verbatim copies of this
-licensedocument, but changing it is not allowed.
-
-This version of the GNU Lesser General Public License incorporates
-the terms and conditions of version 3 of the GNU General Public
-License, supplemented by the additional permissions listed below.
-
-0. Additional Definitions.
-
- As used herein, “this License” refers to version 3 of the GNU Lesser
-General Public License, and the “GNU GPL” refers to version 3 of the
-GNU General Public License.
-
- “The Library” refers to a covered work governed by this License,
-other than an Application or a Combined Work as defined below.
-
- An “Application” is any work that makes use of an interface provided
-by the Library, but which is not otherwise based on the Library.
-Defining a subclass of a class defined by the Library is deemed a mode
-of using an interface provided by the Library.
-
- A “Combined Work” is a work produced by combining or linking an
-Application with the Library. The particular version of the Library
-with which the Combined Work was made is also called the “Linked
-Version”.
-
- The “Minimal Corresponding Source” for a Combined Work means the
-Corresponding Source for the Combined Work, excluding any source code
-for portions of the Combined Work that, considered in isolation, are
-based on the Application, and not on the Linked Version.
-
- The “Corresponding Application Code” for a Combined Work means the
-object code and/or source code for the Application, including any data
-and utility programs needed for reproducing the Combined Work from the
-Application, but excluding the System Libraries of the Combined Work.
-
-1. Exception to Section 3 of the GNU GPL.
-
- You may convey a covered work under sections 3 and 4 of this License
-without being bound by section 3 of the GNU GPL.
-
-2. Conveying Modified Versions.
-
- If you modify a copy of the Library, and, in your modifications, a
-facility refers to a function or data to be supplied by an Application
-that uses the facility (other than as an argument passed when the
-facility is invoked), then you may convey a copy of the modified
-version:
-
- a) under this License, provided that you make a good faith effort
- to ensure that, in the event an Application does not supply the
- function or data, the facility still operates, and performs
- whatever part of its purpose remains meaningful, or
-
- b) under the GNU GPL, with none of the additional permissions of
- this License applicable to that copy.
-
-3. Object Code Incorporating Material from Library Header Files.
-
- The object code form of an Application may incorporate material from
-a header file that is part of the Library. You may convey such object
-code under terms of your choice, provided that, if the incorporated
-material is not limited to numerical parameters, data structure
-layouts and accessors, or small macros, inline functions and templates
-(ten or fewer lines in length), you do both of the following:
-
- a) Give prominent notice with each copy of the object code that
- the Library is used in it and that the Library and its use are
- covered by this License.
-
- b) Accompany the object code with a copy of the GNU GPL and this
- license document.
-
-4. Combined Works.
-
- You may convey a Combined Work under terms of your choice that, taken
-together, effectively do not restrict modification of the portions of
-the Library contained in the Combined Work and reverse engineering for
-debugging such modifications, if you also do each of the following:
-
- a) Give prominent notice with each copy of the Combined Work that
- the Library is used in it and that the Library and its use are
- covered by this License.
-
- b) Accompany the Combined Work with a copy of the GNU GPL and this
- license document.
-
- c) For a Combined Work that displays copyright notices during
- execution, include the copyright notice for the Library among
- these notices, as well as a reference directing the user to the
- copies of the GNU GPL and this license document.
-
- d) Do one of the following:
-
- 0) Convey the Minimal Corresponding Source under the terms of
- this License, and the Corresponding Application Code in a form
- suitable for, and under terms that permit, the user to
- recombine or relink the Application with a modified version of
- the Linked Version to produce a modified Combined Work, in the
- manner specified by section 6 of the GNU GPL for conveying
- Corresponding Source.
-
- 1) Use a suitable shared library mechanism for linking with
- the Library. A suitable mechanism is one that (a) uses at run
- time a copy of the Library already present on the user's
- computer system, and (b) will operate properly with a modified
- version of the Library that is interface-compatible with the
- Linked Version.
-
- e) Provide Installation Information, but only if you would
- otherwise be required to provide such information under section 6
- of the GNU GPL, and only to the extent that such information is
- necessary to install and execute a modified version of the
- Combined Work produced by recombining or relinking the Application
- with a modified version of the Linked Version. (If you use option
- 4d0, the Installation Information must accompany the Minimal
- Corresponding Source and Corresponding Application Code. If you
- use option 4d1, you must provide the Installation Information in
- the manner specified by section 6 of the GNU GPL for conveying
- Corresponding Source.)
-
-5. Combined Libraries.
-
- You may place library facilities that are a work based on the Library
-side by side in a single library together with other library
-facilities that are not Applications and are not covered by this
-License, and convey such a combined library under terms of your
-choice, if you do both of the following:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities, conveyed under the terms of this License.
-
- b) Give prominent notice with the combined library that part of
- it is a work based on the Library, and explaining where to find
- the accompanying uncombined form of the same work.
-
-6. Revised Versions of the GNU Lesser General Public License.
-
- The Free Software Foundation may publish revised and/or new versions
-of the GNU Lesser General Public License from time to time. Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Library
-as you received it specifies that a certain numbered version of the
-GNU Lesser General Public License “or any later version” applies to
-it, you have the option of following the terms and conditions either
-of that published version or of any later version published by the
-Free Software Foundation. If the Library as you received it does not
-specify a version number of the GNU Lesser General Public License,
-you may choose any version of the GNU Lesser General Public License
-ever published by the Free Software Foundation.
-
-If the Library as you received it specifies that a proxy can decide
-whether future versions of the GNU Lesser General Public License shall
-apply, that proxy's public statement of acceptance of any version is
-permanent authorization for you to choose that version for the Library.
-
diff --git a/LICENSES/BSD-3-Clause.txt b/LICENSES/BSD-3-Clause.txt
new file mode 100644
index 0000000..b91bbd8
--- /dev/null
+++ b/LICENSES/BSD-3-Clause.txt
@@ -0,0 +1,9 @@
+Copyright (c) <year> <owner>.
+
+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 copyright holder 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 COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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.
diff --git a/LICENSE.FDL b/LICENSES/GFDL-1.3-no-invariants-only.txt
index 938bb8d..857214d 100644
--- a/LICENSE.FDL
+++ b/LICENSES/GFDL-1.3-no-invariants-only.txt
@@ -1,9 +1,10 @@
+
GNU Free Documentation License
Version 1.3, 3 November 2008
Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
- <http://fsf.org/>
+ <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
@@ -376,7 +377,7 @@ The Free Software Foundation may publish new, revised versions of the
GNU Free Documentation License from time to time. Such new versions
will be similar in spirit to the present version, but may differ in
detail to address new problems or concerns. See
-http://www.gnu.org/copyleft/.
+https://www.gnu.org/licenses/.
Each version of the License is given a distinguishing version number.
If the Document specifies that a particular numbered version of this
@@ -400,19 +401,19 @@ public wiki that anybody can edit is an example of such a server. A
"Massive Multiauthor Collaboration" (or "MMC") contained in the site
means any set of copyrightable works thus published on the MMC site.
-"CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
-license published by Creative Commons Corporation, a not-for-profit
-corporation with a principal place of business in San Francisco,
-California, as well as future copyleft versions of that license
+"CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
+license published by Creative Commons Corporation, a not-for-profit
+corporation with a principal place of business in San Francisco,
+California, as well as future copyleft versions of that license
published by that same organization.
-"Incorporate" means to publish or republish a Document, in whole or in
+"Incorporate" means to publish or republish a Document, in whole or in
part, as part of another Document.
-An MMC is "eligible for relicensing" if it is licensed under this
-License, and if all works that were first published under this License
-somewhere other than this MMC, and subsequently incorporated in whole or
-in part into the MMC, (1) had no cover texts or invariant sections, and
+An MMC is "eligible for relicensing" if it is licensed under this
+License, and if all works that were first published under this License
+somewhere other than this MMC, and subsequently incorporated in whole or
+in part into the MMC, (1) had no cover texts or invariant sections, and
(2) were thus incorporated prior to November 1, 2008.
The operator of an MMC Site may republish an MMC contained in the site
diff --git a/LICENSE.GPL2 b/LICENSES/GPL-2.0-only.txt
index d159169..d159169 100644
--- a/LICENSE.GPL2
+++ b/LICENSES/GPL-2.0-only.txt
diff --git a/LICENSE.GPL3 b/LICENSES/GPL-3.0-only.txt
index 94a9ed0..94a9ed0 100644
--- a/LICENSE.GPL3
+++ b/LICENSES/GPL-3.0-only.txt
diff --git a/LICENSE.LGPL3 b/LICENSES/LGPL-3.0-only.txt
index 65c5ca8..65c5ca8 100644
--- a/LICENSE.LGPL3
+++ b/LICENSES/LGPL-3.0-only.txt
diff --git a/LICENSES/LicenseRef-Qt-Commercial.txt b/LICENSES/LicenseRef-Qt-Commercial.txt
new file mode 100644
index 0000000..825b1f3
--- /dev/null
+++ b/LICENSES/LicenseRef-Qt-Commercial.txt
@@ -0,0 +1,8 @@
+Licensees holding valid commercial Qt licenses may use this software in
+accordance with the the terms contained in a written agreement between
+you and The Qt Company. Alternatively, the terms and conditions that were
+accepted by the licensee when buying and/or downloading the
+software do apply.
+
+For the latest licensing terms and conditions, see https://www.qt.io/terms-conditions.
+For further information use the contact form at https://www.qt.io/contact-us.
diff --git a/LICENSES/Qt-GPL-exception-1.0.txt b/LICENSES/Qt-GPL-exception-1.0.txt
new file mode 100644
index 0000000..d0322bf
--- /dev/null
+++ b/LICENSES/Qt-GPL-exception-1.0.txt
@@ -0,0 +1,22 @@
+The Qt Company GPL Exception 1.0
+
+Exception 1:
+
+As a special exception you may create a larger work which contains the
+output of this application and distribute that work under terms of your
+choice, so long as the work is not otherwise derived from or based on
+this application and so long as the work does not in itself generate
+output that contains the output from this application in its original
+or modified form.
+
+Exception 2:
+
+As a special exception, you have permission to combine this application
+with Plugins licensed under the terms of your choice, to produce an
+executable, and to copy and distribute the resulting executable under
+the terms of your choice. However, the executable must be accompanied
+by a prominent notice offering all users of the executable the entire
+source code to this application, excluding the source code of the
+independent modules, but including any changes you have made to this
+application, under the terms of this license.
+
diff --git a/cmake/FindLibmng.cmake b/cmake/FindLibmng.cmake
new file mode 100644
index 0000000..d074ef4
--- /dev/null
+++ b/cmake/FindLibmng.cmake
@@ -0,0 +1,38 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+if(TARGET Libmng::Libmng)
+ set(Libmng_FOUND TRUE)
+ return()
+endif()
+
+find_package(PkgConfig QUIET)
+
+if(PkgConfig_FOUND)
+ pkg_check_modules(Libmng IMPORTED_TARGET libmng)
+
+ if(TARGET PkgConfig::Libmng)
+ add_library(Libmng::Libmng INTERFACE IMPORTED)
+ target_link_libraries(Libmng::Libmng INTERFACE PkgConfig::Libmng)
+ set(Libmng_FOUND TRUE)
+ endif()
+endif()
+
+if(NOT TARGET Libmng::Libmng)
+ find_library(LIBMNG_LIBRARY NAMES mng)
+ find_path(LIBMNG_INCLUDE_DIR libmng.h)
+
+ if(LIBMNG_LIBRARY AND LIBMNG_INCLUDE_DIR)
+ add_library(Libmng::Libmng UNKNOWN IMPORTED)
+ set_target_properties(Libmng::Libmng PROPERTIES
+ IMPORTED_LOCATION ${LIBMNG_LIBRARY}
+ INTERFACE_INCLUDE_DIRECTORIES ${LIBMNG_INCLUDE_DIR}
+ )
+ endif()
+
+ include(FindPackageHandleStandardArgs)
+ find_package_handle_standard_args(Libmng REQUIRED_VARS
+ LIBMNG_LIBRARY
+ LIBMNG_INCLUDE_DIR
+ )
+endif()
diff --git a/cmake/FindWrapJasper.cmake b/cmake/FindWrapJasper.cmake
index e25d21b..871554b 100644
--- a/cmake/FindWrapJasper.cmake
+++ b/cmake/FindWrapJasper.cmake
@@ -1,3 +1,13 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+# We can't create the same interface imported target multiple times, CMake will complain if we do
+# that. This can happen if the find_package call is done in multiple different subdirectories.
+if(TARGET WrapJasper::WrapJasper)
+ set(WrapJasper_FOUND TRUE)
+ return()
+endif()
+
set(WrapJasper_FOUND OFF)
find_package(Jasper)
diff --git a/cmake/FindWrapWebP.cmake b/cmake/FindWrapWebP.cmake
index de4c414..574cbd2 100644
--- a/cmake/FindWrapWebP.cmake
+++ b/cmake/FindWrapWebP.cmake
@@ -1,3 +1,6 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
# Latest upstream package provides both CMake and autotools building.
# Unfortunately Linux distros and homebrew build the package with autotools,
# so they do not ship the CMake Config file, but only the pkg-config files.
@@ -5,15 +8,22 @@
# So try config files first, and then use the regular find_library / find_path dance with pkg-config
# paths as hints.
+# We can't create the same interface imported target multiple times, CMake will complain if we do
+# that. This can happen if the find_package call is done in multiple different subdirectories.
+if(TARGET WrapWebP::WrapWebP)
+ set(WrapWebP_FOUND TRUE)
+ return()
+endif()
+
find_package(WebP QUIET)
-if(TARGET WebP::webp AND TARGET WebP::webpdemux AND TARGET WebP::webpmux)
+if(TARGET WebP::webp AND TARGET WebP::webpdemux AND TARGET WebP::libwebpmux)
set(WrapWebP_FOUND ON)
add_library(WrapWebP::WrapWebP INTERFACE IMPORTED)
- target_link_libraries(WrapWebP::WrapWebP INTERFACE WebP::webp WebP::webpdemux Webp::webpmux)
+ target_link_libraries(WrapWebP::WrapWebP INTERFACE WebP::webp WebP::webpdemux WebP::libwebpmux)
return()
endif()
-find_package(PkgConfig)
+find_package(PkgConfig QUIET)
pkg_check_modules(PC_WebP libwebp)
pkg_check_modules(PC_WebPDemux libwebpdemux)
pkg_check_modules(PC_WebPMux libwebpmux)
@@ -33,13 +43,13 @@ find_path(WebP_mux_INCLUDE_DIR NAMES "webp/mux.h"
HINTS ${PC_WebPMux_INCLUDEDIR})
include(FindPackageHandleStandardArgs)
-find_package_handle_standard_args(WebP DEFAULT_MSG WebP_INCLUDE_DIR WebP_LIBRARY
- WebP_demux_INCLUDE_DIR WebP_demux_LIBRARY
- WebP_mux_INCLUDE_DIR WebP_mux_LIBRARY)
+find_package_handle_standard_args(WrapWebP DEFAULT_MSG WebP_INCLUDE_DIR WebP_LIBRARY
+ WebP_demux_INCLUDE_DIR WebP_demux_LIBRARY
+ WebP_mux_INCLUDE_DIR WebP_mux_LIBRARY)
mark_as_advanced(WebP_INCLUDE_DIR WebP_LIBRARY WebP_demux_INCLUDE_DIR WebP_demux_LIBRARY WebP_mux_INCLUDE_DIR WebP_mux_LIBRARY)
-if(WebP_FOUND)
- set(WrapWebP_FOUND ON)
+if(WrapWebP_FOUND)
+ set(WebP_FOUND ON)
add_library(WrapWebP::WrapWebP INTERFACE IMPORTED)
target_link_libraries(WrapWebP::WrapWebP INTERFACE ${WebP_LIBRARY} ${WebP_demux_LIBRARY} ${WebP_mux_LIBRARY})
target_include_directories(WrapWebP::WrapWebP
diff --git a/coin/axivion/ci_config_linux.json b/coin/axivion/ci_config_linux.json
new file mode 100644
index 0000000..06eb498
--- /dev/null
+++ b/coin/axivion/ci_config_linux.json
@@ -0,0 +1,40 @@
+{
+ "Project": {
+ "BuildSystemIntegration": {
+ "child_order": [
+ "GCCSetup",
+ "CMake",
+ "LinkLibraries"
+ ]
+ },
+ "CMake": {
+ "_active": true,
+ "_copy_from": "CMakeIntegration",
+ "build_environment": {},
+ "build_options": "-j4",
+ "generate_options": "--fresh",
+ "generator": "Ninja"
+ },
+ "GCCSetup": {
+ "_active": true,
+ "_copy_from": "Command",
+ "build_command": "gccsetup --cc gcc --cxx g++ --config ../../../axivion/"
+ },
+ "LinkLibraries": {
+ "_active": true,
+ "_copy_from": "AxivionLinker",
+ "input_files": [
+ "build/plugins/*/lib*.so*.ir"
+ ],
+ "ir": "build/$(env:TESTED_MODULE_COIN).ir"
+ }
+ },
+ "_Format": "1.0",
+ "_Version": "7.6.2",
+ "_VersionNum": [
+ 7,
+ 6,
+ 2,
+ 12725
+ ]
+}
diff --git a/configure.cmake b/configure.cmake
new file mode 100644
index 0000000..68f54ce
--- /dev/null
+++ b/configure.cmake
@@ -0,0 +1,24 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+
+
+#### Inputs
+
+
+
+#### Libraries
+
+
+
+#### Tests
+
+
+
+#### Features
+
+
+qt_extra_definition("QT_VERSION_STR" "\"${PROJECT_VERSION}\"" PUBLIC)
+qt_extra_definition("QT_VERSION_MAJOR" ${PROJECT_VERSION_MAJOR} PUBLIC)
+qt_extra_definition("QT_VERSION_MINOR" ${PROJECT_VERSION_MINOR} PUBLIC)
+qt_extra_definition("QT_VERSION_PATCH" ${PROJECT_VERSION_PATCH} PUBLIC)
diff --git a/configure.json b/configure.json
deleted file mode 100644
index 550aebd..0000000
--- a/configure.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "subconfigs": [
- "src/imageformats"
- ]
-}
diff --git a/dependencies.yaml b/dependencies.yaml
index 4c811a7..c41fea5 100644
--- a/dependencies.yaml
+++ b/dependencies.yaml
@@ -1,4 +1,4 @@
dependencies:
../qtbase:
- ref: 9edfb7a1b5f8c9e8e6ddaa08637ce710e7917b77
+ ref: e011c3c4b023e5bf206271e642cb55029b614985
required: true
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.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/dist/changes-6.0.0 b/dist/changes-6.0.0
new file mode 100644
index 0000000..f1f569f
--- /dev/null
+++ b/dist/changes-6.0.0
@@ -0,0 +1,17 @@
+Qt 6.0.0 is a new major version release of Qt. It is not binary compatible with
+earlier Qt releases.
+
+The goal has been to retain as much source compatibility with Qt 5.15 as
+possible, but some changes were inevitable to make Qt a better framework.
+
+To make it easier to port to Qt 6.0, we have created a porting guide to
+summarize those changes and provide guidance to handle them. In the guide, you
+can find links to articles about changes that may affect your application and
+help you transition from Qt 5.15 to Qt 6.0:
+
+https://doc.qt.io/qt-6/portingguide.html
+
+For more details refer to the online documentation of Qt 6.0:
+
+https://doc.qt.io/qt-6/index.html
+
diff --git a/licenseRule.json b/licenseRule.json
new file mode 100644
index 0000000..36f8125
--- /dev/null
+++ b/licenseRule.json
@@ -0,0 +1,84 @@
+[
+ {
+ "comment" : ["file_pattern_ending: strings matched against the end of a file name.",
+ "location keys: regular expression matched against the beginning of",
+ "the file path (relative to the git submodule root).",
+ "spdx: list of SPDX-License-Expression's allowed in the matching files.",
+ "-------------------------------------------------------",
+ "Files with the following endings are Build System licensed,",
+ "unless they are examples",
+ "Files with other endings can also be build system files"
+ ],
+ "file_pattern_ending" : ["CMakeLists.txt", ".cmake", ".pro", ".pri", ".prf",
+ "configure", "configure.bat", "cmake.in", "plist.in", "CMakeLists.txt.in"],
+ "location" : {
+ "" : {
+ "comment" : "Default",
+ "file type" : "build system",
+ "spdx" : ["BSD-3-Clause"]
+ },
+ "(.*)(examples/|snippets/)" : {
+ "comment" : "Example takes precedence",
+ "file type" : "examples and snippets",
+ "spdx" : ["LicenseRef-Qt-Commercial OR BSD-3-Clause"]
+ }
+ }
+ },
+ {
+ "comments" : ["Files with the following endings are Tool licensed,",
+ "unless they are examples.",
+ "Files with other endings can also be tool files."],
+ "file_pattern_ending" : [".sh", ".py", ".pl", ".bat", ".ps1"],
+ "location" :{
+ "" : {
+ "comment" : "Default",
+ "file type" : "tools and utils",
+ "spdx" : ["LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0"]
+ },
+ "(.*)(examples/|snippets/)" : {
+ "comment" : "Example takes precedence",
+ "file type" : "examples and snippets",
+ "spdx" : ["LicenseRef-Qt-Commercial OR BSD-3-Clause"]
+ }
+ }
+ },
+ {
+ "comment" : "Files with the following endings are Documentation licensed.",
+ "file_pattern_ending" : [".qdoc", ".qdocinc" , ".qdocconf", ".txt", "README", "qt_attribution.json"],
+ "location" :{
+ "" : {
+ "comment" : "",
+ "file type" : "documentation",
+ "spdx" : ["LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only"]
+ }
+ }
+ },
+ {
+ "comment" : ["All other files",
+ "The licensing is defined only by the file location in the Qt module repository.",
+ "NO <file_pattern_ending> key for this case!",
+ "This needs to be the last entry of the file."],
+ "location" : {
+ "" : {
+ "comment" : "Default",
+ "file type" : "module and plugin",
+ "spdx" : ["LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only"]
+ },
+ "src/" : {
+ "comment" : "Default",
+ "file type" : "module and plugin",
+ "spdx" : ["LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only"]
+ },
+ "tests/" : {
+ "comment" : "Default",
+ "file type" : "test",
+ "spdx" : ["LicenseRef-Qt-Commercial OR GPL-3.0-only"]
+ },
+ "(.*)(examples/|snippets/)" : {
+ "comment" : "Default",
+ "file type" : "examples and snippets",
+ "spdx" : ["LicenseRef-Qt-Commercial OR BSD-3-Clause"]
+ }
+ }
+ }
+]
diff --git a/qt_cmdline.cmake b/qt_cmdline.cmake
new file mode 100644
index 0000000..1718f48
--- /dev/null
+++ b/qt_cmdline.cmake
@@ -0,0 +1 @@
+qt_commandline_subconfig(src/imageformats)
diff --git a/qtimageformats.pro b/qtimageformats.pro
deleted file mode 100644
index fe127be..0000000
--- a/qtimageformats.pro
+++ /dev/null
@@ -1,3 +0,0 @@
-requires(qtHaveModule(gui))
-
-load(qt_parts)
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..87b5f12 100644
--- a/src/3rdparty/libtiff/ChangeLog
+++ b/src/3rdparty/libtiff/ChangeLog
@@ -1,3 +1,6174 @@
+2023-09-05 Even Rouault <even.rouault@spatialys.com>
+
+ libtiff v4.6.0 released
+
+2023-09-05 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_600' into 'master'
+ CMake: fix build with -Dstrip-chopping=off (fixes #600)
+
+ See merge request libtiff/libtiff!527
+
+2023-09-05 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'georgthegreat-master-patch-87447' into 'master'
+ Fix using __attribute__ libtiff with clang-for-windows
+
+ See merge request libtiff/libtiff!525
+
+2023-09-05 Yuriy Chernyshov <georgthegreat@gmail.com>
+
+ Fix using __attribute__ libtiff with clang-for-windows.
+
+2023-09-05 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'manpage_TIFFField_docu_update' into 'master'
+ manpages: TiffField functions documentation updated with return behaviour for...
+
+ See merge request libtiff/libtiff!526
+
+2023-09-05 Even Rouault <even.rouault@spatialys.com>
+
+ CMake: fix build with -Dstrip-chopping=off (fixes #600)
+
+2023-09-03 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'consistently_update_TIFF-version_from_configure-ac' into 'master'
+ Update CMake and autoconf scripts to consistently update LibTIFF version...
+
+ See merge request libtiff/libtiff!456
+
+2023-09-03 Su Laus <sulau@freenet.de>
+
+ Update CMake and autoconf scripts to consistently update LibTIFF version defines and references in various files when version definition in configure.ac has been changed.
+ - Move in tiffvers.h from .\libtiff source directory to .\libtiff build directory.
+ - Remove unused version information from tif_config.h
+ - With every CMake build the version defines (e.g. 4.5.1) within tiffvers.h are consistently updated from configure.ac. The version release-date is taken from file RELEASE-DATE.
+ - The files VERSION and RELEASE-DATE are only updated with a special CMake target build: cmake --build . --target tiff_release.
+
+ - For autotools, version information is updated from configure.ac with ./autogen.sh. LIBTIFF_RELEASE_DATE is taken form file RELEASE-DATE.
+ - ./configure generates tiffvers.h with the cached version information and LIBTIFF_RELEASE_DATE.
+ - "make release" updates tiffvers.h and VERSION file with cached version info and RELEASE-DATE file and tiffves.h with the current date.
+
+2023-08-28 Su_Laus <sulau@freenet.de>
+
+ manpages: TiffField functions documentation updated with return behaviour for not defined tags and determination of write-/read-count size.
+
+2023-08-22 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'change_long_to_int32_t_in_two_test_apps' into 'master'
+ Change "long" to "int32_t" in two test apps, because can be either int32_t or...
+
+ See merge request libtiff/libtiff!524
+
+2023-08-21 Su_Laus <sulau@freenet.de>
+
+ Change "long" to "int32_t" in two test apps, because can be either int32_t or int64_t, depending on compiler and system.
+
+2023-08-16 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'CI_CMake_static_build' into 'master'
+ Add static build for CI/CD to run testcases which need private interface functions.
+
+ See merge request libtiff/libtiff!521
+
+2023-08-16 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_#597_tiffset_different_signedness' into 'master'
+ tiffset fix #597: warning: comparison of integer expressions of different signedness.
+
+ Closes #597
+
+ See merge request libtiff/libtiff!523
+
+2023-08-16 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tiffcp_remove_i_option' into 'master'
+ tiffcp: remove -i option (ignore errors)
+
+ See merge request libtiff/libtiff!522
+
+2023-08-16 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'move_tools_to_unsupported_a_archive' into 'master'
+ Move most TIFF tools to archive and keep some as unsupported (see #580).
+
+ See merge request libtiff/libtiff!520
+
+2023-08-16 Su Laus <sulau@freenet.de>
+
+ Move most TIFF tools to archive and keep some as unsupported (see #580).
+
+2023-08-12 Su_Laus <sulau@freenet.de>
+
+ Add static build for CI/CD to run testcases which need private interface functions.
+
+ tiffset fix #597: warning: comparison of integer expressions of different signedness.
+
+ Remove -i option (ignore errors) from tiffcp, because almost all fuzzer issues were consequential errors from ignored errors because of the "-i" option.
+
+2023-08-11 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_585_test_write_read_tags_autoconf' into 'master'
+ Add missing test_write_read_tags.c and test_transferfunction_write_read.c in...
+
+ Closes #585
+
+ See merge request libtiff/libtiff!519
+
+2023-07-24 Even Rouault <even.rouault@spatialys.com>
+
+ Fix copy paste error.
+
+2023-07-23 Su_Laus <sulau@freenet.de>
+
+ Add missing test_write_read_tags.c and test_transferfunction_write_read.c in tarball (fixes #585) and correct „long“ issue.
+ Don't use "long" because can be int32_t or int64_t, depending on compiler and system.
+
+2023-07-20 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'clang-format-tools' into 'master'
+ Automatically format with clang-format
+
+ See merge request libtiff/libtiff!518
+
+2023-07-20 Timothy Lyanguzov <timothy.lyanguzov@sap.com>
+
+ Automatically format with clang-format.
+
+2023-07-20 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_589' into 'master'
+ TiffConfig.cmake.in: set TIFF_INCLUDE_DIR, TIFF_INCLUDE_DIRS and...
+
+ Closes #589
+
+ See merge request libtiff/libtiff!514
+
+2023-07-20 Even Rouault <even.rouault@spatialys.com>
+
+ TiffConfig.cmake.in: set TIFF_INCLUDE_DIR, TIFF_INCLUDE_DIRS and...
+
+2023-07-19 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'master-patch-6fc6' into 'master'
+ raw2tiff: fix integer overflow and bypass of the check (fixes #592)
+
+ See merge request libtiff/libtiff!516
+
+2023-07-19 Arie Haenel <arie.haenel@jct.ac.il>
+
+ raw2tiff: fix integer overflow and bypass of the check (fixes #592)
+
+2023-07-19 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'master-patch-05a4' into 'master'
+ tiffcp: fix memory corruption (overflow) on hostile images (fixes #591)
+
+ See merge request libtiff/libtiff!515
+
+2023-07-19 Arie Haenel <arie.haenel@jct.ac.il>
+
+ tiffcp: fix memory corruption (overflow) on hostile images (fixes #591)
+
+2023-07-17 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix-numtrunc' into 'master'
+ fix numtrunc at tiff_dirread.c
+
+ See merge request libtiff/libtiff!512
+
+2023-07-17 headshog <craaaaaachind@gmail.com>
+
+ TIFFReadDirectoryCheckOrder: avoid integer overflow.
+ When it occurs, it should be harmless in practice though
+
+2023-07-17 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'webp_lossless_exact' into 'master'
+ WebP codec: turn exact mode when creating lossless files to avoid altering...
+
+ See merge request libtiff/libtiff!511
+
+2023-07-11 Even Rouault <even.rouault@spatialys.com>
+
+ WebP codec: turn exact mode when creating lossless files to avoid altering R,G,B values in areas where alpha=0
+ Fixes https://github.com/OSGeo/gdal/issues/8038
+
+2023-07-05 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'webp_reg_fix' into 'master'
+ WebP decoder: fix error when reading a 3-band blob in a RGBA image
+
+ See merge request libtiff/libtiff!510
+
+2023-07-05 Even Rouault <even.rouault@spatialys.com>
+
+ WebP decoder: fix error when reading a 3-band blob in a RGBA image.
+ Fixes regression of 350ff161c8a61b6483a1e4689e09cd47dd0dd5f9 (master only)
+
+2023-06-26 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'appveyor_fix' into 'master'
+ .appveyor.yml: workaround build error
+
+ See merge request libtiff/libtiff!509
+
+2023-06-26 Even Rouault <even.rouault@spatialys.com>
+
+ .appveyor.yml: workaround build error.
+
+2023-06-26 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tif_webp_warning_fixes' into 'master'
+ tif_webp.c: fix signed vs unsigned comparison warnings (fix previous commit)
+
+ See merge request libtiff/libtiff!508
+
+2023-06-26 Even Rouault <even.rouault@spatialys.com>
+
+ tif_webp.c: fix signed vs unsigned comparison warnings (fix previous commit)
+
+2023-06-26 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_TransferFunction_writing' into 'master'
+ Fix TransferFunction writing of only two transfer functions.
+
+ See merge request libtiff/libtiff!502
+
+2023-06-26 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_581_582' into 'master'
+ WebP decoder: validate WebP blob width, height, band count against TIFF parameters
+
+ Closes #582 et #581
+
+ See merge request libtiff/libtiff!507
+
+2023-06-19 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'warning_cmake_config_file' into 'master'
+ v4.5.1 release note: add warning about CMake config file being preview
+
+ See merge request libtiff/libtiff!506
+
+2023-06-17 Even Rouault <even.rouault@spatialys.com>
+
+ WebP decoder: validate WebP blob width, height, band count against TIFF parameters
+ to avoid use of uninitialized variable, or decoding corrupted content
+ without explicit error
+
+ Fixes #581, fixes #582
+
+2023-06-15 Even Rouault <even.rouault@spatialys.com>
+
+ v4.5.1 release note: add warning about CMake config file being preview.
+
+2023-06-14 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'HOWTO-RELEASE-gitlab-release' into 'master'
+ HOWTO-RELEASE: mention creating a gitlab release
+
+ See merge request libtiff/libtiff!505
+
+2023-06-14 Even Rouault <even.rouault@spatialys.com>
+
+ HOWTO-RELEASE: mention creating a gitlab release.
+
+2023-06-10 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'TIFFOpenWExt_O_RDWR' into 'master'
+ TIFFOpenWExt(): mode r+ in the Windows implementation adjusted to that of Linux
+
+ See merge request libtiff/libtiff!504
+
+2023-06-10 Even Rouault <even.rouault@spatialys.com>
+
+ TIFFOpenWExt(): mode r+ in the Windows implementation adjusted to that of Linux
+
+2023-06-10 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_ossfuzz_59751' into 'master'
+ TIFFReadDirectory(): fix crash when reading tag TIFFTAG_EP_BATTERYLEVEL
+
+ See merge request libtiff/libtiff!503
+
+2023-06-10 Even Rouault <even.rouault@spatialys.com>
+
+ TIFFReadDirectory(): fix crash when reading tag TIFFTAG_EP_BATTERYLEVEL.
+ Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=59751
+
+ In 738e0409 (refs #575), we disabled DNG / EP tags, but there was a
+ special proessing for TIFFTAG_EP_BATTERYLEVEL that must be disabled
+ since the tag is no longer defined.
+
+2023-06-09 Su_Laus <sulau@freenet.de>
+
+ Fix TransferFunction writing of only two transfer functions. The TIFFWriteDirectoryTagTransferfunction() function writes in some cases only two transfer functions, although only exactly one or exactly three transfer functions are allowed. This then leads to an error when reading. --> TIFFReadDirectory: Warning, Incorrect count for "TransferFunction"; tag ignored.
+ This MR corrects the behaviour of TIFFWriteDirectoryTagTransferfunction() accordingly. Furthermore, a possible buffer overflow is avoided.
+
+2023-06-09 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_win_build' into 'master'
+ Fix Windows build
+
+ Closes #578
+
+ See merge request libtiff/libtiff!501
+
+2023-06-09 Even Rouault <even.rouault@spatialys.com>
+
+ cmake/PkgConfig.cmake: avoid CMake error when prefix or suffix is empty.
+
+ Add tif_win32_versioninfo.rc and tif_tools_versioninfo.rc to EXTRA_DIST.
+
+2023-06-09 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_coverity_build' into 'master'
+ build/gitlab-ci: fix coverity_build()
+
+ See merge request libtiff/libtiff!499
+
+2023-06-09 Even Rouault <even.rouault@spatialys.com>
+
+ build/gitlab-ci: fix coverity_build()
+
+2023-06-09 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'v4.5.1rc1_preparation' into 'master'
+ Prepare release 4.5.1
+
+ See merge request libtiff/libtiff!498
+
+2023-06-09 Even Rouault <even.rouault@spatialys.com>
+
+ Prepare for v4.5.1 release.
+
+ Merge remote-tracking branch 'sulaus/Rel_4.5.1_preparation'
+
+2023-06-09 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'disable_dng_tags' into 'master'
+ tif_dirinfo.c: disable DNG 1.2->1.6 tags
+
+ Closes #575
+
+ See merge request libtiff/libtiff!497
+
+2023-06-09 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_577' into 'master'
+ CMake related fixes
+
+ Closes #577
+
+ See merge request libtiff/libtiff!496
+
+2023-06-09 Even Rouault <even.rouault@spatialys.com>
+
+ libtiff v4.5.1 released
+
+2023-06-09 Even Rouault <even.rouault@spatialys.com>
+
+ Merge remote-tracking branch 'sulaus/Rel_4.5.1_preparation'
+
+2023-06-09 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'disable_dng_tags' into 'master'
+ tif_dirinfo.c: disable DNG 1.2->1.6 tags
+
+ Closes #575
+
+ See merge request libtiff/libtiff!497
+
+2023-06-09 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_577' into 'master'
+ CMake related fixes
+
+ Closes #577
+
+ See merge request libtiff/libtiff!496
+
+2023-06-07 Even Rouault <even.rouault@spatialys.com>
+
+ tif_dirinfo.c: disable DNG 1.2->1.6 tags.
+ They were added per b90b20d36d7833f54a1f3014c324f6c21b988006 but it has
+ been found in https://gitlab.com/libtiff/libtiff/-/issues/575 that it
+ could cause compatibity issues with libtiff users, so this addition
+ should be defered for a feature release (likely 4.6.0) and not a patch one.
+
+ Fixes #575
+
+2023-06-06 Timothy Lyanguzov <theta682@gmail.com>
+
+ Apply 1 suggestion(s) to 1 file(s)
+
+2023-06-05 Even Rouault <even.rouault@spatialys.com>
+
+ CI: add testing of find_package(Tiff CONFIG)
+
+ CMake: export TiffConfig.cmake and TiffConfigVersion.cmake files.
+
+ libtiff/CMakeLists.txt: fix export of INTERFACE_INCLUDE_DIRECTORIES.
+
+ libtiff/CMakeLists.txt: correctly define TIFF::tiff alias (fixes #577)
+
+2023-06-05 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'TIFFField_downgrade_errors_to_warnings' into 'master'
+ TIFFFieldWithName() and TIFFFieldWithTag() downgrade errors to warnings.
+
+ See merge request libtiff/libtiff!495
+
+2023-05-28 Su_Laus <sulau@freenet.de>
+
+ TIFFFieldWithName() and TIFFFieldWithTag() downgrade errors to warnings. see https://gitlab.com/libtiff/libtiff/-/issues/575#note_1407633888
+
+2023-05-25 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'bebuch-master-patch-58347' into 'master'
+ check if upstream lzma (xz) config was used and bind to it if so
+
+ See merge request libtiff/libtiff!494
+
+2023-05-25 Benjamin Buch <benni.buch@gmail.com>
+
+ check if upstream lzma (xz) config was used and bind to it if so.
+
+2023-05-25 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'upstream-zstd-config' into 'master'
+ check if upstream zstd config was used and bind to it if so
+
+ See merge request libtiff/libtiff!493
+
+2023-05-25 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'cmake_FindDeflate_bugs_see_526' into 'master'
+ CMake: FindDeflate several errors fixed (see #526)
+
+ See merge request libtiff/libtiff!491
+
+2023-05-24 Su_Laus <sulau@freenet.de>
+
+ CMake: FindDeflate several errors (see #526)
+ There are CMake issues if the library is not included in the environment path and only set with CMake -D option.
+ - For FindDeflate.cmake, FindJBIG.cmake, FindLERC.cmake, FindWebP.cmake, FindZSTD.cmake:
+ Set IMPORTED_LOCATION (without debug or release) if neither <library>_LIBRARY_RELEASE nor <library>_LIBRARY_DEBUG were set.
+ - FindDeflate.cmake: Correct code to retrieve library version information from libdeflate.h
+ - FindLERC.cmake version string return added.
+
+2023-05-24 Benjamin Buch <benni.buch@gmail.com>
+
+ prefer shared over static.
+
+ check if upstream zstd config was used and bind to it if so.
+
+2023-05-24 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'master' into 'master'
+ make WebP component name compatible with upstream ConfigWebP.cmake
+
+ See merge request libtiff/libtiff!492
+
+2023-05-24 Benjamin Buch <benni.buch@gmail.com>
+
+ CMake: make WebP component name compatible with upstream ConfigWebP.cmake
+
+2023-05-18 Su_Laus <sulau@freenet.de>
+
+ Prepare release 4.5.1 - Update till 18.05.23 after fix_559_DNG_1.6_passcount_error
+
+ Prepare release 4.5.1.
+
+2023-05-18 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_559_DNG_1.6_passcount_error' into 'master'
+ Fix #559 DNG 1.6 passcount assertion
+
+ Closes #574 et #559
+
+ See merge request libtiff/libtiff!489
+
+2023-05-18 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_557_TagExtender_for_CustomDirectories_not_possible' into 'master'
+ manpage: TIFFSetTagExtender() cannot add tags to custom directories. Closes #557.
+
+ Closes #557
+
+ See merge request libtiff/libtiff!490
+
+2023-05-18 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_559_DNG_1.6_passcount_error' into 'master'
+ Fix #559 DNG 1.6 passcount assertion
+
+ Closes #574 et #559
+
+ See merge request libtiff/libtiff!489
+
+2023-05-18 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_557_TagExtender_for_CustomDirectories_not_possible' into 'master'
+ manpage: TIFFSetTagExtender() cannot add tags to custom directories. Closes #557.
+
+ Closes #557
+
+ See merge request libtiff/libtiff!490
+
+2023-05-17 Su_Laus <sulau@freenet.de>
+
+ Documentation update: TIFFSetTagExtender() cannot add tags to custom directories.
+ Closes #557.
+
+2023-05-16 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_558' into 'master'
+ Hardcode HOST_FILLORDER to FILLORDER_LSB2MSB, and make 'H' flag of TIFFOpen()...
+
+ See merge request libtiff/libtiff!488
+
+2023-05-16 Su_Laus <sulau@freenet.de>
+
+ Fix #559 DNG 1.6 passcount assertion.
+ Amend DNG tags definition introduced with MR 482:
+ - DNG 1.6 tags specified as UTF-8 strings are defined as variable TIFF_BYTE with passcount=TRUE.
+ - For all tags with TIFF_SETGET_C32_UINT8 the readcount and writecount were corrected to -3 (TIFF_VARIABLE2).
+
+ Testprogram to write and read all tags defined within LibTIFF is introduced.
+ It also checks for valid passcount flag setting for the defined tags but some special tags are excluded from that check.
+
+ Closes #559.
+
+2023-05-09 Even Rouault <even.rouault@spatialys.com>
+
+ Hardcode HOST_FILLORDER to FILLORDER_LSB2MSB, and make 'H' flag of TIFFOpen() to warn and an alias of FILLORDER_MSB2LSB
+
+ tif_lerc.c: use WORDS_BIGENDIAN instead of HOST_BIGENDIAN.
+
+2023-05-07 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_484_TIFFDirectory_32_64_bit' into 'master'
+ Fix 484 TIFFDirectory td_fieldsset uses unsigned long which can be 32 or 64 bits.
+
+ Closes #484
+
+ See merge request libtiff/libtiff!471
+
+2023-05-07 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'DNG_1.6_EP_tags' into 'master'
+ Add DNG tags up to version 1.6.0.0 and some TIFF/EP tags and update documentation
+
+ See merge request libtiff/libtiff!482
+
+2023-05-07 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'issue547' into 'master'
+ do not install libtiff-4.pc when tiff-install is reset
+
+ Closes #547
+
+ See merge request libtiff/libtiff!481
+
+2023-05-06 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_548' into 'master'
+ LZWDecode(): avoid crash when trying to read again from a strip whith a...
+
+ Closes #548
+
+ See merge request libtiff/libtiff!484
+
+2023-05-06 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tiffcrop_fix_553_multi-image-errors' into 'master'
+ tiffcrop: fix 553 by considering error return of writeSelections()
+
+ Closes #553
+
+ See merge request libtiff/libtiff!485
+
+2023-05-06 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tif_ojpeg_fix-554_FPE' into 'master'
+ tif_ojpeg.c fix 554 by checking for division by zero
+
+ Closes #554
+
+ See merge request libtiff/libtiff!486
+
+2023-05-06 Su Laus <sulau@freenet.de>
+
+ tif_ojpeg.c fix 554 by checking for division by zero.
+
+2023-05-05 Su_Laus <sulau@freenet.de>
+
+ Consider error return of writeSelections(). Fixes #553.
+
+2023-04-29 Even Rouault <even.rouault@spatialys.com>
+
+ LZWDecode(): avoid crash when trying to read again from a strip whith a missing end-of-information marker (fixes #548)
+
+2023-04-25 Su_Laus <sulau@freenet.de>
+
+ Add DNG tags up to version 1.6.0.0 and some TIFF/EP tags and update documentation
+ Amend MR !337 'Add support for DNG tags up to version 1.6.0.0 and some TIFF/EP tags' from Sami Liedes:
+ - Set most tags to OkToChange=1.
+ - Define BATTERYLEVEL tag as ASCII and convert values of rational variant to ASCII.
+ - TIFF documentation updated for tags recognized by LibTiff (DNG 1.6 and others).
+ - TIFF/EP tags added, which are equivalent to EXIF tags. This addresses part of #418 as well.
+ - Definition of tags reformatted (clang-format off) for better readability of tag comments in tiff.h and tif_dirinfo.c
+
+2023-04-23 Roman <kosobrodov@fastmail.fm>
+
+ do not install libtiff-4.pc when tiff-install is reset.
+
+2023-04-21 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'mymaster1' into 'master'
+ fix runtime error: applying zero offset to null pointer
+
+ See merge request libtiff/libtiff!479
+
+2023-04-21 xiaoxiaoafeifei <lliangliang2007@163.com>
+
+ countInkNamesString(): fix `UndefinedBehaviorSanitizer`: applying zero offset to null pointer
+
+2023-03-26 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tif_ovrcache_TIFFSetSubDirectory' into 'master'
+ tif_ovrcache.c: check TIFFSetSubDirectory() return value (CID 1524573)
+
+ See merge request libtiff/libtiff!478
+
+2023-03-26 Even Rouault <even.rouault@spatialys.com>
+
+ tif_ovrcache.c: check TIFFSetSubDirectory() return value (CID 1524573)
+
+2023-03-26 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'even_faster_setdirectory_with_IFDlist' into 'master'
+ Even faster TIFFSetDirectory() using IFD list.
+
+ See merge request libtiff/libtiff!477
+
+2023-03-26 Su Laus <sulau@freenet.de>
+
+ Even faster TIFFSetDirectory() using IFD list.
+
+2023-03-12 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'faster-setdirectory_newMR' into 'master'
+ Optimize relative seeking with TIFFSetDirectory
+
+ See merge request libtiff/libtiff!474
+
+2023-03-12 Su Laus <sulau@freenet.de>
+
+ Optimize relative seeking with TIFFSetDirectory.
+
+2023-03-11 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'master' into 'master'
+ Fix memory leak in tiffcrop.c
+
+ See merge request libtiff/libtiff!475
+
+2023-03-08 zhailiangliang <zhailiangliang@loongson.cn>
+
+ Fix memory leak in tiffcrop.c.
+
+2023-02-23 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'skip-thumbnail-test' into 'master'
+ test: avoid running tool tests if not built
+
+ Closes #421
+
+ See merge request libtiff/libtiff!334
+
+2023-02-22 Sam James <sam@gentoo.org>
+
+ test (cmake): skip script tests if tools aren't built.
+ In Gentoo, we avoid building the tools for multilib (32-bit, x86) builds on
+ amd64/x86_64 because we only need the library to keep binary applications working.
+
+ This causes a test failure in e.g. tiffcp-thumbnail.sh as the 'thumbnail'
+ binary isn't built. Skip it if unavailable.
+
+ Fixes: https://gitlab.com/libtiff/libtiff/-/issues/421
+
+2023-02-22 Sam James <sam@gentoo.org>
+
+ test (autotools): skip script tests if tools aren't built.
+ In Gentoo, we avoid building the tools for multilib (32-bit, x86) builds on
+ amd64/x86_64 because we only need the library to keep binary applications working.
+
+ This causes a test failure in e.g. tiffcp-thumbnail.sh as the 'thumbnail'
+ binary isn't built. Skip it if unavailable.
+
+ Fixes: https://gitlab.com/libtiff/libtiff/-/issues/421
+
+2023-02-16 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_Unlink_first_directory_0' into 'master'
+ Fix TIFFUnlinkDirectory(0) case and unlink of first directory.
+
+ See merge request libtiff/libtiff!460
+
+2023-02-16 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tif_luv_check_NaN_fix_#530' into 'master'
+ tif_luv: Check and correct for NaN data in uv_encode().
+
+ Closes #530
+
+ See merge request libtiff/libtiff!473
+
+2023-02-16 Su_Laus <sulau@freenet.de>
+
+ tif_luv: Check and correct for NaN data in uv_encode().
+ Closes #530
+
+ See merge request !473
+
+2023-02-14 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tiffcrop_dont_reuse_input_buffer_fix_527' into 'master'
+ tiffcrop: Do not reuse input buffer for subsequent images. Fix issue 527
+
+ Closes #527
+
+ See merge request libtiff/libtiff!472
+
+2023-02-14 Su_Laus <sulau@freenet.de>
+
+ tiffcrop: Do not reuse input buffer for subsequent images. Fix issue 527
+ Reuse of read_buff within loadImage() from previous image is quite unsafe, because other functions (like rotateImage() etc.) reallocate that buffer with different size without updating the local prev_readsize value.
+
+ Closes #527
+
+2023-02-08 Su_Laus <sulau@freenet.de>
+
+ Fix 484 TIFFDirectory td_fieldsset uses unsigned long which can be 32 or 64 bits.
+ Closes #484
+
+2023-02-08 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'test_ifd_loop_detection_fix_CoverityScan_ln_55' into 'master'
+ test_ifd_loop_detection: fix Coverity Scan issue CID 1520750: Null pointer...
+
+ See merge request libtiff/libtiff!470
+
+2023-02-08 Su_Laus <sulau@freenet.de>
+
+ test_ifd_loop_detection: fix Coverity Scan issue CID 1520750: Null pointer dereferences (NULL_RETURNS) line 55.
+
+2023-02-06 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tiffcrop_fix_CoverityScan_line_9676' into 'master'
+ Fix Coverity Scan issue CID 1520761: Integer handling issues...
+
+ See merge request libtiff/libtiff!469
+
+2023-02-06 Su_Laus <sulau@freenet.de>
+
+ Fix Coverity Scan issue CID 1520761: Integer handling issues (OVERFLOW_BEFORE_WIDEN) tiffcrop.c: 9676 in rotateImage()
+
+2023-02-05 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tiffcrop_R270_fix#492' into 'master'
+ tiffcrop: Amend rotateImage() not to toggle the input (main) image width and...
+
+ Closes #519, #518, #499, #495, #494, #493 et #492
+
+ See merge request libtiff/libtiff!465
+
+2023-02-05 Su_Laus <sulau@freenet.de>
+
+ tiffcrop: Amend rotateImage() not to toggle the input (main) image width and length parameters when only cropped image sections are rotated. Remove buffptr from region structure because never used.
+ Closes #492 #493 #494 #495 #499 #518 #519
+
+2023-02-05 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tiffcrop_correctly_update_buffersize_after_rotate_fix#520' into 'master'
+ tiffcrop correctly update buffersize after rotateImage() fix#520
+
+ Closes #520
+
+ See merge request libtiff/libtiff!467
+
+2023-02-05 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tiffcrop_composite_image_assumption_test_fix#496' into 'master'
+ tiffcrop: added check for assumption on composite images (fixes #496)
+
+ Closes #501, #500, #498, #497 et #496
+
+ See merge request libtiff/libtiff!466
+
+2023-02-05 Su Laus <sulau@freenet.de>
+
+ tiffcrop: added check for assumption on composite images (fixes #496)
+ tiffcrop: For composite images with more than one region, the combined_length or combined_width always needs to be equal, respectively. Otherwise, even the first section/region copy action might cause buffer overrun. This is now checked before the first copy action.
+
+ Closes #496, #497, #498, #500, #501.
+
+2023-02-04 Su_Laus <sulau@freenet.de>
+
+ tiffcrop correctly update buffersize after rotateImage() fix#520 -- enlarge buffsize and check integer overflow within rotateImage().
+
+2023-02-04 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'test_subidf_loop' into 'master'
+ test_ifd_loop_detection: Added test to check loops in SubIFDs that are chained.
+
+ See merge request libtiff/libtiff!464
+
+2023-02-04 Su Laus <sulau@freenet.de>
+
+ test_ifd_loop_detection: Added test to check loops in SubIFDs that are chained.
+
+2023-02-04 Su_Laus <sulau@freenet.de>
+
+ Fix TIFFUnlinkDirectory(0) case and unlink of first directory.
+ If directory number 0 is unlinked, then the base offset variables within LibTiff are not updated. As a result, a subsequent TIFFSetDirectory() first goes to the unlinked former directory number 0.
+
+ In addition, the error case for dirn=0 is handled.
+
+ This MR fixes that by updating the base offset variables tif->tif_header.classic.tiff_diroff and tif->tif_header.big.tiff_diroff.
+
+2023-02-03 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'TiffClose_NULL_ptr_dereferencing_fix_515' into 'master'
+ TIFFClose() avoid NULL pointer dereferencing. fix#515
+
+ Closes #515
+
+ See merge request libtiff/libtiff!468
+
+2023-02-03 Su_Laus <sulau@freenet.de>
+
+ TIFFClose() avoid NULL pointer dereferencing. fix#515.
+ Closes #515
+
+ tiffcrop correctly update buffersize after rotateImage() fix#520 rotateImage() set up a new buffer and calculates its size individually. Therefore, seg_buffs[] size needs to be updated accordingly. Before this fix, the seg_buffs buffer size was calculated with a different formula than within rotateImage().
+ Closes #520.
+
+2023-01-25 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'add_windows_DLL_versioninfo' into 'master'
+ Add versioninfo resource files for DLL and tools compiled with Windows MSVC and MINGW.
+
+ See merge request libtiff/libtiff!455
+
+2023-01-25 Su Laus <sulau@freenet.de>
+
+ Add versioninfo resource files for DLL and tools compiled with Windows MSVC and MINGW.
+
+2023-01-22 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tif_hash_set_order_include' into 'master'
+ tif_hash_set.c: include tif_hash_set.h after tif_config.h to let a chance for...
+
+ See merge request libtiff/libtiff!462
+
+2023-01-22 Even Rouault <even.rouault@spatialys.com>
+
+ tif_hash_set.c: include tif_hash_set.h after tif_config.h to let a chance for GDAL symbol renaming trick
+
+2023-01-22 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_513' into 'master'
+ Fax3: fix failure to decode some fax3 images (fixes #513)
+
+ Closes #513
+
+ See merge request libtiff/libtiff!461
+
+2023-01-21 Even Rouault <even.rouault@spatialys.com>
+
+ Add test for Fax3 decoding issues (refs #513)
+
+2023-01-21 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tiffcrop_fix_#488' into 'master'
+ tiffcrop: Correct simple copy paste error. Fix #488.
+
+ Closes #488
+
+ See merge request libtiff/libtiff!459
+
+2023-01-21 Su Laus <sulau@freenet.de>
+
+ tiffcrop: Correct simple copy paste error. Fix #488.
+
+2023-01-21 Even Rouault <even.rouault@spatialys.com>
+
+ Fax3: fix failure to decode some fax3 images (fixes #513)
+ Patch by @jsummers26
+
+2023-01-12 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'tiffmedian_fix_#477' into 'master'
+ tiffmedian: avoid zero num_colors, fixes #477
+
+ Closes #477
+
+ See merge request libtiff/libtiff!458
+
+2023-01-12 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fax2ps_fixes_#475' into 'master'
+ fax2ps: fixes #475 buffer overflow in qsort function pcompar.
+
+ Closes #475
+
+ See merge request libtiff/libtiff!457
+
+2023-01-12 Su_Laus <sulau@freenet.de>
+
+ tiffmedian: avoid zero num_colors, fixes #477.
+
+ fax2ps: fixes #475 buffer overflow in qsort function pcompar.
+
+2023-01-09 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'fix_241_tiffset_file_size_limit' into 'master'
+ tiffset: get filesize to allocate only the required memory. Fixes issue #241
+
+ Closes #241
+
+ See merge request libtiff/libtiff!451
+
+2023-01-09 Su Laus <sulau@freenet.de>
+
+ tiffset: get filesize to allocate only the required memory. Fixes issue #241
+
+2023-01-09 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch '_TIFFCleanupIFDOffsetAndNumberMaps' into 'master'
+ Add _TIFFCleanupIFDOffsetAndNumberMaps() and call it from TIFFUnlinkDirectory()
+
+ See merge request libtiff/libtiff!454
+
+2023-01-06 Even Rouault <even.rouault@spatialys.com>
+
+ Remove use of tif_dirnumber.
+
+ TIFFSetSubDirectory(): call _TIFFCleanupIFDOffsetAndNumberMaps()
+
+ struct tiff: remove unused tif_dirlistoff.
+
+ TIFFUnlinkDirectory(): reset tif_dirnumber.
+
+ Add _TIFFCleanupIFDOffsetAndNumberMaps() and call it from TIFFUnlinkDirectory()
+
+2022-12-29 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'cmake_in_files_formatting_sensitive' into 'master'
+ Disable clang-formatting for tif_config.h.cmake.in and tiffconf.h.cmake.in...
+
+ See merge request libtiff/libtiff!452
+
+2022-12-28 Su_Laus <sulau@freenet.de>
+
+ Disable clang-formatting for tif_config.h.cmake.in and tiffconf.h.cmake.in because sensitive for CMake scripts. - explanation added
+
+2022-12-26 Su_Laus <sulau@freenet.de>
+
+ Disable clang-formatting for tif_config.h.cmake.in and tiffconf.h.cmake.in because sensitive for CMake scripts.
+
+2022-12-19 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'manpage_multi-page-TIFF' into 'master'
+ manpage: Add multi page TIFF and SubIFDs description and read / write example.
+
+ See merge request libtiff/libtiff!450
+
+2022-12-19 Su Laus <sulau@freenet.de>
+
+ manpage: Add multi page TIFF and SubIFDs description and read / write example.
+
+2022-12-18 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'TIFFOpen_r+_windows_behaviour' into 'master'
+ Behavior of TIFFOpen() mode "r+" in the Windows implementation adjusted to that of Linux.
+
+ See merge request libtiff/libtiff!449
+
+2022-12-16 Su_Laus <sulau@freenet.de>
+
+ Behavior of TIFFOpen() mode "r+" in the Windows implementation adjusted to that of Linux.
+
+2022-12-15 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'ossfuzz_54343' into 'master'
+ TIFFSetDirectory: avoid harmless unsigned-integer-overflow
+
+ See merge request libtiff/libtiff!447
+
+2022-12-15 Even Rouault <even.rouault@spatialys.com>
+
+ TIFFSetDirectory: avoid harmless unsigned-integer-overflow.
+ Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=54343
+
+2022-12-14 Even Rouault <even.rouault@spatialys.com>
+
+ Merge branch 'ossfuzz_54311' into 'master'
+ TIFFWriteDirectorySec(): avoid harmless unsigned-integer-overflow
+
+ See merge request libtiff/libtiff!446
+
+2022-12-14 Even Rouault <even.rouault@spatialys.com>
+
+ TIFFWriteDirectorySec(): avoid harmless unsigned-integer-overflow.
+ Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=54311
+
+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 +6252,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 +6316,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 +6389,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 +6409,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 +6419,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 +6578,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 +6599,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 +6870,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 +7399,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 +7629,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 +8044,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 +8327,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 +8568,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 +8592,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 +9034,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 +9057,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 +9625,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 +9728,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 +10072,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 +11719,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 +11854,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 +12098,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 +12158,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 +12488,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 +12533,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 +12715,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 +13150,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 +14009,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 +14018,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 +14061,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 +14848,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 +15050,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 +15280,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 +15690,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..68d9434 100644
--- a/src/3rdparty/libtiff/RELEASE-DATE
+++ b/src/3rdparty/libtiff/RELEASE-DATE
@@ -1 +1 @@
-20191103
+20230908
diff --git a/src/3rdparty/libtiff/VERSION b/src/3rdparty/libtiff/VERSION
index ee74734..6016e8a 100644
--- a/src/3rdparty/libtiff/VERSION
+++ b/src/3rdparty/libtiff/VERSION
@@ -1 +1 @@
-4.1.0
+4.6.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..907d7f1 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,98 @@
* 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);
+
+ _TIFFCleanupIFDOffsetAndNumberMaps(tif);
+
+ /*
+ * 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);
+}
+
+/************************************************************************/
+/* _TIFFCleanupIFDOffsetAndNumberMaps() */
+/************************************************************************/
+
+void _TIFFCleanupIFDOffsetAndNumberMaps(TIFF *tif)
+{
+ if (tif->tif_map_dir_offset_to_number)
+ {
+ TIFFHashSetDestroy(tif->tif_map_dir_offset_to_number);
+ tif->tif_map_dir_offset_to_number = NULL;
+ }
+ if (tif->tif_map_dir_number_to_offset)
+ {
+ TIFFHashSetDestroy(tif->tif_map_dir_number_to_offset);
+ tif->tif_map_dir_number_to_offset = NULL;
+ }
}
/************************************************************************/
@@ -113,26 +141,18 @@ 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;
-
- TIFFCleanup(tif);
- (void) (*closeproc)(fd);
+ if (tif != NULL)
+ {
+ TIFFCloseProc closeproc = tif->tif_closeproc;
+ thandle_t fd = tif->tif_clientdata;
+
+ 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..7922155 100644
--- a/src/3rdparty/libtiff/libtiff/tif_config.h
+++ b/src/3rdparty/libtiff/libtiff/tif_config.h
@@ -2,20 +2,14 @@
Configuration defines for Qt.
*/
+#include "tiffconf.h"
+
#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS)
#define _CRT_SECURE_NO_WARNINGS
#endif
-#include <qglobal.h>
-#if defined(Q_OS_WINCE)
-# include <qfunctions_wince.h>
-#endif
-
-/* Define if building universal (internal helper macro) */
-/* #undef AC_APPLE_UNIVERSAL_BUILD */
-
/* 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 +19,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,16 +31,8 @@
*/
#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 */
@@ -59,140 +40,24 @@
/* Define to 1 if you have the `getopt' function. */
/* #undef HAVE_GETOPT */
-/* Define to 1 if you have the <GLUT/glut.h> header file. */
-/* #undef HAVE_GLUT_GLUT_H */
-
-/* Define to 1 if you have the <GL/glut.h> header file. */
-/* #undef HAVE_GL_GLUT_H */
-
-/* Define to 1 if you have the <GL/glu.h> header file. */
-/* #undef HAVE_GL_GLU_H */
-
-/* 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 */
-/* Define to 1 if you have the <OpenGL/glu.h> header file. */
-/* #undef HAVE_OPENGL_GLU_H */
-
-/* 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 +66,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 */
@@ -256,164 +87,52 @@
/* Define to the full name of this package. */
/* #undef PACKAGE_NAME */
-/* Define to the full name and version of this package. */
-/* #undef PACKAGE_STRING */
-
/* Define to the one symbol short name of this package. */
/* #undef PACKAGE_TARNAME */
/* Define to the home page for this package. */
/* #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 */
-
/* 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 */
+/* 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 +143,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..62a4c73
--- /dev/null
+++ b/src/3rdparty/libtiff/libtiff/tif_config.h.cmake.in
@@ -0,0 +1,139 @@
+/* clang-format off */
+/* clang-format disabled because CMake scripts are very sensitive to the
+ * formatting of this file. configure_file variables of type "@VAR@" are
+ * modified by clang-format and won't be substituted.
+ */
+
+/* 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 <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 `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 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@"
+
+/* Size of size_t */
+#define SIZEOF_SIZE_T @SIZEOF_SIZE_T@
+
+/* Default size of the strip in bytes (when strip chopping enabled) */
+#cmakedefine 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
+
+/* 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
+
+/* clang-format on */
diff --git a/src/3rdparty/libtiff/libtiff/tif_config.h.in b/src/3rdparty/libtiff/libtiff/tif_config.h.in
index 523da3e..28da641 100644
--- a/src/3rdparty/libtiff/libtiff/tif_config.h.in
+++ b/src/3rdparty/libtiff/libtiff/tif_config.h.in
@@ -1,7 +1,12 @@
-/* libtiff/tif_config.h.in. Generated from configure.ac by autoheader. */
+/* clang-format off */
+/* clang-format disabled because CMake scripts are very sensitive to the
+ * formatting of this file. configure_file variables of type "@VAR@" are
+ * modified by clang-format and won't be substituted.
+ */
-/* Define if building universal (internal helper macro) */
-#undef AC_APPLE_UNIVERSAL_BUILD
+/* libtiff/tif_config.h.in. Not generated, but originated from autoheader. */
+
+#include "tiffconf.h"
/* Support CCITT Group 3 & 4 algorithms */
#undef CCITT_SUPPORT
@@ -16,11 +21,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 +31,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
@@ -43,140 +40,42 @@
/* Define to 1 if you have the `getopt' function. */
#undef HAVE_GETOPT
-/* Define to 1 if you have the <GLUT/glut.h> header file. */
-#undef HAVE_GLUT_GLUT_H
-
-/* Define to 1 if you have the <GL/glut.h> header file. */
-#undef HAVE_GL_GLUT_H
-
-/* Define to 1 if you have the <GL/glu.h> header file. */
-#undef HAVE_GL_GLU_H
-
-/* 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
-/* Define to 1 if you have the <OpenGL/glu.h> header file. */
-#undef HAVE_OPENGL_GLU_H
-
-/* 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
@@ -186,134 +85,24 @@
/* Define to the full name of this package. */
#undef PACKAGE_NAME
-/* Define to the full name and version of this package. */
-#undef PACKAGE_STRING
-
/* Define to the one symbol short name of this package. */
#undef PACKAGE_TARNAME
/* Define to the home page for this package. */
#undef PACKAGE_URL
-/* 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
-/* Version number of package */
-#undef VERSION
-
/* Support webp compression */
#undef WEBP_SUPPORT
@@ -329,12 +118,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 +135,21 @@
/* 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
+/* clang-format on */
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..8500621 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));
+}
+
+void _TIFFsetLongArray(uint32_t **lpp, const uint32_t *lp, uint32_t n)
+{
+ setByteArray(NULL, (void **)lpp, lp, n, sizeof(uint32_t));
+}
+void _TIFFsetLongArrayExt(TIFF *tif, uint32_t **lpp, const uint32_t *lp,
+ uint32_t n)
+{
+ 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));
+}
-static void
-setByteArray(void** vpp, void* vp, size_t nmemb, size_t elem_size)
+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)
{
- 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(tif, (void **)dpp, dp, n, sizeof(double));
}
-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)
+
+static void setDoubleArrayOneValue(TIFF *tif, double **vpp, double value,
+ size_t nmemb)
{
- if (*vpp)
- _TIFFfree(*vpp);
- *vpp = _TIFFmalloc(nmemb*sizeof(double));
- if (*vpp)
- {
- while (nmemb--)
- ((double*)*vpp)[nmemb] = value;
- }
+ 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;
+
+ if (slen > 0)
+ {
+ const char *ep = s + slen;
+ const char *cp = s;
+ 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;
}
- 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;
- }
+ 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);
+ }
+ }
+ }
+ }
+ 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, sizeof(td->td_fieldsset));
+ 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,433 @@ 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;
+ /* invalidate directory index */
+ tif->tif_curdir = TIFF_NON_EXISTENT_DIR_NUMBER;
+ /* invalidate IFD loop lists */
+ _TIFFCleanupIFDOffsetAndNumberMaps(tif);
+ /* To be able to return from SubIFD or custom-IFD to main-IFD */
+ tif->tif_setdirectory_force_absolute = TRUE;
+
+ 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 = 0;
+ tdir_t n;
+
+ if (tif->tif_setdirectory_force_absolute)
+ {
+ /* tif_setdirectory_force_absolute=1 will force parsing the main IFD
+ * chain from the beginning, thus IFD directory list needs to be cleared
+ * from possible SubIFD offsets.
+ */
+ _TIFFCleanupIFDOffsetAndNumberMaps(tif); /* invalidate IFD loop lists */
+ }
+
+ /* Even faster path, if offset is available within IFD loop hash list. */
+ if (!tif->tif_setdirectory_force_absolute &&
+ _TIFFGetOffsetFromDirNumber(tif, dirn, &nextdiroff))
+ {
+ /* Set parameters for following TIFFReadDirectory() below. */
+ tif->tif_nextdiroff = nextdiroff;
+ tif->tif_curdir = dirn;
+ /* Reset to relative stepping */
+ tif->tif_setdirectory_force_absolute = FALSE;
+ }
+ else
+ {
+
+ /* Fast path when we just advance relative to the current directory:
+ * start at the current dir offset and continue to seek from there.
+ * Check special cases when relative is not allowed:
+ * - jump back from SubIFD or custom directory
+ * - right after TIFFWriteDirectory() jump back to that directory
+ * using TIFFSetDirectory() */
+ const int relative = (dirn >= tif->tif_curdir) &&
+ (tif->tif_diroff != 0) &&
+ !tif->tif_setdirectory_force_absolute;
+
+ if (relative)
+ {
+ nextdiroff = tif->tif_diroff;
+ dirn -= tif->tif_curdir;
+ nextdirnum = tif->tif_curdir;
+ }
+ else if (!(tif->tif_flags & TIFF_BIGTIFF))
+ nextdiroff = tif->tif_header.classic.tiff_diroff;
+ else
+ nextdiroff = tif->tif_header.big.tiff_diroff;
+
+ /* Reset to relative stepping */
+ tif->tif_setdirectory_force_absolute = FALSE;
+
+ 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. */
+ if (relative)
+ tif->tif_curdir += dirn - n;
+ else
+ tif->tif_curdir = dirn - n;
+ }
+
+ /* The -1 decrement is because TIFFReadDirectory will increment
+ * tif_curdir after successfully reading the directory. */
+ if (tif->tif_curdir == 0)
+ tif->tif_curdir = TIFF_NON_EXISTENT_DIR_NUMBER;
+ else
+ tif->tif_curdir--;
+ return (TIFFReadDirectory(tif));
}
/*
@@ -1646,140 +2109,200 @@ 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, but leave it for diroff==0. */
+ if (!retval && diroff != 0)
+ {
+ 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. */
+ _TIFFCleanupIFDOffsetAndNumberMaps(tif); /* invalidate IFD loop lists */
+ tif->tif_curdir = 0; /* first directory of new chain */
+ /* add this offset to new IFD list */
+ _TIFFCheckDirNumberAndOffset(tif, tif->tif_curdir, diroff);
+ /* To be able to return from SubIFD or custom-IFD to main-IFD */
+ tif->tif_setdirectory_force_absolute = TRUE;
+ }
+ 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);
+ }
+ if (dirn == 0)
+ {
+ TIFFErrorExtR(tif, module,
+ "For TIFFUnlinkDirectory() first directory starts with "
+ "number 1 and not 0");
+ 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);
+ }
+ }
+
+ /* For dirn=1 (first directory) also update the libtiff internal
+ * base offset variables. */
+ if (dirn == 1)
+ {
+ if (!(tif->tif_flags & TIFF_BIGTIFF))
+ tif->tif_header.classic.tiff_diroff = (uint32_t)nextdir;
+ else
+ tif->tif_header.big.tiff_diroff = nextdir;
+ }
+
+ /*
+ * 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;
+ tif->tif_curdir = TIFF_NON_EXISTENT_DIR_NUMBER;
+ _TIFFCleanupIFDOffsetAndNumberMaps(tif); /* invalidate IFD loop lists */
+ return (1);
+}
diff --git a/src/3rdparty/libtiff/libtiff/tif_dir.h b/src/3rdparty/libtiff/libtiff/tif_dir.h
index e7f0667..9eaf22f 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 {
-#define FIELD_SETLONGS 4
- /* bit vector of fields that are set */
- unsigned long td_fieldsset[FIELD_SETLONGS];
+typedef struct
+{
+#define FIELDSET_ITEMS 4
+ /* bit vector of fields that are set */
+ uint32_t td_fieldsset[FIELDSET_ITEMS];
- 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,141 @@ 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 * FIELDSET_ITEMS - 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) (((uint32_t)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);
+ extern int _TIFFGetOffsetFromDirNumber(TIFF *tif, tdir_t dirn,
+ uint64_t *diroff);
+ extern int _TIFFRemoveEntryFromDirectoryListByOffset(TIFF *tif,
+ uint64_t diroff);
#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..0e705e8 100644
--- a/src/3rdparty/libtiff/libtiff/tif_dirinfo.c
+++ b/src/3rdparty/libtiff/libtiff/tif_dirinfo.c
@@ -42,686 +42,954 @@
/* 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 */
+/* clang-format off */ /* for better readability of tag comments */
+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, 1, 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_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, 1, 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, 1, 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, 1, 0, "DNGVersion", NULL},
+ {TIFFTAG_DNGBACKWARDVERSION, 4, 4, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 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, 1, 1, "CFAPlaneColor", NULL},
+ {TIFFTAG_CFALAYOUT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CFALayout", NULL},
+ {TIFFTAG_LINEARIZATIONTABLE, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "LinearizationTable", NULL},
+ {TIFFTAG_BLACKLEVELREPEATDIM, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_C0_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "BlackLevelRepeatDim", NULL},
+ {TIFFTAG_BLACKLEVEL, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "BlackLevel", NULL},
+ {TIFFTAG_BLACKLEVELDELTAH, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "BlackLevelDeltaH", NULL},
+ {TIFFTAG_BLACKLEVELDELTAV, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "BlackLevelDeltaV", NULL},
+ {TIFFTAG_WHITELEVEL, -1, -1, TIFF_LONG, 0, TIFF_SETGET_C16_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "WhiteLevel", NULL},
+ {TIFFTAG_DEFAULTSCALE, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DefaultScale", NULL},
+ {TIFFTAG_BESTQUALITYSCALE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "BestQualityScale", NULL},
+ {TIFFTAG_DEFAULTCROPORIGIN, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DefaultCropOrigin", NULL},
+ {TIFFTAG_DEFAULTCROPSIZE, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DefaultCropSize", NULL},
+ {TIFFTAG_COLORMATRIX1, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ColorMatrix1", NULL},
+ {TIFFTAG_COLORMATRIX2, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ColorMatrix2", NULL},
+ {TIFFTAG_CAMERACALIBRATION1, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "CameraCalibration1", NULL},
+ {TIFFTAG_CAMERACALIBRATION2, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "CameraCalibration2", NULL},
+ {TIFFTAG_REDUCTIONMATRIX1, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ReductionMatrix1", NULL},
+ {TIFFTAG_REDUCTIONMATRIX2, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ReductionMatrix2", NULL},
+ {TIFFTAG_ANALOGBALANCE, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "AnalogBalance", NULL},
+ {TIFFTAG_ASSHOTNEUTRAL, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "AsShotNeutral", NULL},
+ {TIFFTAG_ASSHOTWHITEXY, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "AsShotWhiteXY", NULL},
+ {TIFFTAG_BASELINEEXPOSURE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "BaselineExposure", NULL},
+ {TIFFTAG_BASELINENOISE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "BaselineNoise", NULL},
+ {TIFFTAG_BASELINESHARPNESS, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "BaselineSharpness", NULL},
+ {TIFFTAG_BAYERGREENSPLIT, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "BayerGreenSplit", NULL},
+ {TIFFTAG_LINEARRESPONSELIMIT, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 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, 1, 0, "LensInfo", NULL},
+ {TIFFTAG_CHROMABLURRADIUS, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ChromaBlurRadius", NULL},
+ {TIFFTAG_ANTIALIASSTRENGTH, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "AntiAliasStrength", NULL},
+ {TIFFTAG_SHADOWSCALE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ShadowScale", NULL},
+ {TIFFTAG_DNGPRIVATEDATA, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "DNGPrivateData", NULL},
+ {TIFFTAG_MAKERNOTESAFETY, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MakerNoteSafety", NULL},
+ {TIFFTAG_CALIBRATIONILLUMINANT1, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CalibrationIlluminant1", NULL},
+ {TIFFTAG_CALIBRATIONILLUMINANT2, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CalibrationIlluminant2", NULL},
+ {TIFFTAG_RAWDATAUNIQUEID, 16, 16, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 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, 1, 1, "OriginalRawFileData", NULL},
+ {TIFFTAG_ACTIVEAREA, 4, 4, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ActiveArea", NULL},
+ {TIFFTAG_MASKEDAREAS, -1, -1, TIFF_LONG, 0, TIFF_SETGET_C16_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "MaskedAreas", NULL},
+ {TIFFTAG_ASSHOTICCPROFILE, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "AsShotICCProfile", NULL},
+ {TIFFTAG_ASSHOTPREPROFILEMATRIX, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "AsShotPreProfileMatrix", NULL},
+ {TIFFTAG_CURRENTICCPROFILE, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "CurrentICCProfile", NULL},
+ {TIFFTAG_CURRENTPREPROFILEMATRIX, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "CurrentPreProfileMatrix", NULL},
+ {TIFFTAG_PERSAMPLE, 0, 0, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "PerSample", NULL},
+#if 0
+ /* TODO: revert above #if 0 for TIFF 4.6.0 */
+
+ /* begin DNG 1.2.0.0 tags */
+ {TIFFTAG_COLORIMETRICREFERENCE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ColorimetricReference", NULL},
+ {TIFFTAG_CAMERACALIBRATIONSIGNATURE, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "CameraCalibrationSignature", NULL},
+ {TIFFTAG_PROFILECALIBRATIONSIGNATURE, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ProfileCalibrationSignature", NULL},
+ {TIFFTAG_EXTRACAMERAPROFILES, -1, -1, TIFF_IFD8, 0, TIFF_SETGET_C16_IFD8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ExtraCameraProfiles", NULL},
+ {TIFFTAG_ASSHOTPROFILENAME, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "AsShotProfileName", NULL},
+ {TIFFTAG_NOISEREDUCTIONAPPLIED, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "NoiseReductionApplied", NULL},
+ {TIFFTAG_PROFILENAME, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ProfileName", NULL},
+ {TIFFTAG_PROFILEHUESATMAPDIMS, 3, 3, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ProfileHueSatMapDims", NULL},
+ {TIFFTAG_PROFILEHUESATMAPDATA1, -1, -1, TIFF_FLOAT, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ProfileHueSatMapData1", NULL},
+ {TIFFTAG_PROFILEHUESATMAPDATA2, -1, -1, TIFF_FLOAT, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ProfileHueSatMapData2", NULL},
+ {TIFFTAG_PROFILETONECURVE, -1, -1, TIFF_FLOAT, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ProfileToneCurve", NULL},
+ {TIFFTAG_PROFILEEMBEDPOLICY, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ProfileEmbedPolicy", NULL},
+ {TIFFTAG_PROFILECOPYRIGHT, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ProfileCopyright", NULL},
+ {TIFFTAG_FORWARDMATRIX1, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ForwardMatrix1", NULL},
+ {TIFFTAG_FORWARDMATRIX2, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ForwardMatrix2", NULL},
+ {TIFFTAG_PREVIEWAPPLICATIONNAME, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "PreviewApplicationName", NULL},
+ {TIFFTAG_PREVIEWAPPLICATIONVERSION, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "PreviewApplicationVersion", NULL},
+ {TIFFTAG_PREVIEWSETTINGSNAME, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "PreviewSettingsName", NULL},
+ {TIFFTAG_PREVIEWSETTINGSDIGEST, 16, 16, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "PreviewSettingsDigest", NULL},
+ {TIFFTAG_PREVIEWCOLORSPACE, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "PreviewColorSpace", NULL},
+ {TIFFTAG_PREVIEWDATETIME, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "PreviewDateTime", NULL},
+ {TIFFTAG_RAWIMAGEDIGEST, 16, 16, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "RawImageDigest", NULL},
+ {TIFFTAG_ORIGINALRAWFILEDIGEST, 16, 16, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "OriginalRawFileDigest", NULL},
+ {TIFFTAG_SUBTILEBLOCKSIZE, 2, 2, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubTileBlockSize", NULL},
+ {TIFFTAG_ROWINTERLEAVEFACTOR, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "RowInterleaveFactor", NULL},
+ {TIFFTAG_PROFILELOOKTABLEDIMS, 3, 3, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ProfileLookTableDims", NULL},
+ {TIFFTAG_PROFILELOOKTABLEDATA, -1, -1, TIFF_FLOAT, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ProfileLookTableData", NULL},
+ /* begin DNG 1.3.0.0 tags */
+ {TIFFTAG_OPCODELIST1, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "OpcodeList1", NULL},
+ {TIFFTAG_OPCODELIST2, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "OpcodeList2", NULL},
+ {TIFFTAG_OPCODELIST3, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "OpcodeList3", NULL},
+ {TIFFTAG_NOISEPROFILE, -1, -1, TIFF_DOUBLE, 0, TIFF_SETGET_C16_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "NoiseProfile", NULL},
+ /* begin DNG 1.4.0.0 tags */
+ {TIFFTAG_DEFAULTUSERCROP, 4, 4, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DefaultUserCrop", NULL},
+ {TIFFTAG_DEFAULTBLACKRENDER, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DefaultBlackRender", NULL},
+ {TIFFTAG_BASELINEEXPOSUREOFFSET, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "BaselineExposureOffset", NULL},
+ {TIFFTAG_PROFILELOOKTABLEENCODING, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ProfileLookTableEncoding", NULL},
+ {TIFFTAG_PROFILEHUESATMAPENCODING, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ProfileHueSatMapEncoding", NULL},
+ {TIFFTAG_ORIGINALDEFAULTFINALSIZE, 2, 2, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "OriginalDefaultFinalSize", NULL},
+ {TIFFTAG_ORIGINALBESTQUALITYFINALSIZE, 2, 2, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "OriginalBestQualityFinalSize", NULL},
+ {TIFFTAG_ORIGINALDEFAULTCROPSIZE, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "OriginalDefaultCropSize", NULL}, /* could also be rational */
+ {TIFFTAG_NEWRAWIMAGEDIGEST, 16, 16, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "NewRawImageDigest", NULL},
+ {TIFFTAG_RAWTOPREVIEWGAIN, 1, 1, TIFF_DOUBLE, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "RawToPreviewGain", NULL},
+ /* begin DNG 1.5.0.0 tags */
+ {TIFFTAG_DEPTHFORMAT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DepthFormat", NULL},
+ {TIFFTAG_DEPTHNEAR, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DepthNear", NULL},
+ {TIFFTAG_DEPTHFAR, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DepthFar", NULL},
+ {TIFFTAG_DEPTHUNITS, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DepthUnits", NULL},
+ {TIFFTAG_DEPTHMEASURETYPE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DepthMeasureType", NULL},
+ {TIFFTAG_ENHANCEPARAMS, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EnhanceParams", NULL},
+ /* begin DNG 1.6.0.0 tags */
+ {TIFFTAG_PROFILEGAINTABLEMAP, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ProfileGainTableMap", NULL},
+ {TIFFTAG_SEMANTICNAME, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SemanticName", NULL},
+ {TIFFTAG_SEMANTICINSTANCEID, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SemanticInstanceID", NULL},
+ {TIFFTAG_MASKSUBAREA, 4, 4, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MaskSubArea", NULL},
+ {TIFFTAG_RGBTABLES, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "RGBTables", NULL},
+ {TIFFTAG_CALIBRATIONILLUMINANT3, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CalibrationIlluminant3", NULL},
+ {TIFFTAG_COLORMATRIX3, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ColorMatrix3", NULL},
+ {TIFFTAG_CAMERACALIBRATION3, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "CameraCalibration3", NULL},
+ {TIFFTAG_REDUCTIONMATRIX3, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ReductionMatrix3", NULL},
+ {TIFFTAG_PROFILEHUESATMAPDATA3, -1, -1, TIFF_FLOAT, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ProfileHueSatMapData3", NULL},
+ {TIFFTAG_FORWARDMATRIX3, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ForwardMatrix3", NULL},
+ {TIFFTAG_ILLUMINANTDATA1, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "IlluminantData1", NULL},
+ {TIFFTAG_ILLUMINANTDATA2, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "IlluminantData2", NULL},
+ {TIFFTAG_ILLUMINANTDATA3, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "IlluminantData3", NULL},
+ /* end DNG tags */
+ /* begin TIFF/EP tags */
+ {TIFFTAG_EP_CFAREPEATPATTERNDIM, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_C0_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP CFARepeatPatternDim", NULL},
+ {TIFFTAG_EP_CFAPATTERN, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "EP CFAPattern", NULL},
+ /* TIFFTAG_EP_BATTERYLEVEL can be RATIONAL or ASCII.
+ * LibTiff defines it as ASCII and converts RATIONAL to an ASCII string. */
+ {TIFFTAG_EP_BATTERYLEVEL, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP BatteryLevel", NULL},
+ {TIFFTAG_EP_INTERLACE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP Interlace", NULL},
+ /* TIFFTAG_EP_IPTC_NAA and TIFFTAG_RICHTIFFIPTC share the same tag number (33723)
+ * LibTIFF type is UNDEFINED or BYTE, but often times incorrectly specified as LONG, because TIFF/EP (ISO/DIS 12234-2) specifies type LONG or ASCII. */
+ {TIFFTAG_EP_TIMEZONEOFFSET, -1, -1, TIFF_SSHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "EP TimeZoneOffset", NULL},
+ {TIFFTAG_EP_SELFTIMERMODE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP SelfTimerMode", NULL},
+ {TIFFTAG_EP_FLASHENERGY, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "EP FlashEnergy", NULL},
+ {TIFFTAG_EP_SPATIALFREQUENCYRESPONSE, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "EP SpatialFrequencyResponse", NULL},
+ {TIFFTAG_EP_NOISE, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "EP Noise", NULL},
+ {TIFFTAG_EP_FOCALPLANEXRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP FocalPlaneXResolution", NULL},
+ {TIFFTAG_EP_FOCALPLANEYRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP FocalPlaneYResolution", NULL},
+ {TIFFTAG_EP_FOCALPLANERESOLUTIONUNIT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP FocalPlaneResolutionUnit", NULL},
+ {TIFFTAG_EP_IMAGENUMBER, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP ImageNumber", NULL}, /* or SHORT */
+ {TIFFTAG_EP_SECURITYCLASSIFICATION, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP SecurityClassification", NULL},
+ {TIFFTAG_EP_IMAGEHISTORY, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP ImageHistory", NULL},
+ {TIFFTAG_EP_EXPOSUREINDEX, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "EP ExposureIndex", NULL},
+ {TIFFTAG_EP_STANDARDID, 4, 4, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP StandardId", NULL},
+ {TIFFTAG_EP_SENSINGMETHOD, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP SensingMethod", NULL},
+ /* TIFF/EP tags equivalent to EXIF tags, sometimes defined differently. */
+ {TIFFTAG_EP_EXPOSURETIME, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "EP ExposureTime", NULL}, /*N=1 or 2 */
+ {TIFFTAG_EP_FNUMBER, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "EP FNumber", NULL},
+ {TIFFTAG_EP_EXPOSUREPROGRAM, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP ExposureProgram", NULL},
+ {TIFFTAG_EP_SPECTRALSENSITIVITY, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP SpectralSensitivity", NULL},
+ {TIFFTAG_EP_ISOSPEEDRATINGS, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP ISOSpeedRatings", NULL},
+ {TIFFTAG_EP_OECF, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "EP OptoelectricConversionFactor", NULL},
+ {TIFFTAG_EP_DATETIMEORIGINAL, 20, 20, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP DateTimeOriginal", NULL},
+ {TIFFTAG_EP_COMPRESSEDBITSPERPIXEL, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP CompressedBitsPerPixel", NULL},
+ {TIFFTAG_EP_SHUTTERSPEEDVALUE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP ShutterSpeedValue", NULL},
+ {TIFFTAG_EP_APERTUREVALUE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP ApertureValue", NULL},
+ {TIFFTAG_EP_BRIGHTNESSVALUE, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "EP BrightnessValue", NULL},
+ {TIFFTAG_EP_EXPOSUREBIASVALUE, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "EP ExposureBiasValue", NULL}, /*N=1 or 2 */
+ {TIFFTAG_EP_MAXAPERTUREVALUE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP MaxApertureValue", NULL},
+ {TIFFTAG_EP_SUBJECTDISTANCE, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "EP SubjectDistance", NULL},
+ {TIFFTAG_EP_METERINGMODE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP MeteringMode", NULL},
+ {TIFFTAG_EP_LIGHTSOURCE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP LightSource", NULL},
+ {TIFFTAG_EP_FLASH, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EP Flash", NULL},
+ {TIFFTAG_EP_FOCALLENGTH, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "EP FocalLength", NULL},
+ {TIFFTAG_EP_SUBJECTLOCATION, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "EP SubjectLocation", NULL},
+ /* end TIFF/EP tags */
+#endif
+ /* begin TIFF/FX tags */
+ {TIFFTAG_INDEXED, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Indexed", NULL},
+ {TIFFTAG_GLOBALPARAMETERSIFD, 1, 1, TIFF_IFD8, 0, TIFF_SETGET_IFD8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "GlobalParametersIFD", NULL},
+ {TIFFTAG_PROFILETYPE, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ProfileType", NULL},
+ {TIFFTAG_FAXPROFILE, 1, 1, TIFF_BYTE, 0, TIFF_SETGET_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FaxProfile", NULL},
+ {TIFFTAG_CODINGMETHODS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CodingMethods", NULL},
+ {TIFFTAG_VERSIONYEAR, 4, 4, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "VersionYear", NULL},
+ {TIFFTAG_MODENUMBER, 1, 1, TIFF_BYTE, 0, TIFF_SETGET_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ModeNumber", NULL},
+ {TIFFTAG_DECODE, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "Decode", NULL},
+ {TIFFTAG_IMAGEBASECOLOR, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ImageBaseColor", NULL},
+ {TIFFTAG_T82OPTIONS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "T82Options", NULL},
+ {TIFFTAG_STRIPROWCOUNTS, -1, -1, TIFF_LONG, 0, TIFF_SETGET_C16_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "StripRowCounts", NULL},
+ {TIFFTAG_IMAGELAYER, 2, 2, TIFF_LONG, 0, TIFF_SETGET_C0_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 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},
+ /* After EXIF 2.2.1 ISOSpeedRatings is named PhotographicSensitivity. In addition, while "Count=Any", only 1 count should be used. */
+ {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}};
+/* clang-format on */ /* was off for better readability of tag comments */
+
+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)
{
- 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);
+ 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);
}
-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)
+ {
+ TIFFWarningExtR(tif, "TIFFFieldWithTag", "Warning, 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)
+ {
+ TIFFWarningExtR(tif, "TIFFFieldWithName", "Warning, 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 +999,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..2c49dc6 100644
--- a/src/3rdparty/libtiff/libtiff/tif_dirread.c
+++ b/src/3rdparty/libtiff/libtiff/tif_dirread.c
@@ -34,3464 +34,3993 @@
* 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);
+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);
#if 0
-static enum TIFFReadDirEntryErr TIFFReadDirEntryPersampleDouble(TIFF* tif, TIFFDirEntry* direntry, double* value);
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckedRationalDirect(TIFF *tif, TIFFDirEntry *direntry,
+ TIFFRational_t *value);
#endif
+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
+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_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)
+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 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 = (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)
+#if 0
+static enum TIFFReadDirEntryErr
+TIFFReadDirEntryCheckedRationalDirect(TIFF *tif, TIFFDirEntry *direntry,
+ TIFFRational_t *value)
+{ /*--: SetGetRATIONAL_directly:_CustomTag: Read rational (and signed rationals)
+ directly --*/
+ UInt64Aligned_t m;
+
+ assert(sizeof(double) == 8);
+ assert(sizeof(uint64_t) == 8);
+ assert(sizeof(uint32_t) == 4);
+
+ if (direntry->tdir_count != 1)
+ return (TIFFReadDirEntryErrCount);
+
+ if (direntry->tdir_type != TIFF_RATIONAL &&
+ direntry->tdir_type != TIFF_SRATIONAL)
+ return (TIFFReadDirEntryErrType);
+
+ 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);
+
+ value->uNum = m.i[0];
+ value->uDenom = m.i[1];
+ return (TIFFReadDirEntryErrOk);
+} /*-- TIFFReadDirEntryCheckedRationalDirect() --*/
+#endif
+
+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 +4028,1709 @@ 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.
+ * This is behind the last IFD, thus no checking or reading necessary.
+ */
+ tif->tif_diroff = tif->tif_nextdiroff;
+ return 0;
+ }
+
+ 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 */
+#if 0
+ case TIFFTAG_EP_BATTERYLEVEL:
+ /* TIFFTAG_EP_BATTERYLEVEL can be RATIONAL or ASCII.
+ * LibTiff defines it as ASCII and converts RATIONAL to an
+ * ASCII string. */
+ switch (dp->tdir_type)
+ {
+ case TIFF_RATIONAL:
+ {
+ /* Read rational and convert to ASCII*/
+ enum TIFFReadDirEntryErr err;
+ TIFFRational_t rValue;
+ err = TIFFReadDirEntryCheckedRationalDirect(
+ tif, dp, &rValue);
+ if (err != TIFFReadDirEntryErrOk)
+ {
+ fip = TIFFFieldWithTag(tif, dp->tdir_tag);
+ TIFFReadDirEntryOutputErr(
+ tif, err, module,
+ fip ? fip->field_name : "unknown tagname",
+ 1);
+ }
+ else
+ {
+ char szAux[32];
+ snprintf(szAux, sizeof(szAux) - 1, "%d/%d",
+ rValue.uNum, rValue.uDenom);
+ TIFFSetField(tif, dp->tdir_tag, szAux);
+ }
+ }
+ break;
+ case TIFF_ASCII:
+ (void)TIFFFetchNormalTag(tif, dp, TRUE);
+ break;
+ default:
+ fip = TIFFFieldWithTag(tif, dp->tdir_tag);
+ TIFFWarningExtR(tif, module,
+ "Invalid data type for tag %s. "
+ "ASCII or RATIONAL expected",
+ fip ? fip->field_name
+ : "unknown tagname");
+ break;
+ }
+ break;
+#endif
+ 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)
+ {
+ 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)
{
- ChopUpSingleUncompressedStrip(tif);
+ 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";
+ uint32_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) */
+ }
+ }
+ /* To be able to return from SubIFD or custom-IFD to main-IFD */
+ tif->tif_setdirectory_force_absolute = TRUE;
+ 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)
- _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_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_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 const char module[] = "MissingRequired";
+
+ TIFFErrorExtR(tif, module,
+ "TIFF directory is missing required \"%s\" field", tagname);
}
-static void
-MissingRequired(TIFF* tif, const char* tagname)
+static unsigned long hashFuncOffsetToNumber(const void *elt)
{
- static const char module[] = "MissingRequired";
+ 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;
+}
- TIFFErrorExt(tif->tif_clientdata, module,
- "TIFF directory is missing required \"%s\" field",
- tagname);
+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 (TIFFHashSetSize(tif->tif_map_dir_offset_to_number) >=
+ 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;
+ }
+
+ 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;
+
+ /* 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;
+ }
+
+ /* This updates the directory list for all main-IFDs in the file. */
+ TIFFNumberOfDirectories(tif);
+
+ foundEntry = (TIFFOffsetAndDirNumber *)TIFFHashSetLookup(
+ tif->tif_map_dir_offset_to_number, &entry);
+ if (foundEntry)
+ {
+ *dirn = foundEntry->dirNumber;
+ return 1;
+ }
+
+ return 0;
+} /*--- _TIFFGetDirNumberFromOffset() ---*/
+
+/*
+ * Retrieve the matching IFD directory offset of a given IFD number
+ * from the list of directories already seen.
+ * Returns 1 if the offset was in the list of already seen IFDs and the
+ * directory offset can be returned. The directory list is not updated.
+ * Otherwise returns 0 or if an error occurred.
+ */
+int _TIFFGetOffsetFromDirNumber(TIFF *tif, tdir_t dirn, uint64_t *diroff)
+{
+
+ if (tif->tif_map_dir_number_to_offset == NULL)
+ return 0;
+ TIFFOffsetAndDirNumber entry;
+ entry.offset = 0; /* not used */
+ entry.dirNumber = dirn;
+
+ TIFFOffsetAndDirNumber *foundEntry =
+ (TIFFOffsetAndDirNumber *)TIFFHashSetLookup(
+ tif->tif_map_dir_number_to_offset, &entry);
+ if (foundEntry)
+ {
+ *diroff = foundEntry->offset;
+ return 1;
+ }
+
+ return 0;
+} /*--- _TIFFGetOffsetFromDirNumber() ---*/
+
+/*
+ * Remove an entry from the directory list of already seen directories
+ * by directory offset.
+ * If an entry is to be removed from the list, it is also okay if the entry
+ * is not in the list or the list does not exist.
+ */
+int _TIFFRemoveEntryFromDirectoryListByOffset(TIFF *tif, uint64_t diroff)
+{
+ if (tif->tif_map_dir_offset_to_number == NULL)
+ return 1;
+
+ TIFFOffsetAndDirNumber entryOld;
+ entryOld.offset = diroff;
+ entryOld.dirNumber = 0;
+ /* 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.
+ * However, we need firstly to find the directory number from offset. */
+
+ TIFFOffsetAndDirNumber *foundEntryOldOff =
+ (TIFFOffsetAndDirNumber *)TIFFHashSetLookup(
+ tif->tif_map_dir_offset_to_number, &entryOld);
+ if (foundEntryOldOff)
+ {
+ entryOld.dirNumber = foundEntryOldOff->dirNumber;
+ if (tif->tif_map_dir_number_to_offset != NULL)
+ {
+ TIFFOffsetAndDirNumber *foundEntryOldDir =
+ (TIFFOffsetAndDirNumber *)TIFFHashSetLookup(
+ tif->tif_map_dir_number_to_offset, &entryOld);
+ if (foundEntryOldDir)
+ {
+ TIFFHashSetRemove(tif->tif_map_dir_number_to_offset,
+ foundEntryOldDir);
+ TIFFHashSetRemove(tif->tif_map_dir_offset_to_number,
+ foundEntryOldOff);
+ return 1;
+ }
+ }
+ else
+ {
+ TIFFErrorExtR(tif, "_TIFFRemoveEntryFromDirectoryListByOffset",
+ "Unexpectedly tif_map_dir_number_to_offset is "
+ "missing but tif_map_dir_offset_to_number exists.");
+ return 0;
+ }
+ }
+ return 1;
+} /*--- _TIFFRemoveEntryFromDirectoryListByOffset() ---*/
/*
* 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 +5738,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);
+ }
+ }
}
- 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_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);
+ }
+ }
+ 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 +7301,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 +7311,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 +7387,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 +7452,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 +7480,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 +7490,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 +7499,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_t);
+ }
+ else if (dirent->tdir_type == TIFF_LONG)
{
- sizeofval = sizeof(uint16);
+ sizeofval = sizeof(uint32_t);
}
- else if( dirent->tdir_type == TIFF_LONG )
+ else if (dirent->tdir_type == TIFF_LONG8)
{
- sizeofval = sizeof(uint32);
+ sizeofval = sizeof(uint64_t);
}
- else if( dirent->tdir_type == TIFF_LONG8 )
+ else if (dirent->tdir_type == TIFF_SLONG8)
{
- sizeofval = sizeof(uint64);
+ /* 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 +7588,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 +7751,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 +7778,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 +7853,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..d8844bb 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,430 @@ 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.
+ */
+ uint64_t torewritediroff = tif->tif_diroff;
+
+ 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;
+ }
+ }
+ /* Remove skipped offset from IFD loop directory list. */
+ _TIFFRemoveEntryFromDirectoryListByOffset(tif, torewritediroff);
+ }
+ 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;
+ }
+ }
+ /* Remove skipped offset from IFD loop directory list. */
+ _TIFFRemoveEntryFromDirectoryListByOffset(tif, torewritediroff);
+ }
+
+ /*
+ * 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 +720,1108 @@ 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;
+ }
+ 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;
- }
- 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_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)
+ {
+ if (tif->tif_curdir == TIFF_NON_EXISTENT_DIR_NUMBER)
+ tif->tif_curdir = 0;
+ else
+ 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 +1831,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 +1848,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 +1978,1183 @@ 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);
+ }
+ /* TIFFTAG_TRANSFERFUNCTION expects (1 or 3) pointer to arrays with
+ * (1 << BitsPerSample) * uint16_t values.
+ */
+ m = (1 << tif->tif_dir.td_bitspersample);
+ /* clang-format off */
+ n = (tif->tif_dir.td_samplesperpixel - tif->tif_dir.td_extrasamples) > 1 ? 3 : 1;
+ /* clang-format on */
+
+ /* Check for proper number of transferfunctions */
+ for (int i = 0; i < n; i++)
+ {
+ if (tif->tif_dir.td_transferfunction[i] == NULL)
+ {
+ TIFFWarningExtR(
+ tif, module,
+ "Too few TransferFunctions provided. Tag not written to file");
+ return (1); /* Not an error; only tag is not written. */
+ }
+ }
+ /*
+ * 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)
+ {
+ if (!_TIFFmemcmp(tif->tif_dir.td_transferfunction[0],
+ tif->tif_dir.td_transferfunction[2],
+ m * sizeof(uint16_t)) &&
+ !_TIFFmemcmp(tif->tif_dir.td_transferfunction[0],
+ tif->tif_dir.td_transferfunction[1],
+ m * sizeof(uint16_t)))
+ 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))
- {
- if( data && datalength )
- {
- _TIFFmemcpy(&dir[m].tdir_offset,data,datalength);
- }
- }
- 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);
+ /* 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)
+ {
+ _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);
+ }
+ }
+ (*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 +3170,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 +3361,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 +3482,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..a3c645c 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,295 @@ 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) \
+ for (int32_t ifill = 0; ifill < (n); ++ifill) \
+ { \
+ (cp)[ifill] = 0xff; \
+ } \
+ (cp) += (n);
+
+#define ZERO(n, cp) \
+ for (int32_t 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 +486,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 + 1, 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 +676,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 +725,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 +993,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 +1495,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 +1645,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..9792c63
--- /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_config.h"
+
+#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;
+}
+
+/************************************************************************/
+/* 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;
+}
+
+/************************************************************************/
+/* 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..f60e2c6
--- /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);
+
+ int TIFFHashSetSize(const TIFFHashSet *set);
+
+#ifdef notused
+ void TIFFHashSetClear(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..4f357a6
--- /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 WORDS_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..021756d 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,891 @@ 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;
+
+ /* check for NaN */
+ if (u != u || v != v)
+ {
+ u = U_NEU;
+ v = V_NEU;
+ }
+
+ 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..d631fa1 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,936 @@
* 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)
+ {
+ TIFFErrorExtR(tif, module,
+ "LZWDecode: Scanline %" PRIu32 " cannot be read due to "
+ "previous error",
+ tif->tif_row);
+ 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:
+ sp->read_error = 1;
+ 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 +1023,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 +1453,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..ea57209 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,2596 @@ 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);
+ /* Check for division by zero. */
+ if (sp->subsampling_hor == 0 || sp->subsampling_ver == 0)
+ return (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..23fcf81 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,626 @@
* 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':
+ TIFFWarningExtR(tif, name,
+ "H(ost) mode is deprecated. Since "
+ "libtiff 4.5.1, it is an alias of 'B' / "
+ "FILLORDER_MSB2LSB.");
+ tif->tif_flags =
+ (tif->tif_flags & ~TIFF_FILLORDER) | FILLORDER_MSB2LSB;
+ 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_setdirectory_force_absolute = FALSE;
+ 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 +655,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..bf9d77e
--- /dev/null
+++ b/src/3rdparty/libtiff/libtiff/tif_webp.c
@@ -0,0 +1,881 @@
+/*
+ * 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 lossless_exact; /* lossless exact mode. If TRUE, R,G,B values in areas
+ with alpha = 0 will be preserved */
+ 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;
+ }
+
+ int webp_width, webp_height;
+ if (!WebPGetInfo(tif->tif_rawcp,
+ (uint64_t)tif->tif_rawcc > UINT32_MAX
+ ? UINT32_MAX
+ : (uint32_t)tif->tif_rawcc,
+ &webp_width, &webp_height))
+ {
+ TIFFErrorExtR(tif, module, "WebPGetInfo() failed");
+ return 0;
+ }
+ if ((uint32_t)webp_width != segment_width ||
+ (uint32_t)webp_height != segment_height)
+ {
+ TIFFErrorExtR(
+ tif, module, "WebP blob dimension is %dx%d. Expected %ux%u",
+ webp_width, webp_height, segment_width, segment_height);
+ return 0;
+ }
+
+#if WEBP_DECODER_ABI_VERSION >= 0x0002
+ WebPDecoderConfig config;
+ if (!WebPInitDecoderConfig(&config))
+ {
+ TIFFErrorExtR(tif, module, "WebPInitDecoderConfig() failed");
+ return 0;
+ }
+
+ const bool bWebPGetFeaturesOK =
+ WebPGetFeatures(tif->tif_rawcp,
+ (uint64_t)tif->tif_rawcc > UINT32_MAX
+ ? UINT32_MAX
+ : (uint32_t)tif->tif_rawcc,
+ &config.input) == VP8_STATUS_OK;
+
+ WebPFreeDecBuffer(&config.output);
+
+ if (!bWebPGetFeaturesOK)
+ {
+ TIFFErrorExtR(tif, module, "WebPInitDecoderConfig() failed");
+ return 0;
+ }
+
+ const int webp_bands = config.input.has_alpha ? 4 : 3;
+ if (webp_bands != sp->nSamples &&
+ /* We accept the situation where the WebP blob has only 3 bands,
+ * whereas the raster is 4 bands. This can happen when the alpha
+ * channel is fully opaque, and WebP decoding works fine in that
+ * situation.
+ */
+ !(webp_bands == 3 && sp->nSamples == 4))
+ {
+ TIFFErrorExtR(tif, module,
+ "WebP blob band count is %d. Expected %d", webp_bands,
+ sp->nSamples);
+ return 0;
+ }
+#endif
+
+ 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;
+#if WEBP_ENCODER_ABI_VERSION >= 0x0209
+ sp->sEncoderConfig.exact = sp->lossless_exact;
+#endif
+ }
+#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
+ case TIFFTAG_WEBP_LOSSLESS_EXACT:
+#if WEBP_ENCODER_ABI_VERSION >= 0x0209
+ sp->lossless_exact = va_arg(ap, int);
+ 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;
+ case TIFFTAG_WEBP_LOSSLESS_EXACT:
+ *va_arg(ap, int *) = sp->lossless_exact;
+ 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},
+ {TIFFTAG_WEBP_LOSSLESS_EXACT, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT,
+ TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "WEBP exact lossless",
+ 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->lossless_exact = 1; /* exact lossless mode (if lossless enabled) */
+ 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..1a6b86d 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_EXISTING;
+ 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_EXISTING;
+ 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..d8da33d 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,552 @@ 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 */
+/* clang-format off */ /* for better readability of tag comments */
+#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] */
+/* For eiStream Annotation Specification, Version 1.00.06 see
+ * http://web.archive.org/web/20050309141348/http://www.kofile.com/support%20pro/faqs/annospec.htm */
+#define TIFFTAG_TIFFANNOTATIONDATA 32932
/* 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 /* (alias for TIFFTAG_EP_CFAREPEATPATTERNDIM)*/
+#define TIFFTAG_CFAPATTERN 33422 /* (alias for TIFFTAG_EP_CFAPATTERN) */
+#define TIFFTAG_BATTERYLEVEL 33423 /* (alias for TIFFTAG_EP_BATTERYLEVEL) */
/* 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 Molecular Dynamics GEL fileformat,
+ * see http://research.stowers-institute.org/mcm/efg/ScientificSoftware/Utility/TiffTags/GEL-FileFormat.pdf
+ * (2023: the above web site is unavailable but tags are explained briefly at
+ * https://www.awaresystems.be/imaging/tiff/tifftags/docs/gel.html
+ */
+#define TIFFTAG_MD_FILETAG 33445 /* Specifies the pixel data format encoding in the GEL file format. */
+#define TIFFTAG_MD_SCALEPIXEL 33446 /* scale factor */
+#define TIFFTAG_MD_COLORTABLE 33447 /* conversion from 16bit to 8bit */
+#define TIFFTAG_MD_LABNAME 33448 /* name of the lab that scanned this file. */
+#define TIFFTAG_MD_SAMPLEINFO 33449 /* information about the scanned GEL sample */
+#define TIFFTAG_MD_PREPDATE 33450 /* information about the date the sample was prepared YY/MM/DD */
+#define TIFFTAG_MD_PREPTIME 33451 /* information about the time the sample was prepared HH:MM*/
+#define TIFFTAG_MD_FILEUNITS 33452 /* Units for data in this file, as used in the GEL file format. */
/* 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 EXIF 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 EXIF 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 (UTF-8) */
+#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 */
+/* TIFFTAG_BAYERGREENSPLIT: &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_BAYERGREENSPLIT 50733
+#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 (UTF-8) */
+#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 /* & */
+
+/* DNG 1.2.0.0 */
+#define TIFFTAG_COLORIMETRICREFERENCE 50879 /* &colorimetric reference */
+#define TIFFTAG_CAMERACALIBRATIONSIGNATURE 50931 /* &camera calibration signature (UTF-8) */
+#define TIFFTAG_PROFILECALIBRATIONSIGNATURE 50932 /* &profile calibration signature (UTF-8) */
+/* TIFFTAG_EXTRACAMERAPROFILES 50933 &extra camera profiles : is already defined for GeoTIFF DGIWG */
+#define TIFFTAG_ASSHOTPROFILENAME 50934 /* &as shot profile name (UTF-8) */
+#define TIFFTAG_NOISEREDUCTIONAPPLIED 50935 /* &amount of applied noise reduction */
+#define TIFFTAG_PROFILENAME 50936 /* &camera profile name (UTF-8) */
+#define TIFFTAG_PROFILEHUESATMAPDIMS 50937 /* &dimensions of HSV mapping */
+#define TIFFTAG_PROFILEHUESATMAPDATA1 50938 /* &first HSV mapping table */
+#define TIFFTAG_PROFILEHUESATMAPDATA2 50939 /* &second HSV mapping table */
+#define TIFFTAG_PROFILETONECURVE 50940 /* &default tone curve */
+#define TIFFTAG_PROFILEEMBEDPOLICY 50941 /* &profile embedding policy */
+#define TIFFTAG_PROFILECOPYRIGHT 50942 /* &profile copyright information (UTF-8) */
+#define TIFFTAG_FORWARDMATRIX1 50964 /* &matrix for mapping white balanced camera colors to XYZ D50 */
+#define TIFFTAG_FORWARDMATRIX2 50965 /* &matrix for mapping white balanced camera colors to XYZ D50 */
+#define TIFFTAG_PREVIEWAPPLICATIONNAME 50966 /* &name of application that created preview (UTF-8) */
+#define TIFFTAG_PREVIEWAPPLICATIONVERSION 50967 /* &version of application that created preview (UTF-8) */
+#define TIFFTAG_PREVIEWSETTINGSNAME 50968 /* &name of conversion settings (UTF-8) */
+#define TIFFTAG_PREVIEWSETTINGSDIGEST 50969 /* &unique id of conversion settings */
+#define TIFFTAG_PREVIEWCOLORSPACE 50970 /* &preview color space */
+#define TIFFTAG_PREVIEWDATETIME 50971 /* &date/time preview was rendered */
+#define TIFFTAG_RAWIMAGEDIGEST 50972 /* &md5 of raw image data */
+#define TIFFTAG_ORIGINALRAWFILEDIGEST 50973 /* &md5 of the data stored in the OriginalRawFileData tag */
+#define TIFFTAG_SUBTILEBLOCKSIZE 50974 /* &subtile block size */
+#define TIFFTAG_ROWINTERLEAVEFACTOR 50975 /* &number of interleaved fields */
+#define TIFFTAG_PROFILELOOKTABLEDIMS 50981 /* &num of input samples in each dim of default "look" table */
+#define TIFFTAG_PROFILELOOKTABLEDATA 50982 /* &default "look" table for use as starting point */
+
+/* DNG 1.3.0.0 */
+#define TIFFTAG_OPCODELIST1 51008 /* &opcodes that should be applied to raw image after reading */
+#define TIFFTAG_OPCODELIST2 51009 /* &opcodes that should be applied after mapping to linear reference */
+#define TIFFTAG_OPCODELIST3 51022 /* &opcodes that should be applied after demosaicing */
+#define TIFFTAG_NOISEPROFILE 51041 /* &noise profile */
+
+/* DNG 1.4.0.0 */
+#define TIFFTAG_DEFAULTUSERCROP 51125 /* &default user crop rectangle in relative coords */
+#define TIFFTAG_DEFAULTBLACKRENDER 51110 /* &black rendering hint */
+#define TIFFTAG_BASELINEEXPOSUREOFFSET 51109 /* &baseline exposure offset */
+#define TIFFTAG_PROFILELOOKTABLEENCODING 51108 /* &3D LookTable indexing conversion */
+#define TIFFTAG_PROFILEHUESATMAPENCODING 51107 /* &3D HueSatMap indexing conversion */
+#define TIFFTAG_ORIGINALDEFAULTFINALSIZE 51089 /* &default final size of larger original file for this proxy */
+#define TIFFTAG_ORIGINALBESTQUALITYFINALSIZE 51090 /* &best quality final size of larger original file for this proxy */
+#define TIFFTAG_ORIGINALDEFAULTCROPSIZE 51091 /* &the default crop size of larger original file for this proxy */
+#define TIFFTAG_NEWRAWIMAGEDIGEST 51111 /* &modified MD5 digest of the raw image data */
+#define TIFFTAG_RAWTOPREVIEWGAIN 51112 /* &The gain between the main raw FD and the preview IFD containing this tag */
+
+/* DNG 1.5.0.0 */
+#define TIFFTAG_DEPTHFORMAT 51177 /* &encoding of the depth data in the file */
+#define TIFFTAG_DEPTHNEAR 51178 /* &distance from the camera represented by value 0 in the depth map */
+#define TIFFTAG_DEPTHFAR 51179 /* &distance from the camera represented by the maximum value in the depth map */
+#define TIFFTAG_DEPTHUNITS 51180 /* &measurement units for DepthNear and DepthFar */
+#define TIFFTAG_DEPTHMEASURETYPE 51181 /* &measurement geometry for the depth map */
+#define TIFFTAG_ENHANCEPARAMS 51182 /* &a string that documents how the enhanced image data was processed. */
+
+/* DNG 1.6.0.0 */
+#define TIFFTAG_PROFILEGAINTABLEMAP 52525 /* &spatially varying gain tables that can be applied as starting point */
+#define TIFFTAG_SEMANTICNAME 52526 /* &a string that identifies the semantic mask */
+#define TIFFTAG_SEMANTICINSTANCEID 52528 /* &a string that identifies a specific instance in a semantic mask */
+#define TIFFTAG_MASKSUBAREA 52536 /* &the crop rectangle of this IFD's mask, relative to the main image */
+#define TIFFTAG_RGBTABLES 52543 /* &color transforms to apply to masked image regions */
+#define TIFFTAG_CALIBRATIONILLUMINANT3 52529 /* &the illuminant used for the third set of color calibration tags */
+#define TIFFTAG_COLORMATRIX3 52531 /* &matrix to convert XYZ values to reference camera native color space under CalibrationIlluminant3 */
+#define TIFFTAG_CAMERACALIBRATION3 52530 /* &matrix to transform reference camera native space values to individual camera native space values under CalibrationIlluminant3 */
+#define TIFFTAG_REDUCTIONMATRIX3 52538 /* &dimensionality reduction matrix for use in color conversion to XYZ under CalibrationIlluminant3 */
+#define TIFFTAG_PROFILEHUESATMAPDATA3 52537 /* &the data for the third HSV table */
+#define TIFFTAG_FORWARDMATRIX3 52532 /* &matrix to map white balanced camera colors to XYZ D50 */
+#define TIFFTAG_ILLUMINANTDATA1 52533 /* &data for the first calibration illuminant */
+#define TIFFTAG_ILLUMINANTDATA2 52534 /* &data for the second calibration illuminant */
+#define TIFFTAG_ILLUMINANTDATA3 53535 /* &data for the third calibration illuminant */
+
+/* TIFF/EP */
+#define TIFFTAG_EP_CFAREPEATPATTERNDIM 33421 /* dimensions of CFA pattern */
+#define TIFFTAG_EP_CFAPATTERN 33422 /* color filter array pattern */
+#define TIFFTAG_EP_BATTERYLEVEL 33423 /* battery level (rational or ASCII) */
+#define TIFFTAG_EP_INTERLACE 34857 /* Number of multi-field images */
+/* TIFFTAG_EP_IPTC_NAA and TIFFTAG_RICHTIFFIPTC share the same tag number (33723)
+ * LibTIFF type is UNDEFINED or BYTE, but often times incorrectly specified as LONG,
+ * because TIFF/EP (ISO/DIS 12234-2) specifies type LONG or ASCII. */
+#define TIFFTAG_EP_IPTC_NAA 33723 /* Alias IPTC/NAA Newspaper Association RichTIFF */
+#define TIFFTAG_EP_TIMEZONEOFFSET 34858 /* Time zone offset relative to UTC */
+#define TIFFTAG_EP_SELFTIMERMODE 34859 /* Number of seconds capture was delayed from button press */
+#define TIFFTAG_EP_FLASHENERGY 37387 /* Flash energy, or range if there is uncertainty */
+#define TIFFTAG_EP_SPATIALFREQUENCYRESPONSE 37388 /* Spatial frequency response */
+#define TIFFTAG_EP_NOISE 37389 /* Camera noise measurement values */
+#define TIFFTAG_EP_FOCALPLANEXRESOLUTION 37390 /* Focal plane X resolution */
+#define TIFFTAG_EP_FOCALPLANEYRESOLUTION 37391 /* Focal plane Y resolution */
+#define TIFFTAG_EP_FOCALPLANERESOLUTIONUNIT 37392 /* Focal plane resolution unit */
+#define TIFFTAG_EP_IMAGENUMBER 37393 /* Number of image when several of burst shot stored in same TIFF/EP */
+#define TIFFTAG_EP_SECURITYCLASSIFICATION 37394 /* Security classification */
+#define TIFFTAG_EP_IMAGEHISTORY 37395 /* Record of what has been done to the image */
+#define TIFFTAG_EP_EXPOSUREINDEX 37397 /* Exposure index */
+#define TIFFTAG_EP_STANDARDID 37398 /* TIFF/EP standard version, n.n.n.n */
+#define TIFFTAG_EP_SENSINGMETHOD 37399 /* Type of image sensor */
+/*
+ * TIFF/EP tags equivalent to EXIF tags
+ * Note that TIFF-EP and EXIF use nearly the same metadata tag set, but TIFF-EP stores the tags in IFD 0,
+ * while EXIF store the tags in a separate IFD. Either location is allowed by DNG, but the EXIF location is preferred.
+ */
+#define TIFFTAG_EP_EXPOSURETIME 33434 /* Exposure time */
+#define TIFFTAG_EP_FNUMBER 33437 /* F number */
+#define TIFFTAG_EP_EXPOSUREPROGRAM 34850 /* Exposure program */
+#define TIFFTAG_EP_SPECTRALSENSITIVITY 34852 /* Spectral sensitivity */
+#define TIFFTAG_EP_ISOSPEEDRATINGS 34855 /* ISO speed rating */
+#define TIFFTAG_EP_OECF 34856 /* Optoelectric conversion factor */
+#define TIFFTAG_EP_DATETIMEORIGINAL 36867 /* Date and time of original data generation */
+#define TIFFTAG_EP_COMPRESSEDBITSPERPIXEL 37122 /* Image compression mode */
+#define TIFFTAG_EP_SHUTTERSPEEDVALUE 37377 /* Shutter speed */
+#define TIFFTAG_EP_APERTUREVALUE 37378 /* Aperture */
+#define TIFFTAG_EP_BRIGHTNESSVALUE 37379 /* Brightness */
+#define TIFFTAG_EP_EXPOSUREBIASVALUE 37380 /* Exposure bias */
+#define TIFFTAG_EP_MAXAPERTUREVALUE 37381 /* Maximum lens aperture */
+#define TIFFTAG_EP_SUBJECTDISTANCE 37382 /* Subject distance */
+#define TIFFTAG_EP_METERINGMODE 37383 /* Metering mode */
+#define TIFFTAG_EP_LIGHTSOURCE 37384 /* Light source */
+#define TIFFTAG_EP_FLASH 37385 /* Flash */
+#define TIFFTAG_EP_FOCALLENGTH 37386 /* Lens focal length */
+#define TIFFTAG_EP_SUBJECTLOCATION 37396 /* Subject location (area) */
+
+#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 +693,207 @@ 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_WEBP_LOSSLESS_EXACT 65571 /* WebP lossless exact mode. Set-only mode. Default is 1. Can be set to 0 to increase compression rate, but R,G,B in areas where alpha = 0 will not be preserved */
+#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 */
+/* After EXIF 2.2.1 ISOSpeedRatings is named PhotographicSensitivity.
+ In addition, while "Count=Any", only 1 count should be used. */
+#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 ambientsituation at the shot in units of mGal (10-5 m/s^2) */
+/* EXIFTAG_CAMERAELEVATIONANGLE: 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_CAMERAELEVATIONANGLE 37893
+#define EXIFTAG_CAMERAOWNERNAME 42032 /* owner of a camera */
+#define EXIFTAG_BODYSERIALNUMBER 42033 /* serial number of the body of the camera */
+/* EXIFTAG_LENSSPECIFICATION: 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_LENSSPECIFICATION 42034
+#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..306874f 100644
--- a/src/3rdparty/libtiff/libtiff/tiffconf.vc.h
+++ b/src/3rdparty/libtiff/libtiff/tiffconf.h.cmake.in
@@ -4,131 +4,128 @@
from this file in your programs.
*/
+/* clang-format off */
+/* clang-format disabled because CMake scripts are very sensitive to the
+ * formatting of this file. configure_file variables of type "@VAR@" are
+ * modified by clang-format and won't be substituted.
+ */
+
#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
-
-/* Set the native cpu bit order (FILLORDER_LSB2MSB or FILLORDER_MSB2LSB) */
+#cmakedefine HAVE_IEEEFP 1
+
+/* The concept of HOST_FILLORDER is broken. Since libtiff 4.5.1
+ * this macro will always be hardcoded to FILLORDER_LSB2MSB on all
+ * architectures, to reflect past long behavior of doing so on x86 architecture.
+ * Note however that the default FillOrder used by libtiff is FILLORDER_MSB2LSB,
+ * as mandated per the TIFF specification.
+ * The influence of HOST_FILLORDER is only when passing the 'H' mode in
+ * TIFFOpen().
+ * You should NOT rely on this macro to decide the CPU endianness!
+ * This macro will be removed in libtiff 4.6
+ */
#define HOST_FILLORDER FILLORDER_LSB2MSB
/* 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 +140,5 @@
#define IPTC_SUPPORT
#endif /* _TIFFCONF_ */
-/*
- * Local Variables:
- * mode: c
- * c-basic-offset: 8
- * fill-column: 78
- * End:
- */
+
+/* clang-format on */
diff --git a/src/3rdparty/libtiff/libtiff/tiffconf.h.in b/src/3rdparty/libtiff/libtiff/tiffconf.h.in
index 5de30c9..ab01735 100644
--- a/src/3rdparty/libtiff/libtiff/tiffconf.h.in
+++ b/src/3rdparty/libtiff/libtiff/tiffconf.h.in
@@ -4,9 +4,21 @@
from this file in your programs.
*/
+/* clang-format off */
+/* clang-format disabled because CMake scripts are very sensitive to the
+ * formatting of this file. configure_file variables of type "@VAR@" are
+ * modified by clang-format and won't be substituted.
+ */
+
#ifndef _TIFFCONF_
#define _TIFFCONF_
+
+#include <stddef.h>
+#include <stdint.h>
+#include <inttypes.h>
+
+
/* Signed 16-bit type */
#undef TIFF_INT16_T
@@ -34,17 +46,23 @@
/* 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
-/* Set the native cpu bit order (FILLORDER_LSB2MSB or FILLORDER_MSB2LSB) */
-#undef HOST_FILLORDER
+/* The concept of HOST_FILLORDER is broken. Since libtiff 4.5.1
+ * this macro will always be hardcoded to FILLORDER_LSB2MSB on all
+ * architectures, to reflect past long behavior of doing so on x86 architecture.
+ * Note however that the default FillOrder used by libtiff is FILLORDER_MSB2LSB,
+ * as mandated per the TIFF specification.
+ * The influence of HOST_FILLORDER is only when passing the 'H' mode in
+ * TIFFOpen().
+ * You should NOT rely on this macro to decide the CPU endianness!
+ * This macro will be removed in libtiff 4.6
+ */
+#define HOST_FILLORDER FILLORDER_LSB2MSB
/* Native cpu byte order: 1 if big-endian (Motorola) or 0 if little-endian
(Intel) */
@@ -59,6 +77,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 +105,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 */
@@ -116,3 +140,5 @@
#define IPTC_SUPPORT
#endif /* _TIFFCONF_ */
+
+/* clang-format on */
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..2046054 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,399 @@ 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>
+typedef struct
+{
+ uint32_t uNum;
+ uint32_t uDenom;
+} TIFFRational_t;
+
#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(__clang__) || 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 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);
-extern int TIFFYCbCrToRGBInit(TIFFYCbCrToRGB*, float*, float*);
-extern void TIFFYCbCrtoRGB(TIFFYCbCrToRGB *, uint32, int32, int32,
- uint32 *, uint32 *, uint32 *);
-
-/****************************************************************************
- * 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..fbf7b07 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,231 @@ 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 */
+ TIFFHashSet *tif_map_dir_offset_to_number;
+ TIFFHashSet *tif_map_dir_number_to_offset;
+ int tif_setdirectory_force_absolute; /* switch between relative and absolute
+ stepping in TIFFSetDirectory() */
+ 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 +327,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 +360,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 +369,155 @@ 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 void _TIFFCleanupIFDOffsetAndNumberMaps(TIFF *tif);
+
+ 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..892e9a0 100644
--- a/src/3rdparty/libtiff/libtiff/tiffvers.h
+++ b/src/3rdparty/libtiff/libtiff/tiffvers.h
@@ -1,4 +1,14 @@
-#define TIFFLIB_VERSION_STR "LIBTIFF, Version 4.1.0\nCopyright (c) 1988-1996 Sam Leffler\nCopyright (c) 1991-1996 Silicon Graphics, Inc."
+/* tiffvers.h version information is updated according to version information
+ * in configure.ac */
+
+/* clang-format off */
+
+/* clang-format disabled because FindTIFF.cmake is very sensitive to the
+ * formatting of below line being a single line.
+ * Furthermore, configure_file variables of type "@VAR@" are
+ * modified by clang-format and won't be substituted by CMake.
+ */
+#define TIFFLIB_VERSION_STR "LIBTIFF, Version 4.6.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 +16,21 @@
* version checking should be done based on the
* string returned by TIFFGetVersion.
*/
-#define TIFFLIB_VERSION 20191103
+#define TIFFLIB_VERSION 20230908
+
+/* The following defines have been added in 4.5.0 */
+#define TIFFLIB_MAJOR_VERSION 4
+#define TIFFLIB_MINOR_VERSION 6
+#define TIFFLIB_MICRO_VERSION 0
+#define TIFFLIB_VERSION_STR_MAJ_MIN_MIC "4.6.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..89a0174 100644
--- a/src/3rdparty/libtiff/qt_attribution.json
+++ b/src/3rdparty/libtiff/qt_attribution.json
@@ -3,13 +3,16 @@
"Name": "TIFF Software Distribution (libtiff)",
"QDocModule": "qtimageformats",
"QtUsage": "Used in the qtiff image plugin if no system libtiff is found.",
+ "SecurityCritical": true,
"Description": "",
"Homepage": "http://www.simplesystems.org/libtiff/",
- "Version": "4.1.0",
+ "Version": "4.6.0",
+ "DownloadLocation": "https://download.osgeo.org/libtiff/tiff-4.6.0.tar.gz",
+
"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..5678427 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 \
diff --git a/src/3rdparty/libwebp/AUTHORS b/src/3rdparty/libwebp/AUTHORS
index 32ff2fb..4cbe976 100644
--- a/src/3rdparty/libwebp/AUTHORS
+++ b/src/3rdparty/libwebp/AUTHORS
@@ -1,15 +1,28 @@
Contributors:
- Aidan O'Loan (aidanol at gmail dot com)
- Alan Browning (browning at google dot com)
+- Alexandru Ardelean (ardeleanalex at gmail dot com)
+- Anuraag Agrawal (anuraaga at gmail dot com)
+- Arthur Eubanks (aeubanks at google 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)
+- Jonathan Grant (jgrantinfotech at gmail dot com)
+- Jonliu1993 (13720414433 at 163 dot com)
- Jovan Zelincevic (jovan dot zelincevic at imgtec dot com)
- Jyrki Alakuijala (jyrki at google dot com)
- Konstantin Ivlev (tomskside at gmail dot com)
@@ -18,16 +31,22 @@ 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)
+- Masahiro Hanada (hanada at atmark-techno dot com)
- Mikołaj Zalewski (mikolajz at google dot com)
- Mislav Bradac (mislavm at google dot com)
+- natewood (natewood at fb dot com)
- Nico Weber (thakis at chromium dot org)
- Noel Chromium (noel at chromium dot org)
+- Nozomi Isozaki (nontan at pixiv dot co dot jp)
- Oliver Wolff (oliver dot wolff at qt dot io)
- Owen Rodley (orodley at google dot com)
+- Ozkan Sezer (sezeroz at gmail 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)
@@ -36,10 +55,13 @@ Contributors:
- Somnath Banerjee (somnath dot banerjee at gmail dot com)
- Sriraman Tallam (tmsriram at google dot com)
- Tamar Levy (tamar dot levy at intel dot com)
+- Thiago Perrotta (tperrotta at google dot com)
- Timothy Gu (timothygu99 at gmail dot com)
- Urvang Joshi (urvang at google dot com)
- 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 0a286fc..e0d920e 100644
--- a/src/3rdparty/libwebp/ChangeLog
+++ b/src/3rdparty/libwebp/ChangeLog
@@ -1,4 +1,726 @@
+8a6a55bb update NEWS
+cf7c5a5d provide a way to opt-out/override WEBP_NODISCARD
+cc34288a update ChangeLog (tag: v1.4.0-rc1)
+f13c0886 NEWS: fix date
+74555950 Merge "vwebp: fix window title when options are given" into 1.4.0
+d781646c vwebp: fix window title when options are given
+c2e394de update NEWS
+f6d15cb7 bump version to 1.4.0
+57c388b8 update AUTHORS
+b3d1b2cb Merge changes I26f4aa22,I83386b6c,I320ed1a2 into main
+07216886 webp-container-spec: fix VP8 chunk ref ('VP8'->'VP8 ')
+f88666eb webp_js/*.html: fix canvas mapping
+e2c8f233 cmake,wasm: simplify SDL2 related flags
+d537cd37 cmake: fix vwebp_sdl compile w/libsdl-org release
+6c484cbf CMakeLists.txt: add missing WEBP_BUILD_EXTRAS check
+7b0bc235 man/cwebp.1: add more detail to -partition_limit
+3c0011bb WebPMuxGetChunk: add an assert
+955a3d14 Merge "muxread,MuxGet: add an assert" into main
+00abc000 muxread,MuxGet: add an assert
+40e85a0b Have the window title reflect the filename.
+1bf46358 man/cwebp.1: clarify -pass > 1 behavior w/o -size/-psnr
+eba03acb webp-container-spec: replace 'above' with 'earlier'
+a16d30cb webp-container-spec: clarify chunk order requirements
+8a7e9112 Merge "CMakeLists.txt: apply cmake-format" into main
+7fac6c1b Merge "Copy C code to not have multiplication overflow" into main
+e2922e43 Merge "Check for the presence of the ANDROID_ABI variable" into main
+501d9274 Copy C code to not have multiplication overflow
+fba7d62e CMakeLists.txt: apply cmake-format
+661c1b66 Merge "windows exports: use dllexport attribute, instead of visibility." into main
+8487860a windows exports: use dllexport attribute, instead of visibility.
+8ea678b9 webp/mux.h: data lifetime note w/copy_data=0
+79e05c7f Check for the presence of the ANDROID_ABI variable
+45f995a3 Expose functions for managing non-image chunks on WebPAnimEncoder
+1fb9f3dc gifdec: fix ErrorGIFNotAvailable() declaration
+4723db65 cosmetics: s/SANITY_CHECK/DCHECK/
+f4b9bc9e clear -Wextra-semi-stmt warnings
+713982b8 Limit animdecoder_fuzzer to 320MB
+cbe825e4 cmake: fix sharpyuv simd files' build
+f99305e9 Makefile.vc: add ARM64 support
+5efd6300 mv SharpYuvEstimate420Risk to extras/
+e78e924f Makefile.vc: add sharpyuv_risk_table.obj
+d7a0506d Add YUV420 riskiness metric.
+89c5b917 Merge "BuildHuffmanTable check sorted[] array bounds before writing" into main
+34c80749 Remove alpha encoding pessimization.
+13d9c30b Add a WEBP_NODISCARD
+24d7f9cb Switch code to SDL2.
+0b56dedc BuildHuffmanTable check sorted[] array bounds before writing
+a429c0de sharpyuv: convert some for() to do/while
+f0cd7861 DoSharpArgbToYuv: remove constant from loop
+339231cc SharpYuvConvertWithOptions,cosmetics: fix formatting
+307071f1 Remove medium/large code model-specific inline asm
+deadc339 Fix transfer functions where toGamma and toLinear are swapped.
+e7b78d43 Merge "Fix bug in FromLinearLog100." into main
+15a1309e Merge "webp-lossless-bitstream-spec: delete extra blank line" into main
+54ca9752 Fix bug in FromLinearLog100.
+d2cb2d8c Dereference after NULL check.
+e9d50107 webp-lossless-bitstream-spec: delete extra blank line
+78657971 Merge changes Ief442c90,Ie6e9c9a5 into main
+e30a5884 webp-lossless-bitstream-spec: update variable names
+09ca1368 Merge "webp-container-spec: change assert to MUST be TRUE" into main
+38cb4fc0 iosbuild,xcframeworkbuild: add SharpYuv framework
+40afa926 webp-lossless-bitstream-spec: simplify abstract
+9db21143 webp-container-spec: change assert to MUST be TRUE
+cdbf88ae Fix typo in API docs for incremental decoding
+05c46984 Reformat vcpkg build instructions.
+8534f539 Merge "Never send VP8_STATUS_SUSPENDED back in non-incremental." into main
+35e197bd Never send VP8_STATUS_SUSPENDED back in non-incremental.
+61441425 Add vcpkg installation instructions
+dce8397f Fix next is invalid pointer when WebPSafeMalloc fails
+57c58105 Cmake: wrong public macro WEBP_INCLUDE_DIRS
+c1ffd9ac Merge "vp8l_enc: fix non-C90 code" into main
+a3965948 Merge changes If628bb93,Ic79f6309,I45f0db23 into main
+f80e9b7e vp8l_enc: fix non-C90 code
+accd141d Update lossless spec for two simple codes.
+ac17ffff Fix non-C90 code.
+433c7dca Fix static analyzer warnings.
+5fac76cf Merge tag 'v1.3.2'
+ca332209 update ChangeLog (tag: v1.3.2)
+1ace578c update NEWS
+63234c42 bump version to 1.3.2
+a35ea50d Add a fuzzer for ReadHuffmanCodes
+95ea5226 Fix invalid incremental decoding check.
+2af26267 Fix OOB write in BuildHuffmanTable.
+902bc919 Fix OOB write in BuildHuffmanTable.
+7ba44f80 Homogenize "__asm__ volatile" vs "asm volatile"
+68e27135 webp-container-spec: reorder example chunk layout
+943b932a Merge changes I6a4d0a04,Ibc37b91e into main
+1cc94f95 decode.h: wrap idec example in /* */
+63acdd1e decode.h: fix decode example
+aac5c5d0 ReadHuffmanCode: rm redundant num code lengths check
+a2de25f6 webp-lossless-bitstream-spec: normalize list item case
+68820f0e webp-lossless-bitstream-spec: normalize pixel ref
+cdb31aa8 webp-lossless-bitstream-spec: add missing periods
+0535a8cf webp-lossless-bitstream-spec: fix grammar
+b6c4ce26 normalize numbered list item format
+dd7364c3 Merge "palette.c: fix msvc warnings" into main
+c63c5df6 palette.c: fix msvc warnings
+0a2cad51 webp-container-spec: move terms from intro section
+dd88d2ff webp-lossless-bitstream-spec: color_cache -> color cache
+6e750547 Merge changes I644d7d39,Icf05491e,Ic02e6652,I63b11258 into main
+67a7cc2b webp-lossless-bitstream-spec: fix code blocks
+1432ebba Refactor palette sorting computation.
+cd436142 webp-lossless-bitstream-spec: block -> chunk
+3cb66f64 webp-lossless-bitstream-spec: add some missing commas
+56471a53 webp-lossless-bitstream-spec: normalize item text in 5.1
+af7fbfd2 vp8l_dec,ReadTransform: improve error status reporting
+7d8e0896 vp8l_dec: add VP8LSetError()
+a71ce1cf animencoder_fuzzer: fix error check w/Nallocfuzz
+e94b36d6 webp-lossless-bitstream-spec: relocate details from 5.1
+84628e56 webp-lossless-bitstream-spec: clarify image width changes
+ee722997 alpha_dec: add missing VP8SetError()
+0081693d enc_dec_fuzzer: use WebPDecode()
+0fcb311c enc_dec_fuzzer: fix WebPEncode/pic.error_code check
+982c177c webp-lossless-bitstream-spec: fix struct member refs
+56cf5625 webp-lossless-bitstream-spec: use RFC 7405 for ABNF
+6c6b3fd3 webp-lossless-bitstream-spec,cosmetics: delete blank lines
+29b9eb15 Merge changes Id56ca4fd,I662bd1d7 into main
+47c0af8d ReadHuffmanCodes: rm max_alphabet_size calc
+b92deba3 animencoder_fuzzer: no WebPAnimEncoderAssemble check w/nallocfuzz
+6be9bf8b animencoder_fuzzer: fix leak on alloc failure
+5c965e55 vp8l_dec,cosmetics: add some /*param=*/ comments
+e4fc2f78 webp-lossless-bitstream-spec: add validity note for max_symbol
+71916726 webp-lossless-bitstream-spec: fix max_symbol definition
+eac3bd5c Have the palette code be in its own file.
+e2c85878 Add an initializer for the SharpYuvOptions struct.
+4222b006 Merge tag 'v1.3.1'
+25d94f47 Implement more transfer functions in libsharpyuv
+2153a679 Merge changes Id0300937,I5dba5ccf,I57bb68e0,I2dba7b4e,I172aca36, ... into main
+4298e976 webp-lossless-bitstream-spec: add PredictorTransformOutput
+cd7e02be webp-lossless-bitstream-spec: fix RIFF-header ABNF
+6c3845f9 webp-lossless-bitstream-spec: split LZ77 Backward Ref section
+7f1b6799 webp-lossless-bitstream-spec: split Meta Prefix Codes section
+7b634d8f webp-lossless-bitstream-spec: note transform order
+6d6d4915 webp-lossless-bitstream-spec: update transformations text
+fd7bb21c update ChangeLog (tag: v1.3.1-rc2, tag: v1.3.1)
+e1adea50 update NEWS
+6b1c722a lossless_common.h,cosmetics: fix a typo
+08d60d60 webp-lossless-bitstream-spec: split code length section
+7a12afcc webp-lossless-bitstream-spec: rm unused anchor
+43393320 enc/*: normalize WebPEncodingSetError() calls
+287fdefe enc/*: add missing WebPEncodingSetError() calls
+c3bd7cff EncodeAlphaInternal: add missing error check
+14a9dbfb webp-lossless-bitstream-spec: refine single node text
+64819c7c Implement ExtractGreen_SSE2
+d49cfbb3 vp8l_enc,WriteImage: add missing error check
+2e5a9ec3 muxread,MuxImageParse: add missing error checks
+ebb6f949 cmake,emscripten: explicitly set stack size
+59a2b1f9 WebPDecodeYUV: check u/v/stride/uv_stride ptrs
+8e965ccb Call png_get_channels() to see if image has alpha
+fe80fbbd webp-container-spec: add some missing commas
+e8ed3176 Merge "treat FILTER_NONE as a regular Unfilter[] call" into main
+03a7a048 webp-lossless-bitstream-spec: rm redundant statement
+c437c7aa webp-lossless-bitstream-spec: mv up prefix code group def
+e4f17a31 webp-lossless-bitstream-spec: fix section reference
+e2ecd5e9 webp-lossless-bitstream-spec: clarify ABNF syntax
+8b55425a webp-lossless-bitstream-spec: refine pixel copy text
+29c9f2d4 webp-lossless-bitstream-spec: minor wording updates
+6b02f660 treat FILTER_NONE as a regular Unfilter[] call
+7f75c91c webp-container-spec: fix location of informative msg
+f6499943 webp-container-spec: consistently quote FourCCs
+49918af3 webp-container-spec: minor wording updates
+7f0a3419 update ChangeLog (tag: v1.3.1-rc1)
+bab7efbe update NEWS
+7138bf8f bump version to 1.3.1
+435b4ded update AUTHORS
+47351229 update .mailmap
+46bc4fc9 Merge "Switch ExtraCost to ints and implement it in SSE." into main
+828b4ce0 Switch ExtraCost to ints and implement it in SSE.
+ff6c7f4e CONTRIBUTING.md: add C style / cmake-format notes
+dd530437 add .cmake-format.py
+adbe2cb1 cmake,cosmetics: apply cmake-format
+15b36508 doc/webp-container-spec: rm future codec comment
+c369c4bf doc/webp-lossless-bitstream-spec: improve link text
+1de35f47 doc/webp-container-spec: don't use 'currently'
+bb06a16e doc/webp-container-spec: prefer present tense
+9f38b71e doc/webp-lossless-bitstream-spec: prefer present tense
+7acb6b82 doc/webp-container-spec: avoid i.e. & e.g.
+4967e7cd doc/webp-lossless-bitstream-spec: avoid i.e. & e.g.
+e3366659 Merge "Do not find_package image libraries if not needed." into main
+428588ef clarify single leaf node trees and use of canonical prefix coding
+709ec152 Do not find_package image libraries if not needed.
+8dd80ef8 fuzz_utils.h: lower kFuzzPxLimit w/ASan
+8f187b9f Clean message calls in CMake
+cba30078 WebPConfig.cmake.in: use calculated include path
+6cf9a76a Merge "webp-lossless-bitstream-spec: remove use of 'dynamics'" into main
+740943b2 Merge "Specialize and optimize ITransform_SSE2 using do_two" into main
+2d547e24 Compare kFuzzPxLimit to max_num_operations
+ac42dde1 Specialize and optimize ITransform_SSE2 using do_two
+17e0ef1d webp-lossless-bitstream-spec: remove use of 'dynamics'
+ed274371 neon.h,cosmetics: clear a couple lint warnings
+3fb82947 cpu.h,cosmetics: segment defines
+0c496a4f cpu.h: add WEBP_AARCH64
+8151f388 move VP8GetCPUInfo declaration to cpu.c
+916548c2 Make kFuzzPxLimit sanitizer dependent
+4070b271 advanced_api_fuzzer: reduce scaling limit
+761f49c3 Merge "webp-lossless-bitstream-spec: add missing bits to ABNF" into main
+84d04c48 webp-lossless-bitstream-spec: add missing bits to ABNF
+0696e1a7 advanced_api_fuzzer: reduce scaling limit
+93d88aa2 Merge "deps.cmake: remove unneeded header checks" into main
+118e0035 deps.cmake: remove unneeded header checks
+4c3d7018 webp-lossless-bitstream-spec: condense normal-prefix-code
+a6a09b32 webp-lossless-bitstream-spec: fix 2 code typos
+50ac4f7c Merge "cpu.h: enable NEON w/_M_ARM64EC" into main
+4b7d7b4f Add contribution instructions
+0afbd97b cpu.h: enable NEON w/_M_ARM64EC
+349f4353 Merge changes Ibd89e56b,Ic57e7f84,I89096614 into main
+8f7513b7 upsampling_neon.c: fix WEBP_SWAP_16BIT_CSP check
+cbf624b5 advanced_api_fuzzer: reduce scaling limit
+89edfdd1 Skip slow scaling in libwebp advanced_api_fuzzer
+859f19f7 Reduce libwebp advanced_api_fuzzer threshold
+a4f04835 Merge changes Ic389aaa2,I329ccd79 into main
+1275fac8 Makefile.vc: fix img2webp link w/dynamic cfg
+2fe27bb9 img2webp: normalize help output
+24bed3d9 cwebp: reflow -near_lossless help text
+0825faa4 img2webp: add -sharp_yuv/-near_lossless
+d64e6d7d Merge "PaletteSortModifiedZeng: fix leak on error" into main
+0e12a22d Merge "EncodeAlphaInternal: clear result->bw on error" into main
+0edbb6ea PaletteSortModifiedZeng: fix leak on error
+41ffe04e Merge "Update yapf style from "chromium" to "yapf"" into main
+2d9d9265 Update yapf style from "chromium" to "yapf"
+a486d800 EncodeAlphaInternal: clear result->bw on error
+1347a32d Skip big scaled advanced_api_fuzzer
+52b6f067 Fix scaling limit in advanced_api_fuzzer.c
+73618428 Limit scaling in libwebp advanced_api_fuzzer.c
+b54d21a0 Merge "CMakeLists.txt: allow CMAKE_INSTALL_RPATH to be set empty" into main
+31c28db5 libwebp{,demux,mux}.pc.in: Requires -> Requires.private
+d9a505ff CMakeLists.txt: allow CMAKE_INSTALL_RPATH to be set empty
+bdf33d03 Merge tag 'v1.3.0'
+b5577769 update ChangeLog (tag: v1.3.0-rc1, tag: v1.3.0)
+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)
+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
@@ -641,7 +1363,7 @@ b016cb91 NEON: faster fancy upsampling
f04eb376 Merge tag 'v0.5.2'
341d711c NEON: 5% faster conversion to RGB565 and RGBA4444
abb54827 remove Clang warnings with unused arch arguments.
-ece9684f update ChangeLog (tag: v0.5.2-rc2, tag: v0.5.2, origin/0.5.2)
+ece9684f update ChangeLog (tag: v0.5.2-rc2, tag: v0.5.2)
aa7744ca anim_util: quiet implicit conv warnings in 32-bit
d9120271 jpegdec: correct ContextFill signature
24eb3940 Remove some errors when compiling the code as C++.
@@ -928,7 +1650,7 @@ bbb6ecd9 Merge "Add MSA optimized distortion functions"
c0991a14 io,EmitRescaledAlphaYUV: factor out a common expr
48bf5ed1 build.gradle: remove tab
bfef6c9f Merge tag 'v0.5.1'
-3d97bb75 update ChangeLog (tag: v0.5.1, origin/0.5.1)
+3d97bb75 update ChangeLog (tag: v0.5.1)
deb54d91 Clarify the expected 'config' lifespan in WebPIDecode()
435308e0 Add MSA optimized encoder transform functions
dce64bfa Add MSA optimized alpha filter functions
diff --git a/src/3rdparty/libwebp/NEWS b/src/3rdparty/libwebp/NEWS
index 46daa09..8e40d8e 100644
--- a/src/3rdparty/libwebp/NEWS
+++ b/src/3rdparty/libwebp/NEWS
@@ -1,3 +1,91 @@
+- 4/12/2024: version 1.4.0
+ This is a binary compatible release.
+ * API changes:
+ - libwebpmux: WebPAnimEncoderSetChunk, WebPAnimEncoderGetChunk,
+ WebPAnimEncoderDeleteChunk
+ - libsharpyuv: SharpYuvOptionsInit, SharpYuvConvertWithOptions
+ - extras: SharpYuvEstimate420Risk
+ * further security related hardening in libwebp & examples
+ * some minor optimizations in the lossless encoder
+ * added WEBP_NODISCARD to report unused result warnings; enable with
+ -DWEBP_ENABLE_NODISCARD=1
+ * improvements and corrections in webp-container-spec.txt and
+ webp-lossless-bitstream-spec.txt (#611)
+ * miscellaneous warning, bug & build fixes (#615, #619, #632, #635)
+
+- 9/13/2023: version 1.3.2
+ This is a binary compatible release.
+ * security fix for lossless decoder (chromium: #1479274, CVE-2023-4863)
+
+- 6/23/2023: version 1.3.1
+ This is a binary compatible release.
+ * security fixes for lossless encoder (#603, chromium: #1420107, #1455619,
+ CVE-2023-1999)
+ * improve error reporting through WebPPicture error codes
+ * fix upsampling for RGB565 and RGBA4444 in NEON builds
+ * img2webp: add -sharp_yuv & -near_lossless
+ * Windows builds:
+ - fix compatibility with clang-cl (#607)
+ - improve Arm64 performance with cl.exe
+ - add Arm64EC support
+ * fix webp_js with emcc >= 3.1.27 (stack size change, #614)
+ * CMake fixes (#592, #610, #612)
+ * further updates to the container and lossless bitstream docs (#581, #611)
+
+- 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:
diff --git a/src/3rdparty/libwebp/README b/src/3rdparty/libwebp/README
index 0592727..f6eaf2c 100644
--- a/src/3rdparty/libwebp/README
+++ b/src/3rdparty/libwebp/README
@@ -4,7 +4,7 @@
\__\__/\____/\_____/__/ ____ ___
/ _/ / \ \ / _ \/ _/
/ \_/ / / \ \ __/ \__
- \____/____/\_____/_____/____/v1.1.0
+ \____/____/\_____/_____/____/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..d721476
--- /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 c86540f..581ecbd 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>
++
+ #include <stddef.h>
+
+ #ifdef HAVE_CONFIG_H
+@@ -48,12 +50,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
+@@ -106,7 +108,8 @@
+ // 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(_M_ARM64EC))))
++ (_MSC_VER >= 1926 && (defined(_M_ARM64) || defined(_M_ARM64EC)))) && \
++ !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 618c31c..71359b3 100644
--- a/src/3rdparty/libwebp/qt_attribution.json
+++ b/src/3rdparty/libwebp/qt_attribution.json
@@ -3,10 +3,13 @@
"Name": "WebP (libwebp)",
"QDocModule": "qtimageformats",
"QtUsage": "Used in the qwebp image plugin if no system libwebp is found.",
+ "SecurityCritical": true,
"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.1.0",
+
+ "Version": "1.4.0",
+ "DownloadLocation": "https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.4.0.tar.gz",
"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..7cbf668
--- /dev/null
+++ b/src/3rdparty/libwebp/sharpyuv/sharpyuv.c
@@ -0,0 +1,574 @@
+// 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,
+ SharpYuvTransferFunctionType transfer_type) {
+ const int bit_depth = rgb_bit_depth + GetPrecisionShift(rgb_bit_depth);
+ const uint32_t A = SharpYuvGammaToLinear(a, bit_depth, transfer_type);
+ const uint32_t B = SharpYuvGammaToLinear(b, bit_depth, transfer_type);
+ const uint32_t C = SharpYuvGammaToLinear(c, bit_depth, transfer_type);
+ const uint32_t D = SharpYuvGammaToLinear(d, bit_depth, transfer_type);
+ return SharpYuvLinearToGamma((A + B + C + D + 2) >> 2, bit_depth,
+ transfer_type);
+}
+
+static WEBP_INLINE void UpdateW(const fixed_y_t* src, fixed_y_t* dst, int w,
+ int rgb_bit_depth,
+ SharpYuvTransferFunctionType transfer_type) {
+ const int bit_depth = rgb_bit_depth + GetPrecisionShift(rgb_bit_depth);
+ int i = 0;
+ do {
+ const uint32_t R =
+ SharpYuvGammaToLinear(src[0 * w + i], bit_depth, transfer_type);
+ const uint32_t G =
+ SharpYuvGammaToLinear(src[1 * w + i], bit_depth, transfer_type);
+ const uint32_t B =
+ SharpYuvGammaToLinear(src[2 * w + i], bit_depth, transfer_type);
+ const uint32_t Y = RGBToGray(R, G, B);
+ dst[i] = (fixed_y_t)SharpYuvLinearToGamma(Y, bit_depth, transfer_type);
+ } while (++i < w);
+}
+
+static void UpdateChroma(const fixed_y_t* src1, const fixed_y_t* src2,
+ fixed_t* dst, int uv_w, int rgb_bit_depth,
+ SharpYuvTransferFunctionType transfer_type) {
+ int i = 0;
+ do {
+ 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, transfer_type);
+ 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, transfer_type);
+ 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, transfer_type);
+ 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;
+ } while (++i < uv_w);
+}
+
+static void StoreGray(const fixed_y_t* rgb, fixed_y_t* y, int w) {
+ int i = 0;
+ assert(w > 0);
+ do {
+ y[i] = RGBToGray(rgb[0 * w + i], rgb[1 * w + i], rgb[2 * w + i]);
+ } while (++i < w);
+}
+
+//------------------------------------------------------------------------------
+
+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 = 0;
+ const int w = (pic_width + 1) & ~1;
+ do {
+ 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);
+ }
+ } while (++i < pic_width);
+ 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;
+
+ best_uv = best_uv_base;
+ j = 0;
+ do {
+ i = 0;
+ do {
+ 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);
+ }
+ } while (++i < width);
+ best_y += w;
+ best_uv += (j & 1) * 3 * uv_w;
+ y_ptr += y_stride;
+ } while (++j < height);
+
+ best_uv = best_uv_base;
+ j = 0;
+ do {
+ i = 0;
+ do {
+ // 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[i + 0 * uv_w];
+ const int g = best_uv[i + 1 * uv_w];
+ const int b = best_uv[i + 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);
+ }
+ } while (++i < uv_w);
+ best_uv += 3 * uv_w;
+ u_ptr += u_stride;
+ v_ptr += v_stride;
+ } while (++j < uv_h);
+ 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((uint64_t)(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,
+ SharpYuvTransferFunctionType transfer_type) {
+ // 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;
+ const int y_bit_depth = rgb_bit_depth + GetPrecisionShift(rgb_bit_depth);
+ 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, transfer_type);
+ UpdateW(src2, target_y + w, w, rgb_bit_depth, transfer_type);
+ UpdateChroma(src1, src2, target_uv, uv_w, rgb_bit_depth, transfer_type);
+ 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;
+ j = 0;
+ do {
+ 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, transfer_type);
+ UpdateW(src2, best_rgb_y + 1 * w, w, rgb_bit_depth, transfer_type);
+ UpdateChroma(src1, src2, best_rgb_uv, uv_w, rgb_bit_depth, transfer_type);
+
+ // update two rows of Y and one row of RGB
+ diff_y_sum +=
+ SharpYuvUpdateY(target_y, best_rgb_y, best_y, 2 * w, y_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;
+ j += 2;
+ } while (j < h);
+ // 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.
+extern VP8CPUInfo SharpYuvGetCPUInfo;
+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) {
+ SharpYuvOptions options;
+ options.yuv_matrix = yuv_matrix;
+ options.transfer_type = kSharpYuvTransferFunctionSrgb;
+ return SharpYuvConvertWithOptions(
+ 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, &options);
+}
+
+int SharpYuvOptionsInitInternal(const SharpYuvConversionMatrix* yuv_matrix,
+ SharpYuvOptions* options, int version) {
+ const int major = (version >> 24);
+ const int minor = (version >> 16) & 0xff;
+ if (options == NULL || yuv_matrix == NULL ||
+ (major == SHARPYUV_VERSION_MAJOR && major == 0 &&
+ minor != SHARPYUV_VERSION_MINOR) ||
+ (major != SHARPYUV_VERSION_MAJOR)) {
+ return 0;
+ }
+ options->yuv_matrix = yuv_matrix;
+ options->transfer_type = kSharpYuvTransferFunctionSrgb;
+ return 1;
+}
+
+int SharpYuvConvertWithOptions(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 SharpYuvOptions* options) {
+ const SharpYuvConversionMatrix* yuv_matrix = options->yuv_matrix;
+ SharpYuvTransferFunctionType transfer_type = options->transfer_type;
+ 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, transfer_type);
+}
+
+//------------------------------------------------------------------------------
diff --git a/src/3rdparty/libwebp/sharpyuv/sharpyuv.h b/src/3rdparty/libwebp/sharpyuv/sharpyuv.h
new file mode 100644
index 0000000..fe95891
--- /dev/null
+++ b/src/3rdparty/libwebp/sharpyuv/sharpyuv.h
@@ -0,0 +1,172 @@
+// 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(_WIN32) && defined(WEBP_DLL)
+#define SHARPYUV_EXTERN __declspec(dllexport)
+#elif defined(__GNUC__) && __GNUC__ >= 4
+#define SHARPYUV_EXTERN extern __attribute__((visibility("default")))
+#else
+#define SHARPYUV_EXTERN extern
+#endif /* defined(_WIN32) && defined(WEBP_DLL) */
+#endif /* WEBP_EXTERN */
+#endif /* SHARPYUV_EXTERN */
+
+#ifndef SHARPYUV_INLINE
+#ifdef WEBP_INLINE
+#define SHARPYUV_INLINE WEBP_INLINE
+#else
+#ifndef _MSC_VER
+#if defined(__cplusplus) || !defined(__STRICT_ANSI__) || \
+ (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L)
+#define SHARPYUV_INLINE inline
+#else
+#define SHARPYUV_INLINE
+#endif
+#else
+#define SHARPYUV_INLINE __forceinline
+#endif /* _MSC_VER */
+#endif /* WEBP_INLINE */
+#endif /* SHARPYUV_INLINE */
+
+// SharpYUV API version following the convention from semver.org
+#define SHARPYUV_VERSION_MAJOR 0
+#define SHARPYUV_VERSION_MINOR 4
+#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;
+
+typedef struct SharpYuvOptions SharpYuvOptions;
+
+// Enums for transfer functions, as defined in H.273,
+// https://www.itu.int/rec/T-REC-H.273-202107-I/en
+typedef enum SharpYuvTransferFunctionType {
+ // 0 is reserved
+ kSharpYuvTransferFunctionBt709 = 1,
+ // 2 is unspecified
+ // 3 is reserved
+ kSharpYuvTransferFunctionBt470M = 4,
+ kSharpYuvTransferFunctionBt470Bg = 5,
+ kSharpYuvTransferFunctionBt601 = 6,
+ kSharpYuvTransferFunctionSmpte240 = 7,
+ kSharpYuvTransferFunctionLinear = 8,
+ kSharpYuvTransferFunctionLog100 = 9,
+ kSharpYuvTransferFunctionLog100_Sqrt10 = 10,
+ kSharpYuvTransferFunctionIec61966 = 11,
+ kSharpYuvTransferFunctionBt1361 = 12,
+ kSharpYuvTransferFunctionSrgb = 13,
+ kSharpYuvTransferFunctionBt2020_10Bit = 14,
+ kSharpYuvTransferFunctionBt2020_12Bit = 15,
+ kSharpYuvTransferFunctionSmpte2084 = 16, // PQ
+ kSharpYuvTransferFunctionSmpte428 = 17,
+ kSharpYuvTransferFunctionHlg = 18,
+ kSharpYuvTransferFunctionNum
+} SharpYuvTransferFunctionType;
+
+// 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
+// This function calls SharpYuvConvertWithOptions with a default transfer
+// function of kSharpYuvTransferFunctionSrgb.
+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);
+
+struct SharpYuvOptions {
+ // This matrix cannot be NULL and can be initialized by
+ // SharpYuvComputeConversionMatrix.
+ const SharpYuvConversionMatrix* yuv_matrix;
+ SharpYuvTransferFunctionType transfer_type;
+};
+
+// Internal, version-checked, entry point
+SHARPYUV_EXTERN int SharpYuvOptionsInitInternal(const SharpYuvConversionMatrix*,
+ SharpYuvOptions*, int);
+
+// Should always be called, to initialize a fresh SharpYuvOptions
+// structure before modification. SharpYuvOptionsInit() must have succeeded
+// before using the 'options' object.
+static SHARPYUV_INLINE int SharpYuvOptionsInit(
+ const SharpYuvConversionMatrix* yuv_matrix, SharpYuvOptions* options) {
+ return SharpYuvOptionsInitInternal(yuv_matrix, options, SHARPYUV_VERSION);
+}
+
+SHARPYUV_EXTERN int SharpYuvConvertWithOptions(
+ 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 SharpYuvOptions* options);
+
+// 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..94a40ec
--- /dev/null
+++ b/src/3rdparty/libwebp/sharpyuv/sharpyuv_dsp.c
@@ -0,0 +1,104 @@
+// 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"
+#include "src/webp/types.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 VP8CPUInfo SharpYuvGetCPUInfo;
+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..0902842
--- /dev/null
+++ b/src/3rdparty/libwebp/sharpyuv/sharpyuv_gamma.c
@@ -0,0 +1,419 @@
+// 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 <float.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;
+}
+
+static uint32_t ToLinearSrgb(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);
+}
+
+static uint16_t FromLinearSrgb(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);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+#define CLAMP(x, low, high) \
+ (((x) < (low)) ? (low) : (((high) < (x)) ? (high) : (x)))
+#define MIN(a, b) (((a) < (b)) ? (a) : (b))
+#define MAX(a, b) (((a) > (b)) ? (a) : (b))
+
+static WEBP_INLINE float Roundf(float x) {
+ if (x < 0)
+ return (float)ceil((double)(x - 0.5f));
+ else
+ return (float)floor((double)(x + 0.5f));
+}
+
+static WEBP_INLINE float Powf(float base, float exp) {
+ return (float)pow((double)base, (double)exp);
+}
+
+static WEBP_INLINE float Log10f(float x) { return (float)log10((double)x); }
+
+static float ToLinear709(float gamma) {
+ if (gamma < 0.f) {
+ return 0.f;
+ } else if (gamma < 4.5f * 0.018053968510807f) {
+ return gamma / 4.5f;
+ } else if (gamma < 1.f) {
+ return Powf((gamma + 0.09929682680944f) / 1.09929682680944f, 1.f / 0.45f);
+ }
+ return 1.f;
+}
+
+static float FromLinear709(float linear) {
+ if (linear < 0.f) {
+ return 0.f;
+ } else if (linear < 0.018053968510807f) {
+ return linear * 4.5f;
+ } else if (linear < 1.f) {
+ return 1.09929682680944f * Powf(linear, 0.45f) - 0.09929682680944f;
+ }
+ return 1.f;
+}
+
+static float ToLinear470M(float gamma) {
+ return Powf(CLAMP(gamma, 0.f, 1.f), 2.2f);
+}
+
+static float FromLinear470M(float linear) {
+ return Powf(CLAMP(linear, 0.f, 1.f), 1.f / 2.2f);
+}
+
+static float ToLinear470Bg(float gamma) {
+ return Powf(CLAMP(gamma, 0.f, 1.f), 2.8f);
+}
+
+static float FromLinear470Bg(float linear) {
+ return Powf(CLAMP(linear, 0.f, 1.f), 1.f / 2.8f);
+}
+
+static float ToLinearSmpte240(float gamma) {
+ if (gamma < 0.f) {
+ return 0.f;
+ } else if (gamma < 4.f * 0.022821585529445f) {
+ return gamma / 4.f;
+ } else if (gamma < 1.f) {
+ return Powf((gamma + 0.111572195921731f) / 1.111572195921731f, 1.f / 0.45f);
+ }
+ return 1.f;
+}
+
+static float FromLinearSmpte240(float linear) {
+ if (linear < 0.f) {
+ return 0.f;
+ } else if (linear < 0.022821585529445f) {
+ return linear * 4.f;
+ } else if (linear < 1.f) {
+ return 1.111572195921731f * Powf(linear, 0.45f) - 0.111572195921731f;
+ }
+ return 1.f;
+}
+
+static float ToLinearLog100(float gamma) {
+ // The function is non-bijective so choose the middle of [0, 0.01].
+ const float mid_interval = 0.01f / 2.f;
+ return (gamma <= 0.0f) ? mid_interval
+ : Powf(10.0f, 2.f * (MIN(gamma, 1.f) - 1.0f));
+}
+
+static float FromLinearLog100(float linear) {
+ return (linear < 0.01f) ? 0.0f : 1.0f + Log10f(MIN(linear, 1.f)) / 2.0f;
+}
+
+static float ToLinearLog100Sqrt10(float gamma) {
+ // The function is non-bijective so choose the middle of [0, 0.00316227766f[.
+ const float mid_interval = 0.00316227766f / 2.f;
+ return (gamma <= 0.0f) ? mid_interval
+ : Powf(10.0f, 2.5f * (MIN(gamma, 1.f) - 1.0f));
+}
+
+static float FromLinearLog100Sqrt10(float linear) {
+ return (linear < 0.00316227766f) ? 0.0f
+ : 1.0f + Log10f(MIN(linear, 1.f)) / 2.5f;
+}
+
+static float ToLinearIec61966(float gamma) {
+ if (gamma <= -4.5f * 0.018053968510807f) {
+ return Powf((-gamma + 0.09929682680944f) / -1.09929682680944f, 1.f / 0.45f);
+ } else if (gamma < 4.5f * 0.018053968510807f) {
+ return gamma / 4.5f;
+ }
+ return Powf((gamma + 0.09929682680944f) / 1.09929682680944f, 1.f / 0.45f);
+}
+
+static float FromLinearIec61966(float linear) {
+ if (linear <= -0.018053968510807f) {
+ return -1.09929682680944f * Powf(-linear, 0.45f) + 0.09929682680944f;
+ } else if (linear < 0.018053968510807f) {
+ return linear * 4.5f;
+ }
+ return 1.09929682680944f * Powf(linear, 0.45f) - 0.09929682680944f;
+}
+
+static float ToLinearBt1361(float gamma) {
+ if (gamma < -0.25f) {
+ return -0.25f;
+ } else if (gamma < 0.f) {
+ return Powf((gamma - 0.02482420670236f) / -0.27482420670236f, 1.f / 0.45f) /
+ -4.f;
+ } else if (gamma < 4.5f * 0.018053968510807f) {
+ return gamma / 4.5f;
+ } else if (gamma < 1.f) {
+ return Powf((gamma + 0.09929682680944f) / 1.09929682680944f, 1.f / 0.45f);
+ }
+ return 1.f;
+}
+
+static float FromLinearBt1361(float linear) {
+ if (linear < -0.25f) {
+ return -0.25f;
+ } else if (linear < 0.f) {
+ return -0.27482420670236f * Powf(-4.f * linear, 0.45f) + 0.02482420670236f;
+ } else if (linear < 0.018053968510807f) {
+ return linear * 4.5f;
+ } else if (linear < 1.f) {
+ return 1.09929682680944f * Powf(linear, 0.45f) - 0.09929682680944f;
+ }
+ return 1.f;
+}
+
+static float ToLinearPq(float gamma) {
+ if (gamma > 0.f) {
+ const float pow_gamma = Powf(gamma, 32.f / 2523.f);
+ const float num = MAX(pow_gamma - 107.f / 128.f, 0.0f);
+ const float den = MAX(2413.f / 128.f - 2392.f / 128.f * pow_gamma, FLT_MIN);
+ return Powf(num / den, 4096.f / 653.f);
+ }
+ return 0.f;
+}
+
+static float FromLinearPq(float linear) {
+ if (linear > 0.f) {
+ const float pow_linear = Powf(linear, 653.f / 4096.f);
+ const float num = 107.f / 128.f + 2413.f / 128.f * pow_linear;
+ const float den = 1.0f + 2392.f / 128.f * pow_linear;
+ return Powf(num / den, 2523.f / 32.f);
+ }
+ return 0.f;
+}
+
+static float ToLinearSmpte428(float gamma) {
+ return Powf(MAX(gamma, 0.f), 2.6f) / 0.91655527974030934f;
+}
+
+static float FromLinearSmpte428(float linear) {
+ return Powf(0.91655527974030934f * MAX(linear, 0.f), 1.f / 2.6f);
+}
+
+// Conversion in BT.2100 requires RGB info. Simplify to gamma correction here.
+static float ToLinearHlg(float gamma) {
+ if (gamma < 0.f) {
+ return 0.f;
+ } else if (gamma <= 0.5f) {
+ return Powf((gamma * gamma) * (1.f / 3.f), 1.2f);
+ }
+ return Powf((expf((gamma - 0.55991073f) / 0.17883277f) + 0.28466892f) / 12.0f,
+ 1.2f);
+}
+
+static float FromLinearHlg(float linear) {
+ linear = Powf(linear, 1.f / 1.2f);
+ if (linear < 0.f) {
+ return 0.f;
+ } else if (linear <= (1.f / 12.f)) {
+ return sqrtf(3.f * linear);
+ }
+ return 0.17883277f * logf(12.f * linear - 0.28466892f) + 0.55991073f;
+}
+
+uint32_t SharpYuvGammaToLinear(uint16_t v, int bit_depth,
+ SharpYuvTransferFunctionType transfer_type) {
+ float v_float, linear;
+ if (transfer_type == kSharpYuvTransferFunctionSrgb) {
+ return ToLinearSrgb(v, bit_depth);
+ }
+ v_float = (float)v / ((1 << bit_depth) - 1);
+ switch (transfer_type) {
+ case kSharpYuvTransferFunctionBt709:
+ case kSharpYuvTransferFunctionBt601:
+ case kSharpYuvTransferFunctionBt2020_10Bit:
+ case kSharpYuvTransferFunctionBt2020_12Bit:
+ linear = ToLinear709(v_float);
+ break;
+ case kSharpYuvTransferFunctionBt470M:
+ linear = ToLinear470M(v_float);
+ break;
+ case kSharpYuvTransferFunctionBt470Bg:
+ linear = ToLinear470Bg(v_float);
+ break;
+ case kSharpYuvTransferFunctionSmpte240:
+ linear = ToLinearSmpte240(v_float);
+ break;
+ case kSharpYuvTransferFunctionLinear:
+ return v;
+ case kSharpYuvTransferFunctionLog100:
+ linear = ToLinearLog100(v_float);
+ break;
+ case kSharpYuvTransferFunctionLog100_Sqrt10:
+ linear = ToLinearLog100Sqrt10(v_float);
+ break;
+ case kSharpYuvTransferFunctionIec61966:
+ linear = ToLinearIec61966(v_float);
+ break;
+ case kSharpYuvTransferFunctionBt1361:
+ linear = ToLinearBt1361(v_float);
+ break;
+ case kSharpYuvTransferFunctionSmpte2084:
+ linear = ToLinearPq(v_float);
+ break;
+ case kSharpYuvTransferFunctionSmpte428:
+ linear = ToLinearSmpte428(v_float);
+ break;
+ case kSharpYuvTransferFunctionHlg:
+ linear = ToLinearHlg(v_float);
+ break;
+ default:
+ assert(0);
+ linear = 0;
+ break;
+ }
+ return (uint32_t)Roundf(linear * ((1 << 16) - 1));
+}
+
+uint16_t SharpYuvLinearToGamma(uint32_t v, int bit_depth,
+ SharpYuvTransferFunctionType transfer_type) {
+ float v_float, linear;
+ if (transfer_type == kSharpYuvTransferFunctionSrgb) {
+ return FromLinearSrgb(v, bit_depth);
+ }
+ v_float = (float)v / ((1 << 16) - 1);
+ switch (transfer_type) {
+ case kSharpYuvTransferFunctionBt709:
+ case kSharpYuvTransferFunctionBt601:
+ case kSharpYuvTransferFunctionBt2020_10Bit:
+ case kSharpYuvTransferFunctionBt2020_12Bit:
+ linear = FromLinear709(v_float);
+ break;
+ case kSharpYuvTransferFunctionBt470M:
+ linear = FromLinear470M(v_float);
+ break;
+ case kSharpYuvTransferFunctionBt470Bg:
+ linear = FromLinear470Bg(v_float);
+ break;
+ case kSharpYuvTransferFunctionSmpte240:
+ linear = FromLinearSmpte240(v_float);
+ break;
+ case kSharpYuvTransferFunctionLinear:
+ return v;
+ case kSharpYuvTransferFunctionLog100:
+ linear = FromLinearLog100(v_float);
+ break;
+ case kSharpYuvTransferFunctionLog100_Sqrt10:
+ linear = FromLinearLog100Sqrt10(v_float);
+ break;
+ case kSharpYuvTransferFunctionIec61966:
+ linear = FromLinearIec61966(v_float);
+ break;
+ case kSharpYuvTransferFunctionBt1361:
+ linear = FromLinearBt1361(v_float);
+ break;
+ case kSharpYuvTransferFunctionSmpte2084:
+ linear = FromLinearPq(v_float);
+ break;
+ case kSharpYuvTransferFunctionSmpte428:
+ linear = FromLinearSmpte428(v_float);
+ break;
+ case kSharpYuvTransferFunctionHlg:
+ linear = FromLinearHlg(v_float);
+ break;
+ default:
+ assert(0);
+ linear = 0;
+ break;
+ }
+ return (uint16_t)Roundf(linear * ((1 << bit_depth) - 1));
+}
diff --git a/src/3rdparty/libwebp/sharpyuv/sharpyuv_gamma.h b/src/3rdparty/libwebp/sharpyuv/sharpyuv_gamma.h
new file mode 100644
index 0000000..b8ba7e9
--- /dev/null
+++ b/src/3rdparty/libwebp/sharpyuv/sharpyuv_gamma.h
@@ -0,0 +1,38 @@
+// 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 "sharpyuv/sharpyuv.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 'bit_depth'-bit gamma color value to a 16-bit linear value.
+uint32_t SharpYuvGammaToLinear(uint16_t v, int bit_depth,
+ SharpYuvTransferFunctionType transfer_type);
+
+// Converts a 16-bit linear color value to a 'bit_depth'-bit gamma value.
+uint16_t SharpYuvLinearToGamma(uint32_t value, int bit_depth,
+ SharpYuvTransferFunctionType transfer_type);
+
+#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..b6c874f 100644
--- a/src/3rdparty/libwebp/src/dec/alpha_dec.c
+++ b/src/3rdparty/libwebp/src/dec/alpha_dec.c
@@ -13,18 +13,20 @@
#include <stdlib.h>
#include "src/dec/alphai_dec.h"
+#include "src/dec/vp8_dec.h"
#include "src/dec/vp8i_dec.h"
#include "src/dec/vp8li_dec.h"
#include "src/dsp/dsp.h"
#include "src/utils/quant_levels_dec_utils.h"
#include "src/utils/utils.h"
#include "src/webp/format_constants.h"
+#include "src/webp/types.h"
//------------------------------------------------------------------------------
// ALPHDecoder object.
// Allocates a new alpha decoder instance.
-static ALPHDecoder* ALPHNew(void) {
+WEBP_NODISCARD static ALPHDecoder* ALPHNew(void) {
ALPHDecoder* const dec = (ALPHDecoder*)WebPSafeCalloc(1ULL, sizeof(*dec));
return dec;
}
@@ -45,9 +47,9 @@ static void ALPHDelete(ALPHDecoder* const dec) {
// header for alpha data stored using lossless compression.
// Returns false in case of error in alpha header (data too short, invalid
// compression method or filter, error in lossless header data etc).
-static int ALPHInit(ALPHDecoder* const dec, const uint8_t* data,
- size_t data_size, const VP8Io* const src_io,
- uint8_t* output) {
+WEBP_NODISCARD static int ALPHInit(ALPHDecoder* const dec, const uint8_t* data,
+ size_t data_size, const VP8Io* const src_io,
+ uint8_t* output) {
int ok = 0;
const uint8_t* const alpha_data = data + ALPHA_HEADER_LEN;
const size_t alpha_data_size = data_size - ALPHA_HEADER_LEN;
@@ -79,7 +81,9 @@ static int ALPHInit(ALPHDecoder* const dec, const uint8_t* data,
}
// Copy the necessary parameters from src_io to io
- VP8InitIo(io);
+ if (!VP8InitIo(io)) {
+ return 0;
+ }
WebPInitCustomIo(NULL, io);
io->opaque = dec;
io->width = src_io->width;
@@ -107,7 +111,8 @@ static int ALPHInit(ALPHDecoder* const dec, const uint8_t* data,
// starting from row number 'row'. It assumes that rows up to (row - 1) have
// already been decoded.
// Returns false in case of bitstream error.
-static int ALPHDecode(VP8Decoder* const dec, int row, int num_rows) {
+WEBP_NODISCARD static int ALPHDecode(VP8Decoder* const dec, int row,
+ int num_rows) {
ALPHDecoder* const alph_dec = dec->alph_dec_;
const int width = alph_dec->width_;
const int height = alph_dec->io_.crop_bottom;
@@ -117,21 +122,12 @@ static int ALPHDecode(VP8Decoder* const dec, int row, int num_rows) {
const uint8_t* deltas = dec->alpha_data_ + ALPHA_HEADER_LEN + row * width;
uint8_t* dst = dec->alpha_plane_ + row * width;
assert(deltas <= &dec->alpha_data_[dec->alpha_data_size_]);
- if (alph_dec->filter_ != WEBP_FILTER_NONE) {
- assert(WebPUnfilters[alph_dec->filter_] != NULL);
- for (y = 0; y < num_rows; ++y) {
- WebPUnfilters[alph_dec->filter_](prev_line, deltas, dst, width);
- prev_line = dst;
- dst += width;
- deltas += width;
- }
- } else {
- for (y = 0; y < num_rows; ++y) {
- memcpy(dst, deltas, width * sizeof(*dst));
- prev_line = dst;
- dst += width;
- deltas += width;
- }
+ assert(WebPUnfilters[alph_dec->filter_] != NULL);
+ for (y = 0; y < num_rows; ++y) {
+ WebPUnfilters[alph_dec->filter_](prev_line, deltas, dst, width);
+ prev_line = dst;
+ dst += width;
+ deltas += width;
}
dec->alpha_prev_line_ = prev_line;
} else { // alph_dec->method_ == ALPHA_LOSSLESS_COMPRESSION
@@ -147,7 +143,8 @@ static int ALPHDecode(VP8Decoder* const dec, int row, int num_rows) {
return 1;
}
-static int AllocateAlphaPlane(VP8Decoder* const dec, const VP8Io* const io) {
+WEBP_NODISCARD static int AllocateAlphaPlane(VP8Decoder* const dec,
+ const VP8Io* const io) {
const int stride = io->width;
const int height = io->crop_bottom;
const uint64_t alpha_size = (uint64_t)stride * height;
@@ -155,7 +152,8 @@ static int AllocateAlphaPlane(VP8Decoder* const dec, const VP8Io* const io) {
dec->alpha_plane_mem_ =
(uint8_t*)WebPSafeMalloc(alpha_size, sizeof(*dec->alpha_plane_));
if (dec->alpha_plane_mem_ == NULL) {
- return 0;
+ return VP8SetError(dec, VP8_STATUS_OUT_OF_MEMORY,
+ "Alpha decoder initialization failed.");
}
dec->alpha_plane_ = dec->alpha_plane_mem_;
dec->alpha_prev_line_ = NULL;
@@ -174,25 +172,34 @@ void WebPDeallocateAlphaMemory(VP8Decoder* const dec) {
//------------------------------------------------------------------------------
// Main entry point.
-const uint8_t* VP8DecompressAlphaRows(VP8Decoder* const dec,
- const VP8Io* const io,
- int row, int num_rows) {
+WEBP_NODISCARD const uint8_t* VP8DecompressAlphaRows(VP8Decoder* const dec,
+ const VP8Io* const io,
+ int row, int num_rows) {
const int width = io->width;
const int height = io->crop_bottom;
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_) {
if (dec->alph_dec_ == NULL) { // Initialize decoder.
dec->alph_dec_ = ALPHNew();
- if (dec->alph_dec_ == NULL) return NULL;
+ if (dec->alph_dec_ == NULL) {
+ VP8SetError(dec, VP8_STATUS_OUT_OF_MEMORY,
+ "Alpha decoder initialization failed.");
+ return NULL;
+ }
if (!AllocateAlphaPlane(dec, io)) goto Error;
if (!ALPHInit(dec->alph_dec_, dec->alpha_data_, dec->alpha_data_size_,
io, dec->alpha_plane_)) {
+ VP8LDecoder* const vp8l_dec = dec->alph_dec_->vp8l_dec_;
+ VP8SetError(dec,
+ (vp8l_dec == NULL) ? VP8_STATUS_OUT_OF_MEMORY
+ : vp8l_dec->status_,
+ "Alpha decoder initialization failed.");
goto Error;
}
// if we allowed use of alpha dithering, check whether it's needed at all
diff --git a/src/3rdparty/libwebp/src/dec/buffer_dec.c b/src/3rdparty/libwebp/src/dec/buffer_dec.c
index 3cd94eb..11ce76f 100644
--- a/src/3rdparty/libwebp/src/dec/buffer_dec.c
+++ b/src/3rdparty/libwebp/src/dec/buffer_dec.c
@@ -75,7 +75,7 @@ static VP8StatusCode CheckDecBuffer(const WebPDecBuffer* const buffer) {
const WebPRGBABuffer* const buf = &buffer->u.RGBA;
const int stride = abs(buf->stride);
const uint64_t size =
- MIN_BUFFER_SIZE(width * kModeBpp[mode], height, stride);
+ MIN_BUFFER_SIZE((uint64_t)width * kModeBpp[mode], height, stride);
ok &= (size <= buf->size);
ok &= (stride >= width * kModeBpp[mode]);
ok &= (buf->rgba != NULL);
@@ -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 04609a8..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;
diff --git a/src/3rdparty/libwebp/src/dec/idec_dec.c b/src/3rdparty/libwebp/src/dec/idec_dec.c
index 9035df5..ad042a1 100644
--- a/src/3rdparty/libwebp/src/dec/idec_dec.c
+++ b/src/3rdparty/libwebp/src/dec/idec_dec.c
@@ -17,8 +17,10 @@
#include "src/dec/alphai_dec.h"
#include "src/dec/webpi_dec.h"
+#include "src/dec/vp8_dec.h"
#include "src/dec/vp8i_dec.h"
#include "src/utils/utils.h"
+#include "src/webp/decode.h"
// In append mode, buffer allocations increase as multiples of this value.
// Needs to be a power of 2.
@@ -161,8 +163,9 @@ static void DoRemap(WebPIDecoder* const idec, ptrdiff_t offset) {
// Appends data to the end of MemBuffer->buf_. It expands the allocated memory
// size if required and also updates VP8BitReader's if new memory is allocated.
-static int AppendToMemBuffer(WebPIDecoder* const idec,
- const uint8_t* const data, size_t data_size) {
+WEBP_NODISCARD static int AppendToMemBuffer(WebPIDecoder* const idec,
+ const uint8_t* const data,
+ size_t data_size) {
VP8Decoder* const dec = (VP8Decoder*)idec->dec_;
MemBuffer* const mem = &idec->mem_;
const int need_compressed_alpha = NeedCompressedAlpha(idec);
@@ -203,8 +206,9 @@ static int AppendToMemBuffer(WebPIDecoder* const idec,
return 1;
}
-static int RemapMemBuffer(WebPIDecoder* const idec,
- const uint8_t* const data, size_t data_size) {
+WEBP_NODISCARD 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 =
@@ -237,7 +241,8 @@ static void ClearMemBuffer(MemBuffer* const mem) {
}
}
-static int CheckMemBufferMode(MemBuffer* const mem, MemBufferMode expected) {
+WEBP_NODISCARD static int CheckMemBufferMode(MemBuffer* const mem,
+ MemBufferMode expected) {
if (mem->mode_ == MEM_MODE_NONE) {
mem->mode_ = expected; // switch to the expected mode
} else if (mem->mode_ != expected) {
@@ -248,7 +253,7 @@ static int CheckMemBufferMode(MemBuffer* const mem, MemBufferMode expected) {
}
// To be called last.
-static VP8StatusCode FinishDecoding(WebPIDecoder* const idec) {
+WEBP_NODISCARD static VP8StatusCode FinishDecoding(WebPIDecoder* const idec) {
const WebPDecoderOptions* const options = idec->params_.options;
WebPDecBuffer* const output = idec->params_.output;
@@ -258,8 +263,10 @@ static VP8StatusCode FinishDecoding(WebPIDecoder* const idec) {
if (status != VP8_STATUS_OK) return status;
}
if (idec->final_output_ != NULL) {
- WebPCopyDecBufferPixels(output, idec->final_output_); // do the slow-copy
+ const VP8StatusCode status = WebPCopyDecBufferPixels(
+ output, idec->final_output_); // do the slow-copy
WebPFreeDecBuffer(&idec->output_);
+ if (status != VP8_STATUS_OK) return status;
*output = *idec->final_output_;
idec->final_output_ = NULL;
}
@@ -288,7 +295,7 @@ static void RestoreContext(const MBContext* context, VP8Decoder* const dec,
static VP8StatusCode IDecError(WebPIDecoder* const idec, VP8StatusCode error) {
if (idec->state_ == STATE_VP8_DATA) {
// Synchronize the thread, clean-up and check for errors.
- VP8ExitCritical((VP8Decoder*)idec->dec_, &idec->io_);
+ (void)VP8ExitCritical((VP8Decoder*)idec->dec_, &idec->io_);
}
idec->state_ = STATE_ERROR;
return error;
@@ -329,6 +336,7 @@ static VP8StatusCode DecodeWebPHeaders(WebPIDecoder* const idec) {
if (dec == NULL) {
return VP8_STATUS_OUT_OF_MEMORY;
}
+ dec->incremental_ = 1;
idec->dec_ = dec;
dec->alpha_data_ = headers.alpha_data;
dec->alpha_data_size_ = headers.alpha_data_size;
@@ -601,8 +609,9 @@ static VP8StatusCode IDecode(WebPIDecoder* idec) {
//------------------------------------------------------------------------------
// Internal constructor
-static WebPIDecoder* NewDecoder(WebPDecBuffer* const output_buffer,
- const WebPBitstreamFeatures* const features) {
+WEBP_NODISCARD static WebPIDecoder* NewDecoder(
+ WebPDecBuffer* const output_buffer,
+ const WebPBitstreamFeatures* const features) {
WebPIDecoder* idec = (WebPIDecoder*)WebPSafeCalloc(1ULL, sizeof(*idec));
if (idec == NULL) {
return NULL;
@@ -614,8 +623,10 @@ static WebPIDecoder* NewDecoder(WebPDecBuffer* const output_buffer,
idec->last_mb_y_ = -1;
InitMemBuffer(&idec->mem_);
- WebPInitDecBuffer(&idec->output_);
- VP8InitIo(&idec->io_);
+ if (!WebPInitDecBuffer(&idec->output_) || !VP8InitIo(&idec->io_)) {
+ WebPSafeFree(idec);
+ return NULL;
+ }
WebPResetDecParams(&idec->params_);
if (output_buffer == NULL || WebPAvoidSlowMemory(output_buffer, features)) {
@@ -674,7 +685,8 @@ void WebPIDelete(WebPIDecoder* idec) {
if (!idec->is_lossless_) {
if (idec->state_ == STATE_VP8_DATA) {
// Synchronize the thread, clean-up and check for errors.
- VP8ExitCritical((VP8Decoder*)idec->dec_, &idec->io_);
+ // TODO(vrabaud) do we care about the return result?
+ (void)VP8ExitCritical((VP8Decoder*)idec->dec_, &idec->io_);
}
VP8Delete((VP8Decoder*)idec->dec_);
} else {
@@ -851,8 +863,8 @@ const WebPDecBuffer* WebPIDecodedArea(const WebPIDecoder* idec,
return src;
}
-uint8_t* WebPIDecGetRGB(const WebPIDecoder* idec, int* last_y,
- int* width, int* height, int* stride) {
+WEBP_NODISCARD uint8_t* WebPIDecGetRGB(const WebPIDecoder* idec, int* last_y,
+ int* width, int* height, int* stride) {
const WebPDecBuffer* const src = GetOutputBuffer(idec);
if (src == NULL) return NULL;
if (src->colorspace >= MODE_YUV) {
@@ -867,10 +879,10 @@ uint8_t* WebPIDecGetRGB(const WebPIDecoder* idec, int* last_y,
return src->u.RGBA.rgba;
}
-uint8_t* WebPIDecGetYUVA(const WebPIDecoder* idec, int* last_y,
- uint8_t** u, uint8_t** v, uint8_t** a,
- int* width, int* height,
- int* stride, int* uv_stride, int* a_stride) {
+WEBP_NODISCARD uint8_t* WebPIDecGetYUVA(const WebPIDecoder* idec, int* last_y,
+ uint8_t** u, uint8_t** v, uint8_t** a,
+ int* width, int* height, int* stride,
+ int* uv_stride, int* a_stride) {
const WebPDecBuffer* const src = GetOutputBuffer(idec);
if (src == NULL) return NULL;
if (src->colorspace < MODE_YUV) {
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/tree_dec.c b/src/3rdparty/libwebp/src/dec/tree_dec.c
index 1c6fdea..2434605 100644
--- a/src/3rdparty/libwebp/src/dec/tree_dec.c
+++ b/src/3rdparty/libwebp/src/dec/tree_dec.c
@@ -12,10 +12,11 @@
// Author: Skal (pascal.massimino@gmail.com)
#include "src/dec/vp8i_dec.h"
+#include "src/dsp/cpu.h"
#include "src/utils/bit_reader_inl_utils.h"
#if !defined(USE_GENERIC_TREE)
-#if !defined(__arm__) && !defined(_M_ARM) && !defined(__aarch64__)
+#if !defined(__arm__) && !defined(_M_ARM) && !WEBP_AARCH64
// using a table is ~1-2% slower on ARM. Prefer the coded-tree approach then.
#define USE_GENERIC_TREE 1 // ALTERNATE_CODE
#else
diff --git a/src/3rdparty/libwebp/src/dec/vp8_dec.c b/src/3rdparty/libwebp/src/dec/vp8_dec.c
index 57efb69..2ee8900 100644
--- a/src/3rdparty/libwebp/src/dec/vp8_dec.c
+++ b/src/3rdparty/libwebp/src/dec/vp8_dec.c
@@ -86,6 +86,8 @@ void VP8Delete(VP8Decoder* const dec) {
int VP8SetError(VP8Decoder* const dec,
VP8StatusCode error, const char* const msg) {
+ // VP8_STATUS_SUSPENDED is only meaningful in incremental decoding.
+ assert(dec->incremental_ || error != VP8_STATUS_SUSPENDED);
// The oldest error reported takes precedence over the new one.
if (dec->status_ == VP8_STATUS_OK) {
dec->status_ = error;
@@ -190,12 +192,12 @@ static int ParseSegmentHeader(VP8BitReader* br,
}
// Paragraph 9.5
-// This function returns VP8_STATUS_SUSPENDED if we don't have all the
-// necessary data in 'buf'.
-// This case is not necessarily an error (for incremental decoding).
-// Still, no bitreader is ever initialized to make it possible to read
-// unavailable memory.
-// If we don't even have the partitions' sizes, than VP8_STATUS_NOT_ENOUGH_DATA
+// If we don't have all the necessary data in 'buf', this function returns
+// VP8_STATUS_SUSPENDED in incremental decoding, VP8_STATUS_NOT_ENOUGH_DATA
+// otherwise.
+// In incremental decoding, this case is not necessarily an error. Still, no
+// bitreader is ever initialized to make it possible to read unavailable memory.
+// If we don't even have the partitions' sizes, then VP8_STATUS_NOT_ENOUGH_DATA
// is returned, and this is an unrecoverable error.
// If the partitions were positioned ok, VP8_STATUS_OK is returned.
static VP8StatusCode ParsePartitions(VP8Decoder* const dec,
@@ -225,8 +227,10 @@ static VP8StatusCode ParsePartitions(VP8Decoder* const dec,
sz += 3;
}
VP8InitBitReader(dec->parts_ + last_part, part_start, size_left);
- return (part_start < buf_end) ? VP8_STATUS_OK :
- VP8_STATUS_SUSPENDED; // Init is ok, but there's not enough data
+ if (part_start < buf_end) return VP8_STATUS_OK;
+ return dec->incremental_
+ ? VP8_STATUS_SUSPENDED // Init is ok, but there's not enough data
+ : VP8_STATUS_NOT_ENOUGH_DATA;
}
// Paragraph 9.4
@@ -335,7 +339,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 +407,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 +498,13 @@ 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;
- }
+extern VP8CPUInfo VP8GetCPUInfo;
+
+WEBP_DSP_INIT_FUNC(InitGetCoeffs) {
+ if (VP8GetCPUInfo != NULL && VP8GetCPUInfo(kSlowSSSE3)) {
+ GetCoeffs = GetCoeffsAlt;
+ } else {
+ GetCoeffs = GetCoeffsFast;
}
}
diff --git a/src/3rdparty/libwebp/src/dec/vp8_dec.h b/src/3rdparty/libwebp/src/dec/vp8_dec.h
index a05405d..91fe104 100644
--- a/src/3rdparty/libwebp/src/dec/vp8_dec.h
+++ b/src/3rdparty/libwebp/src/dec/vp8_dec.h
@@ -15,6 +15,7 @@
#define WEBP_DEC_VP8_DEC_H_
#include "src/webp/decode.h"
+#include "src/webp/types.h"
#ifdef __cplusplus
extern "C" {
@@ -108,16 +109,14 @@ struct VP8Io {
};
// Internal, version-checked, entry point
-int VP8InitIoInternal(VP8Io* const, int);
+WEBP_NODISCARD int VP8InitIoInternal(VP8Io* const, int);
// Set the custom IO function pointers and user-data. The setter for IO hooks
// should be called before initiating incremental decoding. Returns true if
// WebPIDecoder object is successfully modified, false otherwise.
-int WebPISetIOHooks(WebPIDecoder* const idec,
- VP8IoPutHook put,
- VP8IoSetupHook setup,
- VP8IoTeardownHook teardown,
- void* user_data);
+WEBP_NODISCARD int WebPISetIOHooks(WebPIDecoder* const idec, VP8IoPutHook put,
+ VP8IoSetupHook setup,
+ VP8IoTeardownHook teardown, void* user_data);
// Main decoding object. This is an opaque structure.
typedef struct VP8Decoder VP8Decoder;
@@ -128,17 +127,17 @@ VP8Decoder* VP8New(void);
// Must be called to make sure 'io' is initialized properly.
// Returns false in case of version mismatch. Upon such failure, no other
// decoding function should be called (VP8Decode, VP8GetHeaders, ...)
-static WEBP_INLINE int VP8InitIo(VP8Io* const io) {
+WEBP_NODISCARD static WEBP_INLINE int VP8InitIo(VP8Io* const io) {
return VP8InitIoInternal(io, WEBP_DECODER_ABI_VERSION);
}
// Decode the VP8 frame header. Returns true if ok.
// Note: 'io->data' must be pointing to the start of the VP8 frame header.
-int VP8GetHeaders(VP8Decoder* const dec, VP8Io* const io);
+WEBP_NODISCARD int VP8GetHeaders(VP8Decoder* const dec, VP8Io* const io);
// Decode a picture. Will call VP8GetHeaders() if it wasn't done already.
// Returns false in case of error.
-int VP8Decode(VP8Decoder* const dec, VP8Io* const io);
+WEBP_NODISCARD int VP8Decode(VP8Decoder* const dec, VP8Io* const io);
// Return current status of the decoder:
VP8StatusCode VP8Status(VP8Decoder* const dec);
diff --git a/src/3rdparty/libwebp/src/dec/vp8i_dec.h b/src/3rdparty/libwebp/src/dec/vp8i_dec.h
index 600a684..cb21d47 100644
--- a/src/3rdparty/libwebp/src/dec/vp8i_dec.h
+++ b/src/3rdparty/libwebp/src/dec/vp8i_dec.h
@@ -21,6 +21,7 @@
#include "src/utils/random_utils.h"
#include "src/utils/thread_utils.h"
#include "src/dsp/dsp.h"
+#include "src/webp/types.h"
#ifdef __cplusplus
extern "C" {
@@ -31,7 +32,7 @@ extern "C" {
// version numbers
#define DEC_MAJ_VERSION 1
-#define DEC_MIN_VERSION 1
+#define DEC_MIN_VERSION 4
#define DEC_REV_VERSION 0
// YUV-cache parameters. Cache is 32-bytes wide (= one cacheline).
@@ -186,6 +187,7 @@ struct VP8Decoder {
// Main data source
VP8BitReader br_;
+ int incremental_; // if true, incremental decoding is expected
// headers
VP8FrameHeader frm_hdr_;
@@ -281,7 +283,7 @@ int VP8ParseIntraModeRow(VP8BitReader* const br, VP8Decoder* const dec);
void VP8ParseQuant(VP8Decoder* const dec);
// in frame.c
-int VP8InitFrame(VP8Decoder* const dec, VP8Io* const io);
+WEBP_NODISCARD int VP8InitFrame(VP8Decoder* const dec, VP8Io* const io);
// Call io->setup() and finish setting up scan parameters.
// After this call returns, one must always call VP8ExitCritical() with the
// same parameters. Both functions should be used in pair. Returns VP8_STATUS_OK
@@ -289,7 +291,7 @@ int VP8InitFrame(VP8Decoder* const dec, VP8Io* const io);
VP8StatusCode VP8EnterCritical(VP8Decoder* const dec, VP8Io* const io);
// Must always be called in pair with VP8EnterCritical().
// Returns false in case of error.
-int VP8ExitCritical(VP8Decoder* const dec, VP8Io* const io);
+WEBP_NODISCARD int VP8ExitCritical(VP8Decoder* const dec, VP8Io* const io);
// Return the multi-threading method to use (0=off), depending
// on options and bitstream size. Only for lossy decoding.
int VP8GetThreadMethod(const WebPDecoderOptions* const options,
@@ -299,11 +301,12 @@ int VP8GetThreadMethod(const WebPDecoderOptions* const options,
void VP8InitDithering(const WebPDecoderOptions* const options,
VP8Decoder* const dec);
// Process the last decoded row (filtering + output).
-int VP8ProcessRow(VP8Decoder* const dec, VP8Io* const io);
+WEBP_NODISCARD int VP8ProcessRow(VP8Decoder* const dec, VP8Io* const io);
// To be called at the start of a new scanline, to initialize predictors.
void VP8InitScanline(VP8Decoder* const dec);
// Decode one macroblock. Returns false if there is not enough data.
-int VP8DecodeMB(VP8Decoder* const dec, VP8BitReader* const token_br);
+WEBP_NODISCARD int VP8DecodeMB(VP8Decoder* const dec,
+ VP8BitReader* const token_br);
// in alpha.c
const uint8_t* VP8DecompressAlphaRows(VP8Decoder* const dec,
diff --git a/src/3rdparty/libwebp/src/dec/vp8l_dec.c b/src/3rdparty/libwebp/src/dec/vp8l_dec.c
index 93615d4..11c00ea 100644
--- a/src/3rdparty/libwebp/src/dec/vp8l_dec.c
+++ b/src/3rdparty/libwebp/src/dec/vp8l_dec.c
@@ -12,6 +12,7 @@
// Authors: Vikas Arora (vikaas.arora@gmail.com)
// Jyrki Alakuijala (jyrki@google.com)
+#include <assert.h>
#include <stdlib.h>
#include "src/dec/alphai_dec.h"
@@ -84,7 +85,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,
@@ -101,6 +102,14 @@ static const uint16_t kTableSize[12] = {
FIXED_TABLE_SIZE + 2704
};
+static int VP8LSetError(VP8LDecoder* const dec, VP8StatusCode error) {
+ // The oldest error reported takes precedence over the new one.
+ if (dec->status_ == VP8_STATUS_OK || dec->status_ == VP8_STATUS_SUSPENDED) {
+ dec->status_ = error;
+ }
+ return 0;
+}
+
static int DecodeImageStream(int xsize, int ysize,
int is_level0,
VP8LDecoder* const dec,
@@ -178,7 +187,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) {
@@ -253,11 +262,11 @@ static int ReadHuffmanCodeLengths(
int symbol;
int max_symbol;
int prev_code_len = DEFAULT_CODE_LENGTH;
- HuffmanCode table[1 << LENGTHS_TABLE_BITS];
+ HuffmanTables tables;
- if (!VP8LBuildHuffmanTable(table, LENGTHS_TABLE_BITS,
- code_length_code_lengths,
- NUM_CODE_LENGTH_CODES)) {
+ if (!VP8LHuffmanTablesAllocate(1 << LENGTHS_TABLE_BITS, &tables) ||
+ !VP8LBuildHuffmanTable(&tables, LENGTHS_TABLE_BITS,
+ code_length_code_lengths, NUM_CODE_LENGTH_CODES)) {
goto End;
}
@@ -277,7 +286,7 @@ static int ReadHuffmanCodeLengths(
int code_len;
if (max_symbol-- == 0) break;
VP8LFillBitWindow(br);
- p = &table[VP8LPrefetchBits(br) & LENGTHS_TABLE_MASK];
+ p = &tables.curr_segment->start[VP8LPrefetchBits(br) & LENGTHS_TABLE_MASK];
VP8LSetBitPos(br, br->bit_pos_ + p->bits);
code_len = p->value;
if (code_len < kCodeLengthLiterals) {
@@ -300,14 +309,16 @@ static int ReadHuffmanCodeLengths(
ok = 1;
End:
- if (!ok) dec->status_ = VP8_STATUS_BITSTREAM_ERROR;
+ VP8LHuffmanTablesDeallocate(&tables);
+ if (!ok) return VP8LSetError(dec, VP8_STATUS_BITSTREAM_ERROR);
return ok;
}
// 'code_lengths' is pre-allocated temporary buffer, used for creating Huffman
// tree.
static int ReadHuffmanCode(int alphabet_size, VP8LDecoder* const dec,
- int* const code_lengths, HuffmanCode* const table) {
+ int* const code_lengths,
+ HuffmanTables* const table) {
int ok = 0;
int size = 0;
VP8LBitReader* const br = &dec->br_;
@@ -321,7 +332,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;
@@ -331,10 +342,7 @@ static int ReadHuffmanCode(int alphabet_size, VP8LDecoder* const dec,
int i;
int code_length_code_lengths[NUM_CODE_LENGTH_CODES] = { 0 };
const int num_codes = VP8LReadBits(br, 4) + 4;
- if (num_codes > NUM_CODE_LENGTH_CODES) {
- dec->status_ = VP8_STATUS_BITSTREAM_ERROR;
- return 0;
- }
+ assert(num_codes <= NUM_CODE_LENGTH_CODES);
for (i = 0; i < num_codes; ++i) {
code_length_code_lengths[kCodeLengthCodeOrder[i]] = VP8LReadBits(br, 3);
@@ -349,36 +357,35 @@ static int ReadHuffmanCode(int alphabet_size, VP8LDecoder* const dec,
code_lengths, alphabet_size);
}
if (!ok || size == 0) {
- dec->status_ = VP8_STATUS_BITSTREAM_ERROR;
- return 0;
+ return VP8LSetError(dec, VP8_STATUS_BITSTREAM_ERROR);
}
return size;
}
static int ReadHuffmanCodes(VP8LDecoder* const dec, int xsize, int ysize,
int color_cache_bits, int allow_recursion) {
- int i, j;
+ int i;
VP8LBitReader* const br = &dec->br_;
VP8LMetadata* const hdr = &dec->hdr_;
uint32_t* huffman_image = NULL;
HTreeGroup* htree_groups = NULL;
- HuffmanCode* huffman_tables = NULL;
- HuffmanCode* huffman_table = NULL;
+ HuffmanTables* huffman_tables = &hdr->huffman_tables_;
int num_htree_groups = 1;
int num_htree_groups_max = 1;
- int max_alphabet_size = 0;
- int* code_lengths = NULL;
- const int table_size = kTableSize[color_cache_bits];
int* mapping = NULL;
int ok = 0;
+ // Check the table has been 0 initialized (through InitMetadata).
+ assert(huffman_tables->root.start == NULL);
+ assert(huffman_tables->curr_segment == NULL);
+
if (allow_recursion && VP8LReadBits(br, 1)) {
// use meta Huffman codes.
const int huffman_precision = VP8LReadBits(br, 3) + 2;
const int huffman_xsize = VP8LSubSampleSize(xsize, huffman_precision);
const int huffman_ysize = VP8LSubSampleSize(ysize, huffman_precision);
const int huffman_pixs = huffman_xsize * huffman_ysize;
- if (!DecodeImageStream(huffman_xsize, huffman_ysize, 0, dec,
+ if (!DecodeImageStream(huffman_xsize, huffman_ysize, /*is_level0=*/0, dec,
&huffman_image)) {
goto Error;
}
@@ -402,7 +409,7 @@ static int ReadHuffmanCodes(VP8LDecoder* const dec, int xsize, int ysize,
// values [0, num_htree_groups)
mapping = (int*)WebPSafeMalloc(num_htree_groups_max, sizeof(*mapping));
if (mapping == NULL) {
- dec->status_ = VP8_STATUS_OUT_OF_MEMORY;
+ VP8LSetError(dec, VP8_STATUS_OUT_OF_MEMORY);
goto Error;
}
// -1 means a value is unmapped, and therefore unused in the Huffman
@@ -421,29 +428,55 @@ static int ReadHuffmanCodes(VP8LDecoder* const dec, int xsize, int ysize,
if (br->eos_) goto Error;
- // Find maximum alphabet size for the htree group.
- for (j = 0; j < HUFFMAN_CODES_PER_META_CODE; ++j) {
- int alphabet_size = kAlphabetSize[j];
- if (j == 0 && color_cache_bits > 0) {
- alphabet_size += 1 << color_cache_bits;
- }
- if (max_alphabet_size < alphabet_size) {
- max_alphabet_size = alphabet_size;
- }
+ if (!ReadHuffmanCodesHelper(color_cache_bits, num_htree_groups,
+ num_htree_groups_max, mapping, dec,
+ huffman_tables, &htree_groups)) {
+ goto Error;
+ }
+ ok = 1;
+
+ // All OK. Finalize pointers.
+ hdr->huffman_image_ = huffman_image;
+ hdr->num_htree_groups_ = num_htree_groups;
+ hdr->htree_groups_ = htree_groups;
+
+ Error:
+ WebPSafeFree(mapping);
+ if (!ok) {
+ WebPSafeFree(huffman_image);
+ VP8LHuffmanTablesDeallocate(huffman_tables);
+ VP8LHtreeGroupsFree(htree_groups);
+ }
+ return ok;
+}
+
+int ReadHuffmanCodesHelper(int color_cache_bits, int num_htree_groups,
+ int num_htree_groups_max, const int* const mapping,
+ VP8LDecoder* const dec,
+ HuffmanTables* const huffman_tables,
+ HTreeGroup** const htree_groups) {
+ int i, j, ok = 0;
+ const int max_alphabet_size =
+ kAlphabetSize[0] + ((color_cache_bits > 0) ? 1 << color_cache_bits : 0);
+ const int table_size = kTableSize[color_cache_bits];
+ int* code_lengths = NULL;
+
+ if ((mapping == NULL && num_htree_groups != num_htree_groups_max) ||
+ num_htree_groups > num_htree_groups_max) {
+ goto Error;
}
- code_lengths = (int*)WebPSafeCalloc((uint64_t)max_alphabet_size,
- sizeof(*code_lengths));
- huffman_tables = (HuffmanCode*)WebPSafeMalloc(num_htree_groups * table_size,
- sizeof(*huffman_tables));
- htree_groups = VP8LHtreeGroupsNew(num_htree_groups);
+ code_lengths =
+ (int*)WebPSafeCalloc((uint64_t)max_alphabet_size, sizeof(*code_lengths));
+ *htree_groups = VP8LHtreeGroupsNew(num_htree_groups);
- if (htree_groups == NULL || code_lengths == NULL || huffman_tables == NULL) {
- dec->status_ = VP8_STATUS_OUT_OF_MEMORY;
+ if (*htree_groups == NULL || code_lengths == NULL ||
+ !VP8LHuffmanTablesAllocate(num_htree_groups * table_size,
+ huffman_tables)) {
+ VP8LSetError(dec, VP8_STATUS_OUT_OF_MEMORY);
goto Error;
}
- huffman_table = huffman_tables;
for (i = 0; i < num_htree_groups_max; ++i) {
// If the index "i" is unused in the Huffman image, just make sure the
// coefficients are valid but do not store them.
@@ -460,7 +493,7 @@ static int ReadHuffmanCodes(VP8LDecoder* const dec, int xsize, int ysize,
}
} else {
HTreeGroup* const htree_group =
- &htree_groups[(mapping == NULL) ? i : mapping[i]];
+ &(*htree_groups)[(mapping == NULL) ? i : mapping[i]];
HuffmanCode** const htrees = htree_group->htrees;
int size;
int total_size = 0;
@@ -468,19 +501,20 @@ static int ReadHuffmanCodes(VP8LDecoder* const dec, int xsize, int ysize,
int max_bits = 0;
for (j = 0; j < HUFFMAN_CODES_PER_META_CODE; ++j) {
int alphabet_size = kAlphabetSize[j];
- htrees[j] = huffman_table;
if (j == 0 && color_cache_bits > 0) {
alphabet_size += (1 << color_cache_bits);
}
- size = ReadHuffmanCode(alphabet_size, dec, code_lengths, huffman_table);
+ size =
+ ReadHuffmanCode(alphabet_size, dec, code_lengths, huffman_tables);
+ htrees[j] = huffman_tables->curr_segment->curr_table;
if (size == 0) {
goto Error;
}
if (is_trivial_literal && kLiteralMap[j] == 1) {
- is_trivial_literal = (huffman_table->bits == 0);
+ is_trivial_literal = (htrees[j]->bits == 0);
}
- total_size += huffman_table->bits;
- huffman_table += size;
+ total_size += htrees[j]->bits;
+ huffman_tables->curr_segment->curr_table += size;
if (j <= ALPHA) {
int local_max_bits = code_lengths[0];
int k;
@@ -511,19 +545,12 @@ static int ReadHuffmanCodes(VP8LDecoder* const dec, int xsize, int ysize,
}
ok = 1;
- // All OK. Finalize pointers.
- hdr->huffman_image_ = huffman_image;
- hdr->num_htree_groups_ = num_htree_groups;
- hdr->htree_groups_ = htree_groups;
- hdr->huffman_tables_ = huffman_tables;
-
Error:
WebPSafeFree(code_lengths);
- WebPSafeFree(mapping);
if (!ok) {
- WebPSafeFree(huffman_image);
- WebPSafeFree(huffman_tables);
- VP8LHtreeGroupsFree(htree_groups);
+ VP8LHuffmanTablesDeallocate(huffman_tables);
+ VP8LHtreeGroupsFree(*htree_groups);
+ *htree_groups = NULL;
}
return ok;
}
@@ -547,8 +574,7 @@ static int AllocateAndInitRescaler(VP8LDecoder* const dec, VP8Io* const io) {
scaled_data_size * sizeof(*scaled_data);
uint8_t* memory = (uint8_t*)WebPSafeMalloc(memory_size, sizeof(*memory));
if (memory == NULL) {
- dec->status_ = VP8_STATUS_OUT_OF_MEMORY;
- return 0;
+ return VP8LSetError(dec, VP8_STATUS_OUT_OF_MEMORY);
}
assert(dec->rescaler_memory == NULL);
dec->rescaler_memory = memory;
@@ -559,8 +585,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 +603,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 +624,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;
@@ -796,7 +826,8 @@ static void ProcessRows(VP8LDecoder* const dec, int row) {
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 ?
@@ -947,7 +978,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;
@@ -1078,12 +1108,10 @@ static int DecodeAlphaData(VP8LDecoder* const dec, uint8_t* const data,
End:
br->eos_ = VP8LIsEndOfStream(br);
if (!ok || (br->eos_ && pos < end)) {
- ok = 0;
- dec->status_ = br->eos_ ? VP8_STATUS_SUSPENDED
- : VP8_STATUS_BITSTREAM_ERROR;
- } else {
- dec->last_pixel_ = pos;
+ return VP8LSetError(
+ dec, br->eos_ ? VP8_STATUS_SUSPENDED : VP8_STATUS_BITSTREAM_ERROR);
}
+ dec->last_pixel_ = pos;
return ok;
}
@@ -1233,9 +1261,20 @@ static int DecodeImageData(VP8LDecoder* const dec, uint32_t* const data,
}
br->eos_ = VP8LIsEndOfStream(br);
- if (dec->incremental_ && br->eos_ && src < src_end) {
+ // In incremental decoding:
+ // br->eos_ && src < src_last: if 'br' reached the end of the buffer and
+ // 'src_last' has not been reached yet, there is not enough data. 'dec' has to
+ // be reset until there is more data.
+ // !br->eos_ && src < src_last: this cannot happen as either the buffer is
+ // fully read, either enough has been read to reach 'src_last'.
+ // src >= src_last: 'src_last' is reached, all is fine. 'src' can actually go
+ // beyond 'src_last' in case the image is cropped and an LZ77 goes further.
+ // The buffer might have been enough or there is some left. 'br->eos_' does
+ // not matter.
+ assert(!dec->incremental_ || (br->eos_ && src < src_last) || src >= src_last);
+ if (dec->incremental_ && br->eos_ && src < src_last) {
RestoreState(dec);
- } else if (!br->eos_) {
+ } else if ((dec->incremental_ && src >= src_last) || !br->eos_) {
// Process the remaining rows corresponding to last row-block.
if (process_func != NULL) {
process_func(dec, row > last_row ? last_row : row);
@@ -1250,8 +1289,7 @@ static int DecodeImageData(VP8LDecoder* const dec, uint32_t* const data,
return 1;
Error:
- dec->status_ = VP8_STATUS_BITSTREAM_ERROR;
- return 0;
+ return VP8LSetError(dec, VP8_STATUS_BITSTREAM_ERROR);
}
// -----------------------------------------------------------------------------
@@ -1277,7 +1315,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) {
@@ -1318,7 +1356,7 @@ static int ReadTransform(int* const xsize, int const* ysize,
transform->bits_),
VP8LSubSampleSize(transform->ysize_,
transform->bits_),
- 0, dec, &transform->data_);
+ /*is_level0=*/0, dec, &transform->data_);
break;
case COLOR_INDEXING_TRANSFORM: {
const int num_colors = VP8LReadBits(br, 8) + 1;
@@ -1328,11 +1366,14 @@ static int ReadTransform(int* const xsize, int const* ysize,
: 3;
*xsize = VP8LSubSampleSize(transform->xsize_, bits);
transform->bits_ = bits;
- ok = DecodeImageStream(num_colors, 1, 0, dec, &transform->data_);
- ok = ok && ExpandColorMap(num_colors, transform);
+ ok = DecodeImageStream(num_colors, /*ysize=*/1, /*is_level0=*/0, dec,
+ &transform->data_);
+ if (ok && !ExpandColorMap(num_colors, transform)) {
+ return VP8LSetError(dec, VP8_STATUS_OUT_OF_MEMORY);
+ }
break;
}
- case SUBTRACT_GREEN:
+ case SUBTRACT_GREEN_TRANSFORM:
break;
default:
assert(0); // can't happen
@@ -1354,7 +1395,7 @@ static void ClearMetadata(VP8LMetadata* const hdr) {
assert(hdr != NULL);
WebPSafeFree(hdr->huffman_image_);
- WebPSafeFree(hdr->huffman_tables_);
+ VP8LHuffmanTablesDeallocate(&hdr->huffman_tables_);
VP8LHtreeGroupsFree(hdr->htree_groups_);
VP8LColorCacheClear(&hdr->color_cache_);
VP8LColorCacheClear(&hdr->saved_color_cache_);
@@ -1435,7 +1476,7 @@ static int DecodeImageStream(int xsize, int ysize,
color_cache_bits = VP8LReadBits(br, 4);
ok = (color_cache_bits >= 1 && color_cache_bits <= MAX_CACHE_BITS);
if (!ok) {
- dec->status_ = VP8_STATUS_BITSTREAM_ERROR;
+ VP8LSetError(dec, VP8_STATUS_BITSTREAM_ERROR);
goto End;
}
}
@@ -1444,7 +1485,7 @@ static int DecodeImageStream(int xsize, int ysize,
ok = ok && ReadHuffmanCodes(dec, transform_xsize, transform_ysize,
color_cache_bits, is_level0);
if (!ok) {
- dec->status_ = VP8_STATUS_BITSTREAM_ERROR;
+ VP8LSetError(dec, VP8_STATUS_BITSTREAM_ERROR);
goto End;
}
@@ -1452,8 +1493,7 @@ static int DecodeImageStream(int xsize, int ysize,
if (color_cache_bits > 0) {
hdr->color_cache_size_ = 1 << color_cache_bits;
if (!VP8LColorCacheInit(&hdr->color_cache_, color_cache_bits)) {
- dec->status_ = VP8_STATUS_OUT_OF_MEMORY;
- ok = 0;
+ ok = VP8LSetError(dec, VP8_STATUS_OUT_OF_MEMORY);
goto End;
}
} else {
@@ -1470,8 +1510,7 @@ static int DecodeImageStream(int xsize, int ysize,
const uint64_t total_size = (uint64_t)transform_xsize * transform_ysize;
data = (uint32_t*)WebPSafeMalloc(total_size, sizeof(*data));
if (data == NULL) {
- dec->status_ = VP8_STATUS_OUT_OF_MEMORY;
- ok = 0;
+ ok = VP8LSetError(dec, VP8_STATUS_OUT_OF_MEMORY);
goto End;
}
}
@@ -1515,9 +1554,8 @@ 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->status_ = VP8_STATUS_OUT_OF_MEMORY;
- return 0;
+ dec->argb_cache_ = NULL; // for soundness
+ return VP8LSetError(dec, VP8_STATUS_OUT_OF_MEMORY);
}
dec->argb_cache_ = dec->pixels_ + num_pixels + cache_top_pixels;
return 1;
@@ -1525,11 +1563,10 @@ 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;
- return 0;
+ return VP8LSetError(dec, VP8_STATUS_OUT_OF_MEMORY);
}
return 1;
}
@@ -1584,7 +1621,8 @@ int VP8LDecodeAlphaHeader(ALPHDecoder* const alph_dec,
dec->status_ = VP8_STATUS_OK;
VP8LInitBitReader(&dec->br_, data, data_size);
- if (!DecodeImageStream(alph_dec->width_, alph_dec->height_, 1, dec, NULL)) {
+ if (!DecodeImageStream(alph_dec->width_, alph_dec->height_, /*is_level0=*/1,
+ dec, /*decoded_data=*/NULL)) {
goto Err;
}
@@ -1639,22 +1677,24 @@ int VP8LDecodeHeader(VP8LDecoder* const dec, VP8Io* const io) {
if (dec == NULL) return 0;
if (io == NULL) {
- dec->status_ = VP8_STATUS_INVALID_PARAM;
- return 0;
+ return VP8LSetError(dec, VP8_STATUS_INVALID_PARAM);
}
dec->io_ = io;
dec->status_ = VP8_STATUS_OK;
VP8LInitBitReader(&dec->br_, io->data, io->data_size);
if (!ReadImageInfo(&dec->br_, &width, &height, &has_alpha)) {
- dec->status_ = VP8_STATUS_BITSTREAM_ERROR;
+ VP8LSetError(dec, VP8_STATUS_BITSTREAM_ERROR);
goto Error;
}
dec->state_ = READ_DIM;
io->width = width;
io->height = height;
- if (!DecodeImageStream(width, height, 1, dec, NULL)) goto Error;
+ if (!DecodeImageStream(width, height, /*is_level0=*/1, dec,
+ /*decoded_data=*/NULL)) {
+ goto Error;
+ }
return 1;
Error:
@@ -1667,10 +1707,9 @@ int VP8LDecodeImage(VP8LDecoder* const dec) {
VP8Io* io = NULL;
WebPDecParams* params = NULL;
- // Sanity checks.
if (dec == NULL) return 0;
- assert(dec->hdr_.huffman_tables_ != NULL);
+ assert(dec->hdr_.huffman_tables_.root.start != NULL);
assert(dec->hdr_.htree_groups_ != NULL);
assert(dec->hdr_.num_htree_groups_ > 0);
@@ -1685,7 +1724,7 @@ int VP8LDecodeImage(VP8LDecoder* const dec) {
assert(dec->output_ != NULL);
if (!WebPIoInitFromOptions(params->options, io, MODE_BGRA)) {
- dec->status_ = VP8_STATUS_INVALID_PARAM;
+ VP8LSetError(dec, VP8_STATUS_INVALID_PARAM);
goto Err;
}
@@ -1695,7 +1734,7 @@ int VP8LDecodeImage(VP8LDecoder* const dec) {
if (io->use_scaling && !AllocateAndInitRescaler(dec, io)) goto Err;
#else
if (io->use_scaling) {
- dec->status_ = VP8_STATUS_INVALID_PARAM;
+ VP8LSetError(dec, VP8_STATUS_INVALID_PARAM);
goto Err;
}
#endif
@@ -1713,7 +1752,7 @@ int VP8LDecodeImage(VP8LDecoder* const dec) {
dec->hdr_.saved_color_cache_.colors_ == NULL) {
if (!VP8LColorCacheInit(&dec->hdr_.saved_color_cache_,
dec->hdr_.color_cache_.hash_bits_)) {
- dec->status_ = VP8_STATUS_OUT_OF_MEMORY;
+ VP8LSetError(dec, VP8_STATUS_OUT_OF_MEMORY);
goto Err;
}
}
diff --git a/src/3rdparty/libwebp/src/dec/vp8li_dec.h b/src/3rdparty/libwebp/src/dec/vp8li_dec.h
index 72b2e86..9a13bcc 100644
--- a/src/3rdparty/libwebp/src/dec/vp8li_dec.h
+++ b/src/3rdparty/libwebp/src/dec/vp8li_dec.h
@@ -20,6 +20,7 @@
#include "src/utils/bit_reader_utils.h"
#include "src/utils/color_cache_utils.h"
#include "src/utils/huffman_utils.h"
+#include "src/webp/types.h"
#ifdef __cplusplus
extern "C" {
@@ -51,7 +52,7 @@ typedef struct {
uint32_t* huffman_image_;
int num_htree_groups_;
HTreeGroup* htree_groups_;
- HuffmanCode* huffman_tables_;
+ HuffmanTables huffman_tables_;
} VP8LMetadata;
typedef struct VP8LDecoder VP8LDecoder;
@@ -99,25 +100,26 @@ struct ALPHDecoder; // Defined in dec/alphai.h.
// Decodes image header for alpha data stored using lossless compression.
// Returns false in case of error.
-int VP8LDecodeAlphaHeader(struct ALPHDecoder* const alph_dec,
- const uint8_t* const data, size_t data_size);
+WEBP_NODISCARD int VP8LDecodeAlphaHeader(struct ALPHDecoder* const alph_dec,
+ const uint8_t* const data,
+ size_t data_size);
// Decodes *at least* 'last_row' rows of alpha. If some of the initial rows are
// already decoded in previous call(s), it will resume decoding from where it
// was paused.
// Returns false in case of bitstream error.
-int VP8LDecodeAlphaImageStream(struct ALPHDecoder* const alph_dec,
- int last_row);
+WEBP_NODISCARD int VP8LDecodeAlphaImageStream(
+ struct ALPHDecoder* const alph_dec, int last_row);
// Allocates and initialize a new lossless decoder instance.
-VP8LDecoder* VP8LNew(void);
+WEBP_NODISCARD VP8LDecoder* VP8LNew(void);
// Decodes the image header. Returns false in case of error.
-int VP8LDecodeHeader(VP8LDecoder* const dec, VP8Io* const io);
+WEBP_NODISCARD int VP8LDecodeHeader(VP8LDecoder* const dec, VP8Io* const io);
// Decodes an image. It's required to decode the lossless header before calling
// this function. Returns false in case of error, with updated dec->status_.
-int VP8LDecodeImage(VP8LDecoder* const dec);
+WEBP_NODISCARD int VP8LDecodeImage(VP8LDecoder* const dec);
// Resets the decoder in its initial state, reclaiming memory.
// Preserves the dec->status_ value.
@@ -126,6 +128,18 @@ void VP8LClear(VP8LDecoder* const dec);
// Clears and deallocate a lossless decoder instance.
void VP8LDelete(VP8LDecoder* const dec);
+// Helper function for reading the different Huffman codes and storing them in
+// 'huffman_tables' and 'htree_groups'.
+// If mapping is NULL 'num_htree_groups_max' must equal 'num_htree_groups'.
+// If it is not NULL, it maps 'num_htree_groups_max' indices to the
+// 'num_htree_groups' groups. If 'num_htree_groups_max' > 'num_htree_groups',
+// some of those indices map to -1. This is used for non-balanced codes to
+// limit memory usage.
+WEBP_NODISCARD int ReadHuffmanCodesHelper(
+ int color_cache_bits, int num_htree_groups, int num_htree_groups_max,
+ const int* const mapping, VP8LDecoder* const dec,
+ HuffmanTables* const huffman_tables, HTreeGroup** const htree_groups);
+
//------------------------------------------------------------------------------
#ifdef __cplusplus
diff --git a/src/3rdparty/libwebp/src/dec/webp_dec.c b/src/3rdparty/libwebp/src/dec/webp_dec.c
index 42d0988..49ef205 100644
--- a/src/3rdparty/libwebp/src/dec/webp_dec.c
+++ b/src/3rdparty/libwebp/src/dec/webp_dec.c
@@ -13,11 +13,14 @@
#include <stdlib.h>
+#include "src/dec/vp8_dec.h"
#include "src/dec/vp8i_dec.h"
#include "src/dec/vp8li_dec.h"
#include "src/dec/webpi_dec.h"
#include "src/utils/utils.h"
#include "src/webp/mux_types.h" // ALPHA_FLAG
+#include "src/webp/decode.h"
+#include "src/webp/types.h"
//------------------------------------------------------------------------------
// RIFF layout is:
@@ -179,7 +182,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.
@@ -444,8 +447,9 @@ void WebPResetDecParams(WebPDecParams* const params) {
// "Into" decoding variants
// Main flow
-static VP8StatusCode DecodeInto(const uint8_t* const data, size_t data_size,
- WebPDecParams* const params) {
+WEBP_NODISCARD static VP8StatusCode DecodeInto(const uint8_t* const data,
+ size_t data_size,
+ WebPDecParams* const params) {
VP8StatusCode status;
VP8Io io;
WebPHeaderStructure headers;
@@ -459,7 +463,9 @@ static VP8StatusCode DecodeInto(const uint8_t* const data, size_t data_size,
}
assert(params != NULL);
- VP8InitIo(&io);
+ if (!VP8InitIo(&io)) {
+ return VP8_STATUS_INVALID_PARAM;
+ }
io.data = headers.data + headers.offset;
io.data_size = headers.data_size - headers.offset;
WebPInitCustomIo(params, &io); // Plug the I/O functions.
@@ -523,17 +529,16 @@ static VP8StatusCode DecodeInto(const uint8_t* const data, size_t data_size,
}
// Helpers
-static uint8_t* DecodeIntoRGBABuffer(WEBP_CSP_MODE colorspace,
- const uint8_t* const data,
- size_t data_size,
- uint8_t* const rgba,
- int stride, size_t size) {
+WEBP_NODISCARD static uint8_t* DecodeIntoRGBABuffer(WEBP_CSP_MODE colorspace,
+ const uint8_t* const data,
+ size_t data_size,
+ uint8_t* const rgba,
+ int stride, size_t size) {
WebPDecParams params;
WebPDecBuffer buf;
- if (rgba == NULL) {
+ if (rgba == NULL || !WebPInitDecBuffer(&buf)) {
return NULL;
}
- WebPInitDecBuffer(&buf);
WebPResetDecParams(&params);
params.output = &buf;
buf.colorspace = colorspace;
@@ -578,8 +583,7 @@ uint8_t* WebPDecodeYUVInto(const uint8_t* data, size_t data_size,
uint8_t* v, size_t v_size, int v_stride) {
WebPDecParams params;
WebPDecBuffer output;
- if (luma == NULL) return NULL;
- WebPInitDecBuffer(&output);
+ if (luma == NULL || !WebPInitDecBuffer(&output)) return NULL;
WebPResetDecParams(&params);
params.output = &output;
output.colorspace = MODE_YUV;
@@ -601,13 +605,17 @@ uint8_t* WebPDecodeYUVInto(const uint8_t* data, size_t data_size,
//------------------------------------------------------------------------------
-static uint8_t* Decode(WEBP_CSP_MODE mode, const uint8_t* const data,
- size_t data_size, int* const width, int* const height,
- WebPDecBuffer* const keep_info) {
+WEBP_NODISCARD static uint8_t* Decode(WEBP_CSP_MODE mode,
+ const uint8_t* const data,
+ size_t data_size, int* const width,
+ int* const height,
+ WebPDecBuffer* const keep_info) {
WebPDecParams params;
WebPDecBuffer output;
- WebPInitDecBuffer(&output);
+ if (!WebPInitDecBuffer(&output)) {
+ return NULL;
+ }
WebPResetDecParams(&params);
params.output = &output;
output.colorspace = mode;
@@ -658,19 +666,26 @@ uint8_t* WebPDecodeBGRA(const uint8_t* data, size_t data_size,
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) {
- WebPDecBuffer output; // only to preserve the side-infos
- uint8_t* const out = Decode(MODE_YUV, data, data_size,
- width, height, &output);
-
- if (out != NULL) {
- const WebPYUVABuffer* const buf = &output.u.YUVA;
- *u = buf->u;
- *v = buf->v;
- *stride = buf->y_stride;
- *uv_stride = buf->u_stride;
- assert(buf->u_stride == buf->v_stride);
- }
- return out;
+ // data, width and height are checked by Decode().
+ if (u == NULL || v == NULL || stride == NULL || uv_stride == NULL) {
+ return NULL;
+ }
+
+ {
+ WebPDecBuffer output; // only to preserve the side-infos
+ uint8_t* const out = Decode(MODE_YUV, data, data_size,
+ width, height, &output);
+
+ if (out != NULL) {
+ const WebPYUVABuffer* const buf = &output.u.YUVA;
+ *u = buf->u;
+ *v = buf->v;
+ *stride = buf->y_stride;
+ *uv_stride = buf->u_stride;
+ assert(buf->u_stride == buf->v_stride);
+ }
+ return out;
+ }
}
static void DefaultFeatures(WebPBitstreamFeatures* const features) {
@@ -726,7 +741,9 @@ int WebPInitDecoderConfigInternal(WebPDecoderConfig* config,
}
memset(config, 0, sizeof(*config));
DefaultFeatures(&config->input);
- WebPInitDecBuffer(&config->output);
+ if (!WebPInitDecBuffer(&config->output)) {
+ return 0;
+ }
return 1;
}
@@ -765,7 +782,9 @@ VP8StatusCode WebPDecode(const uint8_t* data, size_t data_size,
if (WebPAvoidSlowMemory(params.output, &config->input)) {
// decoding to slow memory: use a temporary in-mem buffer to decode into.
WebPDecBuffer in_mem_buffer;
- WebPInitDecBuffer(&in_mem_buffer);
+ if (!WebPInitDecBuffer(&in_mem_buffer)) {
+ return VP8_STATUS_INVALID_PARAM;
+ }
in_mem_buffer.colorspace = config->output.colorspace;
in_mem_buffer.width = config->input.width;
in_mem_buffer.height = config->input.height;
@@ -785,6 +804,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 +818,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 +828,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 +840,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 +861,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..77bf526 100644
--- a/src/3rdparty/libwebp/src/dec/webpi_dec.h
+++ b/src/3rdparty/libwebp/src/dec/webpi_dec.h
@@ -20,6 +20,7 @@ extern "C" {
#include "src/utils/rescaler_utils.h"
#include "src/dec/vp8_dec.h"
+#include "src/webp/decode.h"
//------------------------------------------------------------------------------
// WebPDecParams: Decoding output parameters. Transient internal object.
@@ -77,14 +78,19 @@ 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);
// Setup crop_xxx fields, mb_w and mb_h in io. 'src_colorspace' refers
// to the *compressed* format, not the output one.
-int WebPIoInitFromOptions(const WebPDecoderOptions* const options,
- VP8Io* const io, WEBP_CSP_MODE src_colorspace);
+WEBP_NODISCARD int WebPIoInitFromOptions(
+ const WebPDecoderOptions* const options, VP8Io* const io,
+ WEBP_CSP_MODE src_colorspace);
//------------------------------------------------------------------------------
// Internal functions regarding WebPDecBuffer memory (in buffer.c).
diff --git a/src/3rdparty/libwebp/src/demux/anim_decode.c b/src/3rdparty/libwebp/src/demux/anim_decode.c
index 05dd707..27f0e2b 100644
--- a/src/3rdparty/libwebp/src/demux/anim_decode.c
+++ b/src/3rdparty/libwebp/src/demux/anim_decode.c
@@ -20,9 +20,18 @@
#include "src/utils/utils.h"
#include "src/webp/decode.h"
#include "src/webp/demux.h"
+#include "src/webp/types.h"
#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);
@@ -60,8 +69,9 @@ int WebPAnimDecoderOptionsInitInternal(WebPAnimDecoderOptions* dec_options,
return 1;
}
-static int ApplyDecoderOptions(const WebPAnimDecoderOptions* const dec_options,
- WebPAnimDecoder* const dec) {
+WEBP_NODISCARD static int ApplyDecoderOptions(
+ const WebPAnimDecoderOptions* const dec_options,
+ WebPAnimDecoder* const dec) {
WEBP_CSP_MODE mode;
WebPDecoderConfig* config = &dec->config_;
assert(dec_options != NULL);
@@ -74,7 +84,9 @@ static int ApplyDecoderOptions(const WebPAnimDecoderOptions* const dec_options,
dec->blend_func_ = (mode == MODE_RGBA || mode == MODE_BGRA)
? &BlendPixelRowNonPremult
: &BlendPixelRowPremult;
- WebPInitDecoderConfig(config);
+ if (!WebPInitDecoderConfig(config)) {
+ return 0;
+ }
config->output.colorspace = mode;
config->output.is_external_memory = 1;
config->options.use_threads = dec_options->use_threads;
@@ -87,11 +99,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;
@@ -141,11 +161,11 @@ static int IsFullFrame(int width, int height, int canvas_width,
}
// Clear the canvas to transparent.
-static int ZeroFillCanvas(uint8_t* buf, uint32_t canvas_width,
- uint32_t canvas_height) {
+WEBP_NODISCARD 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;
}
@@ -163,10 +183,10 @@ static void ZeroFillFrameRect(uint8_t* buf, int buf_stride, int x_offset,
}
// Copy width * height pixels from 'src' to 'dst'.
-static int CopyCanvas(const uint8_t* src, uint8_t* dst,
- uint32_t width, uint32_t height) {
+WEBP_NODISCARD 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 +221,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 +259,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 +276,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 +286,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 +366,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) {
@@ -405,7 +428,9 @@ int WebPAnimDecoderGetNext(WebPAnimDecoder* dec,
WebPDemuxReleaseIterator(&dec->prev_iter_);
dec->prev_iter_ = iter;
dec->prev_frame_was_keyframe_ = is_key_frame;
- CopyCanvas(dec->curr_frame_, dec->prev_frame_disposed_, width, height);
+ if (!CopyCanvas(dec->curr_frame_, dec->prev_frame_disposed_, width, height)) {
+ goto Error;
+ }
if (dec->prev_iter_.dispose_method == WEBP_MUX_DISPOSE_BACKGROUND) {
ZeroFillFrameRect(dec->prev_frame_disposed_, width * NUM_CHANNELS,
dec->prev_iter_.x_offset, dec->prev_iter_.y_offset,
diff --git a/src/3rdparty/libwebp/src/demux/demux.c b/src/3rdparty/libwebp/src/demux/demux.c
index 1b3cc2e..d01c6a7 100644
--- a/src/3rdparty/libwebp/src/demux/demux.c
+++ b/src/3rdparty/libwebp/src/demux/demux.c
@@ -24,7 +24,7 @@
#include "src/webp/format_constants.h"
#define DMUX_MAJ_VERSION 1
-#define DMUX_MIN_VERSION 1
+#define DMUX_MIN_VERSION 4
#define DMUX_REV_VERSION 0
typedef struct {
@@ -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..1d152f2 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,23 +401,31 @@ 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
+extern VP8CPUInfo VP8GetCPUInfo;
extern void WebPInitAlphaProcessingMIPSdspR2(void);
extern void WebPInitAlphaProcessingSSE2(void);
extern void WebPInitAlphaProcessingSSE41(void);
@@ -428,13 +450,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 +471,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 +492,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..aa0cc28 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
@@ -143,6 +144,46 @@ static int ExtractAlpha_SSE2(const uint8_t* argb, int argb_stride,
return (alpha_and == 0xff);
}
+static void ExtractGreen_SSE2(const uint32_t* WEBP_RESTRICT argb,
+ uint8_t* WEBP_RESTRICT alpha, int size) {
+ int i;
+ const __m128i mask = _mm_set1_epi32(0xff);
+ const __m128i* src = (const __m128i*)argb;
+
+ for (i = 0; i + 16 <= size; i += 16, src += 4) {
+ const __m128i a0 = _mm_loadu_si128(src + 0);
+ const __m128i a1 = _mm_loadu_si128(src + 1);
+ const __m128i a2 = _mm_loadu_si128(src + 2);
+ const __m128i a3 = _mm_loadu_si128(src + 3);
+ const __m128i b0 = _mm_srli_epi32(a0, 8);
+ const __m128i b1 = _mm_srli_epi32(a1, 8);
+ const __m128i b2 = _mm_srli_epi32(a2, 8);
+ const __m128i b3 = _mm_srli_epi32(a3, 8);
+ const __m128i c0 = _mm_and_si128(b0, mask);
+ const __m128i c1 = _mm_and_si128(b1, mask);
+ const __m128i c2 = _mm_and_si128(b2, mask);
+ const __m128i c3 = _mm_and_si128(b3, mask);
+ const __m128i d0 = _mm_packs_epi32(c0, c1);
+ const __m128i d1 = _mm_packs_epi32(c2, c3);
+ const __m128i e = _mm_packus_epi16(d0, d1);
+ // store
+ _mm_storeu_si128((__m128i*)&alpha[i], e);
+ }
+ if (i + 8 <= size) {
+ const __m128i a0 = _mm_loadu_si128(src + 0);
+ const __m128i a1 = _mm_loadu_si128(src + 1);
+ const __m128i b0 = _mm_srli_epi32(a0, 8);
+ const __m128i b1 = _mm_srli_epi32(a1, 8);
+ const __m128i c0 = _mm_and_si128(b0, mask);
+ const __m128i c1 = _mm_and_si128(b1, mask);
+ const __m128i d = _mm_packs_epi32(c0, c1);
+ const __m128i e = _mm_packus_epi16(d, d);
+ _mm_storel_epi64((__m128i*)&alpha[i], e);
+ i += 8;
+ }
+ for (; i < size; ++i) alpha[i] = argb[i] >> 8;
+}
+
//------------------------------------------------------------------------------
// Non-dither premultiplied modes
@@ -177,7 +218,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 +306,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 +358,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) {
@@ -331,9 +394,11 @@ WEBP_TSAN_IGNORE_FUNCTION void WebPInitAlphaProcessingSSE2(void) {
WebPDispatchAlpha = DispatchAlpha_SSE2;
WebPDispatchAlphaToGreen = DispatchAlphaToGreen_SSE2;
WebPExtractAlpha = ExtractAlpha_SSE2;
+ WebPExtractGreen = ExtractGreen_SSE2;
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..73d2140 100644
--- a/src/3rdparty/libwebp/src/dsp/cost.c
+++ b/src/3rdparty/libwebp/src/dsp/cost.c
@@ -374,6 +374,7 @@ static void SetResidualCoeffs_C(const int16_t* const coeffs,
VP8GetResidualCostFunc VP8GetResidualCost;
VP8SetResidualCoeffsFunc VP8SetResidualCoeffs;
+extern VP8CPUInfo VP8GetCPUInfo;
extern void VP8EncDspCostInitMIPS32(void);
extern void VP8EncDspCostInitMIPSdspR2(void);
extern void VP8EncDspCostInitSSE2(void);
@@ -395,12 +396,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/cost_neon.c b/src/3rdparty/libwebp/src/dsp/cost_neon.c
index 8cc8ce5..6582669 100644
--- a/src/3rdparty/libwebp/src/dsp/cost_neon.c
+++ b/src/3rdparty/libwebp/src/dsp/cost_neon.c
@@ -29,7 +29,7 @@ static void SetResidualCoeffs_NEON(const int16_t* const coeffs,
const uint8x16_t eob = vcombine_u8(vqmovn_u16(eob_0), vqmovn_u16(eob_1));
const uint8x16_t masked = vandq_u8(eob, vld1q_u8(position));
-#ifdef __aarch64__
+#if WEBP_AARCH64
res->last = vmaxvq_u8(masked) - 1;
#else
const uint8x8_t eob_8x8 = vmax_u8(vget_low_u8(masked), vget_high_u8(masked));
@@ -43,7 +43,7 @@ static void SetResidualCoeffs_NEON(const int16_t* const coeffs,
vst1_lane_s32(&res->last, vreinterpret_s32_u32(eob_32x2), 0);
--res->last;
-#endif // __aarch64__
+#endif // WEBP_AARCH64
res->coeffs = coeffs;
}
diff --git a/src/3rdparty/libwebp/src/dsp/cpu.c b/src/3rdparty/libwebp/src/dsp/cpu.c
index 0fa5b6a..8ba8f68 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>
@@ -36,18 +36,6 @@ static WEBP_INLINE void GetCPUInfo(int cpu_info[4], int info_type) {
: "=a"(cpu_info[0]), "=D"(cpu_info[1]), "=c"(cpu_info[2]), "=d"(cpu_info[3])
: "a"(info_type), "c"(0));
}
-#elif defined(__x86_64__) && \
- (defined(__code_model_medium__) || defined(__code_model_large__)) && \
- defined(__PIC__)
-static WEBP_INLINE void GetCPUInfo(int cpu_info[4], int info_type) {
- __asm__ volatile (
- "xchg{q}\t{%%rbx}, %q1\n"
- "cpuid\n"
- "xchg{q}\t{%%rbx}, %q1\n"
- : "=a"(cpu_info[0]), "=&r"(cpu_info[1]), "=c"(cpu_info[2]),
- "=d"(cpu_info[3])
- : "a"(info_type), "c"(0));
-}
#elif defined(__i386__) || defined(__x86_64__)
static WEBP_INLINE void GetCPUInfo(int cpu_info[4], int info_type) {
__asm__ volatile (
@@ -55,12 +43,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 +88,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) {
@@ -167,6 +161,7 @@ static int x86CPUInfo(CPUFeature feature) {
}
return 0;
}
+WEBP_EXTERN VP8CPUInfo VP8GetCPUInfo;
VP8CPUInfo VP8GetCPUInfo = x86CPUInfo;
#elif defined(WEBP_ANDROID_NEON) // NB: needs to be before generic NEON test.
static int AndroidCPUInfo(CPUFeature feature) {
@@ -178,10 +173,37 @@ static int AndroidCPUInfo(CPUFeature feature) {
}
return 0;
}
+WEBP_EXTERN VP8CPUInfo VP8GetCPUInfo;
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;
+}
+WEBP_EXTERN VP8CPUInfo VP8GetCPUInfo;
+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)
@@ -205,6 +227,7 @@ static int armCPUInfo(CPUFeature feature) {
return 1;
#endif
}
+WEBP_EXTERN VP8CPUInfo VP8GetCPUInfo;
VP8CPUInfo VP8GetCPUInfo = armCPUInfo;
#elif defined(WEBP_USE_MIPS32) || defined(WEBP_USE_MIPS_DSP_R2) || \
defined(WEBP_USE_MSA)
@@ -216,7 +239,9 @@ static int mipsCPUInfo(CPUFeature feature) {
}
}
+WEBP_EXTERN VP8CPUInfo VP8GetCPUInfo;
VP8CPUInfo VP8GetCPUInfo = mipsCPUInfo;
#else
+WEBP_EXTERN VP8CPUInfo VP8GetCPUInfo;
VP8CPUInfo VP8GetCPUInfo = NULL;
#endif
diff --git a/src/3rdparty/libwebp/src/dsp/cpu.h b/src/3rdparty/libwebp/src/dsp/cpu.h
new file mode 100644
index 0000000..581ecbd
--- /dev/null
+++ b/src/3rdparty/libwebp/src/dsp/cpu.h
@@ -0,0 +1,269 @@
+// 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 <qglobal.h>
+
+#include <stddef.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
+
+//------------------------------------------------------------------------------
+// x86 defines.
+
+#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
+
+//------------------------------------------------------------------------------
+// Arm defines.
+
+// 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(_M_ARM64EC)))) && \
+ !defined(__clang__) && (QT_CONFIG_neon == 1)
+#define WEBP_USE_NEON
+#define WEBP_USE_INTRINSICS
+#endif
+
+#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC)
+#define WEBP_AARCH64 1
+#else
+#define WEBP_AARCH64 0
+#endif
+
+#if defined(WEBP_USE_NEON) && !defined(WEBP_HAVE_NEON)
+#define WEBP_HAVE_NEON
+#endif
+
+//------------------------------------------------------------------------------
+// MIPS defines.
+
+#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) || WEBP_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;
+
+// returns true if the CPU supports the feature.
+typedef int (*VP8CPUInfo)(CPUFeature feature);
+
+#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..451d649 100644
--- a/src/3rdparty/libwebp/src/dsp/dec.c
+++ b/src/3rdparty/libwebp/src/dsp/dec.c
@@ -37,9 +37,6 @@ static WEBP_INLINE uint8_t clip_8b(int v) {
STORE(3, y, DC - (d)); \
} while (0)
-#define MUL1(a) ((((a) * 20091) >> 16) + (a))
-#define MUL2(a) (((a) * 35468) >> 16)
-
#if !WEBP_NEON_OMIT_C_CODE
static void TransformOne_C(const int16_t* in, uint8_t* dst) {
int C[4 * 4], *tmp;
@@ -48,8 +45,10 @@ static void TransformOne_C(const int16_t* in, uint8_t* dst) {
for (i = 0; i < 4; ++i) { // vertical pass
const int a = in[0] + in[8]; // [-4096, 4094]
const int b = in[0] - in[8]; // [-4095, 4095]
- const int c = MUL2(in[4]) - MUL1(in[12]); // [-3783, 3783]
- const int d = MUL1(in[4]) + MUL2(in[12]); // [-3785, 3781]
+ const int c = WEBP_TRANSFORM_AC3_MUL2(in[4]) -
+ WEBP_TRANSFORM_AC3_MUL1(in[12]); // [-3783, 3783]
+ const int d = WEBP_TRANSFORM_AC3_MUL1(in[4]) +
+ WEBP_TRANSFORM_AC3_MUL2(in[12]); // [-3785, 3781]
tmp[0] = a + d; // [-7881, 7875]
tmp[1] = b + c; // [-7878, 7878]
tmp[2] = b - c; // [-7878, 7878]
@@ -69,8 +68,10 @@ static void TransformOne_C(const int16_t* in, uint8_t* dst) {
const int dc = tmp[0] + 4;
const int a = dc + tmp[8];
const int b = dc - tmp[8];
- const int c = MUL2(tmp[4]) - MUL1(tmp[12]);
- const int d = MUL1(tmp[4]) + MUL2(tmp[12]);
+ const int c =
+ WEBP_TRANSFORM_AC3_MUL2(tmp[4]) - WEBP_TRANSFORM_AC3_MUL1(tmp[12]);
+ const int d =
+ WEBP_TRANSFORM_AC3_MUL1(tmp[4]) + WEBP_TRANSFORM_AC3_MUL2(tmp[12]);
STORE(0, 0, a + d);
STORE(1, 0, b + c);
STORE(2, 0, b - c);
@@ -83,17 +84,15 @@ static void TransformOne_C(const int16_t* in, uint8_t* dst) {
// Simplified transform when only in[0], in[1] and in[4] are non-zero
static void TransformAC3_C(const int16_t* in, uint8_t* dst) {
const int a = in[0] + 4;
- const int c4 = MUL2(in[4]);
- const int d4 = MUL1(in[4]);
- const int c1 = MUL2(in[1]);
- const int d1 = MUL1(in[1]);
+ const int c4 = WEBP_TRANSFORM_AC3_MUL2(in[4]);
+ const int d4 = WEBP_TRANSFORM_AC3_MUL1(in[4]);
+ const int c1 = WEBP_TRANSFORM_AC3_MUL2(in[1]);
+ const int d1 = WEBP_TRANSFORM_AC3_MUL1(in[1]);
STORE2(0, a + d4, d1, c1);
STORE2(1, a + c4, d1, c1);
STORE2(2, a - c4, d1, c1);
STORE2(3, a - d4, d1, c1);
}
-#undef MUL1
-#undef MUL2
#undef STORE2
static void TransformTwo_C(const int16_t* in, uint8_t* dst, int do_two) {
@@ -734,6 +733,7 @@ VP8SimpleFilterFunc VP8SimpleHFilter16i;
void (*VP8DitherCombine8x8)(const uint8_t* dither, uint8_t* dst,
int dst_stride);
+extern VP8CPUInfo VP8GetCPUInfo;
extern void VP8DspInitSSE2(void);
extern void VP8DspInitSSE41(void);
extern void VP8DspInitNEON(void);
@@ -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_mips32.c b/src/3rdparty/libwebp/src/dsp/dec_mips32.c
index e4e7096..f0e7de4 100644
--- a/src/3rdparty/libwebp/src/dsp/dec_mips32.c
+++ b/src/3rdparty/libwebp/src/dsp/dec_mips32.c
@@ -18,8 +18,8 @@
#include "src/dsp/mips_macro.h"
-static const int kC1 = 20091 + (1 << 16);
-static const int kC2 = 35468;
+static const int kC1 = WEBP_TRANSFORM_AC3_C1;
+static const int kC2 = WEBP_TRANSFORM_AC3_C2;
static WEBP_INLINE int abs_mips32(int x) {
const int sign = x >> 31;
@@ -219,7 +219,7 @@ static void TransformOne(const int16_t* in, uint8_t* dst) {
int temp0, temp1, temp2, temp3, temp4;
int temp5, temp6, temp7, temp8, temp9;
int temp10, temp11, temp12, temp13, temp14;
- int temp15, temp16, temp17, temp18;
+ int temp15, temp16, temp17, temp18, temp19;
int16_t* p_in = (int16_t*)in;
// loops unrolled and merged to avoid usage of tmp buffer
@@ -233,16 +233,14 @@ static void TransformOne(const int16_t* in, uint8_t* dst) {
"addu %[temp16], %[temp0], %[temp8] \n\t"
"subu %[temp0], %[temp0], %[temp8] \n\t"
"mul %[temp8], %[temp4], %[kC2] \n\t"
- "mul %[temp17], %[temp12], %[kC1] \n\t"
- "mul %[temp4], %[temp4], %[kC1] \n\t"
+ MUL_SHIFT_C1(temp17, temp12)
+ MUL_SHIFT_C1_IO(temp4, temp19)
"mul %[temp12], %[temp12], %[kC2] \n\t"
"lh %[temp1], 2(%[in]) \n\t"
"lh %[temp5], 10(%[in]) \n\t"
"lh %[temp9], 18(%[in]) \n\t"
"lh %[temp13], 26(%[in]) \n\t"
"sra %[temp8], %[temp8], 16 \n\t"
- "sra %[temp17], %[temp17], 16 \n\t"
- "sra %[temp4], %[temp4], 16 \n\t"
"sra %[temp12], %[temp12], 16 \n\t"
"lh %[temp2], 4(%[in]) \n\t"
"lh %[temp6], 12(%[in]) \n\t"
@@ -261,49 +259,43 @@ static void TransformOne(const int16_t* in, uint8_t* dst) {
"addu %[temp12], %[temp0], %[temp17] \n\t"
"subu %[temp0], %[temp0], %[temp17] \n\t"
"mul %[temp9], %[temp5], %[kC2] \n\t"
- "mul %[temp17], %[temp13], %[kC1] \n\t"
- "mul %[temp5], %[temp5], %[kC1] \n\t"
+ MUL_SHIFT_C1(temp17, temp13)
+ MUL_SHIFT_C1_IO(temp5, temp19)
"mul %[temp13], %[temp13], %[kC2] \n\t"
"sra %[temp9], %[temp9], 16 \n\t"
- "sra %[temp17], %[temp17], 16 \n\t"
"subu %[temp17], %[temp9], %[temp17] \n\t"
- "sra %[temp5], %[temp5], 16 \n\t"
"sra %[temp13], %[temp13], 16 \n\t"
"addu %[temp5], %[temp5], %[temp13] \n\t"
"addu %[temp13], %[temp1], %[temp17] \n\t"
"subu %[temp1], %[temp1], %[temp17] \n\t"
- "mul %[temp17], %[temp14], %[kC1] \n\t"
+ MUL_SHIFT_C1(temp17, temp14)
"mul %[temp14], %[temp14], %[kC2] \n\t"
"addu %[temp9], %[temp16], %[temp5] \n\t"
"subu %[temp5], %[temp16], %[temp5] \n\t"
"addu %[temp16], %[temp2], %[temp10] \n\t"
"subu %[temp2], %[temp2], %[temp10] \n\t"
"mul %[temp10], %[temp6], %[kC2] \n\t"
- "mul %[temp6], %[temp6], %[kC1] \n\t"
- "sra %[temp17], %[temp17], 16 \n\t"
+ MUL_SHIFT_C1_IO(temp6, temp19)
"sra %[temp14], %[temp14], 16 \n\t"
"sra %[temp10], %[temp10], 16 \n\t"
- "sra %[temp6], %[temp6], 16 \n\t"
"subu %[temp17], %[temp10], %[temp17] \n\t"
"addu %[temp6], %[temp6], %[temp14] \n\t"
"addu %[temp10], %[temp16], %[temp6] \n\t"
"subu %[temp6], %[temp16], %[temp6] \n\t"
"addu %[temp14], %[temp2], %[temp17] \n\t"
"subu %[temp2], %[temp2], %[temp17] \n\t"
- "mul %[temp17], %[temp15], %[kC1] \n\t"
+ MUL_SHIFT_C1(temp17, temp15)
"mul %[temp15], %[temp15], %[kC2] \n\t"
"addu %[temp16], %[temp3], %[temp11] \n\t"
"subu %[temp3], %[temp3], %[temp11] \n\t"
"mul %[temp11], %[temp7], %[kC2] \n\t"
- "mul %[temp7], %[temp7], %[kC1] \n\t"
+ MUL_SHIFT_C1_IO(temp7, temp19)
"addiu %[temp8], %[temp8], 4 \n\t"
"addiu %[temp12], %[temp12], 4 \n\t"
"addiu %[temp0], %[temp0], 4 \n\t"
"addiu %[temp4], %[temp4], 4 \n\t"
- "sra %[temp17], %[temp17], 16 \n\t"
"sra %[temp15], %[temp15], 16 \n\t"
"sra %[temp11], %[temp11], 16 \n\t"
- "sra %[temp7], %[temp7], 16 \n\t"
"subu %[temp17], %[temp11], %[temp17] \n\t"
"addu %[temp7], %[temp7], %[temp15] \n\t"
"addu %[temp15], %[temp3], %[temp17] \n\t"
@@ -313,48 +305,40 @@ static void TransformOne(const int16_t* in, uint8_t* dst) {
"addu %[temp16], %[temp8], %[temp10] \n\t"
"subu %[temp8], %[temp8], %[temp10] \n\t"
"mul %[temp10], %[temp9], %[kC2] \n\t"
- "mul %[temp17], %[temp11], %[kC1] \n\t"
- "mul %[temp9], %[temp9], %[kC1] \n\t"
+ MUL_SHIFT_C1(temp17, temp11)
+ MUL_SHIFT_C1_IO(temp9, temp19)
"mul %[temp11], %[temp11], %[kC2] \n\t"
"sra %[temp10], %[temp10], 16 \n\t"
- "sra %[temp17], %[temp17], 16 \n\t"
- "sra %[temp9], %[temp9], 16 \n\t"
"sra %[temp11], %[temp11], 16 \n\t"
"subu %[temp17], %[temp10], %[temp17] \n\t"
"addu %[temp11], %[temp9], %[temp11] \n\t"
"addu %[temp10], %[temp12], %[temp14] \n\t"
"subu %[temp12], %[temp12], %[temp14] \n\t"
"mul %[temp14], %[temp13], %[kC2] \n\t"
- "mul %[temp9], %[temp15], %[kC1] \n\t"
- "mul %[temp13], %[temp13], %[kC1] \n\t"
+ MUL_SHIFT_C1(temp9, temp15)
+ MUL_SHIFT_C1_IO(temp13, temp19)
"mul %[temp15], %[temp15], %[kC2] \n\t"
"sra %[temp14], %[temp14], 16 \n\t"
- "sra %[temp9], %[temp9], 16 \n\t"
- "sra %[temp13], %[temp13], 16 \n\t"
"sra %[temp15], %[temp15], 16 \n\t"
"subu %[temp9], %[temp14], %[temp9] \n\t"
"addu %[temp15], %[temp13], %[temp15] \n\t"
"addu %[temp14], %[temp0], %[temp2] \n\t"
"subu %[temp0], %[temp0], %[temp2] \n\t"
"mul %[temp2], %[temp1], %[kC2] \n\t"
- "mul %[temp13], %[temp3], %[kC1] \n\t"
- "mul %[temp1], %[temp1], %[kC1] \n\t"
+ MUL_SHIFT_C1(temp13, temp3)
+ MUL_SHIFT_C1_IO(temp1, temp19)
"mul %[temp3], %[temp3], %[kC2] \n\t"
"sra %[temp2], %[temp2], 16 \n\t"
- "sra %[temp13], %[temp13], 16 \n\t"
- "sra %[temp1], %[temp1], 16 \n\t"
"sra %[temp3], %[temp3], 16 \n\t"
"subu %[temp13], %[temp2], %[temp13] \n\t"
"addu %[temp3], %[temp1], %[temp3] \n\t"
"addu %[temp2], %[temp4], %[temp6] \n\t"
"subu %[temp4], %[temp4], %[temp6] \n\t"
"mul %[temp6], %[temp5], %[kC2] \n\t"
- "mul %[temp1], %[temp7], %[kC1] \n\t"
- "mul %[temp5], %[temp5], %[kC1] \n\t"
+ MUL_SHIFT_C1(temp1, temp7)
+ MUL_SHIFT_C1_IO(temp5, temp19)
"mul %[temp7], %[temp7], %[kC2] \n\t"
"sra %[temp6], %[temp6], 16 \n\t"
- "sra %[temp1], %[temp1], 16 \n\t"
- "sra %[temp5], %[temp5], 16 \n\t"
"sra %[temp7], %[temp7], 16 \n\t"
"subu %[temp1], %[temp6], %[temp1] \n\t"
"addu %[temp7], %[temp5], %[temp7] \n\t"
@@ -542,7 +526,7 @@ static void TransformOne(const int16_t* in, uint8_t* dst) {
[temp9]"=&r"(temp9), [temp10]"=&r"(temp10), [temp11]"=&r"(temp11),
[temp12]"=&r"(temp12), [temp13]"=&r"(temp13), [temp14]"=&r"(temp14),
[temp15]"=&r"(temp15), [temp16]"=&r"(temp16), [temp17]"=&r"(temp17),
- [temp18]"=&r"(temp18)
+ [temp18]"=&r"(temp18), [temp19]"=&r"(temp19)
: [in]"r"(p_in), [kC1]"r"(kC1), [kC2]"r"(kC2), [dst]"r"(dst)
: "memory", "hi", "lo"
);
diff --git a/src/3rdparty/libwebp/src/dsp/dec_mips_dsp_r2.c b/src/3rdparty/libwebp/src/dsp/dec_mips_dsp_r2.c
index b0936bc..0ba706a 100644
--- a/src/3rdparty/libwebp/src/dsp/dec_mips_dsp_r2.c
+++ b/src/3rdparty/libwebp/src/dsp/dec_mips_dsp_r2.c
@@ -18,10 +18,8 @@
#include "src/dsp/mips_macro.h"
-static const int kC1 = 20091 + (1 << 16);
-static const int kC2 = 35468;
-
-#define MUL(a, b) (((a) * (b)) >> 16)
+static const int kC1 = WEBP_TRANSFORM_AC3_C1;
+static const int kC2 = WEBP_TRANSFORM_AC3_C2;
static void TransformDC(const int16_t* in, uint8_t* dst) {
int temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8, temp9, temp10;
@@ -49,10 +47,10 @@ static void TransformDC(const int16_t* in, uint8_t* dst) {
static void TransformAC3(const int16_t* in, uint8_t* dst) {
const int a = in[0] + 4;
- int c4 = MUL(in[4], kC2);
- const int d4 = MUL(in[4], kC1);
- const int c1 = MUL(in[1], kC2);
- const int d1 = MUL(in[1], kC1);
+ int c4 = WEBP_TRANSFORM_AC3_MUL2(in[4]);
+ const int d4 = WEBP_TRANSFORM_AC3_MUL1(in[4]);
+ const int c1 = WEBP_TRANSFORM_AC3_MUL2(in[1]);
+ const int d1 = WEBP_TRANSFORM_AC3_MUL1(in[1]);
int temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8, temp9;
int temp10, temp11, temp12, temp13, temp14, temp15, temp16, temp17, temp18;
@@ -479,8 +477,6 @@ static void HFilter8i(uint8_t* u, uint8_t* v, int stride,
FilterLoop24(v + 4, 1, stride, 8, thresh, ithresh, hev_thresh);
}
-#undef MUL
-
//------------------------------------------------------------------------------
// Simple In-loop filtering (Paragraph 15.2)
diff --git a/src/3rdparty/libwebp/src/dsp/dec_msa.c b/src/3rdparty/libwebp/src/dsp/dec_msa.c
index 8090622..58d1730 100644
--- a/src/3rdparty/libwebp/src/dsp/dec_msa.c
+++ b/src/3rdparty/libwebp/src/dsp/dec_msa.c
@@ -37,8 +37,6 @@
d1_m = d_tmp1_m + d_tmp2_m; \
BUTTERFLY_4(a1_m, b1_m, c1_m, d1_m, out0, out1, out2, out3); \
}
-#define MULT1(a) ((((a) * 20091) >> 16) + (a))
-#define MULT2(a) (((a) * 35468) >> 16)
static void TransformOne(const int16_t* in, uint8_t* dst) {
v8i16 input0, input1;
@@ -124,10 +122,10 @@ static void TransformDC(const int16_t* in, uint8_t* dst) {
static void TransformAC3(const int16_t* in, uint8_t* dst) {
const int a = in[0] + 4;
- const int c4 = MULT2(in[4]);
- const int d4 = MULT1(in[4]);
- const int in2 = MULT2(in[1]);
- const int in3 = MULT1(in[1]);
+ const int c4 = WEBP_TRANSFORM_AC3_MUL2(in[4]);
+ const int d4 = WEBP_TRANSFORM_AC3_MUL1(in[4]);
+ const int in2 = WEBP_TRANSFORM_AC3_MUL2(in[1]);
+ const int in3 = WEBP_TRANSFORM_AC3_MUL1(in[1]);
v4i32 tmp0 = { 0 };
v4i32 out0 = __msa_fill_w(a + d4);
v4i32 out1 = __msa_fill_w(a + c4);
diff --git a/src/3rdparty/libwebp/src/dsp/dec_neon.c b/src/3rdparty/libwebp/src/dsp/dec_neon.c
index 239ec41..83b3a1f 100644
--- a/src/3rdparty/libwebp/src/dsp/dec_neon.c
+++ b/src/3rdparty/libwebp/src/dsp/dec_neon.c
@@ -1000,8 +1000,9 @@ static void HFilter8i_NEON(uint8_t* u, uint8_t* v, int stride,
// libwebp adds 1 << 16 to cospi8sqrt2minus1 (kC1). However, this causes the
// same issue with kC1 and vqdmulh that we work around by down shifting kC2
-static const int16_t kC1 = 20091;
-static const int16_t kC2 = 17734; // half of kC2, actually. See comment above.
+static const int16_t kC1 = WEBP_TRANSFORM_AC3_C1;
+static const int16_t kC2 =
+ WEBP_TRANSFORM_AC3_C2 / 2; // half of kC2, actually. See comment above.
#if defined(WEBP_USE_INTRINSICS)
static WEBP_INLINE void Transpose8x2_NEON(const int16x8_t in0,
@@ -1255,15 +1256,12 @@ static void TransformWHT_NEON(const int16_t* in, int16_t* out) {
//------------------------------------------------------------------------------
-#define MUL(a, b) (((a) * (b)) >> 16)
static void TransformAC3_NEON(const int16_t* in, uint8_t* dst) {
- static const int kC1_full = 20091 + (1 << 16);
- static const int kC2_full = 35468;
const int16x4_t A = vld1_dup_s16(in);
- const int16x4_t c4 = vdup_n_s16(MUL(in[4], kC2_full));
- const int16x4_t d4 = vdup_n_s16(MUL(in[4], kC1_full));
- const int c1 = MUL(in[1], kC2_full);
- const int d1 = MUL(in[1], kC1_full);
+ const int16x4_t c4 = vdup_n_s16(WEBP_TRANSFORM_AC3_MUL2(in[4]));
+ const int16x4_t d4 = vdup_n_s16(WEBP_TRANSFORM_AC3_MUL1(in[4]));
+ const int c1 = WEBP_TRANSFORM_AC3_MUL2(in[1]);
+ const int d1 = WEBP_TRANSFORM_AC3_MUL1(in[1]);
const uint64_t cd = (uint64_t)( d1 & 0xffff) << 0 |
(uint64_t)( c1 & 0xffff) << 16 |
(uint64_t)(-c1 & 0xffff) << 32 |
@@ -1274,7 +1272,6 @@ static void TransformAC3_NEON(const int16_t* in, uint8_t* dst) {
const int16x8_t m2_m3 = vcombine_s16(vqsub_s16(B, c4), vqsub_s16(B, d4));
Add4x4_NEON(m0_m1, m2_m3, dst);
}
-#undef MUL
//------------------------------------------------------------------------------
// 4x4
@@ -1283,12 +1280,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
@@ -1428,9 +1425,8 @@ 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 uint16x8_t B = vmovl_u8(A);
- const uint16_t p2 = vaddvq_u16(B);
+#if WEBP_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
@@ -1441,18 +1437,18 @@ static WEBP_INLINE void DC8_NEON(uint8_t* dst, int do_top, int do_left) {
}
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);
@@ -1512,29 +1508,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 WEBP_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..ff3a285 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,24 +187,22 @@ 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));
}
}
}
#if (USE_TRANSFORM_AC3 == 1)
-#define MUL(a, b) (((a) * (b)) >> 16)
+
static void TransformAC3(const int16_t* in, uint8_t* dst) {
- static const int kC1 = 20091 + (1 << 16);
- static const int kC2 = 35468;
const __m128i A = _mm_set1_epi16(in[0] + 4);
- const __m128i c4 = _mm_set1_epi16(MUL(in[4], kC2));
- const __m128i d4 = _mm_set1_epi16(MUL(in[4], kC1));
- const int c1 = MUL(in[1], kC2);
- const int d1 = MUL(in[1], kC1);
+ const __m128i c4 = _mm_set1_epi16(WEBP_TRANSFORM_AC3_MUL2(in[4]));
+ const __m128i d4 = _mm_set1_epi16(WEBP_TRANSFORM_AC3_MUL1(in[4]));
+ const int c1 = WEBP_TRANSFORM_AC3_MUL2(in[1]);
+ const int d1 = WEBP_TRANSFORM_AC3_MUL1(in[1]);
const __m128i CD = _mm_set_epi16(0, 0, 0, 0, -d1, -c1, c1, d1);
const __m128i B = _mm_adds_epi16(A, CD);
const __m128i m0 = _mm_adds_epi16(B, d4);
@@ -213,10 +211,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,12 +231,12 @@ 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
//------------------------------------------------------------------------------
@@ -259,15 +257,15 @@ static WEBP_INLINE void SignedShift8b_SSE2(__m128i* const x) {
*x = _mm_packs_epi16(lo_1, hi_1);
}
-#define FLIP_SIGN_BIT2(a, b) { \
+#define FLIP_SIGN_BIT2(a, b) do { \
(a) = _mm_xor_si128(a, sign_bit); \
(b) = _mm_xor_si128(b, sign_bit); \
-}
+} while (0)
-#define FLIP_SIGN_BIT4(a, b, c, d) { \
+#define FLIP_SIGN_BIT4(a, b, c, d) do { \
FLIP_SIGN_BIT2(a, b); \
FLIP_SIGN_BIT2(c, d); \
-}
+} while (0)
// input/output is uint8_t
static WEBP_INLINE void GetNotHEV_SSE2(const __m128i* const p1,
@@ -477,11 +475,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 +538,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);
}
}
@@ -645,12 +643,12 @@ static void SimpleHFilter16i_SSE2(uint8_t* p, int stride, int thresh) {
(m) = _mm_max_epu8(m, MM_ABS(p2, p1)); \
} while (0)
-#define LOAD_H_EDGES4(p, stride, e1, e2, e3, e4) { \
+#define LOAD_H_EDGES4(p, stride, e1, e2, e3, e4) do { \
(e1) = _mm_loadu_si128((__m128i*)&(p)[0 * (stride)]); \
(e2) = _mm_loadu_si128((__m128i*)&(p)[1 * (stride)]); \
(e3) = _mm_loadu_si128((__m128i*)&(p)[2 * (stride)]); \
(e4) = _mm_loadu_si128((__m128i*)&(p)[3 * (stride)]); \
-}
+} while (0)
#define LOADUV_H_EDGE(p, u, v, stride) do { \
const __m128i U = _mm_loadl_epi64((__m128i*)&(u)[(stride)]); \
@@ -658,18 +656,18 @@ static void SimpleHFilter16i_SSE2(uint8_t* p, int stride, int thresh) {
(p) = _mm_unpacklo_epi64(U, V); \
} while (0)
-#define LOADUV_H_EDGES4(u, v, stride, e1, e2, e3, e4) { \
+#define LOADUV_H_EDGES4(u, v, stride, e1, e2, e3, e4) do { \
LOADUV_H_EDGE(e1, u, v, 0 * (stride)); \
LOADUV_H_EDGE(e2, u, v, 1 * (stride)); \
LOADUV_H_EDGE(e3, u, v, 2 * (stride)); \
LOADUV_H_EDGE(e4, u, v, 3 * (stride)); \
-}
+} while (0)
-#define STOREUV(p, u, v, stride) { \
+#define STOREUV(p, u, v, stride) do { \
_mm_storel_epi64((__m128i*)&(u)[(stride)], p); \
(p) = _mm_srli_si128(p, 8); \
_mm_storel_epi64((__m128i*)&(v)[(stride)], p); \
-}
+} while (0)
static WEBP_INLINE void ComplexMask_SSE2(const __m128i* const p1,
const __m128i* const p0,
@@ -908,10 +906,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 +923,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 +944,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 +968,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 +989,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 +997,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 +1014,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 +1061,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 +1069,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 +1129,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 7c75b26..23bc296 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)))
-#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
-#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
+#define WEBP_RESTRICT __restrict__
+#elif defined(_MSC_VER)
+#define WEBP_RESTRICT __restrict
#else
-#define WEBP_NEON_WORK_AROUND_GCC 0
+#define WEBP_RESTRICT
#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
@@ -379,6 +203,11 @@ extern VP8DecIdct VP8TransformDC;
extern VP8DecIdct VP8TransformDCUV;
extern VP8WHT VP8TransformWHT;
+#define WEBP_TRANSFORM_AC3_C1 20091
+#define WEBP_TRANSFORM_AC3_C2 35468
+#define WEBP_TRANSFORM_AC3_MUL1(a) ((((a) * WEBP_TRANSFORM_AC3_C1) >> 16) + (a))
+#define WEBP_TRANSFORM_AC3_MUL2(a) (((a) * WEBP_TRANSFORM_AC3_C2) >> 16)
+
// *dst is the destination block, with stride BPS. Boundary samples are
// assumed accessible when needed.
typedef void (*VP8PredFunc)(uint8_t* dst);
@@ -508,15 +337,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 +392,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 +427,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..395ad05 100644
--- a/src/3rdparty/libwebp/src/dsp/enc.c
+++ b/src/3rdparty/libwebp/src/dsp/enc.c
@@ -109,10 +109,6 @@ static WEBP_TSAN_IGNORE_FUNCTION void InitTables(void) {
#define STORE(x, y, v) \
dst[(x) + (y) * BPS] = clip_8b(ref[(x) + (y) * BPS] + ((v) >> 3))
-static const int kC1 = 20091 + (1 << 16);
-static const int kC2 = 35468;
-#define MUL(a, b) (((a) * (b)) >> 16)
-
static WEBP_INLINE void ITransformOne(const uint8_t* ref, const int16_t* in,
uint8_t* dst) {
int C[4 * 4], *tmp;
@@ -121,8 +117,10 @@ static WEBP_INLINE void ITransformOne(const uint8_t* ref, const int16_t* in,
for (i = 0; i < 4; ++i) { // vertical pass
const int a = in[0] + in[8];
const int b = in[0] - in[8];
- const int c = MUL(in[4], kC2) - MUL(in[12], kC1);
- const int d = MUL(in[4], kC1) + MUL(in[12], kC2);
+ const int c =
+ WEBP_TRANSFORM_AC3_MUL2(in[4]) - WEBP_TRANSFORM_AC3_MUL1(in[12]);
+ const int d =
+ WEBP_TRANSFORM_AC3_MUL1(in[4]) + WEBP_TRANSFORM_AC3_MUL2(in[12]);
tmp[0] = a + d;
tmp[1] = b + c;
tmp[2] = b - c;
@@ -134,10 +132,12 @@ static WEBP_INLINE void ITransformOne(const uint8_t* ref, const int16_t* in,
tmp = C;
for (i = 0; i < 4; ++i) { // horizontal pass
const int dc = tmp[0] + 4;
- const int a = dc + tmp[8];
- const int b = dc - tmp[8];
- const int c = MUL(tmp[4], kC2) - MUL(tmp[12], kC1);
- const int d = MUL(tmp[4], kC1) + MUL(tmp[12], kC2);
+ const int a = dc + tmp[8];
+ const int b = dc - tmp[8];
+ const int c =
+ WEBP_TRANSFORM_AC3_MUL2(tmp[4]) - WEBP_TRANSFORM_AC3_MUL1(tmp[12]);
+ const int d =
+ WEBP_TRANSFORM_AC3_MUL1(tmp[4]) + WEBP_TRANSFORM_AC3_MUL2(tmp[12]);
STORE(0, i, a + d);
STORE(1, i, b + c);
STORE(2, i, b - c);
@@ -222,7 +222,6 @@ static void FTransformWHT_C(const int16_t* in, int16_t* out) {
}
#endif // !WEBP_NEON_OMIT_C_CODE
-#undef MUL
#undef STORE
//------------------------------------------------------------------------------
@@ -732,6 +731,7 @@ VP8QuantizeBlockWHT VP8EncQuantizeBlockWHT;
VP8BlockCopy VP8Copy4x4;
VP8BlockCopy VP8Copy16x8;
+extern VP8CPUInfo VP8GetCPUInfo;
extern void VP8EncDspInitSSE2(void);
extern void VP8EncDspInitSSE41(void);
extern void VP8EncDspInitNEON(void);
@@ -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_mips32.c b/src/3rdparty/libwebp/src/dsp/enc_mips32.c
index 618f0fc..50518a5 100644
--- a/src/3rdparty/libwebp/src/dsp/enc_mips32.c
+++ b/src/3rdparty/libwebp/src/dsp/enc_mips32.c
@@ -21,8 +21,8 @@
#include "src/enc/vp8i_enc.h"
#include "src/enc/cost_enc.h"
-static const int kC1 = 20091 + (1 << 16);
-static const int kC2 = 35468;
+static const int kC1 = WEBP_TRANSFORM_AC3_C1;
+static const int kC2 = WEBP_TRANSFORM_AC3_C2;
// macro for one vertical pass in ITransformOne
// MUL macro inlined
@@ -30,7 +30,7 @@ static const int kC2 = 35468;
// A..D - offsets in bytes to load from in buffer
// TEMP0..TEMP3 - registers for corresponding tmp elements
// TEMP4..TEMP5 - temporary registers
-#define VERTICAL_PASS(A, B, C, D, TEMP4, TEMP0, TEMP1, TEMP2, TEMP3) \
+#define VERTICAL_PASS(A, B, C, D, TEMP4, TEMP0, TEMP1, TEMP2, TEMP3) \
"lh %[temp16], " #A "(%[temp20]) \n\t" \
"lh %[temp18], " #B "(%[temp20]) \n\t" \
"lh %[temp17], " #C "(%[temp20]) \n\t" \
@@ -38,12 +38,10 @@ static const int kC2 = 35468;
"addu %[" #TEMP4 "], %[temp16], %[temp18] \n\t" \
"subu %[temp16], %[temp16], %[temp18] \n\t" \
"mul %[" #TEMP0 "], %[temp17], %[kC2] \n\t" \
- "mul %[temp18], %[temp19], %[kC1] \n\t" \
- "mul %[temp17], %[temp17], %[kC1] \n\t" \
+ MUL_SHIFT_C1_IO(temp17, temp18) \
+ MUL_SHIFT_C1(temp18, temp19) \
"mul %[temp19], %[temp19], %[kC2] \n\t" \
"sra %[" #TEMP0 "], %[" #TEMP0 "], 16 \n\n" \
- "sra %[temp18], %[temp18], 16 \n\n" \
- "sra %[temp17], %[temp17], 16 \n\n" \
"sra %[temp19], %[temp19], 16 \n\n" \
"subu %[" #TEMP2 "], %[" #TEMP0 "], %[temp18] \n\t" \
"addu %[" #TEMP3 "], %[temp17], %[temp19] \n\t" \
@@ -58,17 +56,15 @@ static const int kC2 = 35468;
// temp0..temp15 holds tmp[0]..tmp[15]
// A - offset in bytes to load from ref and store to dst buffer
// TEMP0, TEMP4, TEMP8 and TEMP12 - registers for corresponding tmp elements
-#define HORIZONTAL_PASS(A, TEMP0, TEMP4, TEMP8, TEMP12) \
+#define HORIZONTAL_PASS(A, TEMP0, TEMP4, TEMP8, TEMP12) \
"addiu %[" #TEMP0 "], %[" #TEMP0 "], 4 \n\t" \
"addu %[temp16], %[" #TEMP0 "], %[" #TEMP8 "] \n\t" \
"subu %[temp17], %[" #TEMP0 "], %[" #TEMP8 "] \n\t" \
"mul %[" #TEMP0 "], %[" #TEMP4 "], %[kC2] \n\t" \
- "mul %[" #TEMP8 "], %[" #TEMP12 "], %[kC1] \n\t" \
- "mul %[" #TEMP4 "], %[" #TEMP4 "], %[kC1] \n\t" \
+ MUL_SHIFT_C1_IO(TEMP4, TEMP8) \
+ MUL_SHIFT_C1(TEMP8, TEMP12) \
"mul %[" #TEMP12 "], %[" #TEMP12 "], %[kC2] \n\t" \
"sra %[" #TEMP0 "], %[" #TEMP0 "], 16 \n\t" \
- "sra %[" #TEMP8 "], %[" #TEMP8 "], 16 \n\t" \
- "sra %[" #TEMP4 "], %[" #TEMP4 "], 16 \n\t" \
"sra %[" #TEMP12 "], %[" #TEMP12 "], 16 \n\t" \
"subu %[temp18], %[" #TEMP0 "], %[" #TEMP8 "] \n\t" \
"addu %[temp19], %[" #TEMP4 "], %[" #TEMP12 "] \n\t" \
diff --git a/src/3rdparty/libwebp/src/dsp/enc_mips_dsp_r2.c b/src/3rdparty/libwebp/src/dsp/enc_mips_dsp_r2.c
index 9ddd895..e1431f3 100644
--- a/src/3rdparty/libwebp/src/dsp/enc_mips_dsp_r2.c
+++ b/src/3rdparty/libwebp/src/dsp/enc_mips_dsp_r2.c
@@ -20,8 +20,8 @@
#include "src/enc/cost_enc.h"
#include "src/enc/vp8i_enc.h"
-static const int kC1 = 20091 + (1 << 16);
-static const int kC2 = 35468;
+static const int kC1 = WEBP_TRANSFORM_AC3_C1;
+static const int kC2 = WEBP_TRANSFORM_AC3_C2;
// O - output
// I - input (macro doesn't change it)
diff --git a/src/3rdparty/libwebp/src/dsp/enc_neon.c b/src/3rdparty/libwebp/src/dsp/enc_neon.c
index 43bf124..6f641c9 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"
@@ -27,8 +27,9 @@
// This code is pretty much the same as TransformOne in the dec_neon.c, except
// for subtraction to *ref. See the comments there for algorithmic explanations.
-static const int16_t kC1 = 20091;
-static const int16_t kC2 = 17734; // half of kC2, actually. See comment above.
+static const int16_t kC1 = WEBP_TRANSFORM_AC3_C1;
+static const int16_t kC2 =
+ WEBP_TRANSFORM_AC3_C2 / 2; // half of kC2, actually. See comment above.
// This code works but is *slower* than the inlined-asm version below
// (with gcc-4.6). So we disable it for now. Later, it'll be conditional to
@@ -764,9 +765,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 WEBP_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) {
@@ -860,7 +866,7 @@ static int QuantizeBlock_NEON(int16_t in[16], int16_t out[16],
uint8x8x4_t shuffles;
// vtbl?_u8 are marked unavailable for iOS arm64 with Xcode < 6.3, use
// non-standard versions there.
-#if defined(__APPLE__) && defined(__aarch64__) && \
+#if defined(__APPLE__) && WEBP_AARCH64 && \
defined(__apple_build_version__) && (__apple_build_version__< 6020037)
uint8x16x2_t all_out;
INIT_VECTOR2(all_out, vreinterpretq_u8_s16(out0), vreinterpretq_u8_s16(out1));
diff --git a/src/3rdparty/libwebp/src/dsp/enc_sse2.c b/src/3rdparty/libwebp/src/dsp/enc_sse2.c
index b2e78ed..010624a 100644
--- a/src/3rdparty/libwebp/src/dsp/enc_sse2.c
+++ b/src/3rdparty/libwebp/src/dsp/enc_sse2.c
@@ -25,9 +25,160 @@
//------------------------------------------------------------------------------
// Transforms (Paragraph 14.4)
-// Does one or two inverse transforms.
-static void ITransform_SSE2(const uint8_t* ref, const int16_t* in, uint8_t* dst,
- int do_two) {
+// Does one inverse transform.
+static void ITransform_One_SSE2(const uint8_t* ref, const int16_t* in,
+ uint8_t* dst) {
+ // This implementation makes use of 16-bit fixed point versions of two
+ // multiply constants:
+ // K1 = sqrt(2) * cos (pi/8) ~= 85627 / 2^16
+ // K2 = sqrt(2) * sin (pi/8) ~= 35468 / 2^16
+ //
+ // To be able to use signed 16-bit integers, we use the following trick to
+ // have constants within range:
+ // - Associated constants are obtained by subtracting the 16-bit fixed point
+ // version of one:
+ // k = K - (1 << 16) => K = k + (1 << 16)
+ // K1 = 85267 => k1 = 20091
+ // K2 = 35468 => k2 = -30068
+ // - The multiplication of a variable by a constant become the sum of the
+ // variable and the multiplication of that variable by the associated
+ // constant:
+ // (x * K) >> 16 = (x * (k + (1 << 16))) >> 16 = ((x * k ) >> 16) + x
+ const __m128i k1k2 = _mm_set_epi16(-30068, -30068, -30068, -30068,
+ 20091, 20091, 20091, 20091);
+ const __m128i k2k1 = _mm_set_epi16(20091, 20091, 20091, 20091,
+ -30068, -30068, -30068, -30068);
+ const __m128i zero = _mm_setzero_si128();
+ const __m128i zero_four = _mm_set_epi16(0, 0, 0, 0, 4, 4, 4, 4);
+ __m128i T01, T23;
+
+ // Load and concatenate the transform coefficients.
+ const __m128i in01 = _mm_loadu_si128((const __m128i*)&in[0]);
+ const __m128i in23 = _mm_loadu_si128((const __m128i*)&in[8]);
+ // a00 a10 a20 a30 a01 a11 a21 a31
+ // a02 a12 a22 a32 a03 a13 a23 a33
+
+ // Vertical pass and subsequent transpose.
+ {
+ const __m128i in1 = _mm_unpackhi_epi64(in01, in01);
+ const __m128i in3 = _mm_unpackhi_epi64(in23, in23);
+
+ // First pass, c and d calculations are longer because of the "trick"
+ // multiplications.
+ // c = MUL(in1, K2) - MUL(in3, K1) = MUL(in1, k2) - MUL(in3, k1) + in1 - in3
+ // d = MUL(in1, K1) + MUL(in3, K2) = MUL(in1, k1) + MUL(in3, k2) + in1 + in3
+ const __m128i a_d3 = _mm_add_epi16(in01, in23);
+ const __m128i b_c3 = _mm_sub_epi16(in01, in23);
+ const __m128i c1d1 = _mm_mulhi_epi16(in1, k2k1);
+ const __m128i c2d2 = _mm_mulhi_epi16(in3, k1k2);
+ const __m128i c3 = _mm_unpackhi_epi64(b_c3, b_c3);
+ const __m128i c4 = _mm_sub_epi16(c1d1, c2d2);
+ const __m128i c = _mm_add_epi16(c3, c4);
+ const __m128i d4u = _mm_add_epi16(c1d1, c2d2);
+ const __m128i du = _mm_add_epi16(a_d3, d4u);
+ const __m128i d = _mm_unpackhi_epi64(du, du);
+
+ // Second pass.
+ const __m128i comb_ab = _mm_unpacklo_epi64(a_d3, b_c3);
+ const __m128i comb_dc = _mm_unpacklo_epi64(d, c);
+
+ const __m128i tmp01 = _mm_add_epi16(comb_ab, comb_dc);
+ const __m128i tmp32 = _mm_sub_epi16(comb_ab, comb_dc);
+ const __m128i tmp23 = _mm_shuffle_epi32(tmp32, _MM_SHUFFLE(1, 0, 3, 2));
+
+ const __m128i transpose_0 = _mm_unpacklo_epi16(tmp01, tmp23);
+ const __m128i transpose_1 = _mm_unpackhi_epi16(tmp01, tmp23);
+ // a00 a20 a01 a21 a02 a22 a03 a23
+ // a10 a30 a11 a31 a12 a32 a13 a33
+
+ T01 = _mm_unpacklo_epi16(transpose_0, transpose_1);
+ T23 = _mm_unpackhi_epi16(transpose_0, transpose_1);
+ // a00 a10 a20 a30 a01 a11 a21 a31
+ // a02 a12 a22 a32 a03 a13 a23 a33
+ }
+
+ // Horizontal pass and subsequent transpose.
+ {
+ const __m128i T1 = _mm_unpackhi_epi64(T01, T01);
+ const __m128i T3 = _mm_unpackhi_epi64(T23, T23);
+
+ // First pass, c and d calculations are longer because of the "trick"
+ // multiplications.
+ const __m128i dc = _mm_add_epi16(T01, zero_four);
+
+ // c = MUL(T1, K2) - MUL(T3, K1) = MUL(T1, k2) - MUL(T3, k1) + T1 - T3
+ // d = MUL(T1, K1) + MUL(T3, K2) = MUL(T1, k1) + MUL(T3, k2) + T1 + T3
+ const __m128i a_d3 = _mm_add_epi16(dc, T23);
+ const __m128i b_c3 = _mm_sub_epi16(dc, T23);
+ const __m128i c1d1 = _mm_mulhi_epi16(T1, k2k1);
+ const __m128i c2d2 = _mm_mulhi_epi16(T3, k1k2);
+ const __m128i c3 = _mm_unpackhi_epi64(b_c3, b_c3);
+ const __m128i c4 = _mm_sub_epi16(c1d1, c2d2);
+ const __m128i c = _mm_add_epi16(c3, c4);
+ const __m128i d4u = _mm_add_epi16(c1d1, c2d2);
+ const __m128i du = _mm_add_epi16(a_d3, d4u);
+ const __m128i d = _mm_unpackhi_epi64(du, du);
+
+ // Second pass.
+ const __m128i comb_ab = _mm_unpacklo_epi64(a_d3, b_c3);
+ const __m128i comb_dc = _mm_unpacklo_epi64(d, c);
+
+ const __m128i tmp01 = _mm_add_epi16(comb_ab, comb_dc);
+ const __m128i tmp32 = _mm_sub_epi16(comb_ab, comb_dc);
+ const __m128i tmp23 = _mm_shuffle_epi32(tmp32, _MM_SHUFFLE(1, 0, 3, 2));
+
+ const __m128i shifted01 = _mm_srai_epi16(tmp01, 3);
+ const __m128i shifted23 = _mm_srai_epi16(tmp23, 3);
+ // a00 a01 a02 a03 a10 a11 a12 a13
+ // a20 a21 a22 a23 a30 a31 a32 a33
+
+ const __m128i transpose_0 = _mm_unpacklo_epi16(shifted01, shifted23);
+ const __m128i transpose_1 = _mm_unpackhi_epi16(shifted01, shifted23);
+ // a00 a20 a01 a21 a02 a22 a03 a23
+ // a10 a30 a11 a31 a12 a32 a13 a33
+
+ T01 = _mm_unpacklo_epi16(transpose_0, transpose_1);
+ T23 = _mm_unpackhi_epi16(transpose_0, transpose_1);
+ // a00 a10 a20 a30 a01 a11 a21 a31
+ // a02 a12 a22 a32 a03 a13 a23 a33
+ }
+
+ // Add inverse transform to 'ref' and store.
+ {
+ // Load the reference(s).
+ __m128i ref01, ref23, ref0123;
+ int32_t buf[4];
+
+ // Load four bytes/pixels per line.
+ const __m128i ref0 = _mm_cvtsi32_si128(WebPMemToInt32(&ref[0 * BPS]));
+ const __m128i ref1 = _mm_cvtsi32_si128(WebPMemToInt32(&ref[1 * BPS]));
+ const __m128i ref2 = _mm_cvtsi32_si128(WebPMemToInt32(&ref[2 * BPS]));
+ const __m128i ref3 = _mm_cvtsi32_si128(WebPMemToInt32(&ref[3 * BPS]));
+ ref01 = _mm_unpacklo_epi32(ref0, ref1);
+ ref23 = _mm_unpacklo_epi32(ref2, ref3);
+
+ // Convert to 16b.
+ ref01 = _mm_unpacklo_epi8(ref01, zero);
+ ref23 = _mm_unpacklo_epi8(ref23, zero);
+ // Add the inverse transform(s).
+ ref01 = _mm_add_epi16(ref01, T01);
+ ref23 = _mm_add_epi16(ref23, T23);
+ // Unsigned saturate to 8b.
+ ref0123 = _mm_packus_epi16(ref01, ref23);
+
+ _mm_storeu_si128((__m128i *)buf, ref0123);
+
+ // Store four bytes/pixels per line.
+ WebPInt32ToMem(&dst[0 * BPS], buf[0]);
+ WebPInt32ToMem(&dst[1 * BPS], buf[1]);
+ WebPInt32ToMem(&dst[2 * BPS], buf[2]);
+ WebPInt32ToMem(&dst[3 * BPS], buf[3]);
+ }
+}
+
+// Does two inverse transforms.
+static void ITransform_Two_SSE2(const uint8_t* ref, const int16_t* in,
+ uint8_t* dst) {
// This implementation makes use of 16-bit fixed point versions of two
// multiply constants:
// K1 = sqrt(2) * cos (pi/8) ~= 85627 / 2^16
@@ -49,33 +200,21 @@ static void ITransform_SSE2(const uint8_t* ref, const int16_t* in, uint8_t* dst,
__m128i T0, T1, T2, T3;
// Load and concatenate the transform coefficients (we'll do two inverse
- // transforms in parallel). In the case of only one inverse transform, the
- // second half of the vectors will just contain random value we'll never
- // use nor store.
+ // transforms in parallel).
__m128i in0, in1, in2, in3;
{
- in0 = _mm_loadl_epi64((const __m128i*)&in[0]);
- in1 = _mm_loadl_epi64((const __m128i*)&in[4]);
- in2 = _mm_loadl_epi64((const __m128i*)&in[8]);
- in3 = _mm_loadl_epi64((const __m128i*)&in[12]);
- // a00 a10 a20 a30 x x x x
- // a01 a11 a21 a31 x x x x
- // a02 a12 a22 a32 x x x x
- // a03 a13 a23 a33 x x x x
- if (do_two) {
- const __m128i inB0 = _mm_loadl_epi64((const __m128i*)&in[16]);
- const __m128i inB1 = _mm_loadl_epi64((const __m128i*)&in[20]);
- const __m128i inB2 = _mm_loadl_epi64((const __m128i*)&in[24]);
- const __m128i inB3 = _mm_loadl_epi64((const __m128i*)&in[28]);
- in0 = _mm_unpacklo_epi64(in0, inB0);
- in1 = _mm_unpacklo_epi64(in1, inB1);
- in2 = _mm_unpacklo_epi64(in2, inB2);
- in3 = _mm_unpacklo_epi64(in3, inB3);
- // a00 a10 a20 a30 b00 b10 b20 b30
- // a01 a11 a21 a31 b01 b11 b21 b31
- // a02 a12 a22 a32 b02 b12 b22 b32
- // a03 a13 a23 a33 b03 b13 b23 b33
- }
+ const __m128i tmp0 = _mm_loadu_si128((const __m128i*)&in[0]);
+ const __m128i tmp1 = _mm_loadu_si128((const __m128i*)&in[8]);
+ const __m128i tmp2 = _mm_loadu_si128((const __m128i*)&in[16]);
+ const __m128i tmp3 = _mm_loadu_si128((const __m128i*)&in[24]);
+ in0 = _mm_unpacklo_epi64(tmp0, tmp2);
+ in1 = _mm_unpackhi_epi64(tmp0, tmp2);
+ in2 = _mm_unpacklo_epi64(tmp1, tmp3);
+ in3 = _mm_unpackhi_epi64(tmp1, tmp3);
+ // a00 a10 a20 a30 b00 b10 b20 b30
+ // a01 a11 a21 a31 b01 b11 b21 b31
+ // a02 a12 a22 a32 b02 b12 b22 b32
+ // a03 a13 a23 a33 b03 b13 b23 b33
}
// Vertical pass and subsequent transpose.
@@ -148,19 +287,11 @@ static void ITransform_SSE2(const uint8_t* ref, const int16_t* in, uint8_t* dst,
const __m128i zero = _mm_setzero_si128();
// Load the reference(s).
__m128i ref0, ref1, ref2, ref3;
- if (do_two) {
- // Load eight bytes/pixels per line.
- ref0 = _mm_loadl_epi64((const __m128i*)&ref[0 * BPS]);
- ref1 = _mm_loadl_epi64((const __m128i*)&ref[1 * BPS]);
- ref2 = _mm_loadl_epi64((const __m128i*)&ref[2 * BPS]);
- 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]));
- }
+ // Load eight bytes/pixels per line.
+ ref0 = _mm_loadl_epi64((const __m128i*)&ref[0 * BPS]);
+ ref1 = _mm_loadl_epi64((const __m128i*)&ref[1 * BPS]);
+ ref2 = _mm_loadl_epi64((const __m128i*)&ref[2 * BPS]);
+ ref3 = _mm_loadl_epi64((const __m128i*)&ref[3 * BPS]);
// Convert to 16b.
ref0 = _mm_unpacklo_epi8(ref0, zero);
ref1 = _mm_unpacklo_epi8(ref1, zero);
@@ -176,20 +307,21 @@ static void ITransform_SSE2(const uint8_t* ref, const int16_t* in, uint8_t* dst,
ref1 = _mm_packus_epi16(ref1, ref1);
ref2 = _mm_packus_epi16(ref2, ref2);
ref3 = _mm_packus_epi16(ref3, ref3);
- // Store the results.
- if (do_two) {
- // Store eight bytes/pixels per line.
- _mm_storel_epi64((__m128i*)&dst[0 * BPS], ref0);
- _mm_storel_epi64((__m128i*)&dst[1 * BPS], ref1);
- _mm_storel_epi64((__m128i*)&dst[2 * BPS], ref2);
- _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));
- }
+ // Store eight bytes/pixels per line.
+ _mm_storel_epi64((__m128i*)&dst[0 * BPS], ref0);
+ _mm_storel_epi64((__m128i*)&dst[1 * BPS], ref1);
+ _mm_storel_epi64((__m128i*)&dst[2 * BPS], ref2);
+ _mm_storel_epi64((__m128i*)&dst[3 * BPS], ref3);
+ }
+}
+
+// Does one or two inverse transforms.
+static void ITransform_SSE2(const uint8_t* ref, const int16_t* in, uint8_t* dst,
+ int do_two) {
+ if (do_two) {
+ ITransform_Two_SSE2(ref, in, dst);
+ } else {
+ ITransform_One_SSE2(ref, in, dst);
}
}
@@ -481,7 +613,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 +621,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 +672,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 +681,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 +854,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 +892,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 +914,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 +939,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 +962,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 +1008,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..c9232ff 100644
--- a/src/3rdparty/libwebp/src/dsp/filters.c
+++ b/src/3rdparty/libwebp/src/dsp/filters.c
@@ -19,14 +19,16 @@
//------------------------------------------------------------------------------
// Helpful macro.
-# define SANITY_CHECK(in, out) \
- assert((in) != NULL); \
- assert((out) != NULL); \
- assert(width > 0); \
- assert(height > 0); \
- assert(stride >= width); \
- assert(row >= 0 && num_rows > 0 && row + num_rows <= height); \
- (void)height; // Silence unused warning.
+#define DCHECK(in, out) \
+ do { \
+ assert((in) != NULL); \
+ assert((out) != NULL); \
+ assert(width > 0); \
+ assert(height > 0); \
+ assert(stride >= width); \
+ assert(row >= 0 && num_rows > 0 && row + num_rows <= height); \
+ (void)height; /* Silence unused warning. */ \
+ } while (0)
#if !WEBP_NEON_OMIT_C_CODE
static WEBP_INLINE void PredictLine_C(const uint8_t* src, const uint8_t* pred,
@@ -49,7 +51,7 @@ static WEBP_INLINE void DoHorizontalFilter_C(const uint8_t* in,
const uint8_t* preds;
const size_t start_offset = row * stride;
const int last_row = row + num_rows;
- SANITY_CHECK(in, out);
+ DCHECK(in, out);
in += start_offset;
out += start_offset;
preds = inverse ? out : in;
@@ -86,7 +88,7 @@ static WEBP_INLINE void DoVerticalFilter_C(const uint8_t* in,
const uint8_t* preds;
const size_t start_offset = row * stride;
const int last_row = row + num_rows;
- SANITY_CHECK(in, out);
+ DCHECK(in, out);
in += start_offset;
out += start_offset;
preds = inverse ? out : in;
@@ -131,7 +133,7 @@ static WEBP_INLINE void DoGradientFilter_C(const uint8_t* in,
const uint8_t* preds;
const size_t start_offset = row * stride;
const int last_row = row + num_rows;
- SANITY_CHECK(in, out);
+ DCHECK(in, out);
in += start_offset;
out += start_offset;
preds = inverse ? out : in;
@@ -165,7 +167,7 @@ static WEBP_INLINE void DoGradientFilter_C(const uint8_t* in,
}
#endif // !WEBP_NEON_OMIT_C_CODE
-#undef SANITY_CHECK
+#undef DCHECK
//------------------------------------------------------------------------------
@@ -189,6 +191,12 @@ static void GradientFilter_C(const uint8_t* data, int width, int height,
//------------------------------------------------------------------------------
+static void NoneUnfilter_C(const uint8_t* prev, const uint8_t* in,
+ uint8_t* out, int width) {
+ (void)prev;
+ if (out != in) memcpy(out, in, width * sizeof(*out));
+}
+
static void HorizontalUnfilter_C(const uint8_t* prev, const uint8_t* in,
uint8_t* out, int width) {
uint8_t pred = (prev == NULL) ? 0 : prev[0];
@@ -233,13 +241,14 @@ static void GradientUnfilter_C(const uint8_t* prev, const uint8_t* in,
WebPFilterFunc WebPFilters[WEBP_FILTER_LAST];
WebPUnfilterFunc WebPUnfilters[WEBP_FILTER_LAST];
+extern VP8CPUInfo VP8GetCPUInfo;
extern void VP8FiltersInitMIPSdspR2(void);
extern void VP8FiltersInitMSA(void);
extern void VP8FiltersInitNEON(void);
extern void VP8FiltersInitSSE2(void);
WEBP_DSP_INIT_FUNC(VP8FiltersInit) {
- WebPUnfilters[WEBP_FILTER_NONE] = NULL;
+ WebPUnfilters[WEBP_FILTER_NONE] = NoneUnfilter_C;
#if !WEBP_NEON_OMIT_C_CODE
WebPUnfilters[WEBP_FILTER_HORIZONTAL] = HorizontalUnfilter_C;
WebPUnfilters[WEBP_FILTER_VERTICAL] = VerticalUnfilter_C;
@@ -254,7 +263,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,13 +280,14 @@ 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();
}
#endif
+ assert(WebPUnfilters[WEBP_FILTER_NONE] != NULL);
assert(WebPUnfilters[WEBP_FILTER_HORIZONTAL] != NULL);
assert(WebPUnfilters[WEBP_FILTER_VERTICAL] != NULL);
assert(WebPUnfilters[WEBP_FILTER_GRADIENT] != NULL);
diff --git a/src/3rdparty/libwebp/src/dsp/filters_mips_dsp_r2.c b/src/3rdparty/libwebp/src/dsp/filters_mips_dsp_r2.c
index 9382b12..eca866f 100644
--- a/src/3rdparty/libwebp/src/dsp/filters_mips_dsp_r2.c
+++ b/src/3rdparty/libwebp/src/dsp/filters_mips_dsp_r2.c
@@ -24,14 +24,16 @@
//------------------------------------------------------------------------------
// Helpful macro.
-# define SANITY_CHECK(in, out) \
- assert(in != NULL); \
- assert(out != NULL); \
- assert(width > 0); \
- assert(height > 0); \
- assert(stride >= width); \
- assert(row >= 0 && num_rows > 0 && row + num_rows <= height); \
- (void)height; // Silence unused warning.
+#define DCHECK(in, out) \
+ do { \
+ assert(in != NULL); \
+ assert(out != NULL); \
+ assert(width > 0); \
+ assert(height > 0); \
+ assert(stride >= width); \
+ assert(row >= 0 && num_rows > 0 && row + num_rows <= height); \
+ (void)height; /* Silence unused warning. */ \
+ } while (0)
#define DO_PREDICT_LINE(SRC, DST, LENGTH, INVERSE) do { \
const uint8_t* psrc = (uint8_t*)(SRC); \
@@ -200,7 +202,7 @@ static WEBP_INLINE void DoHorizontalFilter_MIPSdspR2(const uint8_t* in,
const uint8_t* preds;
const size_t start_offset = row * stride;
const int last_row = row + num_rows;
- SANITY_CHECK(in, out);
+ DCHECK(in, out);
in += start_offset;
out += start_offset;
preds = in;
@@ -248,7 +250,7 @@ static WEBP_INLINE void DoVerticalFilter_MIPSdspR2(const uint8_t* in,
const uint8_t* preds;
const size_t start_offset = row * stride;
const int last_row = row + num_rows;
- SANITY_CHECK(in, out);
+ DCHECK(in, out);
in += start_offset;
out += start_offset;
preds = in;
@@ -316,7 +318,7 @@ static void DoGradientFilter_MIPSdspR2(const uint8_t* in,
const uint8_t* preds;
const size_t start_offset = row * stride;
const int last_row = row + num_rows;
- SANITY_CHECK(in, out);
+ DCHECK(in, out);
in += start_offset;
out += start_offset;
preds = in;
@@ -378,7 +380,7 @@ static void GradientUnfilter_MIPSdspR2(const uint8_t* prev, const uint8_t* in,
#undef DO_PREDICT_LINE_VERTICAL
#undef PREDICT_LINE_ONE_PASS
#undef DO_PREDICT_LINE
-#undef SANITY_CHECK
+#undef DCHECK
//------------------------------------------------------------------------------
// Entry point
diff --git a/src/3rdparty/libwebp/src/dsp/filters_msa.c b/src/3rdparty/libwebp/src/dsp/filters_msa.c
index 14c437d..33a1b20 100644
--- a/src/3rdparty/libwebp/src/dsp/filters_msa.c
+++ b/src/3rdparty/libwebp/src/dsp/filters_msa.c
@@ -56,12 +56,14 @@ static WEBP_INLINE void PredictLineInverse0(const uint8_t* src,
//------------------------------------------------------------------------------
// Helpful macro.
-#define SANITY_CHECK(in, out) \
- assert(in != NULL); \
- assert(out != NULL); \
- assert(width > 0); \
- assert(height > 0); \
- assert(stride >= width);
+#define DCHECK(in, out) \
+ do { \
+ assert(in != NULL); \
+ assert(out != NULL); \
+ assert(width > 0); \
+ assert(height > 0); \
+ assert(stride >= width); \
+ } while (0)
//------------------------------------------------------------------------------
// Horrizontal filter
@@ -72,7 +74,7 @@ static void HorizontalFilter_MSA(const uint8_t* data, int width, int height,
const uint8_t* in = data;
uint8_t* out = filtered_data;
int row = 1;
- SANITY_CHECK(in, out);
+ DCHECK(in, out);
// Leftmost pixel is the same as input for topmost scanline.
out[0] = in[0];
@@ -135,7 +137,7 @@ static void GradientFilter_MSA(const uint8_t* data, int width, int height,
const uint8_t* preds = data;
uint8_t* out = filtered_data;
int row = 1;
- SANITY_CHECK(in, out);
+ DCHECK(in, out);
// left prediction for top scan-line
out[0] = in[0];
@@ -163,7 +165,7 @@ static void VerticalFilter_MSA(const uint8_t* data, int width, int height,
const uint8_t* preds = data;
uint8_t* out = filtered_data;
int row = 1;
- SANITY_CHECK(in, out);
+ DCHECK(in, out);
// Very first top-left pixel is copied.
out[0] = in[0];
@@ -182,7 +184,7 @@ static void VerticalFilter_MSA(const uint8_t* data, int width, int height,
}
}
-#undef SANITY_CHECK
+#undef DCHECK
//------------------------------------------------------------------------------
// Entry point
diff --git a/src/3rdparty/libwebp/src/dsp/filters_neon.c b/src/3rdparty/libwebp/src/dsp/filters_neon.c
index 3e6a578..b49e515 100644
--- a/src/3rdparty/libwebp/src/dsp/filters_neon.c
+++ b/src/3rdparty/libwebp/src/dsp/filters_neon.c
@@ -21,14 +21,16 @@
//------------------------------------------------------------------------------
// Helpful macros.
-# define SANITY_CHECK(in, out) \
- assert(in != NULL); \
- assert(out != NULL); \
- assert(width > 0); \
- assert(height > 0); \
- assert(stride >= width); \
- assert(row >= 0 && num_rows > 0 && row + num_rows <= height); \
- (void)height; // Silence unused warning.
+#define DCHECK(in, out) \
+ do { \
+ assert(in != NULL); \
+ assert(out != NULL); \
+ assert(width > 0); \
+ assert(height > 0); \
+ assert(stride >= width); \
+ assert(row >= 0 && num_rows > 0 && row + num_rows <= height); \
+ (void)height; /* Silence unused warning. */ \
+ } while (0)
// load eight u8 and widen to s16
#define U8_TO_S16(A) vreinterpretq_s16_u16(vmovl_u8(A))
@@ -71,7 +73,7 @@ static WEBP_INLINE void DoHorizontalFilter_NEON(const uint8_t* in,
uint8_t* out) {
const size_t start_offset = row * stride;
const int last_row = row + num_rows;
- SANITY_CHECK(in, out);
+ DCHECK(in, out);
in += start_offset;
out += start_offset;
@@ -110,7 +112,7 @@ static WEBP_INLINE void DoVerticalFilter_NEON(const uint8_t* in,
uint8_t* out) {
const size_t start_offset = row * stride;
const int last_row = row + num_rows;
- SANITY_CHECK(in, out);
+ DCHECK(in, out);
in += start_offset;
out += start_offset;
@@ -172,7 +174,7 @@ static WEBP_INLINE void DoGradientFilter_NEON(const uint8_t* in,
uint8_t* out) {
const size_t start_offset = row * stride;
const int last_row = row + num_rows;
- SANITY_CHECK(in, out);
+ DCHECK(in, out);
in += start_offset;
out += start_offset;
@@ -201,7 +203,7 @@ static void GradientFilter_NEON(const uint8_t* data, int width, int height,
filtered_data);
}
-#undef SANITY_CHECK
+#undef DCHECK
//------------------------------------------------------------------------------
// Inverse transforms
diff --git a/src/3rdparty/libwebp/src/dsp/filters_sse2.c b/src/3rdparty/libwebp/src/dsp/filters_sse2.c
index 4b3f2d0..bb4b5d5 100644
--- a/src/3rdparty/libwebp/src/dsp/filters_sse2.c
+++ b/src/3rdparty/libwebp/src/dsp/filters_sse2.c
@@ -23,14 +23,16 @@
//------------------------------------------------------------------------------
// Helpful macro.
-# define SANITY_CHECK(in, out) \
- assert((in) != NULL); \
- assert((out) != NULL); \
- assert(width > 0); \
- assert(height > 0); \
- assert(stride >= width); \
- assert(row >= 0 && num_rows > 0 && row + num_rows <= height); \
- (void)height; // Silence unused warning.
+#define DCHECK(in, out) \
+ do { \
+ assert((in) != NULL); \
+ assert((out) != NULL); \
+ assert(width > 0); \
+ assert(height > 0); \
+ assert(stride >= width); \
+ assert(row >= 0 && num_rows > 0 && row + num_rows <= height); \
+ (void)height; /* Silence unused warning. */ \
+ } while (0)
static void PredictLineTop_SSE2(const uint8_t* src, const uint8_t* pred,
uint8_t* dst, int length) {
@@ -78,7 +80,7 @@ static WEBP_INLINE void DoHorizontalFilter_SSE2(const uint8_t* in,
uint8_t* out) {
const size_t start_offset = row * stride;
const int last_row = row + num_rows;
- SANITY_CHECK(in, out);
+ DCHECK(in, out);
in += start_offset;
out += start_offset;
@@ -111,7 +113,7 @@ static WEBP_INLINE void DoVerticalFilter_SSE2(const uint8_t* in,
uint8_t* out) {
const size_t start_offset = row * stride;
const int last_row = row + num_rows;
- SANITY_CHECK(in, out);
+ DCHECK(in, out);
in += start_offset;
out += start_offset;
@@ -174,7 +176,7 @@ static WEBP_INLINE void DoGradientFilter_SSE2(const uint8_t* in,
uint8_t* out) {
const size_t start_offset = row * stride;
const int last_row = row + num_rows;
- SANITY_CHECK(in, out);
+ DCHECK(in, out);
in += start_offset;
out += start_offset;
@@ -197,7 +199,7 @@ static WEBP_INLINE void DoGradientFilter_SSE2(const uint8_t* in,
}
}
-#undef SANITY_CHECK
+#undef DCHECK
//------------------------------------------------------------------------------
@@ -320,7 +322,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 aad5f43..9f81209 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,
@@ -107,63 +107,77 @@ 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;
}
@@ -182,18 +196,18 @@ static void PredictorAdd1_C(const uint32_t* in, const uint32_t* upper,
out[i] = left = VP8LAddPixels(in[i], left);
}
}
-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)
//------------------------------------------------------------------------------
@@ -279,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);
}
@@ -381,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:
@@ -562,7 +576,6 @@ VP8LPredictorFunc VP8LPredictors[16];
// exposed plain-C implementations
VP8LPredictorAddSubFunc VP8LPredictorsAdd_C[16];
-VP8LPredictorFunc VP8LPredictors_C[16];
VP8LTransformColorInverseFunc VP8LTransformColorInverse;
@@ -575,7 +588,9 @@ VP8LConvertFunc VP8LConvertBGRAToBGR;
VP8LMapARGBFunc VP8LMapColor32b;
VP8LMapAlphaFunc VP8LMapColor8b;
+extern VP8CPUInfo VP8GetCPUInfo;
extern void VP8LDspInitSSE2(void);
+extern void VP8LDspInitSSE41(void);
extern void VP8LDspInitNEON(void);
extern void VP8LDspInitMIPSdspR2(void);
extern void VP8LDspInitMSA(void);
@@ -600,8 +615,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)
@@ -623,9 +637,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)
@@ -640,7 +659,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..0bf10a1 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 uint32_t (*VP8LCostFunc)(const uint32_t* population, int length);
+typedef uint32_t (*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 9c2ebe6..d6139b2 100644
--- a/src/3rdparty/libwebp/src/dsp/lossless_common.h
+++ b/src/3rdparty/libwebp/src/dsp/lossless_common.h
@@ -16,9 +16,9 @@
#ifndef WEBP_DSP_LOSSLESS_COMMON_H_
#define WEBP_DSP_LOSSLESS_COMMON_H_
-#include "src/webp/types.h"
-
+#include "src/dsp/cpu.h"
#include "src/utils/utils.h"
+#include "src/webp/types.h"
#ifdef __cplusplus
extern "C" {
@@ -166,7 +166,7 @@ uint32_t VP8LSubPixels(uint32_t a, uint32_t b) {
}
//------------------------------------------------------------------------------
-// Transform-related functions use din both encoding and decoding.
+// Transform-related functions used in both encoding and decoding.
// Macros used to create a batch predictor that iteratively uses a
// one-pixel predictor.
@@ -179,24 +179,11 @@ static void PREDICTOR_ADD(const uint32_t* in, const uint32_t* upper, \
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; \
- assert(upper != NULL); \
- 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..997d56c 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,20 +636,25 @@ void VP8LBundleColorMap_C(const uint8_t* const row, int width, int xbits,
//------------------------------------------------------------------------------
-static double ExtraCost_C(const uint32_t* population, int length) {
+static uint32_t ExtraCost_C(const uint32_t* population, int length) {
int i;
- double cost = 0.;
- for (i = 2; i < length - 2; ++i) cost += (i >> 1) * population[i + 2];
+ uint32_t cost = population[4] + population[5];
+ assert(length % 2 == 0);
+ for (i = 2; i < length / 2 - 1; ++i) {
+ cost += i * (population[2 * i + 2] + population[2 * i + 3]);
+ }
return cost;
}
-static double ExtraCostCombined_C(const uint32_t* X, const uint32_t* Y,
- int length) {
+static uint32_t ExtraCostCombined_C(const uint32_t* X, const uint32_t* Y,
+ int length) {
int i;
- double cost = 0.;
- for (i = 2; i < length - 2; ++i) {
- const int xy = X[i + 2] + Y[i + 2];
- cost += (i >> 1) * xy;
+ uint32_t cost = X[4] + Y[4] + X[5] + Y[5];
+ assert(length % 2 == 0);
+ for (i = 2; i < length / 2 - 1; ++i) {
+ const int xy0 = X[2 * i + 2] + Y[2 * i + 2];
+ const int xy1 = X[2 * i + 3] + Y[2 * i + 3];
+ cost += i * (xy0 + xy1);
}
return cost;
}
@@ -702,140 +726,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 +740,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)
//------------------------------------------------------------------------------
@@ -891,6 +796,7 @@ VP8LBundleColorMapFunc VP8LBundleColorMap;
VP8LPredictorAddSubFunc VP8LPredictorsSub[16];
VP8LPredictorAddSubFunc VP8LPredictorsSub_C[16];
+extern VP8CPUInfo VP8GetCPUInfo;
extern void VP8LEncDspInitSSE2(void);
extern void VP8LEncDspInitSSE41(void);
extern void VP8LEncDspInitNEON(void);
@@ -962,10 +868,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 +895,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..e10f12d 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 cost;
+static uint32_t 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 ((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 cost;
+static uint32_t 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 ((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_neon.c b/src/3rdparty/libwebp/src/dsp/lossless_enc_neon.c
index 7c7b73f..e32c796 100644
--- a/src/3rdparty/libwebp/src/dsp/lossless_enc_neon.c
+++ b/src/3rdparty/libwebp/src/dsp/lossless_enc_neon.c
@@ -25,7 +25,7 @@
// vtbl?_u8 are marked unavailable for iOS arm64 with Xcode < 6.3, use
// non-standard versions there.
-#if defined(__APPLE__) && defined(__aarch64__) && \
+#if defined(__APPLE__) && WEBP_AARCH64 && \
defined(__apple_build_version__) && (__apple_build_version__< 6020037)
#define USE_VTBLQ
#endif
diff --git a/src/3rdparty/libwebp/src/dsp/lossless_enc_sse2.c b/src/3rdparty/libwebp/src/dsp/lossless_enc_sse2.c
index e676f6f..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,7 +427,7 @@ 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);
@@ -460,20 +439,22 @@ static void PredictorSub0_SSE2(const uint32_t* in, const uint32_t* upper,
(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
@@ -657,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..7ab83c2 100644
--- a/src/3rdparty/libwebp/src/dsp/lossless_enc_sse41.c
+++ b/src/3rdparty/libwebp/src/dsp/lossless_enc_sse41.c
@@ -18,8 +18,53 @@
#include <smmintrin.h>
#include "src/dsp/lossless.h"
-// For sign-extended multiplying constants, pre-shifted by 5:
-#define CST_5b(X) (((int16_t)((uint16_t)(X) << 8)) >> 5)
+//------------------------------------------------------------------------------
+// Cost operations.
+
+static WEBP_INLINE uint32_t HorizontalSum_SSE41(__m128i cost) {
+ cost = _mm_add_epi32(cost, _mm_srli_si128(cost, 8));
+ cost = _mm_add_epi32(cost, _mm_srli_si128(cost, 4));
+ return _mm_cvtsi128_si32(cost);
+}
+
+static uint32_t ExtraCost_SSE41(const uint32_t* const a, int length) {
+ int i;
+ __m128i cost = _mm_set_epi32(2 * a[7], 2 * a[6], a[5], a[4]);
+ assert(length % 8 == 0);
+
+ for (i = 8; i + 8 <= length; i += 8) {
+ const int j = (i - 2) >> 1;
+ const __m128i a0 = _mm_loadu_si128((const __m128i*)&a[i]);
+ const __m128i a1 = _mm_loadu_si128((const __m128i*)&a[i + 4]);
+ const __m128i w = _mm_set_epi32(j + 3, j + 2, j + 1, j);
+ const __m128i a2 = _mm_hadd_epi32(a0, a1);
+ const __m128i mul = _mm_mullo_epi32(a2, w);
+ cost = _mm_add_epi32(mul, cost);
+ }
+ return HorizontalSum_SSE41(cost);
+}
+
+static uint32_t ExtraCostCombined_SSE41(const uint32_t* const a,
+ const uint32_t* const b, int length) {
+ int i;
+ __m128i cost = _mm_add_epi32(_mm_set_epi32(2 * a[7], 2 * a[6], a[5], a[4]),
+ _mm_set_epi32(2 * b[7], 2 * b[6], b[5], b[4]));
+ assert(length % 8 == 0);
+
+ for (i = 8; i + 8 <= length; i += 8) {
+ const int j = (i - 2) >> 1;
+ const __m128i a0 = _mm_loadu_si128((const __m128i*)&a[i]);
+ const __m128i a1 = _mm_loadu_si128((const __m128i*)&a[i + 4]);
+ const __m128i b0 = _mm_loadu_si128((const __m128i*)&b[i]);
+ const __m128i b1 = _mm_loadu_si128((const __m128i*)&b[i + 4]);
+ const __m128i w = _mm_set_epi32(j + 3, j + 2, j + 1, j);
+ const __m128i a2 = _mm_hadd_epi32(a0, a1);
+ const __m128i b2 = _mm_hadd_epi32(b0, b1);
+ const __m128i mul = _mm_mullo_epi32(_mm_add_epi32(a2, b2), w);
+ cost = _mm_add_epi32(mul, cost);
+ }
+ return HorizontalSum_SSE41(cost);
+}
//------------------------------------------------------------------------------
// Subtract-Green Transform
@@ -44,46 +89,50 @@ static void SubtractGreenFromBlueAndRed_SSE41(uint32_t* argb_data,
//------------------------------------------------------------------------------
// Color Transform
-#define SPAN 8
+// For sign-extended multiplying constants, pre-shifted by 5:
+#define CST_5b(X) (((int16_t)((uint16_t)(X) << 8)) >> 5)
+
+#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 +144,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,12 +183,16 @@ static void CollectColorRedTransforms_SSE41(const uint32_t* argb, int stride,
}
}
+#undef MK_CST_16
+
//------------------------------------------------------------------------------
// Entry point
extern void VP8LEncDspInitSSE41(void);
WEBP_TSAN_IGNORE_FUNCTION void VP8LEncDspInitSSE41(void) {
+ VP8LExtraCost = ExtraCost_SSE41;
+ VP8LExtraCostCombined = ExtraCostCombined_SSE41;
VP8LSubtractGreenFromBlueAndRed = SubtractGreenFromBlueAndRed_SSE41;
VP8LCollectColorBlueTransforms = CollectColorBlueTransforms_SSE41;
VP8LCollectColorRedTransforms = CollectColorRedTransforms_SSE41;
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..e9960db 100644
--- a/src/3rdparty/libwebp/src/dsp/lossless_neon.c
+++ b/src/3rdparty/libwebp/src/dsp/lossless_neon.c
@@ -146,9 +146,9 @@ static void ConvertBGRAToRGB_NEON(const uint32_t* src,
#define LOAD_U32P_AS_U8(IN) vreinterpret_u8_u32(vld1_u32((IN)))
#define LOADQ_U32_AS_U8(IN) vreinterpretq_u8_u32(vdupq_n_u32((IN)))
#define LOADQ_U32P_AS_U8(IN) vreinterpretq_u8_u32(vld1q_u32((IN)))
-#define GET_U8_AS_U32(IN) vget_lane_u32(vreinterpret_u32_u8((IN)), 0);
-#define GETQ_U8_AS_U32(IN) vgetq_lane_u32(vreinterpretq_u32_u8((IN)), 0);
-#define STOREQ_U8_AS_U32P(OUT, IN) vst1q_u32((OUT), vreinterpretq_u32_u8((IN)));
+#define GET_U8_AS_U32(IN) vget_lane_u32(vreinterpret_u32_u8((IN)), 0)
+#define GETQ_U8_AS_U32(IN) vgetq_lane_u32(vreinterpretq_u32_u8((IN)), 0)
+#define STOREQ_U8_AS_U32P(OUT, IN) vst1q_u32((OUT), vreinterpretq_u32_u8((IN)))
#define ROTATE32_LEFT(L) vextq_u8((L), (L), 12) // D|C|B|A -> C|B|A|D
static WEBP_INLINE uint8x8_t Average2_u8_NEON(uint32_t a0, uint32_t a1) {
@@ -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.
@@ -494,7 +498,7 @@ static void PredictorAdd13_NEON(const uint32_t* in, const uint32_t* upper,
// vtbl?_u8 are marked unavailable for iOS arm64 with Xcode < 6.3, use
// non-standard versions there.
-#if defined(__APPLE__) && defined(__aarch64__) && \
+#if defined(__APPLE__) && WEBP_AARCH64 && \
defined(__apple_build_version__) && (__apple_build_version__< 6020037)
#define USE_VTBLQ
#endif
diff --git a/src/3rdparty/libwebp/src/dsp/lossless_sse2.c b/src/3rdparty/libwebp/src/dsp/lossless_sse2.c
index aef0cee..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,7 +188,7 @@ 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);
@@ -200,7 +204,7 @@ static void PredictorAdd0_SSE2(const uint32_t* in, const uint32_t* upper,
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]);
@@ -277,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 { \
@@ -295,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]);
@@ -328,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 { \
@@ -343,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]);
@@ -376,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 { \
@@ -394,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.
@@ -460,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
@@ -524,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) {
@@ -553,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) {
@@ -588,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/mips_macro.h b/src/3rdparty/libwebp/src/dsp/mips_macro.h
index 44aba9b..e810d3d 100644
--- a/src/3rdparty/libwebp/src/dsp/mips_macro.h
+++ b/src/3rdparty/libwebp/src/dsp/mips_macro.h
@@ -45,28 +45,38 @@
"ulw %[" #O2 "], " #I3 "+" XSTR(I9) "*" #I7 "(%[" #I0 "]) \n\t" \
"ulw %[" #O3 "], " #I4 "+" XSTR(I9) "*" #I8 "(%[" #I0 "]) \n\t"
+
+// O - output
+// I - input (macro doesn't change it so it should be different from I)
+#define MUL_SHIFT_C1(O, I) \
+ "mul %[" #O "], %[" #I "], %[kC1] \n\t" \
+ "sra %[" #O "], %[" #O "], 16 \n\t" \
+ "addu %[" #O "], %[" #O "], %[" #I "] \n\t"
+#define MUL_SHIFT_C2(O, I) \
+ "mul %[" #O "], %[" #I "], %[kC2] \n\t" \
+ "sra %[" #O "], %[" #O "], 16 \n\t"
+
+// Same as #define MUL_SHIFT_C1 but I and O are the same. It stores the
+// intermediary result in TMP.
+#define MUL_SHIFT_C1_IO(IO, TMP) \
+ "mul %[" #TMP "], %[" #IO "], %[kC1] \n\t" \
+ "sra %[" #TMP "], %[" #TMP "], 16 \n\t" \
+ "addu %[" #IO "], %[" #TMP "], %[" #IO "] \n\t"
+
// O - output
// IO - input/output
// I - input (macro doesn't change it)
#define MUL_SHIFT_SUM(O0, O1, O2, O3, O4, O5, O6, O7, \
IO0, IO1, IO2, IO3, \
I0, I1, I2, I3, I4, I5, I6, I7) \
- "mul %[" #O0 "], %[" #I0 "], %[kC2] \n\t" \
- "mul %[" #O1 "], %[" #I0 "], %[kC1] \n\t" \
- "mul %[" #O2 "], %[" #I1 "], %[kC2] \n\t" \
- "mul %[" #O3 "], %[" #I1 "], %[kC1] \n\t" \
- "mul %[" #O4 "], %[" #I2 "], %[kC2] \n\t" \
- "mul %[" #O5 "], %[" #I2 "], %[kC1] \n\t" \
- "mul %[" #O6 "], %[" #I3 "], %[kC2] \n\t" \
- "mul %[" #O7 "], %[" #I3 "], %[kC1] \n\t" \
- "sra %[" #O0 "], %[" #O0 "], 16 \n\t" \
- "sra %[" #O1 "], %[" #O1 "], 16 \n\t" \
- "sra %[" #O2 "], %[" #O2 "], 16 \n\t" \
- "sra %[" #O3 "], %[" #O3 "], 16 \n\t" \
- "sra %[" #O4 "], %[" #O4 "], 16 \n\t" \
- "sra %[" #O5 "], %[" #O5 "], 16 \n\t" \
- "sra %[" #O6 "], %[" #O6 "], 16 \n\t" \
- "sra %[" #O7 "], %[" #O7 "], 16 \n\t" \
+ MUL_SHIFT_C2(O0, I0) \
+ MUL_SHIFT_C1(O1, I0) \
+ MUL_SHIFT_C2(O2, I1) \
+ MUL_SHIFT_C1(O3, I1) \
+ MUL_SHIFT_C2(O4, I2) \
+ MUL_SHIFT_C1(O5, I2) \
+ MUL_SHIFT_C2(O6, I3) \
+ MUL_SHIFT_C1(O7, I3) \
"addu %[" #IO0 "], %[" #IO0 "], %[" #I4 "] \n\t" \
"addu %[" #IO1 "], %[" #IO1 "], %[" #I5 "] \n\t" \
"subu %[" #IO2 "], %[" #IO2 "], %[" #I6 "] \n\t" \
diff --git a/src/3rdparty/libwebp/src/dsp/msa_macro.h b/src/3rdparty/libwebp/src/dsp/msa_macro.h
index de026a1..90adbbc 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>
@@ -69,27 +73,25 @@
#define ST_UW(...) ST_W(v4u32, __VA_ARGS__)
#define ST_SW(...) ST_W(v4i32, __VA_ARGS__)
-#define MSA_LOAD_FUNC(TYPE, INSTR, FUNC_NAME) \
- static inline TYPE FUNC_NAME(const void* const psrc) { \
- const uint8_t* const psrc_m = (const uint8_t*)psrc; \
- TYPE val_m; \
- asm volatile ( \
- "" #INSTR " %[val_m], %[psrc_m] \n\t" \
- : [val_m] "=r" (val_m) \
- : [psrc_m] "m" (*psrc_m)); \
- return val_m; \
+#define MSA_LOAD_FUNC(TYPE, INSTR, FUNC_NAME) \
+ static inline TYPE FUNC_NAME(const void* const psrc) { \
+ const uint8_t* const psrc_m = (const uint8_t*)psrc; \
+ TYPE val_m; \
+ __asm__ volatile("" #INSTR " %[val_m], %[psrc_m] \n\t" \
+ : [val_m] "=r"(val_m) \
+ : [psrc_m] "m"(*psrc_m)); \
+ return val_m; \
}
#define MSA_LOAD(psrc, FUNC_NAME) FUNC_NAME(psrc)
-#define MSA_STORE_FUNC(TYPE, INSTR, FUNC_NAME) \
- static inline void FUNC_NAME(TYPE val, void* const pdst) { \
- uint8_t* const pdst_m = (uint8_t*)pdst; \
- TYPE val_m = val; \
- asm volatile ( \
- " " #INSTR " %[val_m], %[pdst_m] \n\t" \
- : [pdst_m] "=m" (*pdst_m) \
- : [val_m] "r" (val_m)); \
+#define MSA_STORE_FUNC(TYPE, INSTR, FUNC_NAME) \
+ static inline void FUNC_NAME(TYPE val, void* const pdst) { \
+ uint8_t* const pdst_m = (uint8_t*)pdst; \
+ TYPE val_m = val; \
+ __asm__ volatile(" " #INSTR " %[val_m], %[pdst_m] \n\t" \
+ : [pdst_m] "=m"(*pdst_m) \
+ : [val_m] "r"(val_m)); \
}
#define MSA_STORE(val, pdst, FUNC_NAME) FUNC_NAME(val, pdst)
@@ -1389,4 +1391,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..14acb40 100644
--- a/src/3rdparty/libwebp/src/dsp/neon.h
+++ b/src/3rdparty/libwebp/src/dsp/neon.h
@@ -12,14 +12,16 @@
#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.
-#if LOCAL_CLANG_PREREQ(3,8) || LOCAL_GCC_PREREQ(4,9) || defined(__aarch64__)
+#if LOCAL_CLANG_PREREQ(3, 8) || LOCAL_GCC_PREREQ(4, 9) || WEBP_AARCH64
#define WEBP_USE_INTRINSICS // use intrinsics when possible
#endif
@@ -44,7 +46,7 @@
// if using intrinsics, this flag avoids some functions that make gcc-4.6.3
// crash ("internal compiler error: in immed_double_const, at emit-rtl.").
// (probably similar to gcc.gnu.org/bugzilla/show_bug.cgi?id=48183)
-#if !(LOCAL_CLANG_PREREQ(3,8) || LOCAL_GCC_PREREQ(4,8) || defined(__aarch64__))
+#if !(LOCAL_CLANG_PREREQ(3, 8) || LOCAL_GCC_PREREQ(4, 8) || WEBP_AARCH64)
#define WORK_AROUND_GCC
#endif
@@ -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..dcbc11c 100644
--- a/src/3rdparty/libwebp/src/dsp/quant.h
+++ b/src/3rdparty/libwebp/src/dsp/quant.h
@@ -21,18 +21,24 @@
#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 WEBP_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,
int thresh) {
const int16x8_t tst_ones = vdupq_n_s16(-1);
uint32x4_t sum = vdupq_n_u32(0);
+ int i;
- for (int i = 0; i < num_blocks; ++i) {
+ for (i = 0; i < num_blocks; ++i) {
// Set DC to zero.
const int16x8_t a_0 = vsetq_lane_s16(0, vld1q_s16(levels), 0);
const int16x8_t a_1 = vld1q_s16(levels + 8);
@@ -45,7 +51,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..325d8be 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;
}
}
@@ -196,6 +197,7 @@ WebPRescalerImportRowFunc WebPRescalerImportRowShrink;
WebPRescalerExportRowFunc WebPRescalerExportRowExpand;
WebPRescalerExportRowFunc WebPRescalerExportRowShrink;
+extern VP8CPUInfo VP8GetCPUInfo;
extern void WebPRescalerDspInitSSE2(void);
extern void WebPRescalerDspInitMIPS32(void);
extern void WebPRescalerDspInitMIPSdspR2(void);
@@ -213,7 +215,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 +237,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_neon.c b/src/3rdparty/libwebp/src/dsp/rescaler_neon.c
index b976a85..957a92d 100644
--- a/src/3rdparty/libwebp/src/dsp/rescaler_neon.c
+++ b/src/3rdparty/libwebp/src/dsp/rescaler_neon.c
@@ -32,7 +32,7 @@
#define STORE_32x8(SRC0, SRC1, DST) do { \
vst1q_u32((DST) + 0, SRC0); \
vst1q_u32((DST) + 4, SRC1); \
-} while (0);
+} while (0)
#if (WEBP_RESCALER_RFIX == 32)
#define MAKE_HALF_CST(C) vdupq_n_s32((int32_t)((C) >> 1))
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..9a1341e 100644
--- a/src/3rdparty/libwebp/src/dsp/ssim.c
+++ b/src/3rdparty/libwebp/src/dsp/ssim.c
@@ -137,6 +137,7 @@ VP8SSIMGetClippedFunc VP8SSIMGetClipped;
VP8AccumulateSSEFunc VP8AccumulateSSE;
#endif
+extern VP8CPUInfo VP8GetCPUInfo;
extern void VP8SSIMDspInitSSE2(void);
WEBP_DSP_INIT_FUNC(VP8SSIMDspInit) {
@@ -150,7 +151,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..983b9c4 100644
--- a/src/3rdparty/libwebp/src/dsp/upsampling.c
+++ b/src/3rdparty/libwebp/src/dsp/upsampling.c
@@ -215,6 +215,7 @@ static void EmptyYuv444Func(const uint8_t* y,
WebPYUV444Converter WebPYUV444Converters[MODE_LAST];
+extern VP8CPUInfo VP8GetCPUInfo;
extern void WebPInitYUV444ConvertersMIPSdspR2(void);
extern void WebPInitYUV444ConvertersSSE2(void);
extern void WebPInitYUV444ConvertersSSE41(void);
@@ -233,12 +234,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 +279,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 +301,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_neon.c b/src/3rdparty/libwebp/src/dsp/upsampling_neon.c
index 6ba71a7..bbc000c 100644
--- a/src/3rdparty/libwebp/src/dsp/upsampling_neon.c
+++ b/src/3rdparty/libwebp/src/dsp/upsampling_neon.c
@@ -111,7 +111,7 @@ static const int16_t kCoeffs1[4] = { 19077, 26149, 6419, 13320 };
vst4_u8(out, v255_r_g_b); \
} while (0)
-#if !defined(WEBP_SWAP_16BIT_CSP)
+#if (WEBP_SWAP_16BIT_CSP == 0)
#define ZIP_U8(lo, hi) vzip_u8((lo), (hi))
#else
#define ZIP_U8(lo, hi) vzip_u8((hi), (lo))
diff --git a/src/3rdparty/libwebp/src/dsp/upsampling_sse2.c b/src/3rdparty/libwebp/src/dsp/upsampling_sse2.c
index 340f1e2..77b4f72 100644
--- a/src/3rdparty/libwebp/src/dsp/upsampling_sse2.c
+++ b/src/3rdparty/libwebp/src/dsp/upsampling_sse2.c
@@ -58,7 +58,7 @@
} while (0)
// Loads 17 pixels each from rows r1 and r2 and generates 32 pixels.
-#define UPSAMPLE_32PIXELS(r1, r2, out) { \
+#define UPSAMPLE_32PIXELS(r1, r2, out) do { \
const __m128i one = _mm_set1_epi8(1); \
const __m128i a = _mm_loadu_si128((const __m128i*)&(r1)[0]); \
const __m128i b = _mm_loadu_si128((const __m128i*)&(r1)[1]); \
@@ -85,7 +85,7 @@
/* pack the alternate pixels */ \
PACK_AND_STORE(a, b, diag1, diag2, (out) + 0); /* store top */ \
PACK_AND_STORE(c, d, diag2, diag1, (out) + 2 * 32); /* store bottom */ \
-}
+} while (0)
// Turn the macro into a function for reducing code-size when non-critical
static void Upsample32Pixels_SSE2(const uint8_t r1[], const uint8_t r2[],
@@ -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); \
@@ -229,11 +229,11 @@ static void FUNC_NAME(const uint8_t* y, const uint8_t* u, const uint8_t* v, \
} \
}
-YUV444_FUNC(Yuv444ToRgba_SSE2, VP8YuvToRgba32_SSE2, WebPYuv444ToRgba_C, 4);
-YUV444_FUNC(Yuv444ToBgra_SSE2, VP8YuvToBgra32_SSE2, WebPYuv444ToBgra_C, 4);
+YUV444_FUNC(Yuv444ToRgba_SSE2, VP8YuvToRgba32_SSE2, WebPYuv444ToRgba_C, 4)
+YUV444_FUNC(Yuv444ToBgra_SSE2, VP8YuvToBgra32_SSE2, WebPYuv444ToBgra_C, 4)
#if !defined(WEBP_REDUCE_CSP)
-YUV444_FUNC(Yuv444ToRgb_SSE2, VP8YuvToRgb32_SSE2, WebPYuv444ToRgb_C, 3);
-YUV444_FUNC(Yuv444ToBgr_SSE2, VP8YuvToBgr32_SSE2, WebPYuv444ToBgr_C, 3);
+YUV444_FUNC(Yuv444ToRgb_SSE2, VP8YuvToRgb32_SSE2, WebPYuv444ToRgb_C, 3)
+YUV444_FUNC(Yuv444ToBgr_SSE2, VP8YuvToBgr32_SSE2, WebPYuv444ToBgr_C, 3)
YUV444_FUNC(Yuv444ToArgb_SSE2, VP8YuvToArgb32_SSE2, WebPYuv444ToArgb_C, 4)
YUV444_FUNC(Yuv444ToRgba4444_SSE2, VP8YuvToRgba444432_SSE2, \
WebPYuv444ToRgba4444_C, 2)
diff --git a/src/3rdparty/libwebp/src/dsp/upsampling_sse41.c b/src/3rdparty/libwebp/src/dsp/upsampling_sse41.c
index 648d456..e38c88d 100644
--- a/src/3rdparty/libwebp/src/dsp/upsampling_sse41.c
+++ b/src/3rdparty/libwebp/src/dsp/upsampling_sse41.c
@@ -60,7 +60,7 @@
} while (0)
// Loads 17 pixels each from rows r1 and r2 and generates 32 pixels.
-#define UPSAMPLE_32PIXELS(r1, r2, out) { \
+#define UPSAMPLE_32PIXELS(r1, r2, out) do { \
const __m128i one = _mm_set1_epi8(1); \
const __m128i a = _mm_loadu_si128((const __m128i*)&(r1)[0]); \
const __m128i b = _mm_loadu_si128((const __m128i*)&(r1)[1]); \
@@ -87,7 +87,7 @@
/* pack the alternate pixels */ \
PACK_AND_STORE(a, b, diag1, diag2, (out) + 0); /* store top */ \
PACK_AND_STORE(c, d, diag2, diag1, (out) + 2 * 32); /* store bottom */ \
-}
+} while (0)
// Turn the macro into a function for reducing code-size when non-critical
static void Upsample32Pixels_SSE41(const uint8_t r1[], const uint8_t r2[],
@@ -217,8 +217,8 @@ static void FUNC_NAME(const uint8_t* y, const uint8_t* u, const uint8_t* v, \
}
#if !defined(WEBP_REDUCE_CSP)
-YUV444_FUNC(Yuv444ToRgb_SSE41, VP8YuvToRgb32_SSE41, WebPYuv444ToRgb_C, 3);
-YUV444_FUNC(Yuv444ToBgr_SSE41, VP8YuvToBgr32_SSE41, WebPYuv444ToBgr_C, 3);
+YUV444_FUNC(Yuv444ToRgb_SSE41, VP8YuvToRgb32_SSE41, WebPYuv444ToRgb_C, 3)
+YUV444_FUNC(Yuv444ToBgr_SSE41, VP8YuvToBgr32_SSE41, WebPYuv444ToBgr_C, 3)
#endif // WEBP_REDUCE_CSP
WEBP_TSAN_IGNORE_FUNCTION void WebPInitYUV444ConvertersSSE41(void) {
diff --git a/src/3rdparty/libwebp/src/dsp/yuv.c b/src/3rdparty/libwebp/src/dsp/yuv.c
index 14e67fc..8a04b85 100644
--- a/src/3rdparty/libwebp/src/dsp/yuv.c
+++ b/src/3rdparty/libwebp/src/dsp/yuv.c
@@ -70,6 +70,7 @@ void WebPSamplerProcessPlane(const uint8_t* y, int y_stride,
WebPSamplerRowFunc WebPSamplers[MODE_LAST];
+extern VP8CPUInfo VP8GetCPUInfo;
extern void WebPInitSamplersSSE2(void);
extern void WebPInitSamplersSSE41(void);
extern void WebPInitSamplersMIPS32(void);
@@ -90,16 +91,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 +195,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 +204,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 +217,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..c11a261 100644
--- a/src/3rdparty/libwebp/src/enc/alpha_enc.c
+++ b/src/3rdparty/libwebp/src/enc/alpha_enc.c
@@ -13,12 +13,14 @@
#include <assert.h>
#include <stdlib.h>
+#include <string.h>
#include "src/enc/vp8i_enc.h"
#include "src/dsp/dsp.h"
#include "src/utils/filters_utils.h"
#include "src/utils/quant_levels_utils.h"
#include "src/utils/utils.h"
+#include "src/webp/encode.h"
#include "src/webp/format_constants.h"
// -----------------------------------------------------------------------------
@@ -54,7 +56,7 @@ static int EncodeLossless(const uint8_t* const data, int width, int height,
WebPConfig config;
WebPPicture picture;
- WebPPictureInit(&picture);
+ if (!WebPPictureInit(&picture)) return 0;
picture.width = width;
picture.height = height;
picture.use_argb = 1;
@@ -65,7 +67,7 @@ static int EncodeLossless(const uint8_t* const data, int width, int height,
WebPDispatchAlphaToGreen(data, width, picture.width, picture.height,
picture.argb, picture.argb_stride);
- WebPConfigInit(&config);
+ if (!WebPConfigInit(&config)) return 0;
config.lossless = 1;
// Enable exact, or it would alter RGB values of transparent alpha, which is
// normally OK but not here since we are not encoding the input image but an
@@ -82,11 +84,7 @@ static int EncodeLossless(const uint8_t* const data, int width, int height,
(use_quality_100 && effort_level == 6) ? 100 : 8.f * effort_level;
assert(config.quality >= 0 && config.quality <= 100.f);
- // TODO(urvang): Temporary fix to avoid generating images that trigger
- // 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);
WebPPictureFree(&picture);
ok = ok && !bw->error_;
if (!ok) {
@@ -140,6 +138,11 @@ static int EncodeAlphaInternal(const uint8_t* const data, int width, int height,
!reduce_levels, &tmp_bw, &result->stats);
if (ok) {
output = VP8LBitWriterFinish(&tmp_bw);
+ if (tmp_bw.error_) {
+ VP8LBitWriterWipeOut(&tmp_bw);
+ memset(&result->bw, 0, sizeof(result->bw));
+ return 0;
+ }
output_size = VP8LBitWriterNumBytes(&tmp_bw);
if (output_size > data_size) {
// compressed size is larger than source! Revert to uncompressed mode.
@@ -148,6 +151,7 @@ static int EncodeAlphaInternal(const uint8_t* const data, int width, int height,
}
} else {
VP8LBitWriterWipeOut(&tmp_bw);
+ memset(&result->bw, 0, sizeof(result->bw));
return 0;
}
}
@@ -162,7 +166,7 @@ static int EncodeAlphaInternal(const uint8_t* const data, int width, int height,
header = method | (filter << 2);
if (reduce_levels) header |= ALPHA_PREPROCESSED_LEVELS << 4;
- VP8BitWriterInit(&result->bw, ALPHA_HEADER_LEN + output_size);
+ if (!VP8BitWriterInit(&result->bw, ALPHA_HEADER_LEN + output_size)) ok = 0;
ok = ok && VP8BitWriterAppend(&result->bw, &header, ALPHA_HEADER_LEN);
ok = ok && VP8BitWriterAppend(&result->bw, output, output_size);
@@ -303,7 +307,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);
@@ -312,11 +316,11 @@ static int EncodeAlpha(VP8Encoder* const enc,
assert(filter >= WEBP_FILTER_NONE && filter <= WEBP_FILTER_FAST);
if (quality < 0 || quality > 100) {
- return 0;
+ return WebPEncodingSetError(pic, VP8_ENC_ERROR_INVALID_CONFIGURATION);
}
if (method < ALPHA_NO_COMPRESSION || method > ALPHA_LOSSLESS_COMPRESSION) {
- return 0;
+ return WebPEncodingSetError(pic, VP8_ENC_ERROR_INVALID_CONFIGURATION);
}
if (method == ALPHA_NO_COMPRESSION) {
@@ -326,7 +330,7 @@ static int EncodeAlpha(VP8Encoder* const enc,
quant_alpha = (uint8_t*)WebPSafeMalloc(1ULL, data_size);
if (quant_alpha == NULL) {
- return 0;
+ return WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
}
// Extract alpha data (width x height) from raw_data (stride x height).
@@ -346,6 +350,9 @@ static int EncodeAlpha(VP8Encoder* const enc,
ok = ApplyFiltersAndEncode(quant_alpha, width, height, data_size, method,
filter, reduce_levels, effort_level, output,
output_size, pic->stats);
+ if (!ok) {
+ WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY); // imprecise
+ }
#if !defined(WEBP_DISABLE_STATS)
if (pic->stats != NULL) { // need stats?
pic->stats->coded_size += (int)(*output_size);
@@ -361,7 +368,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 +382,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;
}
@@ -405,7 +412,7 @@ int VP8EncStartAlpha(VP8Encoder* const enc) {
WebPWorker* const worker = &enc->alpha_worker_;
// Makes sure worker is good to go.
if (!WebPGetWorkerInterface()->Reset(worker)) {
- return 0;
+ return WebPEncodingSetError(enc->pic_, VP8_ENC_ERROR_OUT_OF_MEMORY);
}
WebPGetWorkerInterface()->Launch(worker);
return 1;
diff --git a/src/3rdparty/libwebp/src/enc/analysis_enc.c b/src/3rdparty/libwebp/src/enc/analysis_enc.c
index 687757a..962eaa9 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);
@@ -530,6 +474,10 @@ int VP8EncAnalyze(VP8Encoder* const enc) {
} else { // Use only one default segment.
ResetAllMBInfo(enc);
}
+ if (!ok) {
+ return WebPEncodingSetError(enc->pic_,
+ VP8_ENC_ERROR_OUT_OF_MEMORY); // imprecise
+ }
return ok;
}
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..dc98bf1 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,12 @@ 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) {
+ return WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
+ }
+
+ 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 +334,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 +438,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 +758,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 +814,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 +843,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 +909,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 +932,134 @@ 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) {
+ return WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
+ }
+ // 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)) {
+ return WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
+ }
}
+
+ 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..01860ca 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;
}
@@ -575,7 +578,7 @@ static uint64_t OneStatPass(VP8Encoder* const enc, VP8RDLevel rd_opt,
uint64_t size = 0;
uint64_t size_p0 = 0;
uint64_t distortion = 0;
- const uint64_t pixel_count = nb_mbs * 384;
+ const uint64_t pixel_count = (uint64_t)nb_mbs * 384;
VP8IteratorInit(enc, &it);
SetLoopParams(enc, s->q);
@@ -686,7 +689,7 @@ static int PreLoopInitialize(VP8Encoder* const enc) {
}
if (!ok) {
VP8EncFreeBitWriters(enc); // malloc error occurred
- WebPEncodingSetError(enc->pic_, VP8_ENC_ERROR_OUT_OF_MEMORY);
+ return WebPEncodingSetError(enc->pic_, VP8_ENC_ERROR_OUT_OF_MEMORY);
}
return ok;
}
@@ -716,6 +719,7 @@ static int PostLoopFinalize(VP8EncIterator* const it, int ok) {
} else {
// Something bad happened -> need to do some memory cleanup.
VP8EncFreeBitWriters(enc);
+ return WebPEncodingSetError(enc->pic_, VP8_ENC_ERROR_OUT_OF_MEMORY);
}
return ok;
}
@@ -751,6 +755,11 @@ int VP8EncLoop(VP8Encoder* const enc) {
// *then* decide how to code the skip decision if there's one.
if (!VP8Decimate(&it, &info, rd_opt) || dont_use_skip) {
CodeResiduals(it.bw_, &it, &info);
+ if (it.bw_->error_) {
+ // enc->pic_->error_code is set in PostLoopFinalize().
+ ok = 0;
+ break;
+ }
} else { // reset predictors after a skip
ResetAfterSkip(&it);
}
@@ -775,11 +784,12 @@ 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_;
const VP8RDLevel rd_opt = enc->rd_opt_level_;
- const uint64_t pixel_count = enc->mb_w_ * enc->mb_h_ * 384;
+ const uint64_t pixel_count = (uint64_t)enc->mb_w_ * enc->mb_h_ * 384;
PassStats stats;
int ok;
@@ -802,6 +812,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 +842,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 +861,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 +888,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 a4e6bf3..3ca67b3 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,16 +357,18 @@ static WEBP_INLINE double GetCombinedEntropy(const uint32_t* const X,
}
// Estimates the Entropy + Huffman + other block overhead size cost.
-double VP8LHistogramEstimateBits(VP8LHistogram* const p) {
- return
- PopulationCost(p->literal_, VP8LHistogramNumCodes(p->palette_code_bits_),
- NULL, &p->is_used_[0])
- + PopulationCost(p->red_, NUM_LITERAL_CODES, NULL, &p->is_used_[1])
- + PopulationCost(p->blue_, NUM_LITERAL_CODES, NULL, &p->is_used_[2])
- + PopulationCost(p->alpha_, NUM_LITERAL_CODES, NULL, &p->is_used_[3])
- + PopulationCost(p->distance_, NUM_DISTANCE_CODES, NULL, &p->is_used_[4])
- + VP8LExtraCost(p->literal_ + NUM_LITERAL_CODES, NUM_LENGTH_CODES)
- + VP8LExtraCost(p->distance_, NUM_DISTANCE_CODES);
+float VP8LHistogramEstimateBits(VP8LHistogram* const p) {
+ return PopulationCost(p->literal_,
+ VP8LHistogramNumCodes(p->palette_code_bits_), NULL,
+ &p->is_used_[0]) +
+ PopulationCost(p->red_, NUM_LITERAL_CODES, NULL, &p->is_used_[1]) +
+ PopulationCost(p->blue_, NUM_LITERAL_CODES, NULL, &p->is_used_[2]) +
+ PopulationCost(p->alpha_, NUM_LITERAL_CODES, NULL, &p->is_used_[3]) +
+ PopulationCost(p->distance_, NUM_DISTANCE_CODES, NULL,
+ &p->is_used_[4]) +
+ (float)VP8LExtraCost(p->literal_ + NUM_LITERAL_CODES,
+ NUM_LENGTH_CODES) +
+ (float)VP8LExtraCost(p->distance_, NUM_DISTANCE_CODES);
}
// -----------------------------------------------------------------------------
@@ -372,17 +376,16 @@ 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_);
*cost += GetCombinedEntropy(a->literal_, b->literal_,
VP8LHistogramNumCodes(palette_code_bits),
a->is_used_[0], b->is_used_[0], 0);
- *cost += VP8LExtraCostCombined(a->literal_ + NUM_LITERAL_CODES,
- b->literal_ + NUM_LITERAL_CODES,
- NUM_LENGTH_CODES);
+ *cost += (float)VP8LExtraCostCombined(a->literal_ + NUM_LITERAL_CODES,
+ b->literal_ + NUM_LITERAL_CODES,
+ NUM_LENGTH_CODES);
if (*cost > cost_threshold) return 0;
if (a->trivial_symbol_ != VP8L_NON_TRIVIAL_SYM &&
@@ -416,8 +419,8 @@ static int GetCombinedHistogramEntropy(const VP8LHistogram* const a,
*cost +=
GetCombinedEntropy(a->distance_, b->distance_, NUM_DISTANCE_CODES,
a->is_used_[4], b->is_used_[4], 0);
- *cost +=
- VP8LExtraCostCombined(a->distance_, b->distance_, NUM_DISTANCE_CODES);
+ *cost += (float)VP8LExtraCostCombined(a->distance_, b->distance_,
+ NUM_DISTANCE_CODES);
if (*cost > cost_threshold) return 0;
return 1;
@@ -438,12 +441,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 +460,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 +474,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,16 +504,15 @@ 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);
+ (float)VP8LExtraCost(h->distance_, NUM_DISTANCE_CODES);
const int num_codes = VP8LHistogramNumCodes(h->palette_code_bits_);
h->literal_cost_ =
PopulationCost(h->literal_, num_codes, NULL, &h->is_used_[0]) +
- VP8LExtraCost(h->literal_ + NUM_LITERAL_CODES, NUM_LENGTH_CODES);
+ (float)VP8LExtraCost(h->literal_ + NUM_LITERAL_CODES, NUM_LENGTH_CODES);
h->red_cost_ =
PopulationCost(h->red_, NUM_LITERAL_CODES, &red_sym, &h->is_used_[1]);
h->blue_cost_ =
@@ -528,10 +527,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 +639,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 +673,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 +724,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 +780,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 +791,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 +937,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 +947,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 +1026,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 +1049,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 +1057,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 +1085,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 +1161,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);
@@ -1186,13 +1181,16 @@ int VP8LGetHistoImageSymbols(int xsize, int ysize,
const int entropy_combine_num_bins = low_effort ? NUM_PARTITIONS : BIN_SIZE;
int entropy_combine;
uint16_t* const map_tmp =
- WebPSafeMalloc(2 * image_histo_raw_size, sizeof(map_tmp));
+ 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 +1201,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 +1223,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 +1239,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 718e014..a9280e6 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
@@ -61,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);
}
//------------------------------------------------------------------------------
@@ -78,29 +85,31 @@ 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);
+extern VP8CPUInfo VP8GetCPUInfo;
-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;
@@ -112,12 +121,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;
}
@@ -125,7 +134,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
@@ -159,414 +168,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
@@ -591,8 +212,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,
@@ -818,11 +439,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
}
}
@@ -839,6 +469,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,
@@ -863,18 +495,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;
}
@@ -903,7 +535,9 @@ static int ImportYUVAFromRGBA(const uint8_t* r_ptr,
WebPInitConvertARGBToYUV();
InitGammaTables();
- if (tmp_rgb == NULL) return 0; // malloc error
+ if (tmp_rgb == NULL) {
+ return WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
+ }
// Downsample Y/U/V planes, two rows at a time
for (y = 0; y < (height >> 1); ++y) {
@@ -1044,7 +678,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
@@ -1106,6 +740,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,
@@ -1163,24 +799,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;
}
@@ -1201,9 +837,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..5a27035 100644
--- a/src/3rdparty/libwebp/src/enc/picture_enc.c
+++ b/src/3rdparty/libwebp/src/enc/picture_enc.c
@@ -12,10 +12,10 @@
// Author: Skal (pascal.massimino@gmail.com)
#include <assert.h>
+#include <limits.h>
#include <stdlib.h>
#include "src/enc/vp8i_enc.h"
-#include "src/dsp/dsp.h"
#include "src/utils/utils.h"
//------------------------------------------------------------------------------
@@ -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..ea90d82 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
@@ -133,7 +137,9 @@ int WebPPictureCrop(WebPPicture* pic,
PictureGrabSpecs(pic, &tmp);
tmp.width = width;
tmp.height = height;
- if (!WebPPictureAlloc(&tmp)) return 0;
+ if (!WebPPictureAlloc(&tmp)) {
+ return WebPEncodingSetError(pic, tmp.error_code);
+ }
if (!pic->use_argb) {
const int y_offset = top * pic->y_stride + left;
@@ -164,22 +170,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,73 +204,76 @@ 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;
+ return WebPEncodingSetError(picture, VP8_ENC_ERROR_BAD_DIMENSION);
}
- PictureGrabSpecs(pic, &tmp);
+ PictureGrabSpecs(picture, &tmp);
tmp.width = width;
tmp.height = height;
- if (!WebPPictureAlloc(&tmp)) return 0;
+ if (!WebPPictureAlloc(&tmp)) {
+ return WebPEncodingSetError(picture, tmp.error_code);
+ }
- if (!pic->use_argb) {
+ if (!picture->use_argb) {
work = (rescaler_t*)WebPSafeMalloc(2ULL * width, sizeof(*work));
if (work == NULL) {
WebPPictureFree(&tmp);
- return 0;
+ return WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
}
// 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 WebPEncodingSetError(picture, VP8_ENC_ERROR_BAD_DIMENSION);
+ }
}
// 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 WebPEncodingSetError(picture, VP8_ENC_ERROR_BAD_DIMENSION);
+ }
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) {
WebPPictureFree(&tmp);
- return 0;
+ return WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
}
// In order to correctly interpolate colors, we need to apply the alpha
// 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 WebPEncodingSetError(picture, VP8_ENC_ERROR_BAD_DIMENSION);
+ }
AlphaMultiplyARGB(&tmp, 1);
}
- WebPPictureFree(pic);
+ WebPPictureFree(picture);
WebPSafeFree(work);
- *pic = tmp;
+ *picture = tmp;
return 1;
}
@@ -273,23 +285,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..9b8f524 100644
--- a/src/3rdparty/libwebp/src/enc/syntax_enc.c
+++ b/src/3rdparty/libwebp/src/enc/syntax_enc.c
@@ -258,7 +258,10 @@ static int EmitPartitionsSize(const VP8Encoder* const enc,
buf[3 * p + 1] = (part_size >> 8) & 0xff;
buf[3 * p + 2] = (part_size >> 16) & 0xff;
}
- return p ? pic->writer(buf, 3 * p, pic) : 1;
+ if (p && !pic->writer(buf, 3 * p, pic)) {
+ return WebPEncodingSetError(pic, VP8_ENC_ERROR_BAD_WRITE);
+ }
+ return 1;
}
//------------------------------------------------------------------------------
@@ -349,7 +352,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);
}
@@ -381,6 +384,7 @@ int VP8EncWrite(VP8Encoder* const enc) {
enc->coded_size_ = (int)(CHUNK_HEADER_SIZE + riff_size);
ok = ok && WebPReportProgress(pic, final_percent, &enc->percent_);
+ if (!ok) WebPEncodingSetError(pic, VP8_ENC_ERROR_BAD_WRITE);
return ok;
}
diff --git a/src/3rdparty/libwebp/src/enc/vp8i_enc.h b/src/3rdparty/libwebp/src/enc/vp8i_enc.h
index fedcaee..00ff1be 100644
--- a/src/3rdparty/libwebp/src/enc/vp8i_enc.h
+++ b/src/3rdparty/libwebp/src/enc/vp8i_enc.h
@@ -31,7 +31,7 @@ extern "C" {
// version numbers
#define ENC_MAJ_VERSION 1
-#define ENC_MIN_VERSION 1
+#define ENC_MIN_VERSION 4
#define ENC_REV_VERSION 0
enum { MAX_LF_LEVELS = 64, // Maximum loop filter level
@@ -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..40eafa4 100644
--- a/src/3rdparty/libwebp/src/enc/vp8l_enc.c
+++ b/src/3rdparty/libwebp/src/enc/vp8l_enc.c
@@ -15,128 +15,25 @@
#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/palette.h"
#include "src/utils/utils.h"
+#include "src/webp/encode.h"
#include "src/webp/format_constants.h"
// Maximum number of histogram images (sub-blocks).
#define MAX_HUFF_IMAGE_SIZE 2600
-// Palette reordering for smaller sum of deltas (and for smaller storage).
-
-static int PaletteCompareColorsForQsort(const void* p1, const void* p2) {
- const uint32_t a = WebPMemToUint32((uint8_t*)p1);
- const uint32_t b = WebPMemToUint32((uint8_t*)p2);
- assert(a != b);
- return (a < b) ? -1 : 1;
-}
-
-static WEBP_INLINE uint32_t PaletteComponentDistance(uint32_t v) {
- return (v <= 128) ? v : (256 - v);
-}
-
-// Computes a value that is related to the entropy created by the
-// palette entry diff.
-//
-// Note that the last & 0xff is a no-operation in the next statement, but
-// removed by most compilers and is here only for regularity of the code.
-static WEBP_INLINE uint32_t PaletteColorDistance(uint32_t col1, uint32_t col2) {
- const uint32_t diff = VP8LSubPixels(col1, col2);
- const int kMoreWeightForRGBThanForAlpha = 9;
- uint32_t score;
- score = PaletteComponentDistance((diff >> 0) & 0xff);
- score += PaletteComponentDistance((diff >> 8) & 0xff);
- score += PaletteComponentDistance((diff >> 16) & 0xff);
- score *= kMoreWeightForRGBThanForAlpha;
- score += PaletteComponentDistance((diff >> 24) & 0xff);
- return score;
-}
-
-static WEBP_INLINE void SwapColor(uint32_t* const col1, uint32_t* const col2) {
- const uint32_t tmp = *col1;
- *col1 = *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;
- }
- }
- SwapColor(&palette[best_ix], &palette[i]);
- predict = palette[i];
- }
-}
-
-// The palette has been sorted by alpha. This function checks if the other
-// components of the palette have a monotonic development with regards to
-// position in the palette. If all have monotonic development, there is
-// 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) {
- uint32_t predict = 0x000000;
- int i;
- uint8_t sign_found = 0x00;
- for (i = 0; i < num_colors; ++i) {
- const uint32_t diff = VP8LSubPixels(palette[i], predict);
- const uint8_t rd = (diff >> 16) & 0xff;
- const uint8_t gd = (diff >> 8) & 0xff;
- const uint8_t bd = (diff >> 0) & 0xff;
- if (rd != 0x00) {
- sign_found |= (rd < 0x80) ? 1 : 2;
- }
- if (gd != 0x00) {
- sign_found |= (gd < 0x80) ? 8 : 16;
- }
- if (bd != 0x00) {
- sign_found |= (bd < 0x80) ? 64 : 128;
- }
- predict = palette[i];
- }
- return (sign_found & (sign_found << 1)) != 0; // two consequent signs.
-}
-
// -----------------------------------------------------------------------------
// Palette
-// 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;
- return 0;
- }
- *palette_size = num_colors;
- qsort(palette, num_colors, sizeof(*palette), PaletteCompareColorsForQsort);
- if (!low_effort && PaletteHasNonMonotonousDeltas(palette, num_colors)) {
- GreedyMinimizeDeltas(palette, num_colors);
- }
- return 1;
-}
-
// These five modes are evaluated and their respective entropy is computed.
typedef enum {
kDirect = 0,
@@ -144,7 +41,8 @@ typedef enum {
kSubGreen = 2,
kSpatialSubGreen = 3,
kPalette = 4,
- kNumEntropyIx = 5
+ kPaletteAndSpatial = 5,
+ kNumEntropyIx = 6
} EntropyIx;
typedef enum {
@@ -164,10 +62,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 +140,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 +253,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 * kPaletteSortingNum)
static int EncoderAnalyze(VP8LEncoder* const enc,
CrunchConfig crunch_configs[CRUNCH_CONFIGS_MAX],
@@ -376,11 +282,17 @@ 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_ = GetColorPalette(pic, enc->palette_sorted_);
+ use_palette = (enc->palette_size_ <= MAX_PALETTE_SIZE);
+ if (!use_palette) {
+ enc->palette_size_ = 0;
+ }
// Empirical bit sizes.
enc->histo_bits_ = GetHistoBits(method, use_palette,
@@ -390,6 +302,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 +316,68 @@ 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;
+ if (use_palette && (i == kPalette || i == kPaletteAndSpatial)) {
+ int sorting_method;
+ for (sorting_method = 0; sorting_method < kPaletteSortingNum;
+ ++sorting_method) {
+ const PaletteSorting typed_sorting_method =
+ (PaletteSorting)sorting_method;
+ // TODO(vrabaud) kSortedDefault should be tested. It is omitted
+ // for now for backward compatibility.
+ if (typed_sorting_method == kUnusedPalette ||
+ typed_sorting_method == kSortedDefault) {
+ continue;
+ }
+ crunch_configs[(*crunch_configs_size)].entropy_idx_ = i;
+ crunch_configs[(*crunch_configs_size)].palette_sorting_type_ =
+ typed_sorting_method;
+ ++*crunch_configs_size;
+ }
+ } else {
+ crunch_configs[(*crunch_configs_size)].entropy_idx_ = i;
+ 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 +393,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 +661,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 +718,52 @@ static WebPEncodingError StoreImageToBitMask(
}
VP8LRefsCursorNext(&c);
}
- return bw->error_ ? VP8_ENC_ERROR_OUT_OF_MEMORY : VP8_ENC_OK;
+ if (bw->error_) {
+ return WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
+ }
+ 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 +774,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 +791,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 +803,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,
- 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;
+ VP8LHashChain* const hash_chain, VP8LBackwardRefs refs_array[4], int width,
+ int height, int quality, int low_effort, const CrunchConfig* const config,
+ int* cache_bits, int histogram_bits, 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 +837,131 @@ 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;
}
- 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;
- } else {
- *cache_bits = 0;
+ // 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;
}
- // '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;
+
+ percent_range = remaining_percent / 5;
+ if (!VP8LHashChainFill(hash_chain, quality, argb, width, height,
+ low_effort, pic, percent_range, percent)) {
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;
- }
+ percent_start += percent_range;
+ remaining_percent -= percent_range;
- // 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;
+ // If the value is different from zero, it has been set during the palette
+ // analysis.
+ cache_bits_init = (*cache_bits == 0) ? MAX_COLOR_CACHE_BITS : *cache_bits;
+ // 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 (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 +974,84 @@ 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) {
+ WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
+ 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 +1060,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 +1146,32 @@ 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;
+ *coded_size = 0;
- err = WriteRiffHeader(pic, riff_size, vp8l_size);
- if (err != VP8_ENC_OK) goto Error;
+ if (bw->error_) {
+ return WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
+ }
- 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)) {
+ return WebPEncodingSetError(pic, VP8_ENC_ERROR_BAD_WRITE);
}
if (pad) {
const uint8_t pad_byte[1] = { 0 };
if (!pic->writer(pad_byte, 1, pic)) {
- err = VP8_ENC_ERROR_BAD_WRITE;
- goto Error;
+ return WebPEncodingSetError(pic, VP8_ENC_ERROR_BAD_WRITE);
}
}
*coded_size = CHUNK_HEADER_SIZE + riff_size;
- return VP8_ENC_OK;
-
- Error:
- return err;
+ return 1;
}
// -----------------------------------------------------------------------------
@@ -1199,36 +1187,32 @@ 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;
- const uint64_t image_size = width * height;
+static int AllocateTransformBuffer(VP8LEncoder* const enc, int width,
+ int height) {
+ const uint64_t image_size = (uint64_t)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_) *
+ ? (uint64_t)VP8LSubSampleSize(width, enc->transform_bits_) *
VP8LSubSampleSize(height, enc->transform_bits_)
: 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;
+ return WebPEncodingSetError(enc->pic_, VP8_ENC_ERROR_OUT_OF_MEMORY);
}
enc->transform_mem_ = mem;
enc->transform_mem_size_ = (size_t)mem_size;
@@ -1241,19 +1225,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 +1248,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 +1287,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 +1310,18 @@ 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) {
+ return WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
+ }
if (palette_size < APPLY_PALETTE_GREEDY_MAX) {
APPLY_PALETTE_FOR(SearchColorGreedy(palette, palette_size, pix));
@@ -1410,7 +1366,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 +1374,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 +1392,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 +1421,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 +1448,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);
}
@@ -1505,11 +1462,9 @@ typedef struct {
const WebPPicture* picture_;
VP8LBitWriter* bw_;
VP8LEncoder* enc_;
- int use_cache_;
CrunchConfig crunch_configs_[CRUNCH_CONFIGS_MAX];
int num_crunch_configs_;
int red_and_blue_always_zero_;
- WebPEncodingError err_;
WebPAuxStats* stats_;
} StreamEncodeContext;
@@ -1519,14 +1474,12 @@ static int EncodeStreamHook(void* input, void* data2) {
const WebPPicture* const picture = params->picture_;
VP8LBitWriter* const bw = params->bw_;
VP8LEncoder* const enc = params->enc_;
- const int use_cache = params->use_cache_;
const CrunchConfig* const crunch_configs = params->crunch_configs_;
const int num_crunch_configs = params->num_crunch_configs_;
const int red_and_blue_always_zero = params->red_and_blue_always_zero_;
#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 +1487,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 +1495,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 +1531,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,13 +1547,21 @@ 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 (!PaletteSort(crunch_configs[idx].palette_sorting_type_, enc->pic_,
+ enc->palette_sorted_, enc->palette_size_,
+ enc->palette_)) {
+ WebPEncodingSetError(enc->pic_, VP8_ENC_ERROR_OUT_OF_MEMORY);
+ 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)) {
+ if (enc->palette_size_ < (1 << MAX_COLOR_CACHE_BITS)) {
enc->cache_bits_ = BitsLog2Floor(enc->palette_size_) + 1;
}
}
@@ -1604,8 +1569,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 +1580,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 +1603,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, &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 +1639,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) {
VP8LEncoder* const enc_main = VP8LEncoderNew(config, picture);
VP8LEncoder* enc_side = NULL;
CrunchConfig crunch_configs[CRUNCH_CONFIGS_MAX];
@@ -1690,15 +1659,25 @@ 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)) {
+ VP8LEncoderDelete(enc_main);
+ return WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY);
+ }
+
+ // Avoid "garbage value" error from Clang's static analysis tool.
+ if (!WebPPictureInit(&picture_side)) {
+ goto Error;
+ }
+
// 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 +1706,31 @@ 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 +1739,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 +1754,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 +1764,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 +1775,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 +1789,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,15 +1808,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);
- return 0;
+ return WebPEncodingSetError(picture, VP8_ENC_ERROR_NULL_PARAMETER);
}
width = picture->width;
@@ -1843,13 +1823,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 +1845,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)) 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 +1883,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..c5b60dc 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;
@@ -86,10 +88,9 @@ int VP8LEncodeImage(const WebPConfig* const config,
const WebPPicture* const picture);
// 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);
#if (WEBP_NEAR_LOSSLESS == 1)
// in near_lossless.c
@@ -101,13 +102,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..583fe6a 100644
--- a/src/3rdparty/libwebp/src/enc/webp_enc.c
+++ b/src/3rdparty/libwebp/src/enc/webp_enc.c
@@ -307,7 +307,10 @@ int WebPEncodingSetError(const WebPPicture* const pic,
WebPEncodingError error) {
assert((int)error < VP8_ENC_ERROR_LAST);
assert((int)error >= VP8_ENC_OK);
- ((WebPPicture*)pic)->error_code = error;
+ // The oldest error reported takes precedence over the new one.
+ if (pic->error_code == VP8_ENC_OK) {
+ ((WebPPicture*)pic)->error_code = error;
+ }
return 0;
}
@@ -317,8 +320,7 @@ int WebPReportProgress(const WebPPicture* const pic,
*percent_store = percent;
if (pic->progress_hook && !pic->progress_hook(percent, pic)) {
// user abort requested
- WebPEncodingSetError(pic, VP8_ENC_ERROR_USER_ABORT);
- return 0;
+ return WebPEncodingSetError(pic, VP8_ENC_ERROR_USER_ABORT);
}
}
return 1; // ok
@@ -329,16 +331,14 @@ int WebPEncode(const WebPConfig* config, WebPPicture* pic) {
int ok = 0;
if (pic == NULL) return 0;
- WebPEncodingSetError(pic, VP8_ENC_OK); // all ok so far
+ pic->error_code = VP8_ENC_OK; // all ok so far
if (config == NULL) { // bad params
return WebPEncodingSetError(pic, VP8_ENC_ERROR_NULL_PARAMETER);
}
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 +400,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..31bd045 100644
--- a/src/3rdparty/libwebp/src/mux/anim_encode.c
+++ b/src/3rdparty/libwebp/src/mux/anim_encode.c
@@ -22,6 +22,7 @@
#include "src/webp/encode.h"
#include "src/webp/format_constants.h"
#include "src/webp/mux.h"
+#include "src/webp/types.h"
#if defined(_MSC_VER) && _MSC_VER < 1900
#define snprintf _snprintf
@@ -248,9 +249,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 +419,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);
@@ -596,16 +594,17 @@ int WebPAnimEncoderRefineRect(
int is_lossless, float quality, int* const x_offset, int* const y_offset,
int* const width, int* const height) {
FrameRectangle rect;
- const int right = clip(*x_offset + *width, 0, curr_canvas->width);
- const int left = clip(*x_offset, 0, curr_canvas->width - 1);
- const int bottom = clip(*y_offset + *height, 0, curr_canvas->height);
- const int top = clip(*y_offset, 0, curr_canvas->height - 1);
+ int right, left, bottom, top;
if (prev_canvas == NULL || curr_canvas == NULL ||
prev_canvas->width != curr_canvas->width ||
prev_canvas->height != curr_canvas->height ||
!prev_canvas->use_argb || !curr_canvas->use_argb) {
return 0;
}
+ right = clip(*x_offset + *width, 0, curr_canvas->width);
+ left = clip(*x_offset, 0, curr_canvas->width - 1);
+ bottom = clip(*y_offset + *height, 0, curr_canvas->height);
+ top = clip(*y_offset, 0, curr_canvas->height - 1);
rect.x_offset_ = left;
rect.y_offset_ = top;
rect.width_ = clip(right - left, 0, curr_canvas->width - rect.x_offset_);
@@ -949,7 +948,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 +966,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 +1358,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;
}
@@ -1393,7 +1399,10 @@ int WebPAnimEncoderAdd(WebPAnimEncoder* enc, WebPPicture* frame, int timestamp,
}
config = *encoder_config;
} else {
- WebPConfigInit(&config);
+ if (!WebPConfigInit(&config)) {
+ MarkError(enc, "Cannot Init config");
+ return 0;
+ }
config.lossless = 1;
}
assert(enc->curr_canvas_ == NULL);
@@ -1414,12 +1423,14 @@ int WebPAnimEncoderAdd(WebPAnimEncoder* enc, WebPPicture* frame, int timestamp,
// -----------------------------------------------------------------------------
// Bitstream assembly.
-static int DecodeFrameOntoCanvas(const WebPMuxFrameInfo* const frame,
- WebPPicture* const canvas) {
+WEBP_NODISCARD static int DecodeFrameOntoCanvas(
+ const WebPMuxFrameInfo* const frame, WebPPicture* const canvas) {
const WebPData* const image = &frame->bitstream;
WebPPicture sub_image;
WebPDecoderConfig config;
- WebPInitDecoderConfig(&config);
+ if (!WebPInitDecoderConfig(&config)) {
+ return 0;
+ }
WebPUtilClearPic(canvas, NULL);
if (WebPGetFeatures(image->bytes, image->size, &config.input) !=
VP8_STATUS_OK) {
@@ -1578,4 +1589,23 @@ const char* WebPAnimEncoderGetError(WebPAnimEncoder* enc) {
return enc->error_str_;
}
+WebPMuxError WebPAnimEncoderSetChunk(
+ WebPAnimEncoder* enc, const char fourcc[4], const WebPData* chunk_data,
+ int copy_data) {
+ if (enc == NULL) return WEBP_MUX_INVALID_ARGUMENT;
+ return WebPMuxSetChunk(enc->mux_, fourcc, chunk_data, copy_data);
+}
+
+WebPMuxError WebPAnimEncoderGetChunk(
+ const WebPAnimEncoder* enc, const char fourcc[4], WebPData* chunk_data) {
+ if (enc == NULL) return WEBP_MUX_INVALID_ARGUMENT;
+ return WebPMuxGetChunk(enc->mux_, fourcc, chunk_data);
+}
+
+WebPMuxError WebPAnimEncoderDeleteChunk(
+ WebPAnimEncoder* enc, const char fourcc[4]) {
+ if (enc == NULL) return WEBP_MUX_INVALID_ARGUMENT;
+ return WebPMuxDeleteChunk(enc->mux_, fourcc);
+}
+
// -----------------------------------------------------------------------------
diff --git a/src/3rdparty/libwebp/src/mux/muxedit.c b/src/3rdparty/libwebp/src/mux/muxedit.c
index ccf14b2..48c6834 100644
--- a/src/3rdparty/libwebp/src/mux/muxedit.c
+++ b/src/3rdparty/libwebp/src/mux/muxedit.c
@@ -66,13 +66,16 @@ void WebPMuxDelete(WebPMux* mux) {
// Handy MACRO, makes MuxSet() very symmetric to MuxGet().
#define SWITCH_ID_LIST(INDEX, LIST) \
- if (idx == (INDEX)) { \
- err = ChunkAssignData(&chunk, data, copy_data, tag); \
- if (err == WEBP_MUX_OK) { \
- err = ChunkSetHead(&chunk, (LIST)); \
+ do { \
+ if (idx == (INDEX)) { \
+ 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; \
} \
- return err; \
- }
+ } while (0)
static WebPMuxError MuxSet(WebPMux* const mux, uint32_t tag,
const WebPData* const data, int copy_data) {
@@ -235,7 +238,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 +269,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;
@@ -556,7 +557,8 @@ static WebPMuxError MuxCleanup(WebPMux* const mux) {
if (num_frames == 1) {
WebPMuxImage* frame = NULL;
err = MuxImageGetNth((const WebPMuxImage**)&mux->images_, 1, &frame);
- assert(err == WEBP_MUX_OK); // We know that one frame does exist.
+ if (err != WEBP_MUX_OK) return err;
+ // We know that one frame does exist.
assert(frame != NULL);
if (frame->header_ != NULL &&
((mux->canvas_width_ == 0 && mux->canvas_height_ == 0) ||
diff --git a/src/3rdparty/libwebp/src/mux/muxi.h b/src/3rdparty/libwebp/src/mux/muxi.h
index ad3e1bd..74ae3fa 100644
--- a/src/3rdparty/libwebp/src/mux/muxi.h
+++ b/src/3rdparty/libwebp/src/mux/muxi.h
@@ -28,7 +28,7 @@ extern "C" {
// Defines and constants.
#define MUX_MAJ_VERSION 1
-#define MUX_MIN_VERSION 1
+#define MUX_MIN_VERSION 4
#define MUX_REV_VERSION 0
// Chunk object.
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 ae3b876..afd3542 100644
--- a/src/3rdparty/libwebp/src/mux/muxread.c
+++ b/src/3rdparty/libwebp/src/mux/muxread.c
@@ -21,20 +21,23 @@
// Handy MACRO.
#define SWITCH_ID_LIST(INDEX, LIST) \
- if (idx == (INDEX)) { \
- const WebPChunk* const chunk = ChunkSearchList((LIST), nth, \
- kChunks[(INDEX)].tag); \
- if (chunk) { \
- *data = chunk->data_; \
- return WEBP_MUX_OK; \
- } else { \
- return WEBP_MUX_NOT_FOUND; \
+ do { \
+ if (idx == (INDEX)) { \
+ const WebPChunk* const chunk = ChunkSearchList((LIST), nth, \
+ kChunks[(INDEX)].tag); \
+ if (chunk) { \
+ *data = chunk->data_; \
+ return WEBP_MUX_OK; \
+ } else { \
+ return WEBP_MUX_NOT_FOUND; \
+ } \
} \
- }
+ } while (0)
static WebPMuxError MuxGet(const WebPMux* const mux, CHUNK_INDEX idx,
uint32_t nth, WebPData* const data) {
assert(mux != NULL);
+ assert(idx != IDX_LAST_CHUNK);
assert(!IsWPI(kChunks[idx].id));
WebPDataInit(data);
@@ -56,7 +59,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;
@@ -116,9 +119,12 @@ static int MuxImageParse(const WebPChunk* const chunk, int copy_data,
// Each of ANMF chunk contain a header at the beginning. So, its size should
// be at least 'hdr_size'.
if (size < hdr_size) goto Fail;
- ChunkAssignData(&subchunk, &temp, copy_data, chunk->tag_);
+ if (ChunkAssignData(&subchunk, &temp, copy_data,
+ chunk->tag_) != WEBP_MUX_OK) {
+ goto Fail;
+ }
}
- ChunkSetHead(&subchunk, &wpi->header_);
+ if (ChunkSetHead(&subchunk, &wpi->header_) != WEBP_MUX_OK) goto Fail;
wpi->is_partial_ = 1; // Waiting for ALPH and/or VP8/VP8L chunks.
// Rest of the chunks.
@@ -155,7 +161,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 +192,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 +268,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.
@@ -429,6 +432,7 @@ WebPMuxError WebPMuxGetChunk(const WebPMux* mux, const char fourcc[4],
return WEBP_MUX_INVALID_ARGUMENT;
}
idx = ChunkGetIndexFromFourCC(fourcc);
+ assert(idx != IDX_LAST_CHUNK);
if (IsWPI(kChunks[idx].id)) { // An image chunk.
return WEBP_MUX_INVALID_ARGUMENT;
} else if (idx != IDX_UNKNOWN) { // A known chunk type.
@@ -483,7 +487,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_reader_utils.c b/src/3rdparty/libwebp/src/utils/bit_reader_utils.c
index 857cd60..a26557a 100644
--- a/src/3rdparty/libwebp/src/utils/bit_reader_utils.c
+++ b/src/3rdparty/libwebp/src/utils/bit_reader_utils.c
@@ -15,6 +15,7 @@
#include "src/webp/config.h"
#endif
+#include "src/dsp/cpu.h"
#include "src/utils/bit_reader_inl_utils.h"
#include "src/utils/utils.h"
@@ -121,7 +122,7 @@ int32_t VP8GetSignedValue(VP8BitReader* const br, int bits,
#define VP8L_LOG8_WBITS 4 // Number of bytes needed to store VP8L_WBITS bits.
-#if defined(__arm__) || defined(_M_ARM) || defined(__aarch64__) || \
+#if defined(__arm__) || defined(_M_ARM) || WEBP_AARCH64 || \
defined(__i386__) || defined(_M_IX86) || \
defined(__x86_64__) || defined(_M_X64)
#define VP8L_USE_FAST_LOAD
diff --git a/src/3rdparty/libwebp/src/utils/bit_reader_utils.h b/src/3rdparty/libwebp/src/utils/bit_reader_utils.h
index e64156e..25ff31e 100644
--- a/src/3rdparty/libwebp/src/utils/bit_reader_utils.h
+++ b/src/3rdparty/libwebp/src/utils/bit_reader_utils.h
@@ -19,6 +19,7 @@
#ifdef _MSC_VER
#include <stdlib.h> // _byteswap_ulong
#endif
+#include "src/dsp/cpu.h"
#include "src/webp/types.h"
// Warning! This macro triggers quite some MACRO wizardry around func signature!
@@ -64,7 +65,7 @@ extern "C" {
#define BITS 56
#elif defined(__arm__) || defined(_M_ARM) // ARM
#define BITS 24
-#elif defined(__aarch64__) // ARM 64bit
+#elif WEBP_AARCH64 // ARM 64bit
#define BITS 56
#elif defined(__mips__) // MIPS
#define BITS 24
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/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..16f9faa 100644
--- a/src/3rdparty/libwebp/src/utils/huffman_utils.c
+++ b/src/3rdparty/libwebp/src/utils/huffman_utils.c
@@ -122,6 +122,9 @@ static int BuildHuffmanTable(HuffmanCode* const root_table, int root_bits,
const int symbol_code_length = code_lengths[symbol];
if (code_lengths[symbol] > 0) {
if (sorted != NULL) {
+ if(offset[symbol_code_length] >= code_lengths_size) {
+ return 0;
+ }
sorted[offset[symbol_code_length]++] = symbol;
} else {
offset[symbol_code_length]++;
@@ -142,7 +145,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
@@ -177,21 +180,24 @@ static int BuildHuffmanTable(HuffmanCode* const root_table, int root_bits,
if (num_open < 0) {
return 0;
}
- if (root_table == NULL) continue;
for (; count[len] > 0; --count[len]) {
HuffmanCode code;
if ((key & mask) != low) {
- table += table_size;
+ if (root_table != NULL) table += table_size;
table_bits = NextTableBitSize(count, len, root_bits);
table_size = 1 << table_bits;
total_size += table_size;
low = key & mask;
- root_table[low].bits = (uint8_t)(table_bits + root_bits);
- root_table[low].value = (uint16_t)((table - root_table) - low);
+ if (root_table != NULL) {
+ root_table[low].bits = (uint8_t)(table_bits + root_bits);
+ root_table[low].value = (uint16_t)((table - root_table) - low);
+ }
+ }
+ if (root_table != NULL) {
+ code.bits = (uint8_t)(len - root_bits);
+ code.value = (uint16_t)sorted[symbol++];
+ ReplicateValue(&table[key >> root_bits], step, table_size, code);
}
- code.bits = (uint8_t)(len - root_bits);
- code.value = (uint16_t)sorted[symbol++];
- ReplicateValue(&table[key >> root_bits], step, table_size, code);
key = GetNextKey(key, len);
}
}
@@ -211,25 +217,83 @@ static int BuildHuffmanTable(HuffmanCode* const root_table, int root_bits,
((1 << MAX_CACHE_BITS) + NUM_LITERAL_CODES + NUM_LENGTH_CODES)
// Cut-off value for switching between heap and stack allocation.
#define SORTED_SIZE_CUTOFF 512
-int VP8LBuildHuffmanTable(HuffmanCode* const root_table, int root_bits,
+int VP8LBuildHuffmanTable(HuffmanTables* const root_table, int root_bits,
const int code_lengths[], int code_lengths_size) {
- int total_size;
+ const int total_size =
+ BuildHuffmanTable(NULL, root_bits, code_lengths, code_lengths_size, NULL);
assert(code_lengths_size <= MAX_CODE_LENGTHS_SIZE);
- if (root_table == NULL) {
- total_size = BuildHuffmanTable(NULL, root_bits,
- code_lengths, code_lengths_size, NULL);
- } else if (code_lengths_size <= SORTED_SIZE_CUTOFF) {
+ if (total_size == 0 || root_table == NULL) return total_size;
+
+ if (root_table->curr_segment->curr_table + total_size >=
+ root_table->curr_segment->start + root_table->curr_segment->size) {
+ // If 'root_table' does not have enough memory, allocate a new segment.
+ // The available part of root_table->curr_segment is left unused because we
+ // need a contiguous buffer.
+ const int segment_size = root_table->curr_segment->size;
+ struct HuffmanTablesSegment* next =
+ (HuffmanTablesSegment*)WebPSafeMalloc(1, sizeof(*next));
+ if (next == NULL) return 0;
+ // Fill the new segment.
+ // We need at least 'total_size' but if that value is small, it is better to
+ // allocate a big chunk to prevent more allocations later. 'segment_size' is
+ // therefore chosen (any other arbitrary value could be chosen).
+ next->size = total_size > segment_size ? total_size : segment_size;
+ next->start =
+ (HuffmanCode*)WebPSafeMalloc(next->size, sizeof(*next->start));
+ if (next->start == NULL) {
+ WebPSafeFree(next);
+ return 0;
+ }
+ next->curr_table = next->start;
+ next->next = NULL;
+ // Point to the new segment.
+ root_table->curr_segment->next = next;
+ root_table->curr_segment = next;
+ }
+ if (code_lengths_size <= SORTED_SIZE_CUTOFF) {
// use local stack-allocated array.
uint16_t sorted[SORTED_SIZE_CUTOFF];
- total_size = BuildHuffmanTable(root_table, root_bits,
- code_lengths, code_lengths_size, sorted);
- } else { // rare case. Use heap allocation.
+ BuildHuffmanTable(root_table->curr_segment->curr_table, root_bits,
+ code_lengths, code_lengths_size, sorted);
+ } else { // rare case. Use heap allocation.
uint16_t* const sorted =
(uint16_t*)WebPSafeMalloc(code_lengths_size, sizeof(*sorted));
if (sorted == NULL) return 0;
- total_size = BuildHuffmanTable(root_table, root_bits,
- code_lengths, code_lengths_size, sorted);
+ BuildHuffmanTable(root_table->curr_segment->curr_table, root_bits,
+ code_lengths, code_lengths_size, sorted);
WebPSafeFree(sorted);
}
return total_size;
}
+
+int VP8LHuffmanTablesAllocate(int size, HuffmanTables* huffman_tables) {
+ // Have 'segment' point to the first segment for now, 'root'.
+ HuffmanTablesSegment* const root = &huffman_tables->root;
+ huffman_tables->curr_segment = root;
+ root->next = NULL;
+ // Allocate root.
+ root->start = (HuffmanCode*)WebPSafeMalloc(size, sizeof(*root->start));
+ if (root->start == NULL) return 0;
+ root->curr_table = root->start;
+ root->size = size;
+ return 1;
+}
+
+void VP8LHuffmanTablesDeallocate(HuffmanTables* const huffman_tables) {
+ HuffmanTablesSegment *current, *next;
+ if (huffman_tables == NULL) return;
+ // Free the root node.
+ current = &huffman_tables->root;
+ next = current->next;
+ WebPSafeFree(current->start);
+ current->start = NULL;
+ current->next = NULL;
+ current = next;
+ // Free the following nodes.
+ while (current != NULL) {
+ next = current->next;
+ WebPSafeFree(current->start);
+ WebPSafeFree(current);
+ current = next;
+ }
+}
diff --git a/src/3rdparty/libwebp/src/utils/huffman_utils.h b/src/3rdparty/libwebp/src/utils/huffman_utils.h
index 13b7ad1..d511dc0 100644
--- a/src/3rdparty/libwebp/src/utils/huffman_utils.h
+++ b/src/3rdparty/libwebp/src/utils/huffman_utils.h
@@ -43,6 +43,30 @@ typedef struct {
// or non-literal symbol otherwise
} HuffmanCode32;
+// Contiguous memory segment of HuffmanCodes.
+typedef struct HuffmanTablesSegment {
+ HuffmanCode* start;
+ // Pointer to where we are writing into the segment. Starts at 'start' and
+ // cannot go beyond 'start' + 'size'.
+ HuffmanCode* curr_table;
+ // Pointer to the next segment in the chain.
+ struct HuffmanTablesSegment* next;
+ int size;
+} HuffmanTablesSegment;
+
+// Chained memory segments of HuffmanCodes.
+typedef struct HuffmanTables {
+ HuffmanTablesSegment root;
+ // Currently processed segment. At first, this is 'root'.
+ HuffmanTablesSegment* curr_segment;
+} HuffmanTables;
+
+// Allocates a HuffmanTables with 'size' contiguous HuffmanCodes. Returns 0 on
+// memory allocation error, 1 otherwise.
+WEBP_NODISCARD int VP8LHuffmanTablesAllocate(int size,
+ HuffmanTables* huffman_tables);
+void VP8LHuffmanTablesDeallocate(HuffmanTables* const huffman_tables);
+
#define HUFFMAN_PACKED_BITS 6
#define HUFFMAN_PACKED_TABLE_SIZE (1u << HUFFMAN_PACKED_BITS)
@@ -68,7 +92,7 @@ struct HTreeGroup {
};
// Creates the instance of HTreeGroup with specified number of tree-groups.
-HTreeGroup* VP8LHtreeGroupsNew(int num_htree_groups);
+WEBP_NODISCARD HTreeGroup* VP8LHtreeGroupsNew(int num_htree_groups);
// Releases the memory allocated for HTreeGroup.
void VP8LHtreeGroupsFree(HTreeGroup* const htree_groups);
@@ -78,10 +102,10 @@ void VP8LHtreeGroupsFree(HTreeGroup* const htree_groups);
// the huffman table.
// Returns built table size or 0 in case of error (invalid tree or
// memory error).
-// If root_table is NULL, it returns 0 if a lookup cannot be built, something
-// > 0 otherwise (but not the table size).
-int VP8LBuildHuffmanTable(HuffmanCode* const root_table, int root_bits,
- const int code_lengths[], int code_lengths_size);
+WEBP_NODISCARD int VP8LBuildHuffmanTable(HuffmanTables* const root_table,
+ int root_bits,
+ const int code_lengths[],
+ int code_lengths_size);
#ifdef __cplusplus
} // extern "C"
diff --git a/src/3rdparty/libwebp/src/utils/palette.c b/src/3rdparty/libwebp/src/utils/palette.c
new file mode 100644
index 0000000..515da21
--- /dev/null
+++ b/src/3rdparty/libwebp/src/utils/palette.c
@@ -0,0 +1,402 @@
+// Copyright 2023 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.
+// -----------------------------------------------------------------------------
+//
+// Utilities for palette analysis.
+//
+// Author: Vincent Rabaud (vrabaud@google.com)
+
+#include "src/utils/palette.h"
+
+#include <assert.h>
+#include <stdlib.h>
+
+#include "src/dsp/lossless_common.h"
+#include "src/utils/color_cache_utils.h"
+#include "src/utils/utils.h"
+#include "src/webp/encode.h"
+#include "src/webp/format_constants.h"
+
+// -----------------------------------------------------------------------------
+
+// Palette reordering for smaller sum of deltas (and for smaller storage).
+
+static int PaletteCompareColorsForQsort(const void* p1, const void* p2) {
+ const uint32_t a = WebPMemToUint32((uint8_t*)p1);
+ const uint32_t b = WebPMemToUint32((uint8_t*)p2);
+ assert(a != b);
+ return (a < b) ? -1 : 1;
+}
+
+static WEBP_INLINE uint32_t PaletteComponentDistance(uint32_t v) {
+ return (v <= 128) ? v : (256 - v);
+}
+
+// Computes a value that is related to the entropy created by the
+// palette entry diff.
+//
+// Note that the last & 0xff is a no-operation in the next statement, but
+// removed by most compilers and is here only for regularity of the code.
+static WEBP_INLINE uint32_t PaletteColorDistance(uint32_t col1, uint32_t col2) {
+ const uint32_t diff = VP8LSubPixels(col1, col2);
+ const int kMoreWeightForRGBThanForAlpha = 9;
+ uint32_t score;
+ score = PaletteComponentDistance((diff >> 0) & 0xff);
+ score += PaletteComponentDistance((diff >> 8) & 0xff);
+ score += PaletteComponentDistance((diff >> 16) & 0xff);
+ score *= kMoreWeightForRGBThanForAlpha;
+ score += PaletteComponentDistance((diff >> 24) & 0xff);
+ return score;
+}
+
+static WEBP_INLINE void SwapColor(uint32_t* const col1, uint32_t* const col2) {
+ const uint32_t tmp = *col1;
+ *col1 = *col2;
+ *col2 = tmp;
+}
+
+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;
+ }
+ }
+ assert(0);
+ return 0;
+}
+
+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;
+ }
+}
+
+//------------------------------------------------------------------------------
+
+#define COLOR_HASH_SIZE (MAX_PALETTE_SIZE * 4)
+#define COLOR_HASH_RIGHT_SHIFT 22 // 32 - log2(COLOR_HASH_SIZE).
+
+int GetColorPalette(const WebPPicture* const pic, uint32_t* const palette) {
+ int i;
+ int x, y;
+ int num_colors = 0;
+ uint8_t in_use[COLOR_HASH_SIZE] = {0};
+ uint32_t colors[COLOR_HASH_SIZE] = {0};
+ const uint32_t* argb = pic->argb;
+ const int width = pic->width;
+ const int height = pic->height;
+ uint32_t last_pix = ~argb[0]; // so we're sure that last_pix != argb[0]
+ assert(pic != NULL);
+ assert(pic->use_argb);
+
+ for (y = 0; y < height; ++y) {
+ for (x = 0; x < width; ++x) {
+ int key;
+ if (argb[x] == last_pix) {
+ continue;
+ }
+ last_pix = argb[x];
+ key = VP8LHashPix(last_pix, COLOR_HASH_RIGHT_SHIFT);
+ while (1) {
+ if (!in_use[key]) {
+ colors[key] = last_pix;
+ in_use[key] = 1;
+ ++num_colors;
+ if (num_colors > MAX_PALETTE_SIZE) {
+ return MAX_PALETTE_SIZE + 1; // Exact count not needed.
+ }
+ break;
+ } else if (colors[key] == last_pix) {
+ break; // The color is already there.
+ } else {
+ // Some other color sits here, so do linear conflict resolution.
+ ++key;
+ key &= (COLOR_HASH_SIZE - 1); // Key mask.
+ }
+ }
+ }
+ argb += pic->argb_stride;
+ }
+
+ if (palette != NULL) { // Fill the colors into palette.
+ num_colors = 0;
+ for (i = 0; i < COLOR_HASH_SIZE; ++i) {
+ if (in_use[i]) {
+ palette[num_colors] = colors[i];
+ ++num_colors;
+ }
+ }
+ qsort(palette, num_colors, sizeof(*palette), PaletteCompareColorsForQsort);
+ }
+ return num_colors;
+}
+
+#undef COLOR_HASH_SIZE
+#undef COLOR_HASH_RIGHT_SHIFT
+
+// -----------------------------------------------------------------------------
+
+// The palette has been sorted by alpha. This function checks if the other
+// components of the palette have a monotonic development with regards to
+// position in the palette. If all have monotonic development, there is
+// 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(const uint32_t* const palette,
+ int num_colors) {
+ uint32_t predict = 0x000000;
+ int i;
+ uint8_t sign_found = 0x00;
+ for (i = 0; i < num_colors; ++i) {
+ const uint32_t diff = VP8LSubPixels(palette[i], predict);
+ const uint8_t rd = (diff >> 16) & 0xff;
+ const uint8_t gd = (diff >> 8) & 0xff;
+ const uint8_t bd = (diff >> 0) & 0xff;
+ if (rd != 0x00) {
+ sign_found |= (rd < 0x80) ? 1 : 2;
+ }
+ if (gd != 0x00) {
+ sign_found |= (gd < 0x80) ? 8 : 16;
+ }
+ if (bd != 0x00) {
+ sign_found |= (bd < 0x80) ? 64 : 128;
+ }
+ predict = palette[i];
+ }
+ 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];
+ }
+}
+
+// -----------------------------------------------------------------------------
+// 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);
+}
+
+// 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) {
+ return 0;
+ }
+ 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;
+};
+
+static int PaletteSortModifiedZeng(const WebPPicture* const pic,
+ const uint32_t* const palette_in,
+ 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) {
+ return 0;
+ }
+ if (!CoOccurrenceBuild(pic, palette_in, num_colors, cooccurrence)) {
+ WebPSafeFree(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_in[remapping[(first + i) % num_colors]];
+ }
+ return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+int PaletteSort(PaletteSorting method, const struct WebPPicture* const pic,
+ const uint32_t* const palette_sorted, uint32_t num_colors,
+ uint32_t* const palette) {
+ switch (method) {
+ case kSortedDefault:
+ // Nothing to do, we have already sorted the palette.
+ memcpy(palette, palette_sorted, num_colors * sizeof(*palette));
+ return 1;
+ case kMinimizeDelta:
+ PaletteSortMinimizeDeltas(palette_sorted, num_colors, palette);
+ return 1;
+ case kModifiedZeng:
+ return PaletteSortModifiedZeng(pic, palette_sorted, num_colors, palette);
+ case kUnusedPalette:
+ case kPaletteSortingNum:
+ break;
+ }
+
+ assert(0);
+ return 0;
+}
diff --git a/src/3rdparty/libwebp/src/utils/palette.h b/src/3rdparty/libwebp/src/utils/palette.h
new file mode 100644
index 0000000..34479e4
--- /dev/null
+++ b/src/3rdparty/libwebp/src/utils/palette.h
@@ -0,0 +1,60 @@
+// Copyright 2023 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.
+// -----------------------------------------------------------------------------
+//
+// Utilities for palette analysis.
+//
+// Author: Vincent Rabaud (vrabaud@google.com)
+
+#ifndef WEBP_UTILS_PALETTE_H_
+#define WEBP_UTILS_PALETTE_H_
+
+#include "src/webp/types.h"
+
+struct WebPPicture;
+
+// The different ways a palette can be sorted.
+typedef enum PaletteSorting {
+ kSortedDefault = 0,
+ // Sorts by minimizing L1 deltas between consecutive colors, giving more
+ // weight to RGB colors.
+ kMinimizeDelta = 1,
+ // 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.
+ kModifiedZeng = 2,
+ kUnusedPalette = 3,
+ kPaletteSortingNum = 4
+} PaletteSorting;
+
+// Returns the index of 'color' in the sorted palette 'sorted' of size
+// 'num_colors'.
+int SearchColorNoIdx(const uint32_t sorted[], uint32_t color, int num_colors);
+
+// Sort palette in increasing order and prepare an inverse mapping array.
+void PrepareMapToPalette(const uint32_t palette[], uint32_t num_colors,
+ uint32_t sorted[], uint32_t idx_map[]);
+
+// Returns count of unique colors in 'pic', assuming pic->use_argb is true.
+// If the unique color count is more than MAX_PALETTE_SIZE, returns
+// MAX_PALETTE_SIZE+1.
+// If 'palette' is not NULL and the number of unique colors is less than or
+// equal to MAX_PALETTE_SIZE, also outputs the actual unique colors into
+// 'palette' in a sorted order. Note: 'palette' is assumed to be an array
+// already allocated with at least MAX_PALETTE_SIZE elements.
+int GetColorPalette(const struct WebPPicture* const pic,
+ uint32_t* const palette);
+
+// Sorts the palette according to the criterion defined by 'method'.
+// 'palette_sorted' is the input palette sorted lexicographically, as done in
+// PrepareMapToPalette. Returns 0 on memory allocation error.
+int PaletteSort(PaletteSorting method, const struct WebPPicture* const pic,
+ const uint32_t* const palette_sorted, uint32_t num_colors,
+ uint32_t* const palette);
+
+#endif // WEBP_UTILS_PALETTE_H_
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/utils.c b/src/3rdparty/libwebp/src/utils/utils.c
index 764f752..408ce88 100644
--- a/src/3rdparty/libwebp/src/utils/utils.c
+++ b/src/3rdparty/libwebp/src/utils/utils.c
@@ -11,19 +11,19 @@
//
// Author: Skal (pascal.massimino@gmail.com)
+#include "src/utils/utils.h"
+
#include <stdlib.h>
#include <string.h> // for memcpy()
-#include "src/webp/decode.h"
+
+#include "src/utils/palette.h"
#include "src/webp/encode.h"
-#include "src/webp/format_constants.h" // for MAX_PALETTE_SIZE
-#include "src/utils/color_cache_utils.h"
-#include "src/utils/utils.h"
// If PRINT_MEM_INFO is defined, extra info (like total memory used, number of
// 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!
}
@@ -231,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;
@@ -249,66 +252,10 @@ void WebPCopyPixels(const WebPPicture* const src, WebPPicture* const dst) {
//------------------------------------------------------------------------------
-#define COLOR_HASH_SIZE (MAX_PALETTE_SIZE * 4)
-#define COLOR_HASH_RIGHT_SHIFT 22 // 32 - log2(COLOR_HASH_SIZE).
-
int WebPGetColorPalette(const WebPPicture* const pic, uint32_t* const palette) {
- int i;
- int x, y;
- int num_colors = 0;
- uint8_t in_use[COLOR_HASH_SIZE] = { 0 };
- uint32_t colors[COLOR_HASH_SIZE];
- const uint32_t* argb = pic->argb;
- const int width = pic->width;
- const int height = pic->height;
- uint32_t last_pix = ~argb[0]; // so we're sure that last_pix != argb[0]
- assert(pic != NULL);
- assert(pic->use_argb);
-
- for (y = 0; y < height; ++y) {
- for (x = 0; x < width; ++x) {
- int key;
- if (argb[x] == last_pix) {
- continue;
- }
- last_pix = argb[x];
- key = VP8LHashPix(last_pix, COLOR_HASH_RIGHT_SHIFT);
- while (1) {
- if (!in_use[key]) {
- colors[key] = last_pix;
- in_use[key] = 1;
- ++num_colors;
- if (num_colors > MAX_PALETTE_SIZE) {
- return MAX_PALETTE_SIZE + 1; // Exact count not needed.
- }
- break;
- } else if (colors[key] == last_pix) {
- break; // The color is already there.
- } else {
- // Some other color sits here, so do linear conflict resolution.
- ++key;
- key &= (COLOR_HASH_SIZE - 1); // Key mask.
- }
- }
- }
- argb += pic->argb_stride;
- }
-
- if (palette != NULL) { // Fill the colors into palette.
- num_colors = 0;
- for (i = 0; i < COLOR_HASH_SIZE; ++i) {
- if (in_use[i]) {
- palette[num_colors] = colors[i];
- ++num_colors;
- }
- }
- }
- return num_colors;
+ return GetColorPalette(pic, palette);
}
-#undef COLOR_HASH_SIZE
-#undef COLOR_HASH_RIGHT_SHIFT
-
//------------------------------------------------------------------------------
#if defined(WEBP_NEED_LOG_TABLE_8BIT)
diff --git a/src/3rdparty/libwebp/src/utils/utils.h b/src/3rdparty/libwebp/src/utils/utils.h
index 2a3ec92..b2241fb 100644
--- a/src/3rdparty/libwebp/src/utils/utils.h
+++ b/src/3rdparty/libwebp/src/utils/utils.h
@@ -20,9 +20,7 @@
#endif
#include <assert.h>
-#include <limits.h>
-#include "src/dsp/dsp.h"
#include "src/webp/types.h"
#ifdef __cplusplus
@@ -42,6 +40,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 +62,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 +72,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 +119,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 +160,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
//------------------------------------------------------------------------------
@@ -166,6 +196,7 @@ WEBP_EXTERN void WebPCopyPixels(const struct WebPPicture* const src,
// MAX_PALETTE_SIZE, also outputs the actual unique colors into 'palette'.
// Note: 'palette' is assumed to be an array already allocated with at least
// MAX_PALETTE_SIZE elements.
+// TODO(vrabaud) remove whenever we can break the ABI.
WEBP_EXTERN int WebPGetColorPalette(const struct WebPPicture* const pic,
uint32_t* const palette);
diff --git a/src/3rdparty/libwebp/src/webp/config.h b/src/3rdparty/libwebp/src/webp/config.h
index 6f5d153..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.1.0"
+#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.1.0"
+#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.1.0"
+#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 80dd0ef..d6895f5 100644
--- a/src/3rdparty/libwebp/src/webp/decode.h
+++ b/src/3rdparty/libwebp/src/webp/decode.h
@@ -48,48 +48,47 @@ WEBP_EXTERN int WebPGetDecoderVersion(void);
// RIFF + VP8X + (optional chunks) + VP8(L)
// ALPH + VP8 <-- Not a valid WebP format: only allowed for internal purpose.
// VP8(L) <-- Not a valid WebP format: only allowed for internal purpose.
-WEBP_EXTERN int WebPGetInfo(const uint8_t* data, size_t data_size,
- int* width, int* height);
+WEBP_NODISCARD WEBP_EXTERN int WebPGetInfo(
+ const uint8_t* data, size_t data_size, int* width, int* height);
// Decodes WebP images pointed to by 'data' and returns RGBA samples, along
// with the dimensions in *width and *height. The ordering of samples in
// memory is R, G, B, A, R, G, B, A... in scan order (endian-independent).
// The returned pointer should be deleted calling WebPFree().
// Returns NULL in case of error.
-WEBP_EXTERN uint8_t* WebPDecodeRGBA(const uint8_t* data, size_t data_size,
- int* width, int* height);
+WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPDecodeRGBA(
+ const uint8_t* data, size_t data_size, int* width, int* height);
// Same as WebPDecodeRGBA, but returning A, R, G, B, A, R, G, B... ordered data.
-WEBP_EXTERN uint8_t* WebPDecodeARGB(const uint8_t* data, size_t data_size,
- int* width, int* height);
+WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPDecodeARGB(
+ const uint8_t* data, size_t data_size, int* width, int* height);
// Same as WebPDecodeRGBA, but returning B, G, R, A, B, G, R, A... ordered data.
-WEBP_EXTERN uint8_t* WebPDecodeBGRA(const uint8_t* data, size_t data_size,
- int* width, int* height);
+WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPDecodeBGRA(
+ const uint8_t* data, size_t data_size, int* width, int* height);
// Same as WebPDecodeRGBA, but returning R, G, B, R, G, B... ordered data.
// If the bitstream contains transparency, it is ignored.
-WEBP_EXTERN uint8_t* WebPDecodeRGB(const uint8_t* data, size_t data_size,
- int* width, int* height);
+WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPDecodeRGB(
+ const uint8_t* data, size_t data_size, int* width, int* height);
// Same as WebPDecodeRGB, but returning B, G, R, B, G, R... ordered data.
-WEBP_EXTERN uint8_t* WebPDecodeBGR(const uint8_t* data, size_t data_size,
- int* width, int* height);
-
+WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPDecodeBGR(
+ const uint8_t* data, size_t data_size, int* width, int* height);
// Decode WebP images pointed to by 'data' to Y'UV format(*). The pointer
// returned is the Y samples buffer. Upon return, *u and *v will point to
// the U and V chroma data. These U and V buffers need NOT be passed to
// WebPFree(), unlike the returned Y luma one. The dimension of the U and V
-// planes are both (*width + 1) / 2 and (*height + 1)/ 2.
+// planes are both (*width + 1) / 2 and (*height + 1) / 2.
// 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
-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);
+// 'width' and 'height' may be NULL, the other pointers must not be.
+// Returns NULL in case of error.
+// (*) Also named Y'CbCr. See: https://en.wikipedia.org/wiki/YCbCr
+WEBP_NODISCARD 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);
// These five functions are variants of the above ones, that decode the image
// directly into a pre-allocated buffer 'output_buffer'. The maximum storage
@@ -99,22 +98,22 @@ WEBP_EXTERN uint8_t* WebPDecodeYUV(const uint8_t* data, size_t data_size,
// The parameter 'output_stride' specifies the distance (in bytes)
// between scanlines. Hence, output_buffer_size is expected to be at least
// output_stride x picture-height.
-WEBP_EXTERN uint8_t* WebPDecodeRGBAInto(
+WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPDecodeRGBAInto(
const uint8_t* data, size_t data_size,
uint8_t* output_buffer, size_t output_buffer_size, int output_stride);
-WEBP_EXTERN uint8_t* WebPDecodeARGBInto(
+WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPDecodeARGBInto(
const uint8_t* data, size_t data_size,
uint8_t* output_buffer, size_t output_buffer_size, int output_stride);
-WEBP_EXTERN uint8_t* WebPDecodeBGRAInto(
+WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPDecodeBGRAInto(
const uint8_t* data, size_t data_size,
uint8_t* output_buffer, size_t output_buffer_size, int output_stride);
// RGB and BGR variants. Here too the transparency information, if present,
// will be dropped and ignored.
-WEBP_EXTERN uint8_t* WebPDecodeRGBInto(
+WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPDecodeRGBInto(
const uint8_t* data, size_t data_size,
uint8_t* output_buffer, size_t output_buffer_size, int output_stride);
-WEBP_EXTERN uint8_t* WebPDecodeBGRInto(
+WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPDecodeBGRInto(
const uint8_t* data, size_t data_size,
uint8_t* output_buffer, size_t output_buffer_size, int output_stride);
@@ -125,7 +124,7 @@ WEBP_EXTERN uint8_t* WebPDecodeBGRInto(
// 'u_size' and 'v_size' respectively.
// Pointer to the luma plane ('*luma') is returned or NULL if an error occurred
// during decoding (or because some buffers were found to be too small).
-WEBP_EXTERN uint8_t* WebPDecodeYUVInto(
+WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPDecodeYUVInto(
const uint8_t* data, size_t data_size,
uint8_t* luma, size_t luma_size, int luma_stride,
uint8_t* u, size_t u_size, int u_stride,
@@ -216,11 +215,11 @@ struct WebPDecBuffer {
};
// Internal, version-checked, entry point
-WEBP_EXTERN int WebPInitDecBufferInternal(WebPDecBuffer*, int);
+WEBP_NODISCARD WEBP_EXTERN int WebPInitDecBufferInternal(WebPDecBuffer*, int);
// Initialize the structure as empty. Must be called before any other use.
// Returns false in case of version mismatch
-static WEBP_INLINE int WebPInitDecBuffer(WebPDecBuffer* buffer) {
+WEBP_NODISCARD static WEBP_INLINE int WebPInitDecBuffer(WebPDecBuffer* buffer) {
return WebPInitDecBufferInternal(buffer, WEBP_DECODER_ABI_VERSION);
}
@@ -231,7 +230,7 @@ WEBP_EXTERN void WebPFreeDecBuffer(WebPDecBuffer* buffer);
//------------------------------------------------------------------------------
// Enumeration of the status codes
-typedef enum VP8StatusCode {
+typedef enum WEBP_NODISCARD VP8StatusCode {
VP8_STATUS_OK = 0,
VP8_STATUS_OUT_OF_MEMORY,
VP8_STATUS_INVALID_PARAM,
@@ -250,23 +249,24 @@ typedef enum VP8StatusCode {
// WebPIDecoder object. This object can be left in a SUSPENDED state if the
// picture is only partially decoded, pending additional input.
// Code example:
-//
-// WebPInitDecBuffer(&output_buffer);
-// output_buffer.colorspace = mode;
-// ...
-// WebPIDecoder* idec = WebPINewDecoder(&output_buffer);
-// while (additional_data_is_available) {
-// // ... (get additional data in some new_data[] buffer)
-// status = WebPIAppend(idec, new_data, new_data_size);
-// if (status != VP8_STATUS_OK && status != VP8_STATUS_SUSPENDED) {
-// break; // an error occurred.
-// }
-//
-// // The above call decodes the current available buffer.
-// // Part of the image can now be refreshed by calling
-// // WebPIDecGetRGB()/WebPIDecGetYUVA() etc.
-// }
-// WebPIDelete(idec);
+/*
+ WebPInitDecBuffer(&output_buffer);
+ output_buffer.colorspace = mode;
+ ...
+ WebPIDecoder* idec = WebPINewDecoder(&output_buffer);
+ while (additional_data_is_available) {
+ // ... (get additional data in some new_data[] buffer)
+ status = WebPIAppend(idec, new_data, new_data_size);
+ if (status != VP8_STATUS_OK && status != VP8_STATUS_SUSPENDED) {
+ break; // an error occurred.
+ }
+
+ // The above call decodes the current available buffer.
+ // Part of the image can now be refreshed by calling
+ // WebPIDecGetRGB()/WebPIDecGetYUVA() etc.
+ }
+ WebPIDelete(idec);
+*/
// Creates a new incremental decoder with the supplied buffer parameter.
// This output_buffer can be passed NULL, in which case a default output buffer
@@ -280,7 +280,8 @@ typedef enum VP8StatusCode {
// within valid bounds.
// All other fields of WebPDecBuffer MUST remain constant between calls.
// Returns NULL if the allocation failed.
-WEBP_EXTERN WebPIDecoder* WebPINewDecoder(WebPDecBuffer* output_buffer);
+WEBP_NODISCARD WEBP_EXTERN WebPIDecoder* WebPINewDecoder(
+ WebPDecBuffer* output_buffer);
// This function allocates and initializes an incremental-decoder object, which
// will output the RGB/A samples specified by 'csp' into a preallocated
@@ -292,7 +293,7 @@ WEBP_EXTERN WebPIDecoder* WebPINewDecoder(WebPDecBuffer* output_buffer);
// colorspace 'csp' is taken into account for allocating this buffer. All other
// parameters are ignored.
// Returns NULL if the allocation failed, or if some parameters are invalid.
-WEBP_EXTERN WebPIDecoder* WebPINewRGB(
+WEBP_NODISCARD WEBP_EXTERN WebPIDecoder* WebPINewRGB(
WEBP_CSP_MODE csp,
uint8_t* output_buffer, size_t output_buffer_size, int output_stride);
@@ -307,7 +308,7 @@ WEBP_EXTERN WebPIDecoder* WebPINewRGB(
// In this case, the output buffer will be automatically allocated (using
// MODE_YUVA) when decoding starts. All parameters are then ignored.
// Returns NULL if the allocation failed or if a parameter is invalid.
-WEBP_EXTERN WebPIDecoder* WebPINewYUVA(
+WEBP_NODISCARD WEBP_EXTERN WebPIDecoder* WebPINewYUVA(
uint8_t* luma, size_t luma_size, int luma_stride,
uint8_t* u, size_t u_size, int u_stride,
uint8_t* v, size_t v_size, int v_stride,
@@ -315,7 +316,7 @@ WEBP_EXTERN WebPIDecoder* WebPINewYUVA(
// Deprecated version of the above, without the alpha plane.
// Kept for backward compatibility.
-WEBP_EXTERN WebPIDecoder* WebPINewYUV(
+WEBP_NODISCARD WEBP_EXTERN WebPIDecoder* WebPINewYUV(
uint8_t* luma, size_t luma_size, int luma_stride,
uint8_t* u, size_t u_size, int u_stride,
uint8_t* v, size_t v_size, int v_stride);
@@ -345,21 +346,21 @@ WEBP_EXTERN VP8StatusCode WebPIUpdate(
// (*last_y, *width etc.) can be NULL if corresponding information is not
// needed. The values in these pointers are only valid on successful (non-NULL)
// return.
-WEBP_EXTERN uint8_t* WebPIDecGetRGB(
+WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPIDecGetRGB(
const WebPIDecoder* idec, int* last_y,
int* width, int* height, int* stride);
// Same as above function to get a YUVA image. Returns pointer to the luma
// plane or NULL in case of error. If there is no alpha information
// the alpha pointer '*a' will be returned NULL.
-WEBP_EXTERN uint8_t* WebPIDecGetYUVA(
+WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPIDecGetYUVA(
const WebPIDecoder* idec, int* last_y,
uint8_t** u, uint8_t** v, uint8_t** a,
int* width, int* height, int* stride, int* uv_stride, int* a_stride);
// Deprecated alpha-less version of WebPIDecGetYUVA(): it will ignore the
// alpha information (if present). Kept for backward compatibility.
-static WEBP_INLINE uint8_t* WebPIDecGetYUV(
+WEBP_NODISCARD static WEBP_INLINE uint8_t* WebPIDecGetYUV(
const WebPIDecoder* idec, int* last_y, uint8_t** u, uint8_t** v,
int* width, int* height, int* stride, int* uv_stride) {
return WebPIDecGetYUVA(idec, last_y, u, v, NULL, width, height,
@@ -372,7 +373,7 @@ static WEBP_INLINE uint8_t* WebPIDecGetYUV(
// Returns NULL in case the incremental decoder object is in an invalid state.
// Otherwise returns the pointer to the internal representation. This structure
// is read-only, tied to WebPIDecoder's lifespan and should not be modified.
-WEBP_EXTERN const WebPDecBuffer* WebPIDecodedArea(
+WEBP_NODISCARD WEBP_EXTERN const WebPDecBuffer* WebPIDecodedArea(
const WebPIDecoder* idec, int* left, int* top, int* width, int* height);
//------------------------------------------------------------------------------
@@ -388,7 +389,7 @@ WEBP_EXTERN const WebPDecBuffer* WebPIDecodedArea(
CHECK(WebPGetFeatures(data, data_size, &config.input) == VP8_STATUS_OK);
// C) Adjust 'config', if needed
- config.no_fancy_upsampling = 1;
+ config.options.no_fancy_upsampling = 1;
config.output.colorspace = MODE_BGRA;
// etc.
@@ -453,7 +454,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
@@ -467,12 +468,14 @@ struct WebPDecoderConfig {
};
// Internal, version-checked, entry point
-WEBP_EXTERN int WebPInitDecoderConfigInternal(WebPDecoderConfig*, int);
+WEBP_NODISCARD WEBP_EXTERN int WebPInitDecoderConfigInternal(WebPDecoderConfig*,
+ int);
// Initialize the configuration as empty. This function must always be
// called first, unless WebPGetFeatures() is to be called.
// Returns false in case of mismatched version.
-static WEBP_INLINE int WebPInitDecoderConfig(WebPDecoderConfig* config) {
+WEBP_NODISCARD static WEBP_INLINE int WebPInitDecoderConfig(
+ WebPDecoderConfig* config) {
return WebPInitDecoderConfigInternal(config, WEBP_DECODER_ABI_VERSION);
}
@@ -487,8 +490,8 @@ static WEBP_INLINE int WebPInitDecoderConfig(WebPDecoderConfig* config) {
// The return WebPIDecoder object must always be deleted calling WebPIDelete().
// Returns NULL in case of error (and config->status will then reflect
// the error condition, if available).
-WEBP_EXTERN WebPIDecoder* WebPIDecode(const uint8_t* data, size_t data_size,
- WebPDecoderConfig* config);
+WEBP_NODISCARD WEBP_EXTERN WebPIDecoder* WebPIDecode(
+ const uint8_t* data, size_t data_size, WebPDecoderConfig* config);
// Non-incremental version. This version decodes the full data at once, taking
// 'config' into account. Returns decoding status (which should be VP8_STATUS_OK
diff --git a/src/3rdparty/libwebp/src/webp/demux.h b/src/3rdparty/libwebp/src/webp/demux.h
index 846eeb1..8d24655 100644
--- a/src/3rdparty/libwebp/src/webp/demux.h
+++ b/src/3rdparty/libwebp/src/webp/demux.h
@@ -50,6 +50,7 @@
#include "./decode.h" // for WEBP_CSP_MODE
#include "./mux_types.h"
+#include "./types.h"
#ifdef __cplusplus
extern "C" {
@@ -85,13 +86,13 @@ typedef enum WebPDemuxState {
} WebPDemuxState;
// Internal, version-checked, entry point
-WEBP_EXTERN WebPDemuxer* WebPDemuxInternal(
+WEBP_NODISCARD WEBP_EXTERN WebPDemuxer* WebPDemuxInternal(
const WebPData*, int, WebPDemuxState*, int);
// Parses the full WebP file given by 'data'. For single images the WebP file
// header alone or the file header and the chunk header may be absent.
// Returns a WebPDemuxer object on successful parse, NULL otherwise.
-static WEBP_INLINE WebPDemuxer* WebPDemux(const WebPData* data) {
+WEBP_NODISCARD static WEBP_INLINE WebPDemuxer* WebPDemux(const WebPData* data) {
return WebPDemuxInternal(data, 0, NULL, WEBP_DEMUX_ABI_VERSION);
}
@@ -103,7 +104,7 @@ static WEBP_INLINE WebPDemuxer* WebPDemux(const WebPData* data) {
// If this data is volatile, the demuxer object should be deleted (by calling
// WebPDemuxDelete()) and WebPDemuxPartial() called again on the new data.
// This is usually an inexpensive operation.
-static WEBP_INLINE WebPDemuxer* WebPDemuxPartial(
+WEBP_NODISCARD static WEBP_INLINE WebPDemuxer* WebPDemuxPartial(
const WebPData* data, WebPDemuxState* state) {
return WebPDemuxInternal(data, 1, state, WEBP_DEMUX_ABI_VERSION);
}
@@ -164,14 +165,14 @@ struct WebPIterator {
// Returns false if 'dmux' is NULL or frame 'frame_number' is not present.
// Call WebPDemuxReleaseIterator() when use of the iterator is complete.
// NOTE: 'dmux' must persist for the lifetime of 'iter'.
-WEBP_EXTERN int WebPDemuxGetFrame(
+WEBP_NODISCARD WEBP_EXTERN int WebPDemuxGetFrame(
const WebPDemuxer* dmux, int frame_number, WebPIterator* iter);
// Sets 'iter->fragment' to point to the next ('iter->frame_num' + 1) or
// previous ('iter->frame_num' - 1) frame. These functions do not loop.
// Returns true on success, false otherwise.
-WEBP_EXTERN int WebPDemuxNextFrame(WebPIterator* iter);
-WEBP_EXTERN int WebPDemuxPrevFrame(WebPIterator* iter);
+WEBP_NODISCARD WEBP_EXTERN int WebPDemuxNextFrame(WebPIterator* iter);
+WEBP_NODISCARD WEBP_EXTERN int WebPDemuxPrevFrame(WebPIterator* iter);
// Releases any memory associated with 'iter'.
// Must be called before any subsequent calls to WebPDemuxGetChunk() on the same
@@ -202,15 +203,16 @@ struct WebPChunkIterator {
// payloads are accessed through WebPDemuxGetFrame() and related functions.
// Call WebPDemuxReleaseChunkIterator() when use of the iterator is complete.
// NOTE: 'dmux' must persist for the lifetime of the iterator.
-WEBP_EXTERN int WebPDemuxGetChunk(const WebPDemuxer* dmux,
- const char fourcc[4], int chunk_number,
- WebPChunkIterator* iter);
+WEBP_NODISCARD WEBP_EXTERN int WebPDemuxGetChunk(const WebPDemuxer* dmux,
+ const char fourcc[4],
+ int chunk_number,
+ WebPChunkIterator* iter);
// Sets 'iter->chunk' to point to the next ('iter->chunk_num' + 1) or previous
// ('iter->chunk_num' - 1) chunk. These functions do not loop.
// Returns true on success, false otherwise.
-WEBP_EXTERN int WebPDemuxNextChunk(WebPChunkIterator* iter);
-WEBP_EXTERN int WebPDemuxPrevChunk(WebPChunkIterator* iter);
+WEBP_NODISCARD WEBP_EXTERN int WebPDemuxNextChunk(WebPChunkIterator* iter);
+WEBP_NODISCARD WEBP_EXTERN int WebPDemuxPrevChunk(WebPChunkIterator* iter);
// Releases any memory associated with 'iter'.
// Must be called before destroying the associated WebPDemuxer with
@@ -257,21 +259,21 @@ struct WebPAnimDecoderOptions {
};
// Internal, version-checked, entry point.
-WEBP_EXTERN int WebPAnimDecoderOptionsInitInternal(
+WEBP_NODISCARD WEBP_EXTERN int WebPAnimDecoderOptionsInitInternal(
WebPAnimDecoderOptions*, int);
// Should always be called, to initialize a fresh WebPAnimDecoderOptions
// structure before modification. Returns false in case of version mismatch.
// WebPAnimDecoderOptionsInit() must have succeeded before using the
// 'dec_options' object.
-static WEBP_INLINE int WebPAnimDecoderOptionsInit(
+WEBP_NODISCARD static WEBP_INLINE int WebPAnimDecoderOptionsInit(
WebPAnimDecoderOptions* dec_options) {
return WebPAnimDecoderOptionsInitInternal(dec_options,
WEBP_DEMUX_ABI_VERSION);
}
// Internal, version-checked, entry point.
-WEBP_EXTERN WebPAnimDecoder* WebPAnimDecoderNewInternal(
+WEBP_NODISCARD WEBP_EXTERN WebPAnimDecoder* WebPAnimDecoderNewInternal(
const WebPData*, const WebPAnimDecoderOptions*, int);
// Creates and initializes a WebPAnimDecoder object.
@@ -284,7 +286,7 @@ WEBP_EXTERN WebPAnimDecoder* WebPAnimDecoderNewInternal(
// Returns:
// A pointer to the newly created WebPAnimDecoder object, or NULL in case of
// parsing error, invalid option or memory error.
-static WEBP_INLINE WebPAnimDecoder* WebPAnimDecoderNew(
+WEBP_NODISCARD static WEBP_INLINE WebPAnimDecoder* WebPAnimDecoderNew(
const WebPData* webp_data, const WebPAnimDecoderOptions* dec_options) {
return WebPAnimDecoderNewInternal(webp_data, dec_options,
WEBP_DEMUX_ABI_VERSION);
@@ -306,8 +308,8 @@ struct WebPAnimInfo {
// info - (out) global information fetched from the animation.
// Returns:
// True on success.
-WEBP_EXTERN int WebPAnimDecoderGetInfo(const WebPAnimDecoder* dec,
- WebPAnimInfo* info);
+WEBP_NODISCARD WEBP_EXTERN int WebPAnimDecoderGetInfo(
+ const WebPAnimDecoder* dec, WebPAnimInfo* info);
// Fetch the next frame from 'dec' based on options supplied to
// WebPAnimDecoderNew(). This will be a fully reconstructed canvas of size
@@ -321,8 +323,9 @@ WEBP_EXTERN int WebPAnimDecoderGetInfo(const WebPAnimDecoder* dec,
// Returns:
// False if any of the arguments are NULL, or if there is a parsing or
// decoding error, or if there are no more frames. Otherwise, returns true.
-WEBP_EXTERN int WebPAnimDecoderGetNext(WebPAnimDecoder* dec,
- uint8_t** buf, int* timestamp);
+WEBP_NODISCARD WEBP_EXTERN int WebPAnimDecoderGetNext(WebPAnimDecoder* dec,
+ uint8_t** buf,
+ int* timestamp);
// Check if there are more frames left to decode.
// Parameters:
@@ -330,7 +333,8 @@ WEBP_EXTERN int WebPAnimDecoderGetNext(WebPAnimDecoder* dec,
// Returns:
// True if 'dec' is not NULL and some frames are yet to be decoded.
// Otherwise, returns false.
-WEBP_EXTERN int WebPAnimDecoderHasMoreFrames(const WebPAnimDecoder* dec);
+WEBP_NODISCARD WEBP_EXTERN int WebPAnimDecoderHasMoreFrames(
+ const WebPAnimDecoder* dec);
// Resets the WebPAnimDecoder object, so that next call to
// WebPAnimDecoderGetNext() will restart decoding from 1st frame. This would be
@@ -348,7 +352,7 @@ WEBP_EXTERN void WebPAnimDecoderReset(WebPAnimDecoder* dec);
//
// Parameters:
// dec - (in) decoder instance from which the demuxer object is to be fetched.
-WEBP_EXTERN const WebPDemuxer* WebPAnimDecoderGetDemuxer(
+WEBP_NODISCARD WEBP_EXTERN const WebPDemuxer* WebPAnimDecoderGetDemuxer(
const WebPAnimDecoder* dec);
// Deletes the WebPAnimDecoder object.
diff --git a/src/3rdparty/libwebp/src/webp/encode.h b/src/3rdparty/libwebp/src/webp/encode.h
index 655166e..f3d5929 100644
--- a/src/3rdparty/libwebp/src/webp/encode.h
+++ b/src/3rdparty/libwebp/src/webp/encode.h
@@ -148,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
@@ -163,13 +164,14 @@ typedef enum WebPPreset {
} WebPPreset;
// Internal, version-checked, entry point
-WEBP_EXTERN int WebPConfigInitInternal(WebPConfig*, WebPPreset, float, int);
+WEBP_NODISCARD WEBP_EXTERN int WebPConfigInitInternal(WebPConfig*, WebPPreset,
+ float, int);
// Should always be called, to initialize a fresh WebPConfig structure before
// modification. Returns false in case of version mismatch. WebPConfigInit()
// must have succeeded before using the 'config' object.
// Note that the default values are lossless=0 and quality=75.
-static WEBP_INLINE int WebPConfigInit(WebPConfig* config) {
+WEBP_NODISCARD static WEBP_INLINE int WebPConfigInit(WebPConfig* config) {
return WebPConfigInitInternal(config, WEBP_PRESET_DEFAULT, 75.f,
WEBP_ENCODER_ABI_VERSION);
}
@@ -178,8 +180,9 @@ static WEBP_INLINE int WebPConfigInit(WebPConfig* config) {
// set of parameters (referred to by 'preset') and a given quality factor.
// This function can be called as a replacement to WebPConfigInit(). Will
// return false in case of error.
-static WEBP_INLINE int WebPConfigPreset(WebPConfig* config,
- WebPPreset preset, float quality) {
+WEBP_NODISCARD static WEBP_INLINE int WebPConfigPreset(WebPConfig* config,
+ WebPPreset preset,
+ float quality) {
return WebPConfigInitInternal(config, preset, quality,
WEBP_ENCODER_ABI_VERSION);
}
@@ -190,11 +193,12 @@ static WEBP_INLINE int WebPConfigPreset(WebPConfig* config,
// speed and final compressed size.
// This function will overwrite several fields from config: 'method', 'quality'
// and 'lossless'. Returns false in case of parameter error.
-WEBP_EXTERN int WebPConfigLosslessPreset(WebPConfig* config, int level);
+WEBP_NODISCARD WEBP_EXTERN int WebPConfigLosslessPreset(WebPConfig* config,
+ int level);
// Returns true if 'config' is non-NULL and all configuration parameters are
// within their valid ranges.
-WEBP_EXTERN int WebPValidateConfig(const WebPConfig* config);
+WEBP_NODISCARD WEBP_EXTERN int WebPValidateConfig(const WebPConfig* config);
//------------------------------------------------------------------------------
// Input / Output
@@ -254,8 +258,8 @@ WEBP_EXTERN void WebPMemoryWriterClear(WebPMemoryWriter* writer);
// The custom writer to be used with WebPMemoryWriter as custom_ptr. Upon
// completion, writer.mem and writer.size will hold the coded data.
// writer.mem must be freed by calling WebPMemoryWriterClear.
-WEBP_EXTERN int WebPMemoryWrite(const uint8_t* data, size_t data_size,
- const WebPPicture* picture);
+WEBP_NODISCARD WEBP_EXTERN int WebPMemoryWrite(
+ const uint8_t* data, size_t data_size, const WebPPicture* picture);
// Progress hook, called from time to time to report progress. It can return
// false to request an abort of the encoding process, or true otherwise if
@@ -291,6 +295,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
//////////////
@@ -358,13 +367,13 @@ struct WebPPicture {
};
// Internal, version-checked, entry point
-WEBP_EXTERN int WebPPictureInitInternal(WebPPicture*, int);
+WEBP_NODISCARD WEBP_EXTERN int WebPPictureInitInternal(WebPPicture*, int);
// Should always be called, to initialize the structure. Returns false in case
// of version mismatch. WebPPictureInit() must have succeeded before using the
// 'picture' object.
// Note that, by default, use_argb is false and colorspace is WEBP_YUV420.
-static WEBP_INLINE int WebPPictureInit(WebPPicture* picture) {
+WEBP_NODISCARD static WEBP_INLINE int WebPPictureInit(WebPPicture* picture) {
return WebPPictureInitInternal(picture, WEBP_ENCODER_ABI_VERSION);
}
@@ -375,7 +384,7 @@ static WEBP_INLINE int WebPPictureInit(WebPPicture* picture) {
// Allocate y/u/v buffers as per colorspace/width/height specification.
// Note! This function will free the previous buffer if needed.
// Returns false in case of memory error.
-WEBP_EXTERN int WebPPictureAlloc(WebPPicture* picture);
+WEBP_NODISCARD WEBP_EXTERN int WebPPictureAlloc(WebPPicture* picture);
// Release the memory allocated by WebPPictureAlloc() or WebPPictureImport*().
// Note that this function does _not_ free the memory used by the 'picture'
@@ -388,7 +397,8 @@ WEBP_EXTERN void WebPPictureFree(WebPPicture* picture);
// will fully own the copied pixels (this is not a view). The 'dst' picture need
// not be initialized as its content is overwritten.
// Returns false in case of memory allocation error.
-WEBP_EXTERN int WebPPictureCopy(const WebPPicture* src, WebPPicture* dst);
+WEBP_NODISCARD WEBP_EXTERN int WebPPictureCopy(const WebPPicture* src,
+ WebPPicture* dst);
// Compute the single distortion for packed planes of samples.
// 'src' will be compared to 'ref', and the raw distortion stored into
@@ -397,19 +407,18 @@ WEBP_EXTERN int WebPPictureCopy(const WebPPicture* src, WebPPicture* dst);
// 'x_step' is the horizontal stride (in bytes) between samples.
// 'src/ref_stride' is the byte distance between rows.
// Returns false in case of error (bad parameter, memory allocation error, ...).
-WEBP_EXTERN int WebPPlaneDistortion(const uint8_t* src, size_t src_stride,
- const uint8_t* ref, size_t ref_stride,
- int width, int height,
- size_t x_step,
- int type, // 0 = PSNR, 1 = SSIM, 2 = LSIM
- float* distortion, float* result);
+WEBP_NODISCARD WEBP_EXTERN int WebPPlaneDistortion(
+ const uint8_t* src, size_t src_stride,
+ const uint8_t* ref, size_t ref_stride, int width, int height, size_t x_step,
+ int type, // 0 = PSNR, 1 = SSIM, 2 = LSIM
+ float* distortion, float* result);
// Compute PSNR, SSIM or LSIM distortion metric between two pictures. Results
// are in dB, stored in result[] in the B/G/R/A/All order. The distortion is
// always performed using ARGB samples. Hence if the input is YUV(A), the
// picture will be internally converted to ARGB (just for the measurement).
// Warning: this function is rather CPU-intensive.
-WEBP_EXTERN int WebPPictureDistortion(
+WEBP_NODISCARD WEBP_EXTERN int WebPPictureDistortion(
const WebPPicture* src, const WebPPicture* ref,
int metric_type, // 0 = PSNR, 1 = SSIM, 2 = LSIM
float result[5]);
@@ -422,8 +431,8 @@ WEBP_EXTERN int WebPPictureDistortion(
// must be fully be comprised inside the 'src' source picture. If the source
// picture uses the YUV420 colorspace, the top and left coordinates will be
// snapped to even values.
-WEBP_EXTERN int WebPPictureCrop(WebPPicture* picture,
- int left, int top, int width, int height);
+WEBP_NODISCARD WEBP_EXTERN int WebPPictureCrop(
+ WebPPicture* picture, int left, int top, int width, int height);
// Extracts a view from 'src' picture into 'dst'. The rectangle for the view
// is defined by the top-left corner pixel coordinates (left, top) as well
@@ -435,10 +444,10 @@ 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.
-WEBP_EXTERN int WebPPictureView(const WebPPicture* src,
- int left, int top, int width, int height,
- WebPPicture* dst);
+// Returns false in case of invalid parameters.
+WEBP_NODISCARD WEBP_EXTERN int WebPPictureView(
+ const WebPPicture* src, int left, int top, int width, int height,
+ WebPPicture* dst);
// Returns true if the 'picture' is actually a view and therefore does
// not own the memory for pixels.
@@ -449,29 +458,30 @@ 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_NODISCARD 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.
// *rgb buffer should have a size of at least height * rgb_stride.
// Returns false in case of memory error.
-WEBP_EXTERN int WebPPictureImportRGB(
+WEBP_NODISCARD WEBP_EXTERN int WebPPictureImportRGB(
WebPPicture* picture, const uint8_t* rgb, int rgb_stride);
// Same, but for RGBA buffer.
-WEBP_EXTERN int WebPPictureImportRGBA(
+WEBP_NODISCARD WEBP_EXTERN int WebPPictureImportRGBA(
WebPPicture* picture, const uint8_t* rgba, int rgba_stride);
// Same, but for RGBA buffer. Imports the RGB direct from the 32-bit format
// input buffer ignoring the alpha channel. Avoids needing to copy the data
// to a temporary 24-bit RGB buffer to import the RGB only.
-WEBP_EXTERN int WebPPictureImportRGBX(
+WEBP_NODISCARD WEBP_EXTERN int WebPPictureImportRGBX(
WebPPicture* picture, const uint8_t* rgbx, int rgbx_stride);
// Variants of the above, but taking BGR(A|X) input.
-WEBP_EXTERN int WebPPictureImportBGR(
+WEBP_NODISCARD WEBP_EXTERN int WebPPictureImportBGR(
WebPPicture* picture, const uint8_t* bgr, int bgr_stride);
-WEBP_EXTERN int WebPPictureImportBGRA(
+WEBP_NODISCARD WEBP_EXTERN int WebPPictureImportBGRA(
WebPPicture* picture, const uint8_t* bgra, int bgra_stride);
-WEBP_EXTERN int WebPPictureImportBGRX(
+WEBP_NODISCARD WEBP_EXTERN int WebPPictureImportBGRX(
WebPPicture* picture, const uint8_t* bgrx, int bgrx_stride);
// Converts picture->argb data to the YUV420A format. The 'colorspace'
@@ -480,24 +490,24 @@ WEBP_EXTERN int WebPPictureImportBGRX(
// non-opaque transparent values is detected, and 'colorspace' will be
// adjusted accordingly. Note that this method is lossy.
// Returns false in case of error.
-WEBP_EXTERN int WebPPictureARGBToYUVA(WebPPicture* picture,
- WebPEncCSP /*colorspace = WEBP_YUV420*/);
+WEBP_NODISCARD WEBP_EXTERN int WebPPictureARGBToYUVA(
+ WebPPicture* picture, WebPEncCSP /*colorspace = WEBP_YUV420*/);
// Same as WebPPictureARGBToYUVA(), but the conversion is done using
// pseudo-random dithering with a strength 'dithering' between
// 0.0 (no dithering) and 1.0 (maximum dithering). This is useful
// for photographic picture.
-WEBP_EXTERN int WebPPictureARGBToYUVADithered(
+WEBP_NODISCARD WEBP_EXTERN int WebPPictureARGBToYUVADithered(
WebPPicture* picture, WebPEncCSP colorspace, float dithering);
-// Performs 'sharp' RGBA->YUVA420 downsampling and colorspace conversion.
+// Performs 'sharp' RGBA->YUVA420 downsampling and colorspace conversion
// Downsampling is handled with extra care in case of color clipping. This
// method is roughly 2x slower than WebPPictureARGBToYUVA() but produces better
// and sharper YUV representation.
// Returns false in case of error.
-WEBP_EXTERN int WebPPictureSharpARGBToYUVA(WebPPicture* picture);
+WEBP_NODISCARD WEBP_EXTERN int WebPPictureSharpARGBToYUVA(WebPPicture* picture);
// kept for backward compatibility:
-WEBP_EXTERN int WebPPictureSmartARGBToYUVA(WebPPicture* picture);
+WEBP_NODISCARD WEBP_EXTERN int WebPPictureSmartARGBToYUVA(WebPPicture* picture);
// Converts picture->yuv to picture->argb and sets picture->use_argb to true.
// The input format must be YUV_420 or YUV_420A. The conversion from YUV420 to
@@ -505,7 +515,7 @@ WEBP_EXTERN int WebPPictureSmartARGBToYUVA(WebPPicture* picture);
// Note that the use of this colorspace is discouraged if one has access to the
// raw ARGB samples, since using YUV420 is comparatively lossy.
// Returns false in case of error.
-WEBP_EXTERN int WebPPictureYUVAToARGB(WebPPicture* picture);
+WEBP_NODISCARD WEBP_EXTERN int WebPPictureYUVAToARGB(WebPPicture* picture);
// Helper function: given a width x height plane of RGBA or YUV(A) samples
// clean-up or smoothen the YUV or RGB samples under fully transparent area,
@@ -520,7 +530,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
@@ -535,7 +545,8 @@ WEBP_EXTERN void WebPBlendAlpha(WebPPicture* pic, uint32_t background_rgb);
// the former for lossy encoding, and the latter for lossless encoding
// (when config.lossless is true). Automatic conversion from one format to
// another is provided but they both incur some loss.
-WEBP_EXTERN int WebPEncode(const WebPConfig* config, WebPPicture* picture);
+WEBP_NODISCARD WEBP_EXTERN int WebPEncode(const WebPConfig* config,
+ WebPPicture* picture);
//------------------------------------------------------------------------------
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 7d27489..8fb067e 100644
--- a/src/3rdparty/libwebp/src/webp/mux.h
+++ b/src/3rdparty/libwebp/src/webp/mux.h
@@ -16,12 +16,13 @@
#define WEBP_WEBP_MUX_H_
#include "./mux_types.h"
+#include "./types.h"
#ifdef __cplusplus
extern "C" {
#endif
-#define WEBP_MUX_ABI_VERSION 0x0108 // MAJOR(8b) + MINOR(8b)
+#define WEBP_MUX_ABI_VERSION 0x0109 // MAJOR(8b) + MINOR(8b)
//------------------------------------------------------------------------------
// Mux API
@@ -70,7 +71,7 @@ typedef struct WebPMuxAnimParams WebPMuxAnimParams;
typedef struct WebPAnimEncoderOptions WebPAnimEncoderOptions;
// Error codes
-typedef enum WebPMuxError {
+typedef enum WEBP_NODISCARD WebPMuxError {
WEBP_MUX_OK = 1,
WEBP_MUX_NOT_FOUND = 0,
WEBP_MUX_INVALID_ARGUMENT = -1,
@@ -104,13 +105,13 @@ WEBP_EXTERN int WebPGetMuxVersion(void);
// Life of a Mux object
// Internal, version-checked, entry point
-WEBP_EXTERN WebPMux* WebPNewInternal(int);
+WEBP_NODISCARD WEBP_EXTERN WebPMux* WebPNewInternal(int);
// Creates an empty mux object.
// Returns:
// A pointer to the newly created empty mux object.
// Or NULL in case of memory error.
-static WEBP_INLINE WebPMux* WebPMuxNew(void) {
+WEBP_NODISCARD static WEBP_INLINE WebPMux* WebPMuxNew(void) {
return WebPNewInternal(WEBP_MUX_ABI_VERSION);
}
@@ -123,18 +124,21 @@ WEBP_EXTERN void WebPMuxDelete(WebPMux* mux);
// Mux creation.
// Internal, version-checked, entry point
-WEBP_EXTERN WebPMux* WebPMuxCreateInternal(const WebPData*, int, int);
+WEBP_NODISCARD WEBP_EXTERN WebPMux* WebPMuxCreateInternal(const WebPData*, int,
+ int);
// Creates a mux object from raw data given in WebP RIFF format.
// Parameters:
// bitstream - (in) the bitstream data in WebP RIFF format
// copy_data - (in) value 1 indicates given data WILL be copied to the mux
-// object and value 0 indicates data will NOT be copied.
+// object and value 0 indicates data will NOT be copied. If the
+// data is not copied, it must exist for the lifetime of the
+// mux object.
// Returns:
// A pointer to the mux object created from given data - on success.
// NULL - In case of invalid data or memory error.
-static WEBP_INLINE WebPMux* WebPMuxCreate(const WebPData* bitstream,
- int copy_data) {
+WEBP_NODISCARD static WEBP_INLINE WebPMux* WebPMuxCreate(
+ const WebPData* bitstream, int copy_data) {
return WebPMuxCreateInternal(bitstream, copy_data, WEBP_MUX_ABI_VERSION);
}
@@ -154,7 +158,9 @@ static WEBP_INLINE WebPMux* WebPMuxCreate(const WebPData* bitstream,
// e.g., "ICCP", "XMP ", "EXIF" etc.
// chunk_data - (in) the chunk data to be added
// copy_data - (in) value 1 indicates given data WILL be copied to the mux
-// object and value 0 indicates data will NOT be copied.
+// object and value 0 indicates data will NOT be copied. If the
+// data is not copied, it must exist until a call to
+// WebPMuxAssemble() is made.
// Returns:
// WEBP_MUX_INVALID_ARGUMENT - if mux, fourcc or chunk_data is NULL
// or if fourcc corresponds to an image chunk.
@@ -217,7 +223,9 @@ struct WebPMuxFrameInfo {
// bitstream - (in) can be a raw VP8/VP8L bitstream or a single-image
// WebP file (non-animated)
// copy_data - (in) value 1 indicates given data WILL be copied to the mux
-// object and value 0 indicates data will NOT be copied.
+// object and value 0 indicates data will NOT be copied. If the
+// data is not copied, it must exist until a call to
+// WebPMuxAssemble() is made.
// Returns:
// WEBP_MUX_INVALID_ARGUMENT - if mux is NULL or bitstream is NULL.
// WEBP_MUX_MEMORY_ERROR - on memory allocation error.
@@ -235,7 +243,9 @@ WEBP_EXTERN WebPMuxError WebPMuxSetImage(
// mux - (in/out) object to which the frame is to be added
// frame - (in) frame data.
// copy_data - (in) value 1 indicates given data WILL be copied to the mux
-// object and value 0 indicates data will NOT be copied.
+// object and value 0 indicates data will NOT be copied. If the
+// data is not copied, it must exist until a call to
+// WebPMuxAssemble() is made.
// Returns:
// WEBP_MUX_INVALID_ARGUMENT - if mux or frame is NULL
// or if content of 'frame' is invalid.
@@ -449,7 +459,7 @@ WEBP_EXTERN int WebPAnimEncoderOptionsInitInternal(
// structure before modification. Returns false in case of version mismatch.
// WebPAnimEncoderOptionsInit() must have succeeded before using the
// 'enc_options' object.
-static WEBP_INLINE int WebPAnimEncoderOptionsInit(
+WEBP_NODISCARD static WEBP_INLINE int WebPAnimEncoderOptionsInit(
WebPAnimEncoderOptions* enc_options) {
return WebPAnimEncoderOptionsInitInternal(enc_options, WEBP_MUX_ABI_VERSION);
}
@@ -490,7 +500,7 @@ static WEBP_INLINE WebPAnimEncoder* WebPAnimEncoderNew(
// Returns:
// On error, returns false and frame->error_code is set appropriately.
// Otherwise, returns true.
-WEBP_EXTERN int WebPAnimEncoderAdd(
+WEBP_NODISCARD WEBP_EXTERN int WebPAnimEncoderAdd(
WebPAnimEncoder* enc, struct WebPPicture* frame, int timestamp_ms,
const struct WebPConfig* config);
@@ -503,8 +513,8 @@ WEBP_EXTERN int WebPAnimEncoderAdd(
// webp_data - (out) generated WebP bitstream.
// Returns:
// True on success.
-WEBP_EXTERN int WebPAnimEncoderAssemble(WebPAnimEncoder* enc,
- WebPData* webp_data);
+WEBP_NODISCARD WEBP_EXTERN int WebPAnimEncoderAssemble(WebPAnimEncoder* enc,
+ WebPData* webp_data);
// Get error string corresponding to the most recent call using 'enc'. The
// returned string is owned by 'enc' and is valid only until the next call to
@@ -522,6 +532,57 @@ WEBP_EXTERN const char* WebPAnimEncoderGetError(WebPAnimEncoder* enc);
WEBP_EXTERN void WebPAnimEncoderDelete(WebPAnimEncoder* enc);
//------------------------------------------------------------------------------
+// Non-image chunks.
+
+// Note: Only non-image related chunks should be managed through chunk APIs.
+// (Image related chunks are: "ANMF", "VP8 ", "VP8L" and "ALPH").
+
+// Adds a chunk with id 'fourcc' and data 'chunk_data' in the enc object.
+// Any existing chunk(s) with the same id will be removed.
+// Parameters:
+// enc - (in/out) object to which the chunk is to be added
+// fourcc - (in) a character array containing the fourcc of the given chunk;
+// e.g., "ICCP", "XMP ", "EXIF", etc.
+// chunk_data - (in) the chunk data to be added
+// copy_data - (in) value 1 indicates given data WILL be copied to the enc
+// object and value 0 indicates data will NOT be copied. If the
+// data is not copied, it must exist until a call to
+// WebPAnimEncoderAssemble() is made.
+// Returns:
+// WEBP_MUX_INVALID_ARGUMENT - if enc, fourcc or chunk_data is NULL.
+// WEBP_MUX_MEMORY_ERROR - on memory allocation error.
+// WEBP_MUX_OK - on success.
+WEBP_EXTERN WebPMuxError WebPAnimEncoderSetChunk(
+ WebPAnimEncoder* enc, const char fourcc[4], const WebPData* chunk_data,
+ int copy_data);
+
+// Gets a reference to the data of the chunk with id 'fourcc' in the enc object.
+// The caller should NOT free the returned data.
+// Parameters:
+// enc - (in) object from which the chunk data is to be fetched
+// fourcc - (in) a character array containing the fourcc of the chunk;
+// e.g., "ICCP", "XMP ", "EXIF", etc.
+// chunk_data - (out) returned chunk data
+// Returns:
+// WEBP_MUX_INVALID_ARGUMENT - if enc, fourcc or chunk_data is NULL.
+// WEBP_MUX_NOT_FOUND - If enc does not contain a chunk with the given id.
+// WEBP_MUX_OK - on success.
+WEBP_EXTERN WebPMuxError WebPAnimEncoderGetChunk(
+ const WebPAnimEncoder* enc, const char fourcc[4], WebPData* chunk_data);
+
+// Deletes the chunk with the given 'fourcc' from the enc object.
+// Parameters:
+// enc - (in/out) object from which the chunk is to be deleted
+// fourcc - (in) a character array containing the fourcc of the chunk;
+// e.g., "ICCP", "XMP ", "EXIF", etc.
+// Returns:
+// WEBP_MUX_INVALID_ARGUMENT - if enc or fourcc is NULL.
+// WEBP_MUX_NOT_FOUND - If enc does not contain a chunk with the given fourcc.
+// WEBP_MUX_OK - on success.
+WEBP_EXTERN WebPMuxError WebPAnimEncoderDeleteChunk(
+ WebPAnimEncoder* enc, const char fourcc[4]);
+
+//------------------------------------------------------------------------------
#ifdef __cplusplus
} // extern "C"
diff --git a/src/3rdparty/libwebp/src/webp/mux_types.h b/src/3rdparty/libwebp/src/webp/mux_types.h
index 2fe8195..c585d20 100644
--- a/src/3rdparty/libwebp/src/webp/mux_types.h
+++ b/src/3rdparty/libwebp/src/webp/mux_types.h
@@ -79,7 +79,8 @@ static WEBP_INLINE void WebPDataClear(WebPData* webp_data) {
// Allocates necessary storage for 'dst' and copies the contents of 'src'.
// Returns true on success.
-static WEBP_INLINE int WebPDataCopy(const WebPData* src, WebPData* dst) {
+WEBP_NODISCARD 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) {
diff --git a/src/3rdparty/libwebp/src/webp/types.h b/src/3rdparty/libwebp/src/webp/types.h
index 47f7f2b..9c17ede 100644
--- a/src/3rdparty/libwebp/src/webp/types.h
+++ b/src/3rdparty/libwebp/src/webp/types.h
@@ -36,14 +36,39 @@ typedef long long int int64_t;
#define WEBP_INLINE __forceinline
#endif /* _MSC_VER */
+#ifndef WEBP_NODISCARD
+#if defined(WEBP_ENABLE_NODISCARD) && WEBP_ENABLE_NODISCARD
+#if (defined(__cplusplus) && __cplusplus >= 201700L) || \
+ (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L)
+#define WEBP_NODISCARD [[nodiscard]]
+#else
+// gcc's __has_attribute does not work for enums.
+#if defined(__clang__) && defined(__has_attribute)
+#if __has_attribute(warn_unused_result)
+#define WEBP_NODISCARD __attribute__((warn_unused_result))
+#else
+#define WEBP_NODISCARD
+#endif /* __has_attribute(warn_unused_result) */
+#else
+#define WEBP_NODISCARD
+#endif /* defined(__clang__) && defined(__has_attribute) */
+#endif /* (defined(__cplusplus) && __cplusplus >= 201700L) ||
+ (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L) */
+#else
+#define WEBP_NODISCARD
+#endif /* defined(WEBP_ENABLE_NODISCARD) && WEBP_ENABLE_NODISCARD */
+#endif /* WEBP_NODISCARD */
+
#ifndef WEBP_EXTERN
// This explicitly marks library functions and allows for changing the
// signature for e.g., Windows DLL builds.
-# if defined(__GNUC__) && __GNUC__ >= 4
+# if defined(_WIN32) && defined(WEBP_DLL)
+# define WEBP_EXTERN __declspec(dllexport)
+# elif defined(__GNUC__) && __GNUC__ >= 4
# define WEBP_EXTERN extern __attribute__ ((visibility ("default")))
# else
# define WEBP_EXTERN extern
-# endif /* __GNUC__ >= 4 */
+# endif /* defined(_WIN32) && defined(WEBP_DLL) */
#endif /* WEBP_EXTERN */
// Macro to check ABI compatibility (same major revision number)
@@ -56,7 +81,7 @@ extern "C" {
// 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);
+WEBP_NODISCARD WEBP_EXTERN void* WebPMalloc(size_t size);
// Releases memory returned by the WebPDecode*() functions (from decode.h).
WEBP_EXTERN void WebPFree(void* ptr);
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index e436fa0..d912f7c 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,4 +1,5 @@
-# Generated from src.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
add_subdirectory(imageformats)
add_subdirectory(plugins)
diff --git a/src/imageformats/CMakeLists.txt b/src/imageformats/CMakeLists.txt
index 989075a..6315170 100644
--- a/src/imageformats/CMakeLists.txt
+++ b/src/imageformats/CMakeLists.txt
@@ -1,2 +1,8 @@
-# Generated from imageformats.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+add_library(ImageFormats INTERFACE)
+qt_internal_add_docs(ImageFormats
+ doc/qtimageformats.qdocconf
+)
diff --git a/src/imageformats/configure.cmake b/src/imageformats/configure.cmake
index 0345752..2896b3f 100644
--- a/src/imageformats/configure.cmake
+++ b/src/imageformats/configure.cmake
@@ -1,3 +1,6 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
#### Inputs
@@ -16,7 +19,14 @@ set_property(CACHE INPUT_webp PROPERTY STRINGS undefined no qt system)
qt_find_package(WrapJasper PROVIDED_TARGETS WrapJasper::WrapJasper MODULE_NAME imageformats QMAKE_LIB jasper)
qt_find_package(TIFF PROVIDED_TARGETS TIFF::TIFF MODULE_NAME imageformats QMAKE_LIB tiff)
+# Threads::Threads might be brought in via a top-level CMakeLists.txt find_package dependency
+# in which case if the system WebpConfig.cmake depends Threads, it shouldn't try to promote it to
+# global to avoid a 'global promotion of a target in a different subdirectory' error.
+if(TARGET Threads::Threads)
+ qt_internal_disable_find_package_global_promotion(Threads::Threads)
+endif()
qt_find_package(WrapWebP PROVIDED_TARGETS WrapWebP::WrapWebP MODULE_NAME imageformats QMAKE_LIB webp)
+qt_find_package(Libmng PROVIDED_TARGETS Libmng::Libmng MODULE_NAME imageformats QMAKE_LIB mng)
#### Tests
@@ -33,12 +43,12 @@ qt_feature("jasper" PRIVATE
qt_feature_definition("jasper" "QT_NO_IMAGEFORMAT_JASPER" NEGATE)
qt_feature("mng" PRIVATE
LABEL "MNG"
- CONDITION libs.mng OR FIXME
+ CONDITION Libmng_FOUND
DISABLE INPUT_mng STREQUAL 'no'
)
qt_feature("tiff" PRIVATE
LABEL "TIFF"
- CONDITION QT_FEATURE_imageformatplugin AND TIFF_FOUND
+ CONDITION QT_FEATURE_imageformatplugin
DISABLE INPUT_tiff STREQUAL 'no'
)
qt_feature("system-tiff" PRIVATE
@@ -49,7 +59,7 @@ qt_feature("system-tiff" PRIVATE
)
qt_feature("webp" PRIVATE
LABEL "WEBP"
- CONDITION QT_FEATURE_imageformatplugin AND WrapWebP_FOUND
+ CONDITION QT_FEATURE_imageformatplugin
DISABLE INPUT_webp STREQUAL 'no'
)
qt_feature("system-webp" PRIVATE
diff --git a/src/imageformats/configure.json b/src/imageformats/configure.json
deleted file mode 100644
index 5ece40b..0000000
--- a/src/imageformats/configure.json
+++ /dev/null
@@ -1,183 +0,0 @@
-{
- "module": "imageformats",
- "depends": [
- "gui"
- ],
- "condition": "module.gui",
-
- "commandline": {
- "options": {
- "jasper": { "type": "boolean" },
- "mng": { "type": "boolean" },
- "tiff": { "type": "enum", "values": [ "no", "qt", "system" ] },
- "webp": { "type": "enum", "values": [ "no", "qt", "system" ] }
- }
- },
-
- "libraries": {
- "jasper": {
- "headers": "jasper/jasper.h",
- "test": {
- "include": [
- "string.h",
- "jasper/jasper.h"
- ],
- "head": [
- "constexpr bool streq(const char *a, const char *b)",
- "{",
- " return a[0] == b[0] && (!a[0] || streq(a + 1, b + 1));",
- "}"
- ],
- "main": [
- "static_assert(!streq(JAS_VERSION, \"1.900.0\"),",
- " \"JasPer version 1.900.0 is considered broken.\");"
- ]
- },
- "sources": [
- { "type": "pkgConfig", "args": "jasper" },
- { "libs": "-ljasper" }
- ]
- },
- "mng": {
- "headers": "libmng.h",
- "test": {
- "include": [
- "stdio.h",
- "libmng.h"
- ],
- "main": [
- "mng_handle hMNG;",
- "mng_cleanup(&hMNG);",
- "#if defined(MNG_VERSION_MAJOR)",
- "#if MNG_VERSION_MAJOR < 1 || (MNG_VERSION_MAJOR == 1 && MNG_VERSION_MINOR == 0 && MNG_VERSION_RELEASE < 9)",
- "#error System libmng version is less than 1.0.9",
- "#endif",
- "#endif"
- ]
- },
- "sources": [
- { "type": "pkgConfig", "args": "libmng" },
- { "libs": "-lmng" }
- ]
- },
- "tiff": {
- "headers": "tiffio.h",
- "test": {
- "main": [
- "#if !defined(TIFF_VERSION) && defined(TIFF_VERSION_CLASSIC)",
- "// libtiff 4.0 splits it into TIFF_VERSION_CLASSIC and TIFF_VERSION_BIG",
- "# define TIFF_VERSION TIFF_VERSION_CLASSIC",
- "#endif",
-
- "#if !defined(TIFF_VERSION)",
- "# error \"Required libtiff not found\"",
- "#elif TIFF_VERSION < 42",
- "# error \"unsupported tiff version\"",
- "#endif",
-
- "tdata_t buffer = _TIFFmalloc(128);",
- "_TIFFfree(buffer);",
-
- "// some libtiff implementations where TIFF_VERSION >= 42 do not",
- "// have TIFFReadRGBAImageOriented(), so let's check for it",
- "TIFFReadRGBAImageOriented(0, 0, 0, 0, 0, 0);"
- ]
- },
- "sources": [
- { "type": "pkgConfig", "args": "libtiff-4" },
- { "libs": "-ltiff" }
- ]
- },
- "webp": {
- "headers": [
- "webp/decode.h",
- "webp/encode.h",
- "webp/demux.h",
- "webp/mux.h"
- ],
- "test": {
- "main": [
- "#if WEBP_ABI_IS_INCOMPATIBLE(WEBP_DECODER_ABI_VERSION, 0x0203) || WEBP_ABI_IS_INCOMPATIBLE(WEBP_ENCODER_ABI_VERSION, 0x0202)",
- "#error \"Incompatible libwebp version\"",
- "#endif",
-
- "WebPDecoderConfig config;",
- "WebPDecBuffer *output_buffer = &config.output;",
- "WebPBitstreamFeatures *bitstream = &config.input;",
- "WebPPicture picture;",
- "picture.use_argb = 0;",
- "WebPConfig config2;",
- "config2.lossless = 0;",
- "WebPData data = {};",
- "WebPDemuxer *demuxer = WebPDemux(&data);",
- "WebPIterator iter;",
- "iter.frame_num = 0;"
- ]
- },
- "sources": [
- { "type": "pkgConfig", "args": "libwebp libwebpmux libwebpdemux" },
- { "libs": "-lwebp -lwebpdemux -lwebpmux" }
- ]
- }
- },
-
- "features": {
- "jasper": {
- "label": "JasPer",
- "disable": "input.jasper == 'no'",
- "condition": "features.imageformatplugin && libs.jasper",
- "output": [
- "privateFeature",
- { "type": "define", "negative": true, "name": "QT_NO_IMAGEFORMAT_JASPER" }
- ]
- },
- "mng": {
- "label": "MNG",
- "disable": "input.mng == 'no'",
- "condition": "libs.mng",
- "output": [ "privateFeature" ]
- },
- "tiff": {
- "label": "TIFF",
- "disable": "input.tiff == 'no'",
- "condition": "features.imageformatplugin",
- "output": [
- "privateFeature"
- ]
- },
- "system-tiff": {
- "label": " Using system libtiff",
- "disable": "input.tiff == 'qt'",
- "enable": "input.tiff == 'system'",
- "condition": "features.tiff && libs.tiff",
- "output": [ "privateFeature" ]
- },
- "webp": {
- "label": "WEBP",
- "disable": "input.webp == 'no'",
- "condition": "features.imageformatplugin",
- "output": [
- "privateFeature"
- ]
- },
- "system-webp": {
- "label": " Using system libwebp",
- "disable": "input.webp == 'qt'",
- "enable": "input.webp == 'system'",
- "condition": "features.webp && libs.webp",
- "output": [ "privateFeature" ]
- }
- },
-
- "summary": [
- {
- "section": "Further Image Formats",
- "entries": [
- "jasper",
- "mng",
- "tiff", "system-tiff",
- "webp", "system-webp"
- ]
- }
- ]
-}
diff --git a/src/imageformats/doc/src/qtimageformats.qdoc b/src/imageformats/doc/src/qtimageformats.qdoc
index 48b76c8..3b77c45 100644
--- a/src/imageformats/doc/src/qtimageformats.qdoc
+++ b/src/imageformats/doc/src/qtimageformats.qdoc
@@ -1,34 +1,10 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Image Formats module.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\title Qt Image Formats
\page qtimageformats-index.html
-\brief Qt Image Formats module provides support for extra image file formats
+\brief Qt Image Formats module provides support for extra image file formats.
The core Qt Gui library by default supports reading and writing image
files of the most common file formats: \c PNG, \c JPEG, \c BMP, \c GIF
@@ -52,8 +28,11 @@ libraries. If not found, it may fall back on using a bundled copy (in
\table
\header \li Format \li Description \li Support \li 3rd Party Codec
+\row \li HEIC \li High Efficiency Video Coding \li No \li
+\row \li \li - On Apple operating systems: \li Read/write \li Yes, OS built-in
\row \li ICNS \li Apple Icon Image \li Read/write \li No
\row \li JP2 \li Joint Photographic Experts Group 2000 \li Read/write \li Yes (Not bundled)
+\row \li \li - On Apple operating systems: \li Read/write \li Yes, OS built-in
\row \li MNG \li Multiple-image Network Graphics \li Read \li Yes (Not bundled)
\row \li TGA \li Truevision Graphics Adapter \li Read \li No
\row \li TIFF \li Tagged Image File Format \li Read/write \li Yes (bundled)
@@ -77,7 +56,7 @@ plugins/imageformats), together with the default image format
plugins. They may be deployed to the target system in the same way as
other plugins, see the \l{Deploying Plugins} documentation.
-\section2 Licenses and Attributions
+\section1 Licenses and Attributions
Qt Image Formats is available under commercial licenses from \l{The Qt Company}.
In addition, it is available under the
@@ -90,7 +69,7 @@ modules under following permissive licenses:
\generatelist{groupsbymodule attributions-qtimageformats}
-\section2 Security considerations
+\section1 Security Considerations
Since these file formats are more rarely used, the codecs may be less
thoroughly debugged against potential security holes. As always, care
diff --git a/src/imageformats/imageformats.pro b/src/imageformats/imageformats.pro
deleted file mode 100644
index 95ff5bc..0000000
--- a/src/imageformats/imageformats.pro
+++ /dev/null
@@ -1,3 +0,0 @@
-TEMPLATE = aux
-CONFIG += prepare_docs qt_docs_targets
-QMAKE_DOCS = $$PWD/doc/qtimageformats.qdocconf
diff --git a/src/imageformats/qt_cmdline.cmake b/src/imageformats/qt_cmdline.cmake
new file mode 100644
index 0000000..28a59b1
--- /dev/null
+++ b/src/imageformats/qt_cmdline.cmake
@@ -0,0 +1,7 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+qt_commandline_option(jasper TYPE boolean)
+qt_commandline_option(mng TYPE boolean)
+qt_commandline_option(tiff TYPE enum VALUES no qt system)
+qt_commandline_option(webp TYPE enum VALUES no qt system)
diff --git a/src/plugins/CMakeLists.txt b/src/plugins/CMakeLists.txt
index c1efdbc..506f9c4 100644
--- a/src/plugins/CMakeLists.txt
+++ b/src/plugins/CMakeLists.txt
@@ -1,3 +1,4 @@
-# Generated from plugins.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
add_subdirectory(imageformats)
diff --git a/src/plugins/imageformats/.prev_CMakeLists.txt b/src/plugins/imageformats/.prev_CMakeLists.txt
deleted file mode 100644
index da2ff9f..0000000
--- a/src/plugins/imageformats/.prev_CMakeLists.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-# Generated from imageformats.pro.
-
-add_subdirectory(tga)
-add_subdirectory(wbmp)
-if(QT_FEATURE_tiff)
- add_subdirectory(tiff)
-endif()
-if(QT_FEATURE_webp)
- add_subdirectory(webp)
-endif()
-if(APPLE)
- add_subdirectory(macheif)
-endif()
-if(QT_FEATURE_regularexpression)
- add_subdirectory(icns)
-endif()
-if(QT_FEATURE_mng)
- add_subdirectory(mng)
-endif()
-if(QT_FEATURE_jasper)
- add_subdirectory(jp2)
-endif()
-if(APPLE AND NOT QT_FEATURE_jasper)
- add_subdirectory(macjp2)
-endif()
diff --git a/src/plugins/imageformats/CMakeLists.txt b/src/plugins/imageformats/CMakeLists.txt
index 6f7cb49..56059f4 100644
--- a/src/plugins/imageformats/CMakeLists.txt
+++ b/src/plugins/imageformats/CMakeLists.txt
@@ -1,6 +1,6 @@
-# Generated from imageformats.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
-# special case begin
qt_feature_module_begin(
NO_MODULE
PUBLIC_FILE "qtimageformats-config.h"
@@ -8,7 +8,6 @@ qt_feature_module_begin(
)
include(../../imageformats/configure.cmake)
qt_feature_module_end(NO_MODULE)
-# special case end
add_subdirectory(tga)
add_subdirectory(wbmp)
@@ -24,7 +23,7 @@ endif()
if(QT_FEATURE_regularexpression)
add_subdirectory(icns)
endif()
-if(QT_FEATURE_mng AND OFF) # special case: FIXME
+if(QT_FEATURE_mng)
add_subdirectory(mng)
endif()
if(QT_FEATURE_jasper)
diff --git a/src/plugins/imageformats/dds/dds.pro b/src/plugins/imageformats/dds/dds.pro
deleted file mode 100644
index 00e64cb..0000000
--- a/src/plugins/imageformats/dds/dds.pro
+++ /dev/null
@@ -1,16 +0,0 @@
-TARGET = qdds
-
-HEADERS += \
- ddsheader.h \
- qddshandler.h
-
-SOURCES += \
- ddsheader.cpp \
- main.cpp \
- qddshandler.cpp
-
-OTHER_FILES += dds.json
-
-PLUGIN_TYPE = imageformats
-PLUGIN_CLASS_NAME = QDDSPlugin
-load(qt_plugin)
diff --git a/src/plugins/imageformats/dds/ddsheader.cpp b/src/plugins/imageformats/dds/ddsheader.cpp
index 25833f1..1bf04b3 100644
--- a/src/plugins/imageformats/dds/ddsheader.cpp
+++ b/src/plugins/imageformats/dds/ddsheader.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Ivan Komissarov.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the DDS plugin in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Ivan Komissarov.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "ddsheader.h"
diff --git a/src/plugins/imageformats/dds/ddsheader.h b/src/plugins/imageformats/dds/ddsheader.h
index f88c211..c638224 100644
--- a/src/plugins/imageformats/dds/ddsheader.h
+++ b/src/plugins/imageformats/dds/ddsheader.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Ivan Komissarov.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the DDS plugin in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Ivan Komissarov.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef DDSHEADER_H
#define DDSHEADER_H
diff --git a/src/plugins/imageformats/dds/main.cpp b/src/plugins/imageformats/dds/main.cpp
index 837a570..953ea72 100644
--- a/src/plugins/imageformats/dds/main.cpp
+++ b/src/plugins/imageformats/dds/main.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Ivan Komissarov.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the DDS plugin in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Ivan Komissarov.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <QtGui/qimageiohandler.h>
diff --git a/src/plugins/imageformats/dds/qddshandler.cpp b/src/plugins/imageformats/dds/qddshandler.cpp
index a0ac19b..673718f 100644
--- a/src/plugins/imageformats/dds/qddshandler.cpp
+++ b/src/plugins/imageformats/dds/qddshandler.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Ivan Komissarov.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the DDS plugin in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Ivan Komissarov.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qddshandler.h"
diff --git a/src/plugins/imageformats/dds/qddshandler.h b/src/plugins/imageformats/dds/qddshandler.h
index 0c6449a..6c11adf 100644
--- a/src/plugins/imageformats/dds/qddshandler.h
+++ b/src/plugins/imageformats/dds/qddshandler.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Ivan Komissarov.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the DDS plugin in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Ivan Komissarov.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QDDSHANDLER_H
#define QDDSHANDLER_H
diff --git a/src/plugins/imageformats/icns/.prev_CMakeLists.txt b/src/plugins/imageformats/icns/.prev_CMakeLists.txt
deleted file mode 100644
index 715e544..0000000
--- a/src/plugins/imageformats/icns/.prev_CMakeLists.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-# Generated from icns.pro.
-
-#####################################################################
-## QICNSPlugin Plugin:
-#####################################################################
-
-qt_add_plugin(QICNSPlugin
- OUTPUT_NAME qicns
- TYPE imageformats
- SOURCES
- main.cpp
- qicnshandler.cpp qicnshandler_p.h
- DEFINES
- QT_NO_CAST_FROM_ASCII
- QT_NO_CAST_TO_ASCII
- PUBLIC_LIBRARIES
- Qt::Core
- Qt::Gui
-)
-
-#### Keys ignored in scope 1:.:.:icns.pro:<TRUE>:
-# OTHER_FILES = "icns.json"
diff --git a/src/plugins/imageformats/icns/CMakeLists.txt b/src/plugins/imageformats/icns/CMakeLists.txt
index 715e544..49ee9ed 100644
--- a/src/plugins/imageformats/icns/CMakeLists.txt
+++ b/src/plugins/imageformats/icns/CMakeLists.txt
@@ -1,22 +1,20 @@
-# Generated from icns.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
#####################################################################
## QICNSPlugin Plugin:
#####################################################################
-qt_add_plugin(QICNSPlugin
+qt_internal_add_plugin(QICNSPlugin
OUTPUT_NAME qicns
- TYPE imageformats
+ PLUGIN_TYPE imageformats
SOURCES
main.cpp
qicnshandler.cpp qicnshandler_p.h
DEFINES
QT_NO_CAST_FROM_ASCII
QT_NO_CAST_TO_ASCII
- PUBLIC_LIBRARIES
+ LIBRARIES
Qt::Core
Qt::Gui
)
-
-#### Keys ignored in scope 1:.:.:icns.pro:<TRUE>:
-# OTHER_FILES = "icns.json"
diff --git a/src/plugins/imageformats/icns/icns.pro b/src/plugins/imageformats/icns/icns.pro
deleted file mode 100644
index 57da844..0000000
--- a/src/plugins/imageformats/icns/icns.pro
+++ /dev/null
@@ -1,16 +0,0 @@
-TARGET = qicns
-
-DEFINES += QT_NO_CAST_FROM_ASCII QT_NO_CAST_TO_ASCII
-
-HEADERS += \
- qicnshandler_p.h
-
-SOURCES += \
- main.cpp \
- qicnshandler.cpp
-
-OTHER_FILES += icns.json
-
-PLUGIN_TYPE = imageformats
-PLUGIN_CLASS_NAME = QICNSPlugin
-load(qt_plugin)
diff --git a/src/plugins/imageformats/icns/main.cpp b/src/plugins/imageformats/icns/main.cpp
index 6a5af47..0354d2a 100644
--- a/src/plugins/imageformats/icns/main.cpp
+++ b/src/plugins/imageformats/icns/main.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Alex Char.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Alex Char.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <QtGui/qimageiohandler.h>
#include "qicnshandler_p.h"
diff --git a/src/plugins/imageformats/icns/qicnshandler.cpp b/src/plugins/imageformats/icns/qicnshandler.cpp
index 05b8f5b..a78ae1a 100644
--- a/src/plugins/imageformats/icns/qicnshandler.cpp
+++ b/src/plugins/imageformats/icns/qicnshandler.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Alex Char.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Alex Char.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qicnshandler_p.h"
@@ -462,8 +426,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 +483,9 @@ static bool parseIconEntryInfo(ICNSEntry &icon)
}
icon.height = icon.width;
}
+ // Sanity check
+ if (icon.width == 0 || icon.width > 4096)
+ return false;
return true;
}
@@ -534,7 +505,9 @@ static QImage readMask(const ICNSEntry &mask, QDataStream &stream)
const qint64 oldPos = stream.device()->pos();
if (!stream.device()->seek(pos))
return QImage();
- QImage img(mask.width, mask.height, QImage::Format_RGB32);
+ QImage img;
+ if (!QImageIOHandler::allocateImage(QSize(mask.width, mask.height), QImage::Format_RGB32, &img))
+ return QImage();
quint8 byte = 0;
quint32 pixel = 0;
for (quint32 y = 0; y < mask.height; y++) {
@@ -564,7 +537,9 @@ static QImage readLowDepthIcon(const ICNSEntry &icon, QDataStream &stream)
const QList<QRgb> colortable = getColorTable(depth);
if (colortable.isEmpty())
return QImage();
- QImage img(icon.width, icon.height, format);
+ QImage img;
+ if (!QImageIOHandler::allocateImage(QSize(icon.width, icon.height), format, &img))
+ return QImage();
img.setColorTable(colortable);
quint32 pixel = 0;
quint8 byte = 0;
@@ -595,7 +570,9 @@ static QImage readLowDepthIcon(const ICNSEntry &icon, QDataStream &stream)
static QImage read32bitIcon(const ICNSEntry &icon, QDataStream &stream)
{
- QImage img = QImage(icon.width, icon.height, QImage::Format_RGB32);
+ QImage img;
+ if (!QImageIOHandler::allocateImage(QSize(icon.width, icon.height), QImage::Format_RGB32, &img))
+ return QImage();
if (icon.dataFormat != ICNSEntry::RLE24) {
for (quint32 y = 0; y < icon.height; y++) {
QRgb *line = reinterpret_cast<QRgb *>(img.scanLine(y));
@@ -685,7 +662,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;
}
@@ -892,7 +869,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);
@@ -927,11 +904,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;
@@ -1003,7 +983,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 dc6aba1..20e9e53 100644
--- a/src/plugins/imageformats/icns/qicnshandler_p.h
+++ b/src/plugins/imageformats/icns/qicnshandler_p.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Alex Char.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Alex Char.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QICNSHANDLER_P_H
#define QICNSHANDLER_P_H
@@ -121,7 +85,7 @@ struct ICNSEntry
{
}
};
-Q_DECLARE_TYPEINFO(ICNSEntry, Q_MOVABLE_TYPE);
+Q_DECLARE_TYPEINFO(ICNSEntry, Q_RELOCATABLE_TYPE);
class QICNSHandler : public QImageIOHandler
{
diff --git a/src/plugins/imageformats/imageformats.pro b/src/plugins/imageformats/imageformats.pro
deleted file mode 100644
index 4116591..0000000
--- a/src/plugins/imageformats/imageformats.pro
+++ /dev/null
@@ -1,23 +0,0 @@
-TEMPLATE = subdirs
-SUBDIRS = \
-# dds \
- tga \
- wbmp
-
-include($$OUT_PWD/../../imageformats/qtimageformats-config.pri)
-QT_FOR_CONFIG += imageformats-private
-
-qtConfig(tiff): SUBDIRS += tiff
-qtConfig(webp): SUBDIRS += webp
-
-darwin: SUBDIRS += macheif
-
-qtConfig(regularexpression): \
- SUBDIRS += icns
-
-qtConfig(mng): SUBDIRS += mng
-qtConfig(jasper) {
- SUBDIRS += jp2
-} else:darwin: {
- SUBDIRS += macjp2
-}
diff --git a/src/plugins/imageformats/jp2/.prev_CMakeLists.txt b/src/plugins/imageformats/jp2/.prev_CMakeLists.txt
deleted file mode 100644
index 7afc730..0000000
--- a/src/plugins/imageformats/jp2/.prev_CMakeLists.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-# Generated from jp2.pro.
-
-#####################################################################
-## QJp2Plugin Plugin:
-#####################################################################
-
-qt_add_plugin(QJp2Plugin
- OUTPUT_NAME qjp2
- TYPE imageformats
- SOURCES
- main.cpp
- qjp2handler.cpp qjp2handler_p.h
- LIBRARIES
- WrapJasper::WrapJasper
- PUBLIC_LIBRARIES
- Qt::Core
- Qt::Gui
-)
-
-#### Keys ignored in scope 1:.:.:jp2.pro:<TRUE>:
-# OTHER_FILES = "jp2.json"
-# QT_FOR_CONFIG = "imageformats-private"
diff --git a/src/plugins/imageformats/jp2/CMakeLists.txt b/src/plugins/imageformats/jp2/CMakeLists.txt
index 7afc730..a2819d1 100644
--- a/src/plugins/imageformats/jp2/CMakeLists.txt
+++ b/src/plugins/imageformats/jp2/CMakeLists.txt
@@ -1,22 +1,18 @@
-# Generated from jp2.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
#####################################################################
## QJp2Plugin Plugin:
#####################################################################
-qt_add_plugin(QJp2Plugin
+qt_internal_add_plugin(QJp2Plugin
OUTPUT_NAME qjp2
- TYPE imageformats
+ PLUGIN_TYPE imageformats
SOURCES
main.cpp
qjp2handler.cpp qjp2handler_p.h
LIBRARIES
WrapJasper::WrapJasper
- PUBLIC_LIBRARIES
Qt::Core
Qt::Gui
)
-
-#### Keys ignored in scope 1:.:.:jp2.pro:<TRUE>:
-# OTHER_FILES = "jp2.json"
-# QT_FOR_CONFIG = "imageformats-private"
diff --git a/src/plugins/imageformats/jp2/jp2.pro b/src/plugins/imageformats/jp2/jp2.pro
deleted file mode 100644
index d9fb4fa..0000000
--- a/src/plugins/imageformats/jp2/jp2.pro
+++ /dev/null
@@ -1,15 +0,0 @@
-TARGET = qjp2
-
-HEADERS += qjp2handler_p.h
-SOURCES += main.cpp \
- qjp2handler.cpp
-OTHER_FILES += jp2.json
-
-include($$OUT_PWD/../../../imageformats/qtimageformats-config.pri)
-QT_FOR_CONFIG += imageformats-private
-
-QMAKE_USE_PRIVATE += jasper
-
-PLUGIN_TYPE = imageformats
-PLUGIN_CLASS_NAME = QJp2Plugin
-load(qt_plugin)
diff --git a/src/plugins/imageformats/jp2/main.cpp b/src/plugins/imageformats/jp2/main.cpp
index 22368a5..3745331 100644
--- a/src/plugins/imageformats/jp2/main.cpp
+++ b/src/plugins/imageformats/jp2/main.cpp
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Petroules Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the JP2 plugins in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Petroules Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <qimageiohandler.h>
#include <qstringlist.h>
diff --git a/src/plugins/imageformats/jp2/qjp2handler.cpp b/src/plugins/imageformats/jp2/qjp2handler.cpp
index e9a470c..09a1c11 100644
--- a/src/plugins/imageformats/jp2/qjp2handler.cpp
+++ b/src/plugins/imageformats/jp2/qjp2handler.cpp
@@ -1,50 +1,16 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Petroules Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the JP2 plugins in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Petroules Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qjp2handler_p.h"
#include "qimage.h"
#include "qvariant.h"
#include "qcolor.h"
+#include "qimagereader.h"
#include <jasper/jasper.h>
+#include <math.h> // for pow
QT_BEGIN_NAMESPACE
@@ -332,16 +298,47 @@ 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)
+ if (QImageReader::allocationLimit() > 0)
+ jas_conf_set_max_mem_usage(qsizetype(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
@@ -572,17 +569,13 @@ bool Jpeg2000JasperReader::read(QImage *pImage)
}
// Create a QImage of the correct type
- if (jasperColorspaceFamily == JAS_CLRSPC_FAM_RGB) {
- qtImage = QImage(qtWidth, qtHeight, hasAlpha
- ? QImage::Format_ARGB32
- : QImage::Format_RGB32);
- } else if (jasperColorspaceFamily == JAS_CLRSPC_FAM_GRAY) {
- if (hasAlpha) {
- qtImage = QImage(qtWidth, qtHeight, QImage::Format_ARGB32);
- } else {
- qtImage = QImage(qtWidth, qtHeight, QImage::Format_Grayscale8);
- }
- }
+ QImage::Format qtFormat = QImage::Format_Invalid;
+ if (jasperColorspaceFamily == JAS_CLRSPC_FAM_RGB)
+ qtFormat = hasAlpha ? QImage::Format_ARGB32 : QImage::Format_RGB32;
+ else if (jasperColorspaceFamily == JAS_CLRSPC_FAM_GRAY)
+ qtFormat = hasAlpha ? QImage::Format_ARGB32 : QImage::Format_Grayscale8;
+ if (!QImageIOHandler::allocateImage(QSize(qtWidth, qtHeight), qtFormat, &qtImage))
+ return false;
// Copy data
if (oddComponentSubsampling) {
@@ -856,7 +849,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());
@@ -1198,7 +1191,7 @@ void Jpeg2000JasperReader::printMetadata(jas_image_t *image)
qDebug("Component metadata:");
- for (int c = 0; c < jas_image_numcmpts(image); ++c) {
+ for (int c = 0; c < static_cast<int>(jas_image_numcmpts(image)); ++c) {
qDebug("Component %d:", c);
qDebug(" Component type: %ld", long(jas_image_cmpttype(image, c)));
qDebug(" Width: %ld", long(jas_image_cmptwidth(image, c)));
diff --git a/src/plugins/imageformats/jp2/qjp2handler_p.h b/src/plugins/imageformats/jp2/qjp2handler_p.h
index bdaf601..6a4ca3e 100644
--- a/src/plugins/imageformats/jp2/qjp2handler_p.h
+++ b/src/plugins/imageformats/jp2/qjp2handler_p.h
@@ -1,42 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Petroules Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the JP2 plugins in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Petroules Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QJP2HANDLER_H
#define QJP2HANDLER_H
diff --git a/src/plugins/imageformats/macheif/.prev_CMakeLists.txt b/src/plugins/imageformats/macheif/.prev_CMakeLists.txt
deleted file mode 100644
index 9618984..0000000
--- a/src/plugins/imageformats/macheif/.prev_CMakeLists.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-# Generated from macheif.pro.
-
-#####################################################################
-## QMacHeifPlugin Plugin:
-#####################################################################
-
-qt_add_plugin(QMacHeifPlugin
- OUTPUT_NAME qmacheif
- TYPE imageformats
- SOURCES
- ../shared/qiiofhelpers.cpp ../shared/qiiofhelpers_p.h
- main.cpp
- qmacheifhandler.cpp qmacheifhandler.h
- INCLUDE_DIRECTORIES
- ../shared
- PUBLIC_LIBRARIES
- ${FWCoreFoundation}
- ${FWCoreGraphics}
- ${FWImageIO}
- Qt::Core
- Qt::CorePrivate
- Qt::Gui
- Qt::GuiPrivate
-)
-
-#### Keys ignored in scope 1:.:.:macheif.pro:<TRUE>:
-# OTHER_FILES = "macheif.json"
diff --git a/src/plugins/imageformats/macheif/CMakeLists.txt b/src/plugins/imageformats/macheif/CMakeLists.txt
index 7d90b40..6ceee54 100644
--- a/src/plugins/imageformats/macheif/CMakeLists.txt
+++ b/src/plugins/imageformats/macheif/CMakeLists.txt
@@ -1,25 +1,27 @@
-# Generated from macheif.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
#####################################################################
## QMacHeifPlugin Plugin:
#####################################################################
-# special case begin
-find_library(FWCoreFoundation CoreFoundation)
-find_library(FWCoreGraphics CoreGraphics)
-find_library(FWImageIO ImageIO)
-# special case end
+qt_internal_find_apple_system_framework(FWCoreFoundation
+ CoreFoundation)
+qt_internal_find_apple_system_framework(FWCoreGraphics CoreGraphics)
+qt_internal_find_apple_system_framework(FWImageIO ImageIO)
-qt_add_plugin(QMacHeifPlugin
+qt_internal_add_plugin(QMacHeifPlugin
OUTPUT_NAME qmacheif
- TYPE imageformats
+ PLUGIN_TYPE imageformats
SOURCES
../shared/qiiofhelpers.cpp ../shared/qiiofhelpers_p.h
main.cpp
qmacheifhandler.cpp qmacheifhandler.h
INCLUDE_DIRECTORIES
../shared
- PUBLIC_LIBRARIES
+ DEFINES
+ NS_IIOF_HELPERS=QMacHeif
+ LIBRARIES
${FWCoreFoundation}
${FWCoreGraphics}
${FWImageIO}
@@ -28,6 +30,3 @@ qt_add_plugin(QMacHeifPlugin
Qt::Gui
Qt::GuiPrivate
)
-
-#### Keys ignored in scope 1:.:.:macheif.pro:<TRUE>:
-# OTHER_FILES = "macheif.json"
diff --git a/src/plugins/imageformats/macheif/macheif.pro b/src/plugins/imageformats/macheif/macheif.pro
deleted file mode 100644
index 38e8087..0000000
--- a/src/plugins/imageformats/macheif/macheif.pro
+++ /dev/null
@@ -1,20 +0,0 @@
-TARGET = qmacheif
-PLUGIN_TYPE = imageformats
-PLUGIN_CLASS_NAME = QMacHeifPlugin
-
-LIBS += -framework CoreFoundation -framework CoreGraphics -framework ImageIO
-
-QT += core-private gui-private
-
-SOURCES += \
- qmacheifhandler.cpp \
- main.cpp
-
-HEADERS += \
- qmacheifhandler.h
-
-include (../shared/qiiofhelpers.pri)
-
-OTHER_FILES += macheif.json
-
-load(qt_plugin)
diff --git a/src/plugins/imageformats/macheif/main.cpp b/src/plugins/imageformats/macheif/main.cpp
index 785ad1f..d209f20 100644
--- a/src/plugins/imageformats/macheif/main.cpp
+++ b/src/plugins/imageformats/macheif/main.cpp
@@ -1,46 +1,9 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the MacHeif plugin in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QT_NO_IMAGEFORMATPLUGIN
#include <qmacheifhandler.h>
-#include <qiiofhelpers_p.h>
QT_BEGIN_NAMESPACE
diff --git a/src/plugins/imageformats/macheif/qmacheifhandler.cpp b/src/plugins/imageformats/macheif/qmacheifhandler.cpp
index bb4829e..36e074f 100644
--- a/src/plugins/imageformats/macheif/qmacheifhandler.cpp
+++ b/src/plugins/imageformats/macheif/qmacheifhandler.cpp
@@ -1,44 +1,7 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the MacHeif plugin in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qmacheifhandler.h"
-#include "qiiofhelpers_p.h"
#include <QVariant>
QT_BEGIN_NAMESPACE
diff --git a/src/plugins/imageformats/macheif/qmacheifhandler.h b/src/plugins/imageformats/macheif/qmacheifhandler.h
index cf63de8..7593bee 100644
--- a/src/plugins/imageformats/macheif/qmacheifhandler.h
+++ b/src/plugins/imageformats/macheif/qmacheifhandler.h
@@ -1,55 +1,21 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the MacHeif plugin in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QMACHEIFHANDLER_H
#define QMACHEIFHANDLER_H
#include <QScopedPointer>
#include <QImageIOHandler>
+#include "qiiofhelpers_p.h"
QT_BEGIN_NAMESPACE
+using namespace NS_IIOF_HELPERS;
+
class QImage;
class QByteArray;
class QIODevice;
class QVariant;
-class QIIOFHelper;
class QMacHeifHandler : public QImageIOHandler
{
diff --git a/src/plugins/imageformats/macjp2/CMakeLists.txt b/src/plugins/imageformats/macjp2/CMakeLists.txt
index 94d5ab3..dab50e5 100644
--- a/src/plugins/imageformats/macjp2/CMakeLists.txt
+++ b/src/plugins/imageformats/macjp2/CMakeLists.txt
@@ -1,19 +1,22 @@
-# Generated from macjp2.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
#####################################################################
## QMacJp2Plugin Plugin:
#####################################################################
-qt_add_plugin(QMacJp2Plugin
+qt_internal_add_plugin(QMacJp2Plugin
OUTPUT_NAME qmacjp2
- TYPE imageformats
+ PLUGIN_TYPE imageformats
SOURCES
../shared/qiiofhelpers.cpp ../shared/qiiofhelpers_p.h
main.cpp
qmacjp2handler.cpp qmacjp2handler.h
INCLUDE_DIRECTORIES
../shared
- PUBLIC_LIBRARIES
+ DEFINES
+ NS_IIOF_HELPERS=QMacJp2
+ LIBRARIES
${FWCoreFoundation}
${FWCoreGraphics}
${FWImageIO}
@@ -22,6 +25,3 @@ qt_add_plugin(QMacJp2Plugin
Qt::Gui
Qt::GuiPrivate
)
-
-#### Keys ignored in scope 1:.:.:macjp2.pro:<TRUE>:
-# OTHER_FILES = "macjp2.json"
diff --git a/src/plugins/imageformats/macjp2/macjp2.pro b/src/plugins/imageformats/macjp2/macjp2.pro
deleted file mode 100644
index 9a44b69..0000000
--- a/src/plugins/imageformats/macjp2/macjp2.pro
+++ /dev/null
@@ -1,20 +0,0 @@
-TARGET = qmacjp2
-PLUGIN_TYPE = imageformats
-PLUGIN_CLASS_NAME = QMacJp2Plugin
-
-LIBS += -framework CoreFoundation -framework CoreGraphics -framework ImageIO
-
-QT += core-private gui-private
-
-SOURCES += \
- qmacjp2handler.cpp \
- main.cpp
-
-HEADERS += \
- qmacjp2handler.h
-
-include (../shared/qiiofhelpers.pri)
-
-OTHER_FILES += macjp2.json
-
-load(qt_plugin)
diff --git a/src/plugins/imageformats/macjp2/main.cpp b/src/plugins/imageformats/macjp2/main.cpp
index ea0cf44..e95193d 100644
--- a/src/plugins/imageformats/macjp2/main.cpp
+++ b/src/plugins/imageformats/macjp2/main.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the MacJp2 plugin in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QT_NO_IMAGEFORMATPLUGIN
diff --git a/src/plugins/imageformats/macjp2/qmacjp2handler.cpp b/src/plugins/imageformats/macjp2/qmacjp2handler.cpp
index 11df94a..8b06250 100644
--- a/src/plugins/imageformats/macjp2/qmacjp2handler.cpp
+++ b/src/plugins/imageformats/macjp2/qmacjp2handler.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the MacJp2 plugin in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qmacjp2handler.h"
#include "qiiofhelpers_p.h"
@@ -43,6 +7,8 @@
QT_BEGIN_NAMESPACE
+using namespace NS_IIOF_HELPERS;
+
class QMacJp2HandlerPrivate
{
Q_DECLARE_PUBLIC(QMacJp2Handler)
diff --git a/src/plugins/imageformats/macjp2/qmacjp2handler.h b/src/plugins/imageformats/macjp2/qmacjp2handler.h
index e1deaf7..b688f2e 100644
--- a/src/plugins/imageformats/macjp2/qmacjp2handler.h
+++ b/src/plugins/imageformats/macjp2/qmacjp2handler.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the MacJp2 plugin in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QMACJP2HANDLER_H
#define QMACJP2HANDLER_H
diff --git a/src/plugins/imageformats/mng/CMakeLists.txt b/src/plugins/imageformats/mng/CMakeLists.txt
index 185f602..2e68b6c 100644
--- a/src/plugins/imageformats/mng/CMakeLists.txt
+++ b/src/plugins/imageformats/mng/CMakeLists.txt
@@ -1,22 +1,18 @@
-# Generated from mng.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
#####################################################################
## QMngPlugin Plugin:
#####################################################################
-qt_add_plugin(QMngPlugin
+qt_internal_add_plugin(QMngPlugin
OUTPUT_NAME qmng
- TYPE imageformats
+ PLUGIN_TYPE imageformats
SOURCES
main.cpp
qmnghandler.cpp qmnghandler_p.h
LIBRARIES
- mng
- PUBLIC_LIBRARIES
+ Libmng::Libmng
Qt::Core
Qt::Gui
)
-
-#### Keys ignored in scope 1:.:.:mng.pro:<TRUE>:
-# OTHER_FILES = "mng.json"
-# QT_FOR_CONFIG = "imageformats-private"
diff --git a/src/plugins/imageformats/mng/main.cpp b/src/plugins/imageformats/mng/main.cpp
index be82312..cdd2b58 100644
--- a/src/plugins/imageformats/mng/main.cpp
+++ b/src/plugins/imageformats/mng/main.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the MNG plugins in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <qimageiohandler.h>
#include <qstringlist.h>
diff --git a/src/plugins/imageformats/mng/mng.pro b/src/plugins/imageformats/mng/mng.pro
deleted file mode 100644
index f509fa8..0000000
--- a/src/plugins/imageformats/mng/mng.pro
+++ /dev/null
@@ -1,15 +0,0 @@
-TARGET = qmng
-
-HEADERS += qmnghandler_p.h
-SOURCES += main.cpp \
- qmnghandler.cpp
-OTHER_FILES += mng.json
-
-include($$OUT_PWD/../../../imageformats/qtimageformats-config.pri)
-QT_FOR_CONFIG += imageformats-private
-
-QMAKE_USE_PRIVATE += mng
-
-PLUGIN_TYPE = imageformats
-PLUGIN_CLASS_NAME = QMngPlugin
-load(qt_plugin)
diff --git a/src/plugins/imageformats/mng/qmnghandler.cpp b/src/plugins/imageformats/mng/qmnghandler.cpp
index b37dca1..47c4edd 100644
--- a/src/plugins/imageformats/mng/qmnghandler.cpp
+++ b/src/plugins/imageformats/mng/qmnghandler.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the MNG plugins in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qmnghandler_p.h"
@@ -80,7 +44,7 @@ class QMngHandlerPrivate
QMngHandler *q_ptr;
};
-static mng_bool myerror(mng_handle /*hMNG*/,
+static mng_bool MNG_DECL myerror(mng_handle /*hMNG*/,
mng_int32 iErrorcode,
mng_int8 /*iSeverity*/,
mng_chunkid iChunkname,
@@ -99,29 +63,29 @@ static mng_bool myerror(mng_handle /*hMNG*/,
return MNG_TRUE;
}
-static mng_ptr myalloc(mng_size_t iSize)
+static mng_ptr MNG_DECL myalloc(mng_size_t iSize)
{
return (mng_ptr)calloc(1, iSize);
}
-static void myfree(mng_ptr pPtr, mng_size_t /*iSize*/)
+static void MNG_DECL myfree(mng_ptr pPtr, mng_size_t /*iSize*/)
{
free(pPtr);
}
-static mng_bool myopenstream(mng_handle)
+static mng_bool MNG_DECL myopenstream(mng_handle)
{
return MNG_TRUE;
}
-static mng_bool myclosestream(mng_handle hMNG)
+static mng_bool MNG_DECL myclosestream(mng_handle hMNG)
{
QMngHandlerPrivate *pMydata = reinterpret_cast<QMngHandlerPrivate *>(mng_get_userdata(hMNG));
pMydata->haveReadAll = true;
return MNG_TRUE;
}
-static mng_bool myreaddata(mng_handle hMNG,
+static mng_bool MNG_DECL myreaddata(mng_handle hMNG,
mng_ptr pBuf,
mng_uint32 iSize,
mng_uint32p pRead)
@@ -130,7 +94,7 @@ static mng_bool myreaddata(mng_handle hMNG,
return pMydata->readData(pBuf, iSize, pRead);
}
-static mng_bool mywritedata(mng_handle hMNG,
+static mng_bool MNG_DECL mywritedata(mng_handle hMNG,
mng_ptr pBuf,
mng_uint32 iSize,
mng_uint32p pWritten)
@@ -139,7 +103,7 @@ static mng_bool mywritedata(mng_handle hMNG,
return pMydata->writeData(pBuf, iSize, pWritten);
}
-static mng_bool myprocessheader(mng_handle hMNG,
+static mng_bool MNG_DECL myprocessheader(mng_handle hMNG,
mng_uint32 iWidth,
mng_uint32 iHeight)
{
@@ -147,14 +111,14 @@ static mng_bool myprocessheader(mng_handle hMNG,
return pMydata->processHeader(iWidth, iHeight);
}
-static mng_ptr mygetcanvasline(mng_handle hMNG,
+static mng_ptr MNG_DECL mygetcanvasline(mng_handle hMNG,
mng_uint32 iLinenr)
{
QMngHandlerPrivate *pMydata = reinterpret_cast<QMngHandlerPrivate *>(mng_get_userdata(hMNG));
return (mng_ptr)pMydata->image.scanLine(iLinenr);
}
-static mng_bool myrefresh(mng_handle /*hMNG*/,
+static mng_bool MNG_DECL myrefresh(mng_handle /*hMNG*/,
mng_uint32 /*iX*/,
mng_uint32 /*iY*/,
mng_uint32 /*iWidth*/,
@@ -163,13 +127,13 @@ static mng_bool myrefresh(mng_handle /*hMNG*/,
return MNG_TRUE;
}
-static mng_uint32 mygettickcount(mng_handle hMNG)
+static mng_uint32 MNG_DECL mygettickcount(mng_handle hMNG)
{
QMngHandlerPrivate *pMydata = reinterpret_cast<QMngHandlerPrivate *>(mng_get_userdata(hMNG));
return pMydata->elapsed++;
}
-static mng_bool mysettimer(mng_handle hMNG,
+static mng_bool MNG_DECL mysettimer(mng_handle hMNG,
mng_uint32 iMsecs)
{
QMngHandlerPrivate *pMydata = reinterpret_cast<QMngHandlerPrivate *>(mng_get_userdata(hMNG));
@@ -178,7 +142,7 @@ static mng_bool mysettimer(mng_handle hMNG,
return MNG_TRUE;
}
-static mng_bool myprocessterm(mng_handle hMNG,
+static mng_bool MNG_DECL myprocessterm(mng_handle hMNG,
mng_uint8 iTermaction,
mng_uint8 /*iIteraction*/,
mng_uint32 /*iDelay*/,
@@ -190,7 +154,7 @@ static mng_bool myprocessterm(mng_handle hMNG,
return MNG_TRUE;
}
-static mng_bool mytrace(mng_handle,
+static mng_bool MNG_DECL mytrace(mng_handle,
mng_int32 iFuncnr,
mng_int32 iFuncseq,
mng_pchar zFuncname)
@@ -247,7 +211,8 @@ mng_bool QMngHandlerPrivate::processHeader(mng_uint32 iWidth, mng_uint32 iHeight
{
if (mng_set_canvasstyle(hMNG, iStyle) != MNG_NOERROR)
return MNG_FALSE;
- image = QImage(iWidth, iHeight, QImage::Format_ARGB32);
+ if (!QImageIOHandler::allocateImage(QSize(iWidth, iHeight), QImage::Format_ARGB32, &image))
+ return MNG_FALSE;
image.fill(0);
return MNG_TRUE;
}
diff --git a/src/plugins/imageformats/mng/qmnghandler_p.h b/src/plugins/imageformats/mng/qmnghandler_p.h
index de2ff5c..59d1615 100644
--- a/src/plugins/imageformats/mng/qmnghandler_p.h
+++ b/src/plugins/imageformats/mng/qmnghandler_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the MNG plugins in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QMNGHANDLER_P_H
#define QMNGHANDLER_P_H
diff --git a/src/plugins/imageformats/shared/qiiofhelpers.cpp b/src/plugins/imageformats/shared/qiiofhelpers.cpp
index f8172fe..f288a96 100644
--- a/src/plugins/imageformats/shared/qiiofhelpers.cpp
+++ b/src/plugins/imageformats/shared/qiiofhelpers.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the MacJp2 plugin in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <QGuiApplication>
#include <QBuffer>
@@ -47,6 +11,12 @@
QT_BEGIN_NAMESPACE
+// QImage <-> CGImage conversion functions from QtGui on darwin
+CGImageRef qt_mac_toCGImage(const QImage &qImage);
+QImage qt_mac_toQImage(CGImageRef image);
+
+namespace NS_IIOF_HELPERS {
+
// Callbacks for sequential data provider & consumer:
static size_t cbGetBytes(void *info, void *buffer, size_t count)
@@ -91,10 +61,6 @@ static size_t cbPutBytes(void *info, const void *buffer, size_t count)
}
-// QImage <-> CGImage conversion functions from QtGui on darwin
-CGImageRef qt_mac_toCGImage(const QImage &qImage);
-QImage qt_mac_toQImage(CGImageRef image);
-
QImageIOPlugin::Capabilities QIIOFHelpers::systemCapabilities(const QString &uti)
{
QImageIOPlugin::Capabilities res;
@@ -322,4 +288,6 @@ bool QIIOFHelper::writeImage(const QImage &in, const QString &uti)
return CGImageDestinationFinalize(cgImageDest);
}
+}
+
QT_END_NAMESPACE
diff --git a/src/plugins/imageformats/shared/qiiofhelpers_p.h b/src/plugins/imageformats/shared/qiiofhelpers_p.h
index 18862f1..b572f20 100644
--- a/src/plugins/imageformats/shared/qiiofhelpers_p.h
+++ b/src/plugins/imageformats/shared/qiiofhelpers_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the MacJp2 plugin in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QIIOFHELPERS_P_H
#define QIIOFHELPERS_P_H
@@ -58,6 +22,8 @@
QT_BEGIN_NAMESPACE
+namespace NS_IIOF_HELPERS {
+
/*
Functions to utilize the native ImageIO Framework in OS X and iOS
*/
@@ -91,6 +57,8 @@ protected:
QCFType<CFDictionaryRef> cfImageDict = nullptr;
};
+}
+
QT_END_NAMESPACE
#endif
diff --git a/src/plugins/imageformats/tga/.prev_CMakeLists.txt b/src/plugins/imageformats/tga/.prev_CMakeLists.txt
deleted file mode 100644
index db1def3..0000000
--- a/src/plugins/imageformats/tga/.prev_CMakeLists.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# Generated from tga.pro.
-
-#####################################################################
-## QTgaPlugin Plugin:
-#####################################################################
-
-qt_add_plugin(QTgaPlugin
- OUTPUT_NAME qtga
- TYPE imageformats
- SOURCES
- main.cpp
- qtgafile.cpp qtgafile.h
- qtgahandler.cpp qtgahandler.h
- PUBLIC_LIBRARIES
- Qt::Core
- Qt::Gui
-)
-
-#### Keys ignored in scope 1:.:.:tga.pro:<TRUE>:
-# OTHER_FILES = "tga.json"
diff --git a/src/plugins/imageformats/tga/CMakeLists.txt b/src/plugins/imageformats/tga/CMakeLists.txt
index db1def3..b5a11fb 100644
--- a/src/plugins/imageformats/tga/CMakeLists.txt
+++ b/src/plugins/imageformats/tga/CMakeLists.txt
@@ -1,20 +1,18 @@
-# Generated from tga.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
#####################################################################
## QTgaPlugin Plugin:
#####################################################################
-qt_add_plugin(QTgaPlugin
+qt_internal_add_plugin(QTgaPlugin
OUTPUT_NAME qtga
- TYPE imageformats
+ PLUGIN_TYPE imageformats
SOURCES
main.cpp
qtgafile.cpp qtgafile.h
qtgahandler.cpp qtgahandler.h
- PUBLIC_LIBRARIES
+ LIBRARIES
Qt::Core
Qt::Gui
)
-
-#### Keys ignored in scope 1:.:.:tga.pro:<TRUE>:
-# OTHER_FILES = "tga.json"
diff --git a/src/plugins/imageformats/tga/main.cpp b/src/plugins/imageformats/tga/main.cpp
index 9177aa8..bc59f94 100644
--- a/src/plugins/imageformats/tga/main.cpp
+++ b/src/plugins/imageformats/tga/main.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the TGA plugin in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <QtGui/QImageIOHandler>
#include <QtCore/QDebug>
diff --git a/src/plugins/imageformats/tga/qtgafile.cpp b/src/plugins/imageformats/tga/qtgafile.cpp
index 5d086c6..f1b9af3 100644
--- a/src/plugins/imageformats/tga/qtgafile.cpp
+++ b/src/plugins/imageformats/tga/qtgafile.cpp
@@ -1,47 +1,12 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the TGA plugin in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qtgafile.h"
#include <QtCore/QIODevice>
#include <QtCore/QDebug>
#include <QtCore/QDateTime>
+#include <QtGui/QImageIOHandler>
struct TgaReader
{
@@ -220,9 +185,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);
@@ -238,8 +212,8 @@ QImage QTgaFile::readImage()
//unsigned char xCorner = desc & 0x10; // 0 = left, 1 = right
unsigned char yCorner = desc & 0x20; // 0 = lower, 1 = upper
- QImage im(imageWidth, imageHeight, QImage::Format_ARGB32);
- if (im.isNull())
+ QImage im;
+ if (!QImageIOHandler::allocateImage(QSize(imageWidth, imageHeight), QImage::Format_ARGB32, &im))
return QImage();
TgaReader *reader = 0;
if (bitsPerPixel == 16)
@@ -248,6 +222,8 @@ QImage QTgaFile::readImage()
reader = new Tga24Reader();
else if (bitsPerPixel == 32)
reader = new Tga32Reader();
+ else
+ return QImage();
TgaReader &read = *reader;
// For now only deal with yCorner, since no one uses xCorner == 1
diff --git a/src/plugins/imageformats/tga/qtgafile.h b/src/plugins/imageformats/tga/qtgafile.h
index 35aa803..f331802 100644
--- a/src/plugins/imageformats/tga/qtgafile.h
+++ b/src/plugins/imageformats/tga/qtgafile.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the TGA plugin in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QTGAFILE_H
#define QTGAFILE_H
diff --git a/src/plugins/imageformats/tga/qtgahandler.cpp b/src/plugins/imageformats/tga/qtgahandler.cpp
index bc70f39..395dd5b 100644
--- a/src/plugins/imageformats/tga/qtgahandler.cpp
+++ b/src/plugins/imageformats/tga/qtgahandler.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the TGA plugin in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qtgahandler.h"
#include "qtgafile.h"
@@ -66,6 +30,7 @@ bool QTgaHandler::canRead() const
setFormat("tga");
return true;
}
+ qWarning("QTgaHandler::canRead(): %s", qPrintable(tga->errorMessage()));
return false;
}
diff --git a/src/plugins/imageformats/tga/qtgahandler.h b/src/plugins/imageformats/tga/qtgahandler.h
index 8e16bb6..35b41c2 100644
--- a/src/plugins/imageformats/tga/qtgahandler.h
+++ b/src/plugins/imageformats/tga/qtgahandler.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the TGA plugin in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QTGAHANDLER_H
#define QTGAHANDLER_H
diff --git a/src/plugins/imageformats/tga/tga.pro b/src/plugins/imageformats/tga/tga.pro
deleted file mode 100644
index 7a04c20..0000000
--- a/src/plugins/imageformats/tga/tga.pro
+++ /dev/null
@@ -1,13 +0,0 @@
-TARGET = qtga
-
-HEADERS += qtgahandler.h \
- qtgafile.h
-SOURCES += qtgahandler.cpp \
- qtgafile.cpp
-OTHER_FILES += tga.json
-
-SOURCES += main.cpp
-
-PLUGIN_TYPE = imageformats
-PLUGIN_CLASS_NAME = QTgaPlugin
-load(qt_plugin)
diff --git a/src/plugins/imageformats/tiff/.prev_CMakeLists.txt b/src/plugins/imageformats/tiff/.prev_CMakeLists.txt
deleted file mode 100644
index 3ac1280..0000000
--- a/src/plugins/imageformats/tiff/.prev_CMakeLists.txt
+++ /dev/null
@@ -1,93 +0,0 @@
-# Generated from tiff.pro.
-
-#####################################################################
-## QTiffPlugin Plugin:
-#####################################################################
-
-qt_add_plugin(QTiffPlugin
- OUTPUT_NAME qtiff
- TYPE imageformats
- SOURCES
- main.cpp
- qtiffhandler.cpp qtiffhandler_p.h
- PUBLIC_LIBRARIES
- Qt::Core
- Qt::Gui
-)
-
-#### Keys ignored in scope 1:.:.:tiff.pro:<TRUE>:
-# OTHER_FILES = "tiff.json"
-# QT_FOR_CONFIG = "imageformats-private"
-
-## Scopes:
-#####################################################################
-
-qt_extend_target(QTiffPlugin CONDITION QT_FEATURE_system_tiff
- LIBRARIES
- TIFF::TIFF
-)
-
-qt_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_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
- ../../../3rdparty/libtiff/port/snprintf.c
- INCLUDE_DIRECTORIES
- ../../../3rdparty/libtiff/libtiff
-)
-
-qt_extend_target(QTiffPlugin CONDITION WIN32 AND NOT QT_FEATURE_system_tiff
- SOURCES
- ../../../3rdparty/libtiff/libtiff/tif_win32.c
-)
-
-qt_extend_target(QTiffPlugin CONDITION UNIX AND NOT QT_FEATURE_system_tiff
- SOURCES
- ../../../3rdparty/libtiff/libtiff/tif_unix.c
-)
-
-qt_extend_target(QTiffPlugin CONDITION ANDROID AND NOT QT_FEATURE_system_tiff
- SOURCES
- ../../../3rdparty/libtiff/port/lfind.c
-)
-
-qt_extend_target(QTiffPlugin CONDITION QT_FEATURE_system_zlib AND NOT QT_FEATURE_system_tiff
- LIBRARIES
- ZLIB::ZLIB
-)
-
-qt_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/CMakeLists.txt b/src/plugins/imageformats/tiff/CMakeLists.txt
index c9a7f56..613fd1c 100644
--- a/src/plugins/imageformats/tiff/CMakeLists.txt
+++ b/src/plugins/imageformats/tiff/CMakeLists.txt
@@ -1,42 +1,39 @@
-# Generated from tiff.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
#####################################################################
## 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 Zlib)
-elseif(NOT TARGET ZLIB::ZLIB)
- qt_find_package(ZLIB PROVIDED_TARGETS ZLIB::ZLIB)
+ find_package(Qt6 COMPONENTS ZlibPrivate)
+elseif(NOT TARGET WrapZLIB::WrapZLIB)
+ qt_find_package(WrapZLIB PROVIDED_TARGETS WrapZLIB::WrapZLIB)
endif()
-# special case end
-qt_add_plugin(QTiffPlugin
+qt_internal_add_plugin(QTiffPlugin
OUTPUT_NAME qtiff
- TYPE imageformats
+ PLUGIN_TYPE imageformats
SOURCES
main.cpp
qtiffhandler.cpp qtiffhandler_p.h
- PUBLIC_LIBRARIES
+ LIBRARIES
Qt::Core
Qt::Gui
)
-#### Keys ignored in scope 1:.:.:tiff.pro:<TRUE>:
-# OTHER_FILES = "tiff.json"
-# QT_FOR_CONFIG = "imageformats-private"
+set_target_properties(QTiffPlugin PROPERTIES UNITY_BUILD OFF)
## Scopes:
#####################################################################
-qt_extend_target(QTiffPlugin CONDITION QT_FEATURE_system_tiff
+qt_internal_extend_target(QTiffPlugin CONDITION QT_FEATURE_system_tiff
LIBRARIES
TIFF::TIFF
)
-qt_extend_target(QTiffPlugin CONDITION NOT QT_FEATURE_system_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
@@ -54,6 +51,7 @@ qt_extend_target(QTiffPlugin CONDITION NOT QT_FEATURE_system_tiff
../../../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
@@ -71,32 +69,26 @@ qt_extend_target(QTiffPlugin CONDITION NOT QT_FEATURE_system_tiff
../../../3rdparty/libtiff/libtiff/tif_warning.c
../../../3rdparty/libtiff/libtiff/tif_write.c
../../../3rdparty/libtiff/libtiff/tif_zip.c
- ../../../3rdparty/libtiff/port/snprintf.c
INCLUDE_DIRECTORIES
../../../3rdparty/libtiff/libtiff
)
-qt_extend_target(QTiffPlugin CONDITION WIN32 AND NOT QT_FEATURE_system_tiff
+qt_internal_extend_target(QTiffPlugin CONDITION WIN32 AND NOT QT_FEATURE_system_tiff
SOURCES
../../../3rdparty/libtiff/libtiff/tif_win32.c
)
-qt_extend_target(QTiffPlugin CONDITION UNIX AND NOT QT_FEATURE_system_tiff
+qt_internal_extend_target(QTiffPlugin CONDITION UNIX AND NOT QT_FEATURE_system_tiff
SOURCES
../../../3rdparty/libtiff/libtiff/tif_unix.c
)
-qt_extend_target(QTiffPlugin CONDITION ANDROID AND NOT QT_FEATURE_system_tiff
- SOURCES
- ../../../3rdparty/libtiff/port/lfind.c
-)
-
-qt_extend_target(QTiffPlugin CONDITION QT_FEATURE_system_zlib AND NOT QT_FEATURE_system_tiff
+qt_internal_extend_target(QTiffPlugin CONDITION QT_FEATURE_system_zlib AND NOT QT_FEATURE_system_tiff
LIBRARIES
- ZLIB::ZLIB
+ WrapZLIB::WrapZLIB
)
-qt_extend_target(QTiffPlugin CONDITION NOT QT_FEATURE_system_tiff AND NOT QT_FEATURE_system_zlib
+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 8882f35..e05048d 100644
--- a/src/plugins/imageformats/tiff/main.cpp
+++ b/src/plugins/imageformats/tiff/main.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <qimageiohandler.h>
#include <qdebug.h>
diff --git a/src/plugins/imageformats/tiff/qtiffhandler.cpp b/src/plugins/imageformats/tiff/qtiffhandler.cpp
index b6c50b8..95d30d7 100644
--- a/src/plugins/imageformats/tiff/qtiffhandler.cpp
+++ b/src/plugins/imageformats/tiff/qtiffhandler.cpp
@@ -1,48 +1,18 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qtiffhandler_p.h"
-#include <qvariant.h>
+
#include <qcolorspace.h>
#include <qdebug.h>
+#include <qfloat16.h>
#include <qimage.h>
-#include <qglobal.h>
+#include <qloggingcategory.h>
+#include <qvariant.h>
+#include <qvarlengtharray.h>
+#include <qbuffer.h>
+#include <qfiledevice.h>
+
extern "C" {
#include "tiffio.h"
}
@@ -51,6 +21,8 @@ extern "C" {
QT_BEGIN_NAMESPACE
+static Q_LOGGING_CATEGORY(lcTiff, "qt.imageformats.tiff")
+
tsize_t qtiffReadProc(thandle_t fd, tdata_t buf, tsize_t size)
{
QIODevice *device = static_cast<QIODevice *>(fd);
@@ -90,13 +62,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));
}
@@ -110,14 +102,22 @@ public:
bool openForRead(QIODevice *device);
bool readHeaders(QIODevice *device);
void close();
+ TIFF *openInternal(const char *mode, QIODevice *device);
+#if TIFFLIB_VERSION >= 20221213
+ static int tiffErrorHandler(TIFF *tif, void *user_data, const char *,
+ const char *fmt, va_list ap);
+ static int tiffWarningHandler(TIFF *tif, void *user_data, const char *,
+ const char *fmt, va_list ap);
+#endif
TIFF *tiff;
int compression;
QImageIOHandler::Transformations transformation;
QImage::Format format;
QSize size;
- uint16 photometric;
+ uint16_t photometric;
bool grayscale;
+ bool floatingPoint;
bool headersRead;
int currentDirectory;
int directoryCount;
@@ -143,7 +143,7 @@ static QImageIOHandler::Transformations exif2Qt(int exifOrientation)
case 8: // rotate 270 CW
return QImageIOHandler::TransformationRotate270;
}
- qWarning("Invalid EXIF orientation");
+ qCWarning(lcTiff, "Invalid EXIF orientation");
return QImageIOHandler::TransformationNone;
}
@@ -167,7 +167,7 @@ static int qt2Exif(QImageIOHandler::Transformations transformation)
case QImageIOHandler::TransformationRotate270:
return 8;
}
- qWarning("Invalid Qt image transformation");
+ qCWarning(lcTiff, "Invalid Qt image transformation");
return 1;
}
@@ -196,10 +196,67 @@ void QTiffHandlerPrivate::close()
tiff = 0;
}
+TIFF *QTiffHandlerPrivate::openInternal(const char *mode, QIODevice *device)
+{
+// TIFFLIB_VERSION 20221213 -> 4.5.0
+#if TIFFLIB_VERSION >= 20221213
+ TIFFOpenOptions *opts = TIFFOpenOptionsAlloc();
+ TIFFOpenOptionsSetErrorHandlerExtR(opts, &tiffErrorHandler, this);
+ TIFFOpenOptionsSetWarningHandlerExtR(opts, &tiffWarningHandler, this);
+ auto handle = TIFFClientOpenExt("foo",
+ mode,
+ device,
+ qtiffReadProc,
+ qtiffWriteProc,
+ qtiffSeekProc,
+ qtiffCloseProc,
+ qtiffSizeProc,
+ qtiffMapProc,
+ qtiffUnmapProc,
+ opts);
+ TIFFOpenOptionsFree(opts);
+#else
+ auto handle = TIFFClientOpen("foo",
+ mode,
+ device,
+ qtiffReadProc,
+ qtiffWriteProc,
+ qtiffSeekProc,
+ qtiffCloseProc,
+ qtiffSizeProc,
+ qtiffMapProc,
+ qtiffUnmapProc);
+#endif
+ return handle;
+}
+
+
+#if TIFFLIB_VERSION >= 20221213
+int QTiffHandlerPrivate::tiffErrorHandler(TIFF *tif, void *user_data, const char *,
+ const char *fmt, va_list ap)
+{
+ const auto priv = static_cast<QTiffHandlerPrivate *>(user_data);
+ if (!priv || priv->tiff != tif)
+ return 0;
+ qCCritical(lcTiff) << QString::vasprintf(fmt, ap);
+ return 1;
+}
+
+int QTiffHandlerPrivate::tiffWarningHandler(TIFF *tif, void *user_data, const char *,
+ const char *fmt, va_list ap)
+{
+ const auto priv = static_cast<QTiffHandlerPrivate *>(user_data);
+ if (!priv || priv->tiff != tif)
+ return 0;
+ qCWarning(lcTiff) << QString::vasprintf(fmt, ap);
+ return 1;
+}
+#endif
+
bool QTiffHandlerPrivate::canRead(QIODevice *device)
{
if (!device) {
- qWarning("QTiffHandler::canRead() called with no device");
+ qCWarning(lcTiff, "QTiffHandler::canRead() called with no device");
return false;
}
@@ -223,21 +280,8 @@ bool QTiffHandlerPrivate::openForRead(QIODevice *device)
if (!canRead(device))
return false;
- tiff = TIFFClientOpen("foo",
- "r",
- device,
- qtiffReadProc,
- qtiffWriteProc,
- qtiffSeekProc,
- qtiffCloseProc,
- qtiffSizeProc,
- qtiffMapProc,
- qtiffUnmapProc);
-
- if (!tiff) {
- return false;
- }
- return true;
+ tiff = openInternal("rh", device);
+ return tiff != nullptr;
}
bool QTiffHandlerPrivate::readHeaders(QIODevice *device)
@@ -248,10 +292,13 @@ bool QTiffHandlerPrivate::readHeaders(QIODevice *device)
if (!openForRead(device))
return false;
- TIFFSetDirectory(tiff, currentDirectory);
+ if (!TIFFSetDirectory(tiff, currentDirectory)) {
+ close();
+ return false;
+ }
- 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)) {
@@ -260,17 +307,21 @@ 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;
+ uint16_t sampleFormat;
+ if (!TIFFGetField(tiff, TIFFTAG_SAMPLEFORMAT, &sampleFormat))
+ sampleFormat = SAMPLEFORMAT_VOID;
+ floatingPoint = (sampleFormat == SAMPLEFORMAT_IEEEFP);
grayscale = photometric == PHOTOMETRIC_MINISBLACK || photometric == PHOTOMETRIC_MINISWHITE;
@@ -278,18 +329,20 @@ bool QTiffHandlerPrivate::readHeaders(QIODevice *device)
format = QImage::Format_Mono;
else if (photometric == PHOTOMETRIC_MINISBLACK && bitPerSample == 8 && samplesPerPixel == 1)
format = QImage::Format_Grayscale8;
- else if (photometric == PHOTOMETRIC_MINISBLACK && bitPerSample == 16 && samplesPerPixel == 1)
+ else if (photometric == PHOTOMETRIC_MINISBLACK && bitPerSample == 16 && samplesPerPixel == 1 && !floatingPoint)
format = QImage::Format_Grayscale16;
else if ((grayscale || photometric == PHOTOMETRIC_PALETTE) && bitPerSample == 8 && samplesPerPixel == 1)
format = QImage::Format_Indexed8;
else if (samplesPerPixel < 4)
- if (bitPerSample == 16 && photometric == PHOTOMETRIC_RGB)
- format = QImage::Format_RGBX64;
+ if (bitPerSample == 16 && (photometric == PHOTOMETRIC_RGB || photometric == PHOTOMETRIC_MINISBLACK))
+ format = floatingPoint ? QImage::Format_RGBX16FPx4 : QImage::Format_RGBX64;
+ else if (bitPerSample == 32 && floatingPoint && (photometric == PHOTOMETRIC_RGB || photometric == PHOTOMETRIC_MINISBLACK))
+ format = QImage::Format_RGBX32FPx4;
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
@@ -304,9 +357,25 @@ bool QTiffHandlerPrivate::readHeaders(QIODevice *device)
if (gotField && count && extrasamples[0] == EXTRASAMPLE_UNASSALPHA)
premultiplied = false;
if (premultiplied)
- format = QImage::Format_RGBA64_Premultiplied;
+ format = floatingPoint ? QImage::Format_RGBA16FPx4_Premultiplied : QImage::Format_RGBA64_Premultiplied;
else
- format = QImage::Format_RGBA64;
+ format = floatingPoint ? QImage::Format_RGBA16FPx4 : QImage::Format_RGBA64;
+ } else if (bitPerSample == 32 && floatingPoint && photometric == PHOTOMETRIC_RGB) {
+ if (gotField && count && extrasamples[0] == EXTRASAMPLE_UNASSALPHA)
+ premultiplied = false;
+ if (premultiplied)
+ format = QImage::Format_RGBA32FPx4_Premultiplied;
+ else
+ format = QImage::Format_RGBA32FPx4;
+ } else if (samplesPerPixel == 4 && bitPerSample == 8 && photometric == PHOTOMETRIC_SEPARATED) {
+ uint16_t inkSet;
+ const bool gotInkSetField = TIFFGetField(tiff, TIFFTAG_INKSET, &inkSet);
+ if (!gotInkSetField || inkSet == INKSET_CMYK) {
+ format = QImage::Format_CMYK8888;
+ } else {
+ close();
+ return false;
+ }
} else {
if (premultiplied)
format = QImage::Format_ARGB32_Premultiplied;
@@ -349,18 +418,14 @@ bool QTiffHandler::read(QImage *image)
QImage::Format format = d->format;
- if (image->size() == d->size && image->format() != format)
- image->reinterpretAsFormat(format);
-
- if (image->size() != d->size || image->format() != format)
- *image = QImage(d->size, format);
-
- if (image->isNull()) {
+ if (!QImageIOHandler::allocateImage(d->size, format, image)) {
d->close();
return false;
}
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();
@@ -377,7 +442,7 @@ bool QTiffHandler::read(QImage *image)
}
image->setColorTable(colortable);
} else if (format == QImage::Format_Indexed8) {
- const uint16 tableSize = 256;
+ const uint16_t tableSize = 256;
QList<QRgb> qtColorTable(tableSize);
if (d->grayscale) {
for (int i = 0; i<tableSize; ++i) {
@@ -386,9 +451,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;
@@ -412,25 +477,38 @@ bool QTiffHandler::read(QImage *image)
}
bool format8bit = (format == QImage::Format_Mono || format == QImage::Format_Indexed8 || format == QImage::Format_Grayscale8);
bool format16bit = (format == QImage::Format_Grayscale16);
+ bool formatCmyk32bit = (format == QImage::Format_CMYK8888);
bool format64bit = (format == QImage::Format_RGBX64 || format == QImage::Format_RGBA64 || format == QImage::Format_RGBA64_Premultiplied);
+ bool format64fp = (format == QImage::Format_RGBX16FPx4 || format == QImage::Format_RGBA16FPx4 || format == QImage::Format_RGBA16FPx4_Premultiplied);
+ bool format128fp = (format == QImage::Format_RGBX32FPx4 || format == QImage::Format_RGBA32FPx4 || format == QImage::Format_RGBA32FPx4_Premultiplied);
// Formats we read directly, instead of over RGBA32:
- if (format8bit || format16bit || format64bit) {
+ if (format8bit || format16bit || formatCmyk32bit || format64bit || format64fp || format128fp) {
int bytesPerPixel = image->depth() / 8;
- if (format == QImage::Format_RGBX64)
- bytesPerPixel = 6;
+ if (format == QImage::Format_RGBX64 || format == QImage::Format_RGBX16FPx4)
+ bytesPerPixel = d->photometric == PHOTOMETRIC_RGB ? 6 : 2;
+ else if (format == QImage::Format_RGBX32FPx4)
+ bytesPerPixel = d->photometric == PHOTOMETRIC_RGB ? 12 : 4;
if (TIFFIsTiled(tiff)) {
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);
+ if (byteTileSize > image->sizeInBytes() || byteTileSize / tileLength < byteTileWidth) {
+ d->close();
+ return false;
+ }
+ uchar *buf = (uchar *)_TIFFmalloc(byteTileSize);
+ if (!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) {
@@ -448,19 +526,32 @@ 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;
}
}
}
- if (format == QImage::Format_RGBX64)
- rgb48fixup(image);
+ if (format == QImage::Format_RGBX64 || format == QImage::Format_RGBX16FPx4) {
+ if (d->photometric == PHOTOMETRIC_RGB)
+ rgb48fixup(image, d->floatingPoint);
+ else
+ rgbFixup(image);
+ } else if (format == QImage::Format_RGBX32FPx4) {
+ if (d->photometric == PHOTOMETRIC_RGB)
+ rgb96fixup(image);
+ else
+ rgbFixup(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();
@@ -471,7 +562,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;
@@ -494,7 +585,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);
@@ -558,16 +649,7 @@ bool QTiffHandler::write(const QImage &image)
if (!device()->isWritable())
return false;
- TIFF *const tiff = TIFFClientOpen("foo",
- "wB",
- device(),
- qtiffReadProc,
- qtiffWriteProc,
- qtiffSeekProc,
- qtiffCloseProc,
- qtiffSizeProc,
- qtiffMapProc,
- qtiffUnmapProc);
+ TIFF *const tiff = d->openInternal("wB", device());
if (!tiff)
return false;
@@ -608,8 +690,8 @@ bool QTiffHandler::write(const QImage &image)
return false;
}
// set color space
- if (image.colorSpace().isValid()) {
- QByteArray iccProfile = image.colorSpace().iccProfile();
+ const QByteArray iccProfile = image.colorSpace().iccProfile();
+ if (!iccProfile.isEmpty()) {
if (!TIFFSetField(tiff, TIFFTAG_ICCPROFILE, iccProfile.size(), reinterpret_cast<const void *>(iccProfile.constData()))) {
TIFFClose(tiff);
return false;
@@ -618,7 +700,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)
@@ -640,7 +722,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;
}
@@ -655,12 +737,13 @@ bool QTiffHandler::write(const QImage &image)
QList<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)
|| !TIFFSetField(tiff, TIFFTAG_COMPRESSION, compression == NoCompression ? COMPRESSION_NONE : COMPRESSION_LZW)
|| !TIFFSetField(tiff, TIFFTAG_BITSPERSAMPLE, image.depth())
+ || !TIFFSetField(tiff, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT)
|| !TIFFSetField(tiff, TIFFTAG_ROWSPERSTRIP, defaultStripSize(tiff))) {
TIFFClose(tiff);
return false;
@@ -677,9 +760,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) {
@@ -705,11 +788,15 @@ bool QTiffHandler::write(const QImage &image)
}
}
TIFFClose(tiff);
- } else if (format == QImage::Format_RGBX64) {
+ } else if (format == QImage::Format_RGBX64 || format == QImage::Format_RGBX16FPx4) {
if (!TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB)
|| !TIFFSetField(tiff, TIFFTAG_COMPRESSION, compression == NoCompression ? COMPRESSION_NONE : COMPRESSION_LZW)
|| !TIFFSetField(tiff, TIFFTAG_SAMPLESPERPIXEL, 3)
|| !TIFFSetField(tiff, TIFFTAG_BITSPERSAMPLE, 16)
+ || !TIFFSetField(tiff, TIFFTAG_SAMPLEFORMAT,
+ format == QImage::Format_RGBX64
+ ? SAMPLEFORMAT_UINT
+ : SAMPLEFORMAT_IEEEFP)
|| !TIFFSetField(tiff, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(tiff, 0))) {
TIFFClose(tiff);
return false;
@@ -732,11 +819,59 @@ 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)
|| !TIFFSetField(tiff, TIFFTAG_BITSPERSAMPLE, 16)
+ || !TIFFSetField(tiff, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT)
+ || !TIFFSetField(tiff, TIFFTAG_EXTRASAMPLES, 1, &extrasamples)
+ || !TIFFSetField(tiff, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(tiff, 0))) {
+ TIFFClose(tiff);
+ return false;
+ }
+ for (int y = 0; y < height; ++y) {
+ if (TIFFWriteScanline(tiff, (void*)image.scanLine(y), y) != 1) {
+ TIFFClose(tiff);
+ return false;
+ }
+ }
+ TIFFClose(tiff);
+ } else if (format == QImage::Format_RGBX32FPx4) {
+ if (!TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB)
+ || !TIFFSetField(tiff, TIFFTAG_COMPRESSION, compression == NoCompression ? COMPRESSION_NONE : COMPRESSION_LZW)
+ || !TIFFSetField(tiff, TIFFTAG_SAMPLESPERPIXEL, 3)
+ || !TIFFSetField(tiff, TIFFTAG_BITSPERSAMPLE, 32)
+ || !TIFFSetField(tiff, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP)
+ || !TIFFSetField(tiff, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(tiff, 0))) {
+ TIFFClose(tiff);
+ return false;
+ }
+ std::unique_ptr<float[]> line(new float[width * 3]);
+ for (int y = 0; y < height; ++y) {
+ const float *srcLine = reinterpret_cast<const float *>(image.constScanLine(y));
+ for (int x = 0; x < width; ++x) {
+ line[x * 3 + 0] = srcLine[x * 4 + 0];
+ line[x * 3 + 1] = srcLine[x * 4 + 1];
+ line[x * 3 + 2] = srcLine[x * 4 + 2];
+ }
+
+ if (TIFFWriteScanline(tiff, (void*)line.get(), y) != 1) {
+ TIFFClose(tiff);
+ return false;
+ }
+ }
+ TIFFClose(tiff);
+ } else if (format == QImage::Format_RGBA16FPx4 || format == QImage::Format_RGBA32FPx4
+ || format == QImage::Format_RGBA16FPx4_Premultiplied
+ || format == QImage::Format_RGBA32FPx4_Premultiplied) {
+ const bool premultiplied = image.format() != QImage::Format_RGBA16FPx4 && image.format() != QImage::Format_RGBA32FPx4;
+ 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)
+ || !TIFFSetField(tiff, TIFFTAG_BITSPERSAMPLE, image.depth() == 64 ? 16 : 32)
+ || !TIFFSetField(tiff, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP)
|| !TIFFSetField(tiff, TIFFTAG_EXTRASAMPLES, 1, &extrasamples)
|| !TIFFSetField(tiff, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(tiff, 0))) {
TIFFClose(tiff);
@@ -749,6 +884,25 @@ bool QTiffHandler::write(const QImage &image)
}
}
TIFFClose(tiff);
+ } else if (format == QImage::Format_CMYK8888) {
+ if (!TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_SEPARATED)
+ || !TIFFSetField(tiff, TIFFTAG_COMPRESSION, compression == NoCompression ? COMPRESSION_NONE : COMPRESSION_LZW)
+ || !TIFFSetField(tiff, TIFFTAG_SAMPLESPERPIXEL, 4)
+ || !TIFFSetField(tiff, TIFFTAG_BITSPERSAMPLE, 8)
+ || !TIFFSetField(tiff, TIFFTAG_INKSET, INKSET_CMYK)
+ || !TIFFSetField(tiff, TIFFTAG_ROWSPERSTRIP, defaultStripSize(tiff))) {
+ TIFFClose(tiff);
+ return false;
+ }
+
+ for (int y = 0; y < image.height(); ++y) {
+ if (TIFFWriteScanline(tiff, (void*)image.scanLine(y), y) != 1) {
+ TIFFClose(tiff);
+ return false;
+ }
+ }
+
+ TIFFClose(tiff);
} else if (!image.hasAlphaChannel()) {
if (!TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB)
|| !TIFFSetField(tiff, TIFFTAG_COMPRESSION, compression == NoCompression ? COMPRESSION_NONE : COMPRESSION_LZW)
@@ -780,7 +934,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)
@@ -835,7 +989,7 @@ QVariant QTiffHandler::option(ImageOption option) const
void QTiffHandler::setOption(ImageOption option, const QVariant &value)
{
- if (option == CompressionRatio && value.type() == QVariant::Int)
+ if (option == CompressionRatio && value.metaType().id() == QMetaType::Int)
d->compression = qBound(0, value.toInt(), 1);
if (option == ImageTransformation) {
int transformation = value.toInt();
@@ -893,9 +1047,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)
@@ -904,17 +1058,21 @@ void QTiffHandler::convert32BitOrder(void *buffer, int width)
}
}
-void QTiffHandler::rgb48fixup(QImage *image)
+void QTiffHandler::rgb48fixup(QImage *image, bool floatingPoint)
{
Q_ASSERT(image->depth() == 64);
const int h = image->height();
const int w = image->width();
uchar *scanline = image->bits();
const qsizetype bpl = image->bytesPerLine();
+ quint16 mask = 0xffff;
+ const qfloat16 fp_mask = qfloat16(1.0f);
+ if (floatingPoint)
+ memcpy(&mask, &fp_mask, 2);
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 + 3] = mask;
dst[x * 4 + 2] = dst[x * 3 + 2];
dst[x * 4 + 1] = dst[x * 3 + 1];
dst[x * 4 + 0] = dst[x * 3 + 0];
@@ -923,29 +1081,75 @@ void QTiffHandler::rgb48fixup(QImage *image)
}
}
+void QTiffHandler::rgb96fixup(QImage *image)
+{
+ Q_ASSERT(image->depth() == 128);
+ const int h = image->height();
+ const int w = image->width();
+ uchar *scanline = image->bits();
+ const qsizetype bpl = image->bytesPerLine();
+ for (int y = 0; y < h; ++y) {
+ float *dst = reinterpret_cast<float *>(scanline);
+ for (int x = w - 1; x >= 0; --x) {
+ dst[x * 4 + 3] = 1.0f;
+ dst[x * 4 + 2] = dst[x * 3 + 2];
+ dst[x * 4 + 1] = dst[x * 3 + 1];
+ dst[x * 4 + 0] = dst[x * 3 + 0];
+ }
+ scanline += bpl;
+ }
+}
+
+void QTiffHandler::rgbFixup(QImage *image)
+{
+ Q_ASSERT(d->floatingPoint);
+ if (image->depth() == 64) {
+ const int h = image->height();
+ const int w = image->width();
+ uchar *scanline = image->bits();
+ const qsizetype bpl = image->bytesPerLine();
+ for (int y = 0; y < h; ++y) {
+ qfloat16 *dst = reinterpret_cast<qfloat16 *>(scanline);
+ for (int x = w - 1; x >= 0; --x) {
+ dst[x * 4 + 3] = qfloat16(1.0f);
+ dst[x * 4 + 2] = dst[x];
+ dst[x * 4 + 1] = dst[x];
+ dst[x * 4 + 0] = dst[x];
+ }
+ scanline += bpl;
+ }
+ } else {
+ const int h = image->height();
+ const int w = image->width();
+ uchar *scanline = image->bits();
+ const qsizetype bpl = image->bytesPerLine();
+ for (int y = 0; y < h; ++y) {
+ float *dst = reinterpret_cast<float *>(scanline);
+ for (int x = w - 1; x >= 0; --x) {
+ dst[x * 4 + 3] = 1.0f;
+ dst[x * 4 + 2] = dst[x];
+ dst[x * 4 + 1] = dst[x];
+ dst[x * 4 + 0] = dst[x];
+ }
+ scanline += bpl;
+ }
+ }
+}
+
bool QTiffHandler::ensureHaveDirectoryCount() const
{
if (d->directoryCount > 0)
return true;
- TIFF *tiff = TIFFClientOpen("foo",
- "r",
- device(),
- qtiffReadProc,
- qtiffWriteProc,
- qtiffSeekProc,
- qtiffCloseProc,
- qtiffSizeProc,
- qtiffMapProc,
- qtiffUnmapProc);
+ TIFF *tiff = d->openInternal("rh", device());
+
if (!tiff) {
device()->reset();
return false;
}
- do {
- ++d->directoryCount;
- } while (TIFFReadDirectory(tiff));
+ while (TIFFReadDirectory(tiff))
+ ++d->directoryCount;
TIFFClose(tiff);
device()->reset();
return true;
diff --git a/src/plugins/imageformats/tiff/qtiffhandler_p.h b/src/plugins/imageformats/tiff/qtiffhandler_p.h
index 97a63e1..738b992 100644
--- a/src/plugins/imageformats/tiff/qtiffhandler_p.h
+++ b/src/plugins/imageformats/tiff/qtiffhandler_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QTIFFHANDLER_P_H
#define QTIFFHANDLER_P_H
@@ -72,7 +36,9 @@ public:
};
private:
void convert32BitOrder(void *buffer, int width);
- void rgb48fixup(QImage *image);
+ void rgb48fixup(QImage *image, bool floatingPoint);
+ void rgb96fixup(QImage *image);
+ void rgbFixup(QImage *image);
const QScopedPointer<QTiffHandlerPrivate> d;
bool ensureHaveDirectoryCount() const;
};
diff --git a/src/plugins/imageformats/tiff/tiff.pro b/src/plugins/imageformats/tiff/tiff.pro
deleted file mode 100644
index 0c42749..0000000
--- a/src/plugins/imageformats/tiff/tiff.pro
+++ /dev/null
@@ -1,18 +0,0 @@
-TARGET = qtiff
-
-HEADERS += qtiffhandler_p.h
-SOURCES += main.cpp qtiffhandler.cpp
-OTHER_FILES += tiff.json
-
-include($$OUT_PWD/../../../imageformats/qtimageformats-config.pri)
-QT_FOR_CONFIG += imageformats-private
-
-qtConfig(system-tiff) {
- QMAKE_USE_PRIVATE += tiff
-} else {
- include($$PWD/../../../3rdparty/libtiff.pri)
-}
-
-PLUGIN_TYPE = imageformats
-PLUGIN_CLASS_NAME = QTiffPlugin
-load(qt_plugin)
diff --git a/src/plugins/imageformats/wbmp/.prev_CMakeLists.txt b/src/plugins/imageformats/wbmp/.prev_CMakeLists.txt
deleted file mode 100644
index 2d6484a..0000000
--- a/src/plugins/imageformats/wbmp/.prev_CMakeLists.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-# Generated from wbmp.pro.
-
-#####################################################################
-## QWbmpPlugin Plugin:
-#####################################################################
-
-qt_add_plugin(QWbmpPlugin
- OUTPUT_NAME qwbmp
- TYPE imageformats
- SOURCES
- main.cpp
- qwbmphandler.cpp qwbmphandler_p.h
- PUBLIC_LIBRARIES
- Qt::Core
- Qt::Gui
-)
-
-#### Keys ignored in scope 1:.:.:wbmp.pro:<TRUE>:
-# OTHER_FILES = "wbmp.json"
diff --git a/src/plugins/imageformats/wbmp/CMakeLists.txt b/src/plugins/imageformats/wbmp/CMakeLists.txt
index 2d6484a..8462f2f 100644
--- a/src/plugins/imageformats/wbmp/CMakeLists.txt
+++ b/src/plugins/imageformats/wbmp/CMakeLists.txt
@@ -1,19 +1,17 @@
-# Generated from wbmp.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
#####################################################################
## QWbmpPlugin Plugin:
#####################################################################
-qt_add_plugin(QWbmpPlugin
+qt_internal_add_plugin(QWbmpPlugin
OUTPUT_NAME qwbmp
- TYPE imageformats
+ PLUGIN_TYPE imageformats
SOURCES
main.cpp
qwbmphandler.cpp qwbmphandler_p.h
- PUBLIC_LIBRARIES
+ LIBRARIES
Qt::Core
Qt::Gui
)
-
-#### Keys ignored in scope 1:.:.:wbmp.pro:<TRUE>:
-# OTHER_FILES = "wbmp.json"
diff --git a/src/plugins/imageformats/wbmp/main.cpp b/src/plugins/imageformats/wbmp/main.cpp
index 5e8206e..72fd438 100644
--- a/src/plugins/imageformats/wbmp/main.cpp
+++ b/src/plugins/imageformats/wbmp/main.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the WBMP plugin in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <qimageiohandler.h>
diff --git a/src/plugins/imageformats/wbmp/qwbmphandler.cpp b/src/plugins/imageformats/wbmp/qwbmphandler.cpp
index 5fe8ec9..581984d 100644
--- a/src/plugins/imageformats/wbmp/qwbmphandler.cpp
+++ b/src/plugins/imageformats/wbmp/qwbmphandler.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the WBMP plugin in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qwbmphandler_p.h"
@@ -197,7 +161,9 @@ QImage WBMPReader::readImage()
if (!readWBMPHeader(iodev, &hdr))
return QImage();
- QImage image(hdr.width, hdr.height, QImage::Format_Mono);
+ QImage image;
+ if (!QImageIOHandler::allocateImage(QSize(hdr.width, hdr.height), QImage::Format_Mono, &image))
+ return QImage();
if (!readWBMPData(iodev, image))
return QImage();
diff --git a/src/plugins/imageformats/wbmp/qwbmphandler_p.h b/src/plugins/imageformats/wbmp/qwbmphandler_p.h
index 3856fc4..a804e22 100644
--- a/src/plugins/imageformats/wbmp/qwbmphandler_p.h
+++ b/src/plugins/imageformats/wbmp/qwbmphandler_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the WBMP plugin in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
//
// W A R N I N G
diff --git a/src/plugins/imageformats/wbmp/wbmp.pro b/src/plugins/imageformats/wbmp/wbmp.pro
deleted file mode 100644
index f25c23c..0000000
--- a/src/plugins/imageformats/wbmp/wbmp.pro
+++ /dev/null
@@ -1,11 +0,0 @@
-TARGET = qwbmp
-
-HEADERS += qwbmphandler_p.h
-SOURCES += qwbmphandler.cpp
-OTHER_FILES += wbmp.json
-
-SOURCES += main.cpp
-
-PLUGIN_TYPE = imageformats
-PLUGIN_CLASS_NAME = QWbmpPlugin
-load(qt_plugin)
diff --git a/src/plugins/imageformats/webp/.prev_CMakeLists.txt b/src/plugins/imageformats/webp/.prev_CMakeLists.txt
deleted file mode 100644
index b1edce6..0000000
--- a/src/plugins/imageformats/webp/.prev_CMakeLists.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-# Generated from webp.pro.
-
-#####################################################################
-## QWebpPlugin Plugin:
-#####################################################################
-
-qt_add_plugin(QWebpPlugin
- OUTPUT_NAME qwebp
- TYPE imageformats
- SOURCES
- main.cpp
- qwebphandler.cpp qwebphandler_p.h
- PUBLIC_LIBRARIES
- Qt::Core
- Qt::Gui
- WrapWebP::WrapWebP
-)
-
-#### Keys ignored in scope 1:.:.:webp.pro:<TRUE>:
-# OTHER_FILES = "webp.json"
-# QT_FOR_CONFIG = "imageformats-private"
-
-## Scopes:
-#####################################################################
diff --git a/src/plugins/imageformats/webp/CMakeLists.txt b/src/plugins/imageformats/webp/CMakeLists.txt
index b1edce6..a34657a 100644
--- a/src/plugins/imageformats/webp/CMakeLists.txt
+++ b/src/plugins/imageformats/webp/CMakeLists.txt
@@ -1,24 +1,185 @@
-# Generated from webp.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
#####################################################################
## QWebpPlugin Plugin:
#####################################################################
-qt_add_plugin(QWebpPlugin
+qt_internal_add_plugin(QWebpPlugin
OUTPUT_NAME qwebp
- TYPE imageformats
+ PLUGIN_TYPE imageformats
SOURCES
main.cpp
qwebphandler.cpp qwebphandler_p.h
- PUBLIC_LIBRARIES
+ LIBRARIES
Qt::Core
Qt::Gui
- WrapWebP::WrapWebP
)
-#### Keys ignored in scope 1:.:.:webp.pro:<TRUE>:
-# OTHER_FILES = "webp.json"
-# QT_FOR_CONFIG = "imageformats-private"
+set_target_properties(QWebpPlugin PROPERTIES UNITY_BUILD OFF)
## 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/palette.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
+ INCLUDE_DIRECTORIES
+ ${CMAKE_ANDROID_NDK}/sources/android/cpufeatures
+)
+
+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()
diff --git a/src/plugins/imageformats/webp/main.cpp b/src/plugins/imageformats/webp/main.cpp
index 02a3ed4..fe9aa17 100644
--- a/src/plugins/imageformats/webp/main.cpp
+++ b/src/plugins/imageformats/webp/main.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the WebP plugins in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <qimageiohandler.h>
#include <qstringlist.h>
diff --git a/src/plugins/imageformats/webp/qwebphandler.cpp b/src/plugins/imageformats/webp/qwebphandler.cpp
index 82d38cb..922868c 100644
--- a/src/plugins/imageformats/webp/qwebphandler.cpp
+++ b/src/plugins/imageformats/webp/qwebphandler.cpp
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the WebP plugins in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2019 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qwebphandler_p.h"
#include "webp/mux.h"
@@ -45,6 +9,7 @@
#include <qdebug.h>
#include <qpainter.h>
#include <qvariant.h>
+#include <QtEndian>
static const int riffHeaderSize = 12; // RIFF_HEADER_SIZE from webp/format_constants.h
@@ -102,41 +67,42 @@ bool QWebpHandler::ensureScanned() const
m_scanState = ScanError;
- if (device()->isSequential()) {
- qWarning() << "Sequential devices are not supported";
+ QWebpHandler *that = const_cast<QWebpHandler *>(this);
+ const int headerBytesNeeded = sizeof(WebPBitstreamFeatures);
+ QByteArray header = device()->peek(headerBytesNeeded);
+ if (header.size() < headerBytesNeeded)
return false;
- }
-
- qint64 oldPos = device()->pos();
- device()->seek(0);
- QWebpHandler *that = const_cast<QWebpHandler *>(this);
- QByteArray header = device()->peek(sizeof(WebPBitstreamFeatures));
+ // We do no random access during decoding, just a readAll() of the whole image file. So if
+ // if it is all available already, we can accept a sequential device. The riff header contains
+ // the file size minus 8 bytes header
+ qint64 byteSize = qFromLittleEndian<quint32>(header.constData() + 4);
+ if (device()->isSequential() && device()->bytesAvailable() < byteSize + 8) {
+ qWarning() << "QWebpHandler: Insufficient data available in sequential device";
+ return false;
+ }
if (WebPGetFeatures((const uint8_t*)header.constData(), header.size(), &(that->m_features)) == VP8_STATUS_OK) {
if (m_features.has_animation) {
// For animation, we have to read and scan whole file to determine loop count and images count
- device()->seek(oldPos);
-
if (that->ensureDemuxer()) {
that->m_loop = WebPDemuxGetI(m_demuxer, WEBP_FF_LOOP_COUNT);
that->m_frameCount = WebPDemuxGetI(m_demuxer, WEBP_FF_FRAME_COUNT);
that->m_bgColor = QColor::fromRgba(QRgb(WebPDemuxGetI(m_demuxer, WEBP_FF_BACKGROUND_COLOR)));
- that->m_composited = new QImage(that->m_features.width, that->m_features.height, QImage::Format_ARGB32);
+ QSize sz(that->m_features.width, that->m_features.height);
+ that->m_composited = new QImage;
+ if (!QImageIOHandler::allocateImage(sz, QImage::Format_ARGB32, that->m_composited))
+ return false;
if (that->m_features.has_alpha)
that->m_composited->fill(Qt::transparent);
- // We do not reset device position since we have read in all data
m_scanState = ScanSuccess;
- return true;
}
} else {
m_scanState = ScanSuccess;
}
}
- device()->seek(oldPos);
-
return m_scanState == ScanSuccess;
}
@@ -159,7 +125,7 @@ bool QWebpHandler::ensureDemuxer()
bool QWebpHandler::read(QImage *image)
{
- if (!ensureScanned() || device()->isSequential() || !ensureDemuxer())
+ if (!ensureScanned() || !ensureDemuxer())
return false;
QRect prevFrameRect;
@@ -195,7 +161,9 @@ bool QWebpHandler::read(QImage *image)
return false;
QImage::Format format = m_features.has_alpha ? QImage::Format_ARGB32 : QImage::Format_RGB32;
- QImage frame(m_iter.width, m_iter.height, format);
+ QImage frame;
+ if (!QImageIOHandler::allocateImage(QSize(m_iter.width, m_iter.height), format, &frame))
+ return false;
uint8_t *output = frame.bits();
size_t output_size = frame.sizeInBytes();
#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
diff --git a/src/plugins/imageformats/webp/qwebphandler_p.h b/src/plugins/imageformats/webp/qwebphandler_p.h
index 849afe3..69e8404 100644
--- a/src/plugins/imageformats/webp/qwebphandler_p.h
+++ b/src/plugins/imageformats/webp/qwebphandler_p.h
@@ -1,41 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the WebP plugins in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QWEBPHANDLER_P_H
#define QWEBPHANDLER_P_H
diff --git a/src/plugins/imageformats/webp/webp.pro b/src/plugins/imageformats/webp/webp.pro
deleted file mode 100644
index cea7c78..0000000
--- a/src/plugins/imageformats/webp/webp.pro
+++ /dev/null
@@ -1,18 +0,0 @@
-TARGET = qwebp
-
-HEADERS += qwebphandler_p.h
-SOURCES += main.cpp qwebphandler.cpp
-OTHER_FILES += webp.json
-
-include($$OUT_PWD/../../../imageformats/qtimageformats-config.pri)
-QT_FOR_CONFIG += imageformats-private
-
-qtConfig(system-webp) {
- QMAKE_USE += webp
-} else {
- include($$PWD/../../../3rdparty/libwebp.pri)
-}
-
-PLUGIN_TYPE = imageformats
-PLUGIN_CLASS_NAME = QWebpPlugin
-load(qt_plugin)
diff --git a/src/plugins/plugins.pro b/src/plugins/plugins.pro
deleted file mode 100644
index e9abe7d..0000000
--- a/src/plugins/plugins.pro
+++ /dev/null
@@ -1,2 +0,0 @@
-TEMPLATE = subdirs
-SUBDIRS = imageformats
diff --git a/src/src.pro b/src/src.pro
deleted file mode 100644
index 4f9cee1..0000000
--- a/src/src.pro
+++ /dev/null
@@ -1,4 +0,0 @@
-TEMPLATE = subdirs
-SUBDIRS = imageformats plugins
-
-plugins.depends = imageformats
diff --git a/sync.profile b/sync.profile
deleted file mode 100644
index 6d035bc..0000000
--- a/sync.profile
+++ /dev/null
@@ -1,2 +0,0 @@
-%modules = ( # path to module name map
-);
diff --git a/tests/.prev_CMakeLists.txt b/tests/.prev_CMakeLists.txt
deleted file mode 100644
index 2214137..0000000
--- a/tests/.prev_CMakeLists.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-# Generated from tests.pro.
-
-if(QT_BUILD_STANDALONE_TESTS)
- # Add qt_find_package calls for extra dependencies that need to be found when building
- # the standalone tests here.
-endif()
-qt_build_tests()
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 2214137..05cc44c 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -1,4 +1,5 @@
-# Generated from tests.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
if(QT_BUILD_STANDALONE_TESTS)
# Add qt_find_package calls for extra dependencies that need to be found when building
diff --git a/tests/auto/CMakeLists.txt b/tests/auto/CMakeLists.txt
index b671097..898e379 100644
--- a/tests/auto/CMakeLists.txt
+++ b/tests/auto/CMakeLists.txt
@@ -1,4 +1,13 @@
-# Generated from auto.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+# For now, don't built auto tests when QT_BUILD_MINIMAL_STATIC_TEST
+# is specified and the build is targeting iOS. QT_BUILD_MINIMAL_STATIC_TEST is used in our CI.
+# Regular non-cmake build tests shouldn't be built because the CI will try to run them and fail
+# due to missing simulator support.
+if(IOS AND QT_BUILD_MINIMAL_STATIC_TESTS)
+ return()
+endif()
add_subdirectory(tga)
add_subdirectory(wbmp)
diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro
deleted file mode 100644
index daa1dfb..0000000
--- a/tests/auto/auto.pro
+++ /dev/null
@@ -1,11 +0,0 @@
-TEMPLATE = subdirs
-SUBDIRS = \
- tga \
- wbmp \
- dds \
- icns \
- jp2 \
- webp \
- heif \
- mng \
- tiff
diff --git a/tests/auto/dds/CMakeLists.txt b/tests/auto/dds/CMakeLists.txt
index 6da7a9a..2bfdcce 100644
--- a/tests/auto/dds/CMakeLists.txt
+++ b/tests/auto/dds/CMakeLists.txt
@@ -1,221 +1,72 @@
-# Generated from dds.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
#####################################################################
## tst_qdds Test:
#####################################################################
-qt_add_test(tst_qdds
+qt_internal_add_test(tst_qdds
SOURCES
tst_qdds.cpp
- PUBLIC_LIBRARIES
+ LIBRARIES
Qt::Gui
)
# Resources:
-set_source_files_properties("../../shared/images/dds/A16B16G16R16.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/A16B16G16R16.dds"
-)
-set_source_files_properties("../../shared/images/dds/A16B16G16R16F.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/A16B16G16R16F.dds"
-)
-set_source_files_properties("../../shared/images/dds/A1R5G5B5.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/A1R5G5B5.dds"
-)
-set_source_files_properties("../../shared/images/dds/A2B10G10R10.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/A2B10G10R10.dds"
-)
-set_source_files_properties("../../shared/images/dds/A2R10G10B10.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/A2R10G10B10.dds"
-)
-set_source_files_properties("../../shared/images/dds/A2W10V10U10.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/A2W10V10U10.dds"
-)
-set_source_files_properties("../../shared/images/dds/A32B32G32R32F.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/A32B32G32R32F.dds"
-)
-set_source_files_properties("../../shared/images/dds/A4L4.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/A4L4.dds"
-)
-set_source_files_properties("../../shared/images/dds/A4R4G4B4.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/A4R4G4B4.dds"
-)
-set_source_files_properties("../../shared/images/dds/A8.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/A8.dds"
-)
-set_source_files_properties("../../shared/images/dds/A8B8G8R8.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/A8B8G8R8.dds"
-)
-set_source_files_properties("../../shared/images/dds/A8L8.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/A8L8.dds"
-)
-set_source_files_properties("../../shared/images/dds/A8R3G3B2.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/A8R3G3B2.dds"
-)
-set_source_files_properties("../../shared/images/dds/A8R8G8B8.2.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/A8R8G8B8.2.dds"
-)
-set_source_files_properties("../../shared/images/dds/A8R8G8B8.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/A8R8G8B8.dds"
-)
-set_source_files_properties("../../shared/images/dds/ATI2.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/ATI2.dds"
-)
-set_source_files_properties("../../shared/images/dds/CxV8U8.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/CxV8U8.dds"
-)
-set_source_files_properties("../../shared/images/dds/DXT1.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/DXT1.dds"
-)
-set_source_files_properties("../../shared/images/dds/DXT2.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/DXT2.dds"
-)
-set_source_files_properties("../../shared/images/dds/DXT3.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/DXT3.dds"
-)
-set_source_files_properties("../../shared/images/dds/DXT4.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/DXT4.dds"
-)
-set_source_files_properties("../../shared/images/dds/DXT5.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/DXT5.dds"
-)
-set_source_files_properties("../../shared/images/dds/G16R16.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/G16R16.dds"
-)
-set_source_files_properties("../../shared/images/dds/G16R16F.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/G16R16F.dds"
-)
-set_source_files_properties("../../shared/images/dds/G32R32F.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/G32R32F.dds"
-)
-set_source_files_properties("../../shared/images/dds/G8R8_G8B8.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/G8R8_G8B8.dds"
-)
-set_source_files_properties("../../shared/images/dds/L16.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/L16.dds"
-)
-set_source_files_properties("../../shared/images/dds/L6V5U5.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/L6V5U5.dds"
-)
-set_source_files_properties("../../shared/images/dds/L8.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/L8.dds"
-)
-set_source_files_properties("../../shared/images/dds/P4.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/P4.dds"
-)
-set_source_files_properties("../../shared/images/dds/P8.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/P8.dds"
-)
-set_source_files_properties("../../shared/images/dds/Q16W16V16U16.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/Q16W16V16U16.dds"
-)
-set_source_files_properties("../../shared/images/dds/Q8W8V8U8.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/Q8W8V8U8.dds"
-)
-set_source_files_properties("../../shared/images/dds/R16F.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/R16F.dds"
-)
-set_source_files_properties("../../shared/images/dds/R32F.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/R32F.dds"
-)
-set_source_files_properties("../../shared/images/dds/R3G3B2.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/R3G3B2.dds"
-)
-set_source_files_properties("../../shared/images/dds/R5G6B5.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/R5G6B5.dds"
-)
-set_source_files_properties("../../shared/images/dds/R8G8B8.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/R8G8B8.dds"
-)
-set_source_files_properties("../../shared/images/dds/R8G8_B8G8.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/R8G8_B8G8.dds"
-)
-set_source_files_properties("../../shared/images/dds/RXGB.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/RXGB.dds"
-)
-set_source_files_properties("../../shared/images/dds/UYVY.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/UYVY.dds"
-)
-set_source_files_properties("../../shared/images/dds/V16U16.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/V16U16.dds"
-)
-set_source_files_properties("../../shared/images/dds/V8U8.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/V8U8.dds"
-)
-set_source_files_properties("../../shared/images/dds/X1R5G5B5.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/X1R5G5B5.dds"
-)
-set_source_files_properties("../../shared/images/dds/X4R4G4B4.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/X4R4G4B4.dds"
-)
-set_source_files_properties("../../shared/images/dds/X8B8G8R8.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/X8B8G8R8.dds"
-)
-set_source_files_properties("../../shared/images/dds/X8L8V8U8.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/X8L8V8U8.dds"
-)
-set_source_files_properties("../../shared/images/dds/X8R8G8B8.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/X8R8G8B8.dds"
-)
-set_source_files_properties("../../shared/images/dds/YUY2.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/YUY2.dds"
-)
-set_source_files_properties("../../shared/images/dds/mipmaps.dds"
- PROPERTIES QT_RESOURCE_ALIAS "dds/mipmaps.dds"
-)
set(dds_resource_files
- "dds/A16B16G16R16.dds"
- "dds/A16B16G16R16F.dds"
- "dds/A1R5G5B5.dds"
- "dds/A2B10G10R10.dds"
- "dds/A2R10G10B10.dds"
- "dds/A2W10V10U10.dds"
- "dds/A32B32G32R32F.dds"
- "dds/A4L4.dds"
- "dds/A4R4G4B4.dds"
- "dds/A8.dds"
- "dds/A8B8G8R8.dds"
- "dds/A8L8.dds"
- "dds/A8R3G3B2.dds"
- "dds/A8R8G8B8.2.dds"
- "dds/A8R8G8B8.dds"
- "dds/ATI2.dds"
- "dds/CxV8U8.dds"
- "dds/DXT1.dds"
- "dds/DXT2.dds"
- "dds/DXT3.dds"
- "dds/DXT4.dds"
- "dds/DXT5.dds"
- "dds/G16R16.dds"
- "dds/G16R16F.dds"
- "dds/G32R32F.dds"
- "dds/G8R8_G8B8.dds"
- "dds/L16.dds"
- "dds/L6V5U5.dds"
- "dds/L8.dds"
- "dds/P4.dds"
- "dds/P8.dds"
- "dds/Q16W16V16U16.dds"
- "dds/Q8W8V8U8.dds"
- "dds/R16F.dds"
- "dds/R32F.dds"
- "dds/R3G3B2.dds"
- "dds/R5G6B5.dds"
- "dds/R8G8B8.dds"
- "dds/R8G8_B8G8.dds"
- "dds/RXGB.dds"
- "dds/UYVY.dds"
- "dds/V16U16.dds"
- "dds/V8U8.dds"
- "dds/X1R5G5B5.dds"
- "dds/X4R4G4B4.dds"
- "dds/X8B8G8R8.dds"
- "dds/X8L8V8U8.dds"
- "dds/X8R8G8B8.dds"
- "dds/YUY2.dds"
- "dds/mipmaps.dds"
+ "../../shared/images/dds/A16B16G16R16.dds"
+ "../../shared/images/dds/A16B16G16R16F.dds"
+ "../../shared/images/dds/A1R5G5B5.dds"
+ "../../shared/images/dds/A2B10G10R10.dds"
+ "../../shared/images/dds/A2R10G10B10.dds"
+ "../../shared/images/dds/A2W10V10U10.dds"
+ "../../shared/images/dds/A32B32G32R32F.dds"
+ "../../shared/images/dds/A4L4.dds"
+ "../../shared/images/dds/A4R4G4B4.dds"
+ "../../shared/images/dds/A8.dds"
+ "../../shared/images/dds/A8B8G8R8.dds"
+ "../../shared/images/dds/A8L8.dds"
+ "../../shared/images/dds/A8R3G3B2.dds"
+ "../../shared/images/dds/A8R8G8B8.2.dds"
+ "../../shared/images/dds/A8R8G8B8.dds"
+ "../../shared/images/dds/ATI2.dds"
+ "../../shared/images/dds/CxV8U8.dds"
+ "../../shared/images/dds/DXT1.dds"
+ "../../shared/images/dds/DXT2.dds"
+ "../../shared/images/dds/DXT3.dds"
+ "../../shared/images/dds/DXT4.dds"
+ "../../shared/images/dds/DXT5.dds"
+ "../../shared/images/dds/G16R16.dds"
+ "../../shared/images/dds/G16R16F.dds"
+ "../../shared/images/dds/G32R32F.dds"
+ "../../shared/images/dds/G8R8_G8B8.dds"
+ "../../shared/images/dds/L16.dds"
+ "../../shared/images/dds/L6V5U5.dds"
+ "../../shared/images/dds/L8.dds"
+ "../../shared/images/dds/P4.dds"
+ "../../shared/images/dds/P8.dds"
+ "../../shared/images/dds/Q16W16V16U16.dds"
+ "../../shared/images/dds/Q8W8V8U8.dds"
+ "../../shared/images/dds/R16F.dds"
+ "../../shared/images/dds/R32F.dds"
+ "../../shared/images/dds/R3G3B2.dds"
+ "../../shared/images/dds/R5G6B5.dds"
+ "../../shared/images/dds/R8G8B8.dds"
+ "../../shared/images/dds/R8G8_B8G8.dds"
+ "../../shared/images/dds/RXGB.dds"
+ "../../shared/images/dds/UYVY.dds"
+ "../../shared/images/dds/V16U16.dds"
+ "../../shared/images/dds/V8U8.dds"
+ "../../shared/images/dds/X1R5G5B5.dds"
+ "../../shared/images/dds/X4R4G4B4.dds"
+ "../../shared/images/dds/X8B8G8R8.dds"
+ "../../shared/images/dds/X8L8V8U8.dds"
+ "../../shared/images/dds/X8R8G8B8.dds"
+ "../../shared/images/dds/YUY2.dds"
+ "../../shared/images/dds/mipmaps.dds"
)
-qt_add_resource(tst_qdds "dds"
+qt_internal_add_resource(tst_qdds "dds"
PREFIX
"/"
BASE
@@ -223,4 +74,3 @@ qt_add_resource(tst_qdds "dds"
FILES
${dds_resource_files}
)
-
diff --git a/tests/auto/dds/dds.pro b/tests/auto/dds/dds.pro
deleted file mode 100644
index da63b84..0000000
--- a/tests/auto/dds/dds.pro
+++ /dev/null
@@ -1,8 +0,0 @@
-TARGET = tst_qdds
-
-QT = core gui testlib
-CONFIG -= app_bundle
-CONFIG += testcase
-
-SOURCES += tst_qdds.cpp
-RESOURCES += $$PWD/../../shared/images/dds.qrc
diff --git a/tests/auto/dds/tst_qdds.cpp b/tests/auto/dds/tst_qdds.cpp
index b7bdfb3..8e5550c 100644
--- a/tests/auto/dds/tst_qdds.cpp
+++ b/tests/auto/dds/tst_qdds.cpp
@@ -1,31 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Ivan Komissarov.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the DDS plugin in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Ivan Komissarov.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtTest/QtTest>
#include <QtGui/QtGui>
diff --git a/tests/auto/heif/CMakeLists.txt b/tests/auto/heif/CMakeLists.txt
index c4ca92d..3fc310e 100644
--- a/tests/auto/heif/CMakeLists.txt
+++ b/tests/auto/heif/CMakeLists.txt
@@ -1,29 +1,24 @@
-# Generated from heif.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
#####################################################################
## tst_qheif Test:
#####################################################################
-qt_add_test(tst_qheif
+qt_internal_add_test(tst_qheif
SOURCES
tst_qheif.cpp
- PUBLIC_LIBRARIES
+ LIBRARIES
Qt::Gui
)
# Resources:
-set_source_files_properties("../../shared/images/heif/col320x480.heic"
- PROPERTIES QT_RESOURCE_ALIAS "heif/col320x480.heic"
-)
-set_source_files_properties("../../shared/images/heif/newlogoCCW.heic"
- PROPERTIES QT_RESOURCE_ALIAS "heif/newlogoCCW.heic"
-)
set(heif_resource_files
- "heif/col320x480.heic"
- "heif/newlogoCCW.heic"
+ "../../shared/images/heif/col320x480.heic"
+ "../../shared/images/heif/newlogoCCW.heic"
)
-qt_add_resource(tst_qheif "heif"
+qt_internal_add_resource(tst_qheif "heif"
PREFIX
"/"
BASE
@@ -31,4 +26,3 @@ qt_add_resource(tst_qheif "heif"
FILES
${heif_resource_files}
)
-
diff --git a/tests/auto/heif/heif.pro b/tests/auto/heif/heif.pro
deleted file mode 100644
index 9ef1085..0000000
--- a/tests/auto/heif/heif.pro
+++ /dev/null
@@ -1,8 +0,0 @@
-TARGET = tst_qheif
-
-QT = core gui testlib
-CONFIG -= app_bundle
-CONFIG += testcase
-
-SOURCES += tst_qheif.cpp
-RESOURCES += $$PWD/../../shared/images/heif.qrc
diff --git a/tests/auto/heif/tst_qheif.cpp b/tests/auto/heif/tst_qheif.cpp
index 1b68074..1c4a75a 100644
--- a/tests/auto/heif/tst_qheif.cpp
+++ b/tests/auto/heif/tst_qheif.cpp
@@ -1,30 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the autotests in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtTest/QtTest>
#include <QtGui/QtGui>
diff --git a/tests/auto/icns/CMakeLists.txt b/tests/auto/icns/CMakeLists.txt
index c7d9806..b02d721 100644
--- a/tests/auto/icns/CMakeLists.txt
+++ b/tests/auto/icns/CMakeLists.txt
@@ -1,69 +1,35 @@
-# Generated from icns.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
#####################################################################
## tst_qicns Test:
#####################################################################
-qt_add_test(tst_qicns
+qt_internal_add_test(tst_qicns
SOURCES
tst_qicns.cpp
- PUBLIC_LIBRARIES
+ LIBRARIES
Qt::Gui
)
# Resources:
-set_source_files_properties("../../shared/images/icns/test-32bit.icns"
- PROPERTIES QT_RESOURCE_ALIAS "icns/test-32bit.icns"
-)
-set_source_files_properties("../../shared/images/icns/test-jp2.icns"
- PROPERTIES QT_RESOURCE_ALIAS "icns/test-jp2.icns"
-)
-set_source_files_properties("../../shared/images/icns/test-legacy.icns"
- PROPERTIES QT_RESOURCE_ALIAS "icns/test-legacy.icns"
-)
-set_source_files_properties("../../shared/images/icns/test-png.icns"
- PROPERTIES QT_RESOURCE_ALIAS "icns/test-png.icns"
-)
-set_source_files_properties("../../shared/images/icns/test-variants.icns"
- PROPERTIES QT_RESOURCE_ALIAS "icns/test-variants.icns"
-)
-set_source_files_properties("../../shared/images/icns/test-write-1024.png"
- PROPERTIES QT_RESOURCE_ALIAS "icns/test-write-1024.png"
-)
-set_source_files_properties("../../shared/images/icns/test-write-128.png"
- PROPERTIES QT_RESOURCE_ALIAS "icns/test-write-128.png"
-)
-set_source_files_properties("../../shared/images/icns/test-write-16.png"
- PROPERTIES QT_RESOURCE_ALIAS "icns/test-write-16.png"
-)
-set_source_files_properties("../../shared/images/icns/test-write-256.png"
- PROPERTIES QT_RESOURCE_ALIAS "icns/test-write-256.png"
-)
-set_source_files_properties("../../shared/images/icns/test-write-32.png"
- PROPERTIES QT_RESOURCE_ALIAS "icns/test-write-32.png"
-)
-set_source_files_properties("../../shared/images/icns/test-write-512.png"
- PROPERTIES QT_RESOURCE_ALIAS "icns/test-write-512.png"
-)
-set_source_files_properties("../../shared/images/icns/test-write-64.png"
- PROPERTIES QT_RESOURCE_ALIAS "icns/test-write-64.png"
-)
set(icns_resource_files
- "icns/test-32bit.icns"
- "icns/test-jp2.icns"
- "icns/test-legacy.icns"
- "icns/test-png.icns"
- "icns/test-variants.icns"
- "icns/test-write-1024.png"
- "icns/test-write-128.png"
- "icns/test-write-16.png"
- "icns/test-write-256.png"
- "icns/test-write-32.png"
- "icns/test-write-512.png"
- "icns/test-write-64.png"
+ "../../shared/images/icns/test-32bit.icns"
+ "../../shared/images/icns/test-jp2.icns"
+ "../../shared/images/icns/test-legacy.icns"
+ "../../shared/images/icns/test-png.icns"
+ "../../shared/images/icns/test-variants.icns"
+ "../../shared/images/icns/test-write-1024.png"
+ "../../shared/images/icns/test-write-128.png"
+ "../../shared/images/icns/test-write-16.png"
+ "../../shared/images/icns/test-write-256.png"
+ "../../shared/images/icns/test-write-32.png"
+ "../../shared/images/icns/test-write-512.png"
+ "../../shared/images/icns/test-write-64.png"
)
-qt_add_resource(tst_qicns "icns"
+qt_internal_add_resource(tst_qicns "icns"
PREFIX
"/"
BASE
@@ -71,4 +37,3 @@ qt_add_resource(tst_qicns "icns"
FILES
${icns_resource_files}
)
-
diff --git a/tests/auto/icns/icns.pro b/tests/auto/icns/icns.pro
deleted file mode 100644
index ef891b7..0000000
--- a/tests/auto/icns/icns.pro
+++ /dev/null
@@ -1,8 +0,0 @@
-TARGET = tst_qicns
-
-QT = core gui testlib
-CONFIG -= app_bundle
-CONFIG += testcase
-
-SOURCES += tst_qicns.cpp
-RESOURCES += $$PWD/../../shared/images/icns.qrc
diff --git a/tests/auto/icns/tst_qicns.cpp b/tests/auto/icns/tst_qicns.cpp
index a9e8016..395af47 100644
--- a/tests/auto/icns/tst_qicns.cpp
+++ b/tests/auto/icns/tst_qicns.cpp
@@ -1,31 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Alex Char.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the ICNS autotests in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2022 The Qt Company Ltd.
+// Copyright (C) 2016 Alex Char.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtTest/QtTest>
#include <QtGui/QtGui>
@@ -40,6 +15,8 @@ private slots:
void readIcons();
void writeIcons_data();
void writeIcons();
+ void ossFuzz_data();
+ void ossFuzz();
};
void tst_qicns::initTestCase()
@@ -100,6 +77,9 @@ void tst_qicns::writeIcons_data()
void tst_qicns::writeIcons()
{
+#ifdef Q_OS_INTEGRITY
+ QSKIP("Unable to create temp dir on INTEGRITY device.");
+#endif
QTemporaryDir temp(QDir::tempPath() + QStringLiteral("/tst_qincs"));
QVERIFY2(temp.isValid(), "Unable to create temp dir.");
@@ -120,5 +100,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/jp2/CMakeLists.txt b/tests/auto/jp2/CMakeLists.txt
index 7b998e6..d12d635 100644
--- a/tests/auto/jp2/CMakeLists.txt
+++ b/tests/auto/jp2/CMakeLists.txt
@@ -1,29 +1,24 @@
-# Generated from jp2.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
#####################################################################
## tst_qjp2 Test:
#####################################################################
-qt_add_test(tst_qjp2
+qt_internal_add_test(tst_qjp2
SOURCES
tst_qjp2.cpp
- PUBLIC_LIBRARIES
+ LIBRARIES
Qt::Gui
)
# Resources:
-set_source_files_properties("../../shared/images/jp2/logo.bmp"
- PROPERTIES QT_RESOURCE_ALIAS "jp2/logo.bmp"
-)
-set_source_files_properties("../../shared/images/jp2/logo.jp2"
- PROPERTIES QT_RESOURCE_ALIAS "jp2/logo.jp2"
-)
set(jp2_resource_files
- "jp2/logo.bmp"
- "jp2/logo.jp2"
+ "../../shared/images/jp2/logo.bmp"
+ "../../shared/images/jp2/logo.jp2"
)
-qt_add_resource(tst_qjp2 "jp2"
+qt_internal_add_resource(tst_qjp2 "jp2"
PREFIX
"/"
BASE
@@ -31,4 +26,3 @@ qt_add_resource(tst_qjp2 "jp2"
FILES
${jp2_resource_files}
)
-
diff --git a/tests/auto/jp2/jp2.pro b/tests/auto/jp2/jp2.pro
deleted file mode 100644
index 26c2f83..0000000
--- a/tests/auto/jp2/jp2.pro
+++ /dev/null
@@ -1,8 +0,0 @@
-TARGET = tst_qjp2
-
-QT = core gui testlib
-CONFIG -= app_bundle
-CONFIG += testcase
-
-SOURCES += tst_qjp2.cpp
-RESOURCES += $$PWD/../../shared/images/jp2.qrc
diff --git a/tests/auto/jp2/tst_qjp2.cpp b/tests/auto/jp2/tst_qjp2.cpp
index 7274194..2c51b93 100644
--- a/tests/auto/jp2/tst_qjp2.cpp
+++ b/tests/auto/jp2/tst_qjp2.cpp
@@ -1,31 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Petroules Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the MNG autotests in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// Copyright (C) 2016 Petroules Corporation.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtTest/QtTest>
#include <QtGui/QtGui>
diff --git a/tests/auto/mng/CMakeLists.txt b/tests/auto/mng/CMakeLists.txt
index 56e53a8..5567131 100644
--- a/tests/auto/mng/CMakeLists.txt
+++ b/tests/auto/mng/CMakeLists.txt
@@ -1,41 +1,27 @@
-# Generated from mng.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
#####################################################################
## tst_qmng Test:
#####################################################################
-qt_add_test(tst_qmng
+qt_internal_add_test(tst_qmng
SOURCES
tst_qmng.cpp
- PUBLIC_LIBRARIES
+ LIBRARIES
Qt::Gui
)
# Resources:
-set_source_files_properties("../../shared/images/mng/animation.mng"
- PROPERTIES QT_RESOURCE_ALIAS "mng/animation.mng"
-)
-set_source_files_properties("../../shared/images/mng/ball.mng"
- PROPERTIES QT_RESOURCE_ALIAS "mng/ball.mng"
-)
-set_source_files_properties("../../shared/images/mng/corrupt.mng"
- PROPERTIES QT_RESOURCE_ALIAS "mng/corrupt.mng"
-)
-set_source_files_properties("../../shared/images/mng/dutch.mng"
- PROPERTIES QT_RESOURCE_ALIAS "mng/dutch.mng"
-)
-set_source_files_properties("../../shared/images/mng/fire.mng"
- PROPERTIES QT_RESOURCE_ALIAS "mng/fire.mng"
-)
set(mng_resource_files
- "mng/animation.mng"
- "mng/ball.mng"
- "mng/corrupt.mng"
- "mng/dutch.mng"
- "mng/fire.mng"
+ "../../shared/images/mng/animation.mng"
+ "../../shared/images/mng/ball.mng"
+ "../../shared/images/mng/corrupt.mng"
+ "../../shared/images/mng/dutch.mng"
+ "../../shared/images/mng/fire.mng"
)
-qt_add_resource(tst_qmng "mng"
+qt_internal_add_resource(tst_qmng "mng"
PREFIX
"/"
BASE
@@ -43,4 +29,3 @@ qt_add_resource(tst_qmng "mng"
FILES
${mng_resource_files}
)
-
diff --git a/tests/auto/mng/mng.pro b/tests/auto/mng/mng.pro
deleted file mode 100644
index 64545a0..0000000
--- a/tests/auto/mng/mng.pro
+++ /dev/null
@@ -1,8 +0,0 @@
-TARGET = tst_qmng
-
-QT = core gui testlib
-CONFIG -= app_bundle
-CONFIG += testcase
-
-SOURCES += tst_qmng.cpp
-RESOURCES += $$PWD/../../shared/images/mng.qrc
diff --git a/tests/auto/mng/tst_qmng.cpp b/tests/auto/mng/tst_qmng.cpp
index 5a1267b..760311e 100644
--- a/tests/auto/mng/tst_qmng.cpp
+++ b/tests/auto/mng/tst_qmng.cpp
@@ -1,30 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the MNG autotests in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtTest/QtTest>
#include <QtGui/QtGui>
diff --git a/tests/auto/tga/CMakeLists.txt b/tests/auto/tga/CMakeLists.txt
index feed14d..b2229ec 100644
--- a/tests/auto/tga/CMakeLists.txt
+++ b/tests/auto/tga/CMakeLists.txt
@@ -1,25 +1,23 @@
-# Generated from tga.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
#####################################################################
## tst_qtga Test:
#####################################################################
-qt_add_test(tst_qtga
+qt_internal_add_test(tst_qtga
SOURCES
tst_qtga.cpp
- PUBLIC_LIBRARIES
+ LIBRARIES
Qt::Gui
)
# Resources:
-set_source_files_properties("../../shared/images/tga/test-flag.tga"
- PROPERTIES QT_RESOURCE_ALIAS "tga/test-flag.tga"
-)
set(tga_resource_files
- "tga/test-flag.tga"
+ "../../shared/images/tga/test-flag.tga"
)
-qt_add_resource(tst_qtga "tga"
+qt_internal_add_resource(tst_qtga "tga"
PREFIX
"/"
BASE
@@ -27,4 +25,3 @@ qt_add_resource(tst_qtga "tga"
FILES
${tga_resource_files}
)
-
diff --git a/tests/auto/tga/tga.pro b/tests/auto/tga/tga.pro
deleted file mode 100644
index 14d51c6..0000000
--- a/tests/auto/tga/tga.pro
+++ /dev/null
@@ -1,8 +0,0 @@
-TARGET = tst_qtga
-
-QT = core gui testlib
-CONFIG -= app_bundle
-CONFIG += testcase
-
-SOURCES += tst_qtga.cpp
-RESOURCES += $$PWD/../../shared/images/tga.qrc
diff --git a/tests/auto/tga/tst_qtga.cpp b/tests/auto/tga/tst_qtga.cpp
index 6b1a517..1b7c143 100644
--- a/tests/auto/tga/tst_qtga.cpp
+++ b/tests/auto/tga/tst_qtga.cpp
@@ -1,30 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the TGA autotests in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtTest/QtTest>
#include <QtGui/QtGui>
diff --git a/tests/auto/tiff/CMakeLists.txt b/tests/auto/tiff/CMakeLists.txt
index 4bd527a..05cea63 100644
--- a/tests/auto/tiff/CMakeLists.txt
+++ b/tests/auto/tiff/CMakeLists.txt
@@ -1,245 +1,80 @@
-# Generated from tiff.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
#####################################################################
## tst_qtiff Test:
#####################################################################
-qt_add_test(tst_qtiff
+qt_internal_add_test(tst_qtiff
SOURCES
tst_qtiff.cpp
- PUBLIC_LIBRARIES
+ LIBRARIES
Qt::Gui
)
# Resources:
-set_source_files_properties("../../shared/images/tiff/16bpc.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/16bpc.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/big_16bpc.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/big_16bpc.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/big_grayscale.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/big_grayscale.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/big_rgb.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/big_rgb.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/big_rgb_bigendian.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/big_rgb_bigendian.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/colorful.bmp"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/colorful.bmp"
-)
-set_source_files_properties("../../shared/images/tiff/corrupt-data.tif"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/corrupt-data.tif"
-)
-set_source_files_properties("../../shared/images/tiff/gray16.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/gray16.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/grayscale-ref.tif"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/grayscale-ref.tif"
-)
-set_source_files_properties("../../shared/images/tiff/grayscale.tif"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/grayscale.tif"
-)
-set_source_files_properties("../../shared/images/tiff/image.tif"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/image.tif"
-)
-set_source_files_properties("../../shared/images/tiff/image_100dpi.tif"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/image_100dpi.tif"
-)
-set_source_files_properties("../../shared/images/tiff/indexed_orientation_1.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/indexed_orientation_1.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/indexed_orientation_2.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/indexed_orientation_2.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/indexed_orientation_3.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/indexed_orientation_3.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/indexed_orientation_4.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/indexed_orientation_4.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/indexed_orientation_5.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/indexed_orientation_5.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/indexed_orientation_6.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/indexed_orientation_6.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/indexed_orientation_7.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/indexed_orientation_7.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/indexed_orientation_8.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/indexed_orientation_8.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/mono_orientation_1.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/mono_orientation_1.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/mono_orientation_2.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/mono_orientation_2.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/mono_orientation_3.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/mono_orientation_3.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/mono_orientation_4.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/mono_orientation_4.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/mono_orientation_5.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/mono_orientation_5.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/mono_orientation_6.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/mono_orientation_6.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/mono_orientation_7.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/mono_orientation_7.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/mono_orientation_8.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/mono_orientation_8.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/multipage.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/multipage.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/oddsize_grayscale.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/oddsize_grayscale.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/oddsize_mono.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/oddsize_mono.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/original_grayscale.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/original_grayscale.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/original_indexed.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/original_indexed.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/original_mono.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/original_mono.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/original_rgb.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/original_rgb.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/rgb_orientation_1.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/rgb_orientation_1.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/rgb_orientation_2.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/rgb_orientation_2.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/rgb_orientation_3.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/rgb_orientation_3.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/rgb_orientation_4.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/rgb_orientation_4.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/rgb_orientation_5.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/rgb_orientation_5.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/rgb_orientation_6.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/rgb_orientation_6.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/rgb_orientation_7.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/rgb_orientation_7.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/rgb_orientation_8.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/rgb_orientation_8.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/rgba_adobedeflate_littleendian.tif"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/rgba_adobedeflate_littleendian.tif"
-)
-set_source_files_properties("../../shared/images/tiff/rgba_lzw_littleendian.tif"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/rgba_lzw_littleendian.tif"
-)
-set_source_files_properties("../../shared/images/tiff/rgba_nocompression_bigendian.tif"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/rgba_nocompression_bigendian.tif"
-)
-set_source_files_properties("../../shared/images/tiff/rgba_nocompression_littleendian.tif"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/rgba_nocompression_littleendian.tif"
-)
-set_source_files_properties("../../shared/images/tiff/rgba_packbits_littleendian.tif"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/rgba_packbits_littleendian.tif"
-)
-set_source_files_properties("../../shared/images/tiff/rgba_zipdeflate_littleendian.tif"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/rgba_zipdeflate_littleendian.tif"
-)
-set_source_files_properties("../../shared/images/tiff/teapot.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/teapot.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/tiled_grayscale.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/tiled_grayscale.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/tiled_indexed.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/tiled_indexed.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/tiled_mono.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/tiled_mono.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/tiled_oddsize_grayscale.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/tiled_oddsize_grayscale.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/tiled_oddsize_mono.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/tiled_oddsize_mono.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/tiled_rgb.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/tiled_rgb.tiff"
-)
set(tiff_resource_files
- "tiff/16bpc.tiff"
- "tiff/big_16bpc.tiff"
- "tiff/big_grayscale.tiff"
- "tiff/big_rgb.tiff"
- "tiff/big_rgb_bigendian.tiff"
- "tiff/colorful.bmp"
- "tiff/corrupt-data.tif"
- "tiff/gray16.tiff"
- "tiff/grayscale-ref.tif"
- "tiff/grayscale.tif"
- "tiff/image.tif"
- "tiff/image_100dpi.tif"
- "tiff/indexed_orientation_1.tiff"
- "tiff/indexed_orientation_2.tiff"
- "tiff/indexed_orientation_3.tiff"
- "tiff/indexed_orientation_4.tiff"
- "tiff/indexed_orientation_5.tiff"
- "tiff/indexed_orientation_6.tiff"
- "tiff/indexed_orientation_7.tiff"
- "tiff/indexed_orientation_8.tiff"
- "tiff/mono_orientation_1.tiff"
- "tiff/mono_orientation_2.tiff"
- "tiff/mono_orientation_3.tiff"
- "tiff/mono_orientation_4.tiff"
- "tiff/mono_orientation_5.tiff"
- "tiff/mono_orientation_6.tiff"
- "tiff/mono_orientation_7.tiff"
- "tiff/mono_orientation_8.tiff"
- "tiff/multipage.tiff"
- "tiff/oddsize_grayscale.tiff"
- "tiff/oddsize_mono.tiff"
- "tiff/original_grayscale.tiff"
- "tiff/original_indexed.tiff"
- "tiff/original_mono.tiff"
- "tiff/original_rgb.tiff"
- "tiff/rgb_orientation_1.tiff"
- "tiff/rgb_orientation_2.tiff"
- "tiff/rgb_orientation_3.tiff"
- "tiff/rgb_orientation_4.tiff"
- "tiff/rgb_orientation_5.tiff"
- "tiff/rgb_orientation_6.tiff"
- "tiff/rgb_orientation_7.tiff"
- "tiff/rgb_orientation_8.tiff"
- "tiff/rgba_adobedeflate_littleendian.tif"
- "tiff/rgba_lzw_littleendian.tif"
- "tiff/rgba_nocompression_bigendian.tif"
- "tiff/rgba_nocompression_littleendian.tif"
- "tiff/rgba_packbits_littleendian.tif"
- "tiff/rgba_zipdeflate_littleendian.tif"
- "tiff/teapot.tiff"
- "tiff/tiled_grayscale.tiff"
- "tiff/tiled_indexed.tiff"
- "tiff/tiled_mono.tiff"
- "tiff/tiled_oddsize_grayscale.tiff"
- "tiff/tiled_oddsize_mono.tiff"
- "tiff/tiled_rgb.tiff"
+ "../../shared/images/tiff/16bpc.tiff"
+ "../../shared/images/tiff/big_16bpc.tiff"
+ "../../shared/images/tiff/big_grayscale.tiff"
+ "../../shared/images/tiff/big_rgb.tiff"
+ "../../shared/images/tiff/big_rgb_bigendian.tiff"
+ "../../shared/images/tiff/colorful.bmp"
+ "../../shared/images/tiff/corrupt-data.tif"
+ "../../shared/images/tiff/gray16.tiff"
+ "../../shared/images/tiff/grayscale-ref.tif"
+ "../../shared/images/tiff/grayscale.tif"
+ "../../shared/images/tiff/image.tif"
+ "../../shared/images/tiff/image_100dpi.tif"
+ "../../shared/images/tiff/indexed_orientation_1.tiff"
+ "../../shared/images/tiff/indexed_orientation_2.tiff"
+ "../../shared/images/tiff/indexed_orientation_3.tiff"
+ "../../shared/images/tiff/indexed_orientation_4.tiff"
+ "../../shared/images/tiff/indexed_orientation_5.tiff"
+ "../../shared/images/tiff/indexed_orientation_6.tiff"
+ "../../shared/images/tiff/indexed_orientation_7.tiff"
+ "../../shared/images/tiff/indexed_orientation_8.tiff"
+ "../../shared/images/tiff/mono_orientation_1.tiff"
+ "../../shared/images/tiff/mono_orientation_2.tiff"
+ "../../shared/images/tiff/mono_orientation_3.tiff"
+ "../../shared/images/tiff/mono_orientation_4.tiff"
+ "../../shared/images/tiff/mono_orientation_5.tiff"
+ "../../shared/images/tiff/mono_orientation_6.tiff"
+ "../../shared/images/tiff/mono_orientation_7.tiff"
+ "../../shared/images/tiff/mono_orientation_8.tiff"
+ "../../shared/images/tiff/multipage.tiff"
+ "../../shared/images/tiff/oddsize_grayscale.tiff"
+ "../../shared/images/tiff/oddsize_mono.tiff"
+ "../../shared/images/tiff/original_grayscale.tiff"
+ "../../shared/images/tiff/original_indexed.tiff"
+ "../../shared/images/tiff/original_mono.tiff"
+ "../../shared/images/tiff/original_rgb.tiff"
+ "../../shared/images/tiff/rgb_orientation_1.tiff"
+ "../../shared/images/tiff/rgb_orientation_2.tiff"
+ "../../shared/images/tiff/rgb_orientation_3.tiff"
+ "../../shared/images/tiff/rgb_orientation_4.tiff"
+ "../../shared/images/tiff/rgb_orientation_5.tiff"
+ "../../shared/images/tiff/rgb_orientation_6.tiff"
+ "../../shared/images/tiff/rgb_orientation_7.tiff"
+ "../../shared/images/tiff/rgb_orientation_8.tiff"
+ "../../shared/images/tiff/rgba_adobedeflate_littleendian.tif"
+ "../../shared/images/tiff/rgba_lzw_littleendian.tif"
+ "../../shared/images/tiff/rgba_nocompression_bigendian.tif"
+ "../../shared/images/tiff/rgba_nocompression_littleendian.tif"
+ "../../shared/images/tiff/rgba_packbits_littleendian.tif"
+ "../../shared/images/tiff/rgba_zipdeflate_littleendian.tif"
+ "../../shared/images/tiff/teapot.tiff"
+ "../../shared/images/tiff/teapot_cmyk.tiff"
+ "../../shared/images/tiff/tiled_grayscale.tiff"
+ "../../shared/images/tiff/tiled_indexed.tiff"
+ "../../shared/images/tiff/tiled_mono.tiff"
+ "../../shared/images/tiff/tiled_oddsize_grayscale.tiff"
+ "../../shared/images/tiff/tiled_oddsize_mono.tiff"
+ "../../shared/images/tiff/tiled_rgb.tiff"
)
-qt_add_resource(tst_qtiff "tiff"
+qt_internal_add_resource(tst_qtiff "tiff"
PREFIX
"/"
BASE
@@ -247,4 +82,3 @@ qt_add_resource(tst_qtiff "tiff"
FILES
${tiff_resource_files}
)
-
diff --git a/tests/auto/tiff/tiff.pro b/tests/auto/tiff/tiff.pro
deleted file mode 100644
index 29ed9eb..0000000
--- a/tests/auto/tiff/tiff.pro
+++ /dev/null
@@ -1,8 +0,0 @@
-TARGET = tst_qtiff
-
-QT = core gui testlib
-CONFIG -= app_bundle
-CONFIG += testcase
-
-SOURCES += tst_qtiff.cpp
-RESOURCES += $$PWD/../../shared/images/tiff.qrc
diff --git a/tests/auto/tiff/tst_qtiff.cpp b/tests/auto/tiff/tst_qtiff.cpp
index 671ade3..c5083f3 100644
--- a/tests/auto/tiff/tst_qtiff.cpp
+++ b/tests/auto/tiff/tst_qtiff.cpp
@@ -1,30 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtAddOn.ImageFormats module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtTest/QtTest>
#include <QtGui/QtGui>
@@ -166,6 +141,7 @@ void tst_qtiff::readImage_data()
QTest::newRow("rgb_orientation_7") << QString("rgb_orientation_7.tiff") << QSize(64, 64);
QTest::newRow("rgb_orientation_8") << QString("rgb_orientation_8.tiff") << QSize(64, 64);
QTest::newRow("teapot") << QString("teapot.tiff") << QSize(256, 256);
+ QTest::newRow("teapot_cmyk") << QString("teapot_cmyk.tiff") << QSize(256, 256);
QTest::newRow("oddsize_grayscale") << QString("oddsize_grayscale.tiff") << QSize(59, 71);
QTest::newRow("oddsize_mono") << QString("oddsize_mono.tiff") << QSize(59, 71);
QTest::newRow("tiled_rgb") << QString("tiled_rgb.tiff") << QSize(64, 64);
@@ -407,6 +383,23 @@ void tst_qtiff::readWriteNonDestructive_data()
QTest::newRow("tiff rgb64") << QImage::Format_RGBX64 << QImage::Format_RGBX64 << QImageIOHandler::TransformationNone;
QTest::newRow("tiff rgba64") << QImage::Format_RGBA64 << QImage::Format_RGBA64 << QImageIOHandler::TransformationRotate90;
QTest::newRow("tiff rgba64pm") << QImage::Format_RGBA64_Premultiplied << QImage::Format_RGBA64_Premultiplied << QImageIOHandler::TransformationNone;
+ QTest::newRow("tiff rgb16fpx4") << QImage::Format_RGBX16FPx4 << QImage::Format_RGBX16FPx4
+ << QImageIOHandler::TransformationNone;
+ QTest::newRow("tiff rgba16fpx4") << QImage::Format_RGBA16FPx4 << QImage::Format_RGBA16FPx4
+ << QImageIOHandler::TransformationRotate90;
+ QTest::newRow("tiff rgba16fpx4pm") << QImage::Format_RGBA16FPx4_Premultiplied
+ << QImage::Format_RGBA16FPx4_Premultiplied
+ << QImageIOHandler::TransformationNone;
+ QTest::newRow("tiff rgb32fpx4") << QImage::Format_RGBX32FPx4 << QImage::Format_RGBX32FPx4
+ << QImageIOHandler::TransformationNone;
+ QTest::newRow("tiff rgba32fpx4") << QImage::Format_RGBA32FPx4 << QImage::Format_RGBA32FPx4
+ << QImageIOHandler::TransformationRotate90;
+ QTest::newRow("tiff rgba32fpx4pm") << QImage::Format_RGBA32FPx4_Premultiplied
+ << QImage::Format_RGBA32FPx4_Premultiplied
+ << QImageIOHandler::TransformationNone;
+ QTest::newRow("tiff cmyk") << QImage::Format_CMYK8888
+ << QImage::Format_CMYK8888
+ << QImageIOHandler::TransformationNone;
}
void tst_qtiff::readWriteNonDestructive()
@@ -506,7 +499,7 @@ void tst_qtiff::supportsOption()
allOptions.remove(QImageIOHandler::ImageOption(options.at(i)));
}
- for (QImageIOHandler::ImageOption option : qAsConst(allOptions))
+ for (QImageIOHandler::ImageOption option : std::as_const(allOptions))
QVERIFY(!writer.supportsOption(option));
}
diff --git a/tests/auto/wbmp/CMakeLists.txt b/tests/auto/wbmp/CMakeLists.txt
index 09d4cbd..f1392a1 100644
--- a/tests/auto/wbmp/CMakeLists.txt
+++ b/tests/auto/wbmp/CMakeLists.txt
@@ -1,29 +1,24 @@
-# Generated from wbmp.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
#####################################################################
## tst_qwbmp Test:
#####################################################################
-qt_add_test(tst_qwbmp
+qt_internal_add_test(tst_qwbmp
SOURCES
tst_qwbmp.cpp
- PUBLIC_LIBRARIES
+ LIBRARIES
Qt::Gui
)
# Resources:
-set_source_files_properties("../../shared/images/wbmp/qt-logo-big.wbmp"
- PROPERTIES QT_RESOURCE_ALIAS "wbmp/qt-logo-big.wbmp"
-)
-set_source_files_properties("../../shared/images/wbmp/qt-logo-small.wbmp"
- PROPERTIES QT_RESOURCE_ALIAS "wbmp/qt-logo-small.wbmp"
-)
set(wbmp_resource_files
- "wbmp/qt-logo-big.wbmp"
- "wbmp/qt-logo-small.wbmp"
+ "../../shared/images/wbmp/qt-logo-big.wbmp"
+ "../../shared/images/wbmp/qt-logo-small.wbmp"
)
-qt_add_resource(tst_qwbmp "wbmp"
+qt_internal_add_resource(tst_qwbmp "wbmp"
PREFIX
"/"
BASE
@@ -31,4 +26,3 @@ qt_add_resource(tst_qwbmp "wbmp"
FILES
${wbmp_resource_files}
)
-
diff --git a/tests/auto/wbmp/tst_qwbmp.cpp b/tests/auto/wbmp/tst_qwbmp.cpp
index 4003f1c..aea8663 100644
--- a/tests/auto/wbmp/tst_qwbmp.cpp
+++ b/tests/auto/wbmp/tst_qwbmp.cpp
@@ -1,30 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the WBMP plugin in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtTest/QtTest>
#include <QtGui/QtGui>
diff --git a/tests/auto/wbmp/wbmp.pro b/tests/auto/wbmp/wbmp.pro
deleted file mode 100644
index f8b0bdd..0000000
--- a/tests/auto/wbmp/wbmp.pro
+++ /dev/null
@@ -1,8 +0,0 @@
-TARGET = tst_qwbmp
-
-QT = core gui testlib
-CONFIG -= app_bundle
-CONFIG += testcase
-
-SOURCES += tst_qwbmp.cpp
-RESOURCES += $$PWD/../../shared/images/wbmp.qrc
diff --git a/tests/auto/webp/CMakeLists.txt b/tests/auto/webp/CMakeLists.txt
index 9d94e6b..05e8373 100644
--- a/tests/auto/webp/CMakeLists.txt
+++ b/tests/auto/webp/CMakeLists.txt
@@ -1,13 +1,14 @@
-# Generated from webp.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
#####################################################################
## tst_qwebp Test:
#####################################################################
-qt_add_test(tst_qwebp
+qt_internal_add_test(tst_qwebp
SOURCES
tst_qwebp.cpp
- PUBLIC_LIBRARIES
+ LIBRARIES
Qt::Gui
)
@@ -20,7 +21,7 @@ set(webp_resource_files
"images/kollada_noalpha.webp"
)
-qt_add_resource(tst_qwebp "webp"
+qt_internal_add_resource(tst_qwebp "webp"
PREFIX
"/"
FILES
diff --git a/tests/auto/webp/tst_qwebp.cpp b/tests/auto/webp/tst_qwebp.cpp
index 17289a5..45e425b 100644
--- a/tests/auto/webp/tst_qwebp.cpp
+++ b/tests/auto/webp/tst_qwebp.cpp
@@ -1,30 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtAddOn.ImageFormats module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtTest/QtTest>
#include <QtGui/QtGui>
diff --git a/tests/auto/webp/webp.pro b/tests/auto/webp/webp.pro
deleted file mode 100644
index 666ab51..0000000
--- a/tests/auto/webp/webp.pro
+++ /dev/null
@@ -1,8 +0,0 @@
-TARGET = tst_qwebp
-
-QT = core gui testlib
-CONFIG -= app_bundle
-CONFIG += testcase
-
-SOURCES += tst_qwebp.cpp
-RESOURCES += $$PWD/webp.qrc
diff --git a/tests/auto/webp/webp.qrc b/tests/auto/webp/webp.qrc
deleted file mode 100644
index 7d0c626..0000000
--- a/tests/auto/webp/webp.qrc
+++ /dev/null
@@ -1,9 +0,0 @@
-<RCC>
- <qresource prefix="/">
- <file>images/kollada.png</file>
- <file>images/kollada.webp</file>
- <file>images/kollada_lossless.webp</file>
- <file>images/kollada_animation.webp</file>
- <file>images/kollada_noalpha.webp</file>
- </qresource>
-</RCC>
diff --git a/tests/benchmarks/CMakeLists.txt b/tests/benchmarks/CMakeLists.txt
index d6508bf..533bb31 100644
--- a/tests/benchmarks/CMakeLists.txt
+++ b/tests/benchmarks/CMakeLists.txt
@@ -1,4 +1,6 @@
-# Generated from benchmarks.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
if(QT_FEATURE_system_zlib)
add_subdirectory(mng)
diff --git a/tests/benchmarks/mng/CMakeLists.txt b/tests/benchmarks/mng/CMakeLists.txt
index 2531a6e..5fb3681 100644
--- a/tests/benchmarks/mng/CMakeLists.txt
+++ b/tests/benchmarks/mng/CMakeLists.txt
@@ -1,42 +1,28 @@
-# Generated from mng.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
#####################################################################
## tst_bench_qmng Binary:
#####################################################################
-qt_add_benchmark(tst_bench_qmng
+qt_internal_add_benchmark(tst_bench_qmng
SOURCES
tst_qmng.cpp
- PUBLIC_LIBRARIES
+ LIBRARIES
Qt::Gui
Qt::Test
)
# Resources:
-set_source_files_properties("../../shared/images/mng/animation.mng"
- PROPERTIES QT_RESOURCE_ALIAS "mng/animation.mng"
-)
-set_source_files_properties("../../shared/images/mng/ball.mng"
- PROPERTIES QT_RESOURCE_ALIAS "mng/ball.mng"
-)
-set_source_files_properties("../../shared/images/mng/corrupt.mng"
- PROPERTIES QT_RESOURCE_ALIAS "mng/corrupt.mng"
-)
-set_source_files_properties("../../shared/images/mng/dutch.mng"
- PROPERTIES QT_RESOURCE_ALIAS "mng/dutch.mng"
-)
-set_source_files_properties("../../shared/images/mng/fire.mng"
- PROPERTIES QT_RESOURCE_ALIAS "mng/fire.mng"
-)
set(mng_resource_files
- "mng/animation.mng"
- "mng/ball.mng"
- "mng/corrupt.mng"
- "mng/dutch.mng"
- "mng/fire.mng"
+ "../../shared/images/mng/animation.mng"
+ "../../shared/images/mng/ball.mng"
+ "../../shared/images/mng/corrupt.mng"
+ "../../shared/images/mng/dutch.mng"
+ "../../shared/images/mng/fire.mng"
)
-qt_add_resource(tst_bench_qmng "mng"
+qt_internal_add_resource(tst_bench_qmng "mng"
PREFIX
"/"
BASE
@@ -44,4 +30,3 @@ qt_add_resource(tst_bench_qmng "mng"
FILES
${mng_resource_files}
)
-
diff --git a/tests/benchmarks/mng/tst_qmng.cpp b/tests/benchmarks/mng/tst_qmng.cpp
index 0ff69f1..e74d06b 100644
--- a/tests/benchmarks/mng/tst_qmng.cpp
+++ b/tests/benchmarks/mng/tst_qmng.cpp
@@ -1,30 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the MNG benchmarks in the Qt ImageFormats module.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtTest/QtTest>
#include <QtGui/QtGui>
diff --git a/tests/benchmarks/tiff/CMakeLists.txt b/tests/benchmarks/tiff/CMakeLists.txt
index 2632376..b8253e4 100644
--- a/tests/benchmarks/tiff/CMakeLists.txt
+++ b/tests/benchmarks/tiff/CMakeLists.txt
@@ -1,246 +1,79 @@
-# Generated from tiff.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
#####################################################################
## tst_bench_qtiff Binary:
#####################################################################
-qt_add_benchmark(tst_bench_qtiff
+qt_internal_add_benchmark(tst_bench_qtiff
SOURCES
tst_qtiff.cpp
- PUBLIC_LIBRARIES
+ LIBRARIES
Qt::Gui
Qt::Test
)
# Resources:
-set_source_files_properties("../../shared/images/tiff/16bpc.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/16bpc.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/big_16bpc.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/big_16bpc.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/big_grayscale.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/big_grayscale.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/big_rgb.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/big_rgb.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/big_rgb_bigendian.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/big_rgb_bigendian.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/colorful.bmp"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/colorful.bmp"
-)
-set_source_files_properties("../../shared/images/tiff/corrupt-data.tif"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/corrupt-data.tif"
-)
-set_source_files_properties("../../shared/images/tiff/gray16.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/gray16.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/grayscale-ref.tif"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/grayscale-ref.tif"
-)
-set_source_files_properties("../../shared/images/tiff/grayscale.tif"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/grayscale.tif"
-)
-set_source_files_properties("../../shared/images/tiff/image.tif"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/image.tif"
-)
-set_source_files_properties("../../shared/images/tiff/image_100dpi.tif"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/image_100dpi.tif"
-)
-set_source_files_properties("../../shared/images/tiff/indexed_orientation_1.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/indexed_orientation_1.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/indexed_orientation_2.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/indexed_orientation_2.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/indexed_orientation_3.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/indexed_orientation_3.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/indexed_orientation_4.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/indexed_orientation_4.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/indexed_orientation_5.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/indexed_orientation_5.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/indexed_orientation_6.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/indexed_orientation_6.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/indexed_orientation_7.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/indexed_orientation_7.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/indexed_orientation_8.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/indexed_orientation_8.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/mono_orientation_1.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/mono_orientation_1.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/mono_orientation_2.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/mono_orientation_2.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/mono_orientation_3.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/mono_orientation_3.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/mono_orientation_4.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/mono_orientation_4.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/mono_orientation_5.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/mono_orientation_5.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/mono_orientation_6.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/mono_orientation_6.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/mono_orientation_7.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/mono_orientation_7.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/mono_orientation_8.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/mono_orientation_8.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/multipage.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/multipage.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/oddsize_grayscale.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/oddsize_grayscale.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/oddsize_mono.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/oddsize_mono.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/original_grayscale.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/original_grayscale.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/original_indexed.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/original_indexed.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/original_mono.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/original_mono.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/original_rgb.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/original_rgb.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/rgb_orientation_1.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/rgb_orientation_1.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/rgb_orientation_2.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/rgb_orientation_2.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/rgb_orientation_3.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/rgb_orientation_3.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/rgb_orientation_4.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/rgb_orientation_4.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/rgb_orientation_5.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/rgb_orientation_5.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/rgb_orientation_6.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/rgb_orientation_6.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/rgb_orientation_7.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/rgb_orientation_7.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/rgb_orientation_8.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/rgb_orientation_8.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/rgba_adobedeflate_littleendian.tif"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/rgba_adobedeflate_littleendian.tif"
-)
-set_source_files_properties("../../shared/images/tiff/rgba_lzw_littleendian.tif"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/rgba_lzw_littleendian.tif"
-)
-set_source_files_properties("../../shared/images/tiff/rgba_nocompression_bigendian.tif"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/rgba_nocompression_bigendian.tif"
-)
-set_source_files_properties("../../shared/images/tiff/rgba_nocompression_littleendian.tif"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/rgba_nocompression_littleendian.tif"
-)
-set_source_files_properties("../../shared/images/tiff/rgba_packbits_littleendian.tif"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/rgba_packbits_littleendian.tif"
-)
-set_source_files_properties("../../shared/images/tiff/rgba_zipdeflate_littleendian.tif"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/rgba_zipdeflate_littleendian.tif"
-)
-set_source_files_properties("../../shared/images/tiff/teapot.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/teapot.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/tiled_grayscale.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/tiled_grayscale.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/tiled_indexed.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/tiled_indexed.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/tiled_mono.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/tiled_mono.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/tiled_oddsize_grayscale.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/tiled_oddsize_grayscale.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/tiled_oddsize_mono.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/tiled_oddsize_mono.tiff"
-)
-set_source_files_properties("../../shared/images/tiff/tiled_rgb.tiff"
- PROPERTIES QT_RESOURCE_ALIAS "tiff/tiled_rgb.tiff"
-)
set(tiff_resource_files
- "tiff/16bpc.tiff"
- "tiff/big_16bpc.tiff"
- "tiff/big_grayscale.tiff"
- "tiff/big_rgb.tiff"
- "tiff/big_rgb_bigendian.tiff"
- "tiff/colorful.bmp"
- "tiff/corrupt-data.tif"
- "tiff/gray16.tiff"
- "tiff/grayscale-ref.tif"
- "tiff/grayscale.tif"
- "tiff/image.tif"
- "tiff/image_100dpi.tif"
- "tiff/indexed_orientation_1.tiff"
- "tiff/indexed_orientation_2.tiff"
- "tiff/indexed_orientation_3.tiff"
- "tiff/indexed_orientation_4.tiff"
- "tiff/indexed_orientation_5.tiff"
- "tiff/indexed_orientation_6.tiff"
- "tiff/indexed_orientation_7.tiff"
- "tiff/indexed_orientation_8.tiff"
- "tiff/mono_orientation_1.tiff"
- "tiff/mono_orientation_2.tiff"
- "tiff/mono_orientation_3.tiff"
- "tiff/mono_orientation_4.tiff"
- "tiff/mono_orientation_5.tiff"
- "tiff/mono_orientation_6.tiff"
- "tiff/mono_orientation_7.tiff"
- "tiff/mono_orientation_8.tiff"
- "tiff/multipage.tiff"
- "tiff/oddsize_grayscale.tiff"
- "tiff/oddsize_mono.tiff"
- "tiff/original_grayscale.tiff"
- "tiff/original_indexed.tiff"
- "tiff/original_mono.tiff"
- "tiff/original_rgb.tiff"
- "tiff/rgb_orientation_1.tiff"
- "tiff/rgb_orientation_2.tiff"
- "tiff/rgb_orientation_3.tiff"
- "tiff/rgb_orientation_4.tiff"
- "tiff/rgb_orientation_5.tiff"
- "tiff/rgb_orientation_6.tiff"
- "tiff/rgb_orientation_7.tiff"
- "tiff/rgb_orientation_8.tiff"
- "tiff/rgba_adobedeflate_littleendian.tif"
- "tiff/rgba_lzw_littleendian.tif"
- "tiff/rgba_nocompression_bigendian.tif"
- "tiff/rgba_nocompression_littleendian.tif"
- "tiff/rgba_packbits_littleendian.tif"
- "tiff/rgba_zipdeflate_littleendian.tif"
- "tiff/teapot.tiff"
- "tiff/tiled_grayscale.tiff"
- "tiff/tiled_indexed.tiff"
- "tiff/tiled_mono.tiff"
- "tiff/tiled_oddsize_grayscale.tiff"
- "tiff/tiled_oddsize_mono.tiff"
- "tiff/tiled_rgb.tiff"
+ "../../shared/images/tiff/16bpc.tiff"
+ "../../shared/images/tiff/big_16bpc.tiff"
+ "../../shared/images/tiff/big_grayscale.tiff"
+ "../../shared/images/tiff/big_rgb.tiff"
+ "../../shared/images/tiff/big_rgb_bigendian.tiff"
+ "../../shared/images/tiff/colorful.bmp"
+ "../../shared/images/tiff/corrupt-data.tif"
+ "../../shared/images/tiff/gray16.tiff"
+ "../../shared/images/tiff/grayscale-ref.tif"
+ "../../shared/images/tiff/grayscale.tif"
+ "../../shared/images/tiff/image.tif"
+ "../../shared/images/tiff/image_100dpi.tif"
+ "../../shared/images/tiff/indexed_orientation_1.tiff"
+ "../../shared/images/tiff/indexed_orientation_2.tiff"
+ "../../shared/images/tiff/indexed_orientation_3.tiff"
+ "../../shared/images/tiff/indexed_orientation_4.tiff"
+ "../../shared/images/tiff/indexed_orientation_5.tiff"
+ "../../shared/images/tiff/indexed_orientation_6.tiff"
+ "../../shared/images/tiff/indexed_orientation_7.tiff"
+ "../../shared/images/tiff/indexed_orientation_8.tiff"
+ "../../shared/images/tiff/mono_orientation_1.tiff"
+ "../../shared/images/tiff/mono_orientation_2.tiff"
+ "../../shared/images/tiff/mono_orientation_3.tiff"
+ "../../shared/images/tiff/mono_orientation_4.tiff"
+ "../../shared/images/tiff/mono_orientation_5.tiff"
+ "../../shared/images/tiff/mono_orientation_6.tiff"
+ "../../shared/images/tiff/mono_orientation_7.tiff"
+ "../../shared/images/tiff/mono_orientation_8.tiff"
+ "../../shared/images/tiff/multipage.tiff"
+ "../../shared/images/tiff/oddsize_grayscale.tiff"
+ "../../shared/images/tiff/oddsize_mono.tiff"
+ "../../shared/images/tiff/original_grayscale.tiff"
+ "../../shared/images/tiff/original_indexed.tiff"
+ "../../shared/images/tiff/original_mono.tiff"
+ "../../shared/images/tiff/original_rgb.tiff"
+ "../../shared/images/tiff/rgb_orientation_1.tiff"
+ "../../shared/images/tiff/rgb_orientation_2.tiff"
+ "../../shared/images/tiff/rgb_orientation_3.tiff"
+ "../../shared/images/tiff/rgb_orientation_4.tiff"
+ "../../shared/images/tiff/rgb_orientation_5.tiff"
+ "../../shared/images/tiff/rgb_orientation_6.tiff"
+ "../../shared/images/tiff/rgb_orientation_7.tiff"
+ "../../shared/images/tiff/rgb_orientation_8.tiff"
+ "../../shared/images/tiff/rgba_adobedeflate_littleendian.tif"
+ "../../shared/images/tiff/rgba_lzw_littleendian.tif"
+ "../../shared/images/tiff/rgba_nocompression_bigendian.tif"
+ "../../shared/images/tiff/rgba_nocompression_littleendian.tif"
+ "../../shared/images/tiff/rgba_packbits_littleendian.tif"
+ "../../shared/images/tiff/rgba_zipdeflate_littleendian.tif"
+ "../../shared/images/tiff/teapot.tiff"
+ "../../shared/images/tiff/tiled_grayscale.tiff"
+ "../../shared/images/tiff/tiled_indexed.tiff"
+ "../../shared/images/tiff/tiled_mono.tiff"
+ "../../shared/images/tiff/tiled_oddsize_grayscale.tiff"
+ "../../shared/images/tiff/tiled_oddsize_mono.tiff"
+ "../../shared/images/tiff/tiled_rgb.tiff"
)
-qt_add_resource(tst_bench_qtiff "tiff"
+qt_internal_add_resource(tst_bench_qtiff "tiff"
PREFIX
"/"
BASE
@@ -248,4 +81,3 @@ qt_add_resource(tst_bench_qtiff "tiff"
FILES
${tiff_resource_files}
)
-
diff --git a/tests/benchmarks/tiff/tst_qtiff.cpp b/tests/benchmarks/tiff/tst_qtiff.cpp
index 1ef7820..024675d 100644
--- a/tests/benchmarks/tiff/tst_qtiff.cpp
+++ b/tests/benchmarks/tiff/tst_qtiff.cpp
@@ -1,30 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtAddOn.ImageFormats module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtTest/QtTest>
#include <QtGui/QtGui>
diff --git a/tests/shared/images/dds.qrc b/tests/shared/images/dds.qrc
deleted file mode 100644
index 50f34c1..0000000
--- a/tests/shared/images/dds.qrc
+++ /dev/null
@@ -1,54 +0,0 @@
-<RCC>
- <qresource prefix="/">
- <file>dds/A1R5G5B5.dds</file>
- <file>dds/A2B10G10R10.dds</file>
- <file>dds/A2R10G10B10.dds</file>
- <file>dds/A2W10V10U10.dds</file>
- <file>dds/A4L4.dds</file>
- <file>dds/A4R4G4B4.dds</file>
- <file>dds/A8.dds</file>
- <file>dds/A8B8G8R8.dds</file>
- <file>dds/A8L8.dds</file>
- <file>dds/A8R3G3B2.dds</file>
- <file>dds/A8R8G8B8.dds</file>
- <file>dds/A16B16G16R16.dds</file>
- <file>dds/A16B16G16R16F.dds</file>
- <file>dds/A32B32G32R32F.dds</file>
- <file>dds/CxV8U8.dds</file>
- <file>dds/DXT1.dds</file>
- <file>dds/DXT2.dds</file>
- <file>dds/DXT3.dds</file>
- <file>dds/DXT4.dds</file>
- <file>dds/DXT5.dds</file>
- <file>dds/G8R8_G8B8.dds</file>
- <file>dds/G16R16.dds</file>
- <file>dds/G16R16F.dds</file>
- <file>dds/G32R32F.dds</file>
- <file>dds/L6V5U5.dds</file>
- <file>dds/L8.dds</file>
- <file>dds/L16.dds</file>
- <file>dds/mipmaps.dds</file>
- <file>dds/P4.dds</file>
- <file>dds/P8.dds</file>
- <file>dds/Q8W8V8U8.dds</file>
- <file>dds/Q16W16V16U16.dds</file>
- <file>dds/R3G3B2.dds</file>
- <file>dds/R5G6B5.dds</file>
- <file>dds/R8G8_B8G8.dds</file>
- <file>dds/R8G8B8.dds</file>
- <file>dds/R16F.dds</file>
- <file>dds/R32F.dds</file>
- <file>dds/UYVY.dds</file>
- <file>dds/V8U8.dds</file>
- <file>dds/V16U16.dds</file>
- <file>dds/X1R5G5B5.dds</file>
- <file>dds/X4R4G4B4.dds</file>
- <file>dds/X8B8G8R8.dds</file>
- <file>dds/X8L8V8U8.dds</file>
- <file>dds/X8R8G8B8.dds</file>
- <file>dds/YUY2.dds</file>
- <file>dds/RXGB.dds</file>
- <file>dds/ATI2.dds</file>
- <file>dds/A8R8G8B8.2.dds</file>
- </qresource>
-</RCC>
diff --git a/tests/shared/images/heif.qrc b/tests/shared/images/heif.qrc
deleted file mode 100644
index 8232b6a..0000000
--- a/tests/shared/images/heif.qrc
+++ /dev/null
@@ -1,6 +0,0 @@
-<RCC>
- <qresource prefix="/">
- <file>heif/col320x480.heic</file>
- <file>heif/newlogoCCW.heic</file>
- </qresource>
-</RCC>
diff --git a/tests/shared/images/heif/col320x480.heic b/tests/shared/images/heif/col320x480.heic
index 6ca3c7b..9fbb4bc 100644
--- a/tests/shared/images/heif/col320x480.heic
+++ b/tests/shared/images/heif/col320x480.heic
Binary files differ
diff --git a/tests/shared/images/icns.qrc b/tests/shared/images/icns.qrc
deleted file mode 100644
index f87830d..0000000
--- a/tests/shared/images/icns.qrc
+++ /dev/null
@@ -1,16 +0,0 @@
-<RCC>
- <qresource prefix="/">
- <file>icns/test-png.icns</file>
- <file>icns/test-jp2.icns</file>
- <file>icns/test-32bit.icns</file>
- <file>icns/test-legacy.icns</file>
- <file>icns/test-variants.icns</file>
- <file>icns/test-write-16.png</file>
- <file>icns/test-write-32.png</file>
- <file>icns/test-write-64.png</file>
- <file>icns/test-write-128.png</file>
- <file>icns/test-write-256.png</file>
- <file>icns/test-write-512.png</file>
- <file>icns/test-write-1024.png</file>
- </qresource>
-</RCC>
diff --git a/tests/shared/images/jp2.qrc b/tests/shared/images/jp2.qrc
deleted file mode 100644
index f952076..0000000
--- a/tests/shared/images/jp2.qrc
+++ /dev/null
@@ -1,6 +0,0 @@
-<RCC>
- <qresource prefix="/">
- <file>jp2/logo.bmp</file>
- <file>jp2/logo.jp2</file>
- </qresource>
-</RCC>
diff --git a/tests/shared/images/tga.qrc b/tests/shared/images/tga.qrc
deleted file mode 100644
index 1388451..0000000
--- a/tests/shared/images/tga.qrc
+++ /dev/null
@@ -1,5 +0,0 @@
-<RCC>
- <qresource prefix="/">
- <file>tga/test-flag.tga</file>
- </qresource>
-</RCC>
diff --git a/tests/shared/images/tiff.qrc b/tests/shared/images/tiff.qrc
index 2c876af..0814a49 100644
--- a/tests/shared/images/tiff.qrc
+++ b/tests/shared/images/tiff.qrc
@@ -41,6 +41,7 @@
<file>tiff/rgb_orientation_7.tiff</file>
<file>tiff/rgb_orientation_8.tiff</file>
<file>tiff/teapot.tiff</file>
+ <file>tiff/teapot_cmyk.tiff</file>
<file>tiff/colorful.bmp</file>
<file>tiff/tiled_grayscale.tiff</file>
<file>tiff/tiled_oddsize_grayscale.tiff</file>
diff --git a/tests/shared/images/tiff/teapot_cmyk.tiff b/tests/shared/images/tiff/teapot_cmyk.tiff
new file mode 100644
index 0000000..aae07c4
--- /dev/null
+++ b/tests/shared/images/tiff/teapot_cmyk.tiff
Binary files differ
diff --git a/tests/shared/images/wbmp.qrc b/tests/shared/images/wbmp.qrc
deleted file mode 100644
index bea46a1..0000000
--- a/tests/shared/images/wbmp.qrc
+++ /dev/null
@@ -1,6 +0,0 @@
-<RCC>
- <qresource prefix="/">
- <file>wbmp/qt-logo-big.wbmp</file>
- <file>wbmp/qt-logo-small.wbmp</file>
- </qresource>
-</RCC>
diff --git a/tests/tests.pro b/tests/tests.pro
deleted file mode 100644
index 6b6bdac..0000000
--- a/tests/tests.pro
+++ /dev/null
@@ -1,2 +0,0 @@
-TEMPLATE = subdirs
-SUBDIRS = auto benchmarks