diff options
author | Lei Zhang <thestig@chromium.org> | 2016-01-07 15:52:44 -0800 |
---|---|---|
committer | Lei Zhang <thestig@chromium.org> | 2016-01-07 15:52:44 -0800 |
commit | 9c2c87d1c7443b4eeb3e439af7dc34f695bbd2c8 (patch) | |
tree | d40131c4030f331b224abcd0efe707767f58fd75 | |
parent | 0aec19b09e48097df6096802f70daeb53d348c79 (diff) | |
download | pdfium-9c2c87d1c7443b4eeb3e439af7dc34f695bbd2c8.tar.xz |
XFA: Upgrade to libtiff 4.0.6.
R=jun_fang@foxitsoftware.com, tsepez@chromium.org
Review URL: https://codereview.chromium.org/1563103002 .
-rw-r--r-- | core/src/fxcodec/codec/fx_codec_tiff.cpp | 22 | ||||
-rw-r--r-- | third_party/BUILD.gn | 72 | ||||
-rw-r--r-- | third_party/libtiff/0000-build-config.patch | 337 | ||||
-rw-r--r-- | third_party/libtiff/README.pdfium | 12 | ||||
-rw-r--r-- | third_party/libtiff/t4.h (renamed from third_party/tiff_v403/t4.h) | 0 | ||||
-rw-r--r-- | third_party/libtiff/tif_aux.c (renamed from third_party/tiff_v403/tif_aux.c) | 1 | ||||
-rw-r--r-- | third_party/libtiff/tif_close.c (renamed from third_party/tiff_v403/tif_close.c) | 1 | ||||
-rw-r--r-- | third_party/libtiff/tif_codec.c (renamed from third_party/tiff_v403/tif_codec.c) | 5 | ||||
-rw-r--r-- | third_party/libtiff/tif_color.c (renamed from third_party/tiff_v403/tif_color.c) | 2 | ||||
-rw-r--r-- | third_party/libtiff/tif_compress.c (renamed from third_party/tiff_v403/tif_compress.c) | 1 | ||||
-rw-r--r-- | third_party/libtiff/tif_dir.c (renamed from third_party/tiff_v403/tif_dir.c) | 69 | ||||
-rw-r--r-- | third_party/libtiff/tif_dir.h (renamed from third_party/tiff_v403/tif_dir.h) | 0 | ||||
-rw-r--r-- | third_party/libtiff/tif_dirinfo.c (renamed from third_party/tiff_v403/tif_dirinfo.c) | 53 | ||||
-rw-r--r-- | third_party/libtiff/tif_dirread.c (renamed from third_party/tiff_v403/tif_dirread.c) | 80 | ||||
-rw-r--r-- | third_party/libtiff/tif_dirwrite.c (renamed from third_party/tiff_v403/tif_dirwrite.c) | 7 | ||||
-rw-r--r-- | third_party/libtiff/tif_dumpmode.c (renamed from third_party/tiff_v403/tif_dumpmode.c) | 1 | ||||
-rw-r--r-- | third_party/libtiff/tif_error.c (renamed from third_party/tiff_v403/tif_error.c) | 5 | ||||
-rw-r--r-- | third_party/libtiff/tif_extension.c (renamed from third_party/tiff_v403/tif_extension.c) | 2 | ||||
-rw-r--r-- | third_party/libtiff/tif_fax3.c (renamed from third_party/tiff_v403/tif_fax3.c) | 43 | ||||
-rw-r--r-- | third_party/libtiff/tif_fax3.h (renamed from third_party/tiff_v403/tif_fax3.h) | 0 | ||||
-rw-r--r-- | third_party/libtiff/tif_fax3sm.c (renamed from third_party/tiff_v403/tif_fax3sm.c) | 1 | ||||
-rw-r--r-- | third_party/libtiff/tif_flush.c (renamed from third_party/tiff_v403/tif_flush.c) | 1 | ||||
-rw-r--r-- | third_party/libtiff/tif_getimage.c (renamed from third_party/tiff_v403/tif_getimage.c) | 321 | ||||
-rw-r--r-- | third_party/libtiff/tif_jpeg.c (renamed from third_party/tiff_v403/tif_jpeg.c) | 335 | ||||
-rw-r--r-- | third_party/libtiff/tif_luv.c (renamed from third_party/tiff_v403/tif_luv.c) | 20 | ||||
-rw-r--r-- | third_party/libtiff/tif_lzw.c (renamed from third_party/tiff_v403/tif_lzw.c) | 61 | ||||
-rw-r--r-- | third_party/libtiff/tif_next.c (renamed from third_party/tiff_v403/tif_next.c) | 27 | ||||
-rw-r--r-- | third_party/libtiff/tif_ojpeg.c (renamed from third_party/tiff_v403/tif_ojpeg.c) | 74 | ||||
-rw-r--r-- | third_party/libtiff/tif_open.c (renamed from third_party/tiff_v403/tif_open.c) | 1 | ||||
-rw-r--r-- | third_party/libtiff/tif_packbits.c (renamed from third_party/tiff_v403/tif_packbits.c) | 2 | ||||
-rw-r--r-- | third_party/libtiff/tif_pixarlog.c (renamed from third_party/tiff_v403/tif_pixarlog.c) | 24 | ||||
-rw-r--r-- | third_party/libtiff/tif_predict.c (renamed from third_party/tiff_v403/tif_predict.c) | 191 | ||||
-rw-r--r-- | third_party/libtiff/tif_predict.h (renamed from third_party/tiff_v403/tif_predict.h) | 0 | ||||
-rw-r--r-- | third_party/libtiff/tif_print.c (renamed from third_party/tiff_v403/tif_print.c) | 17 | ||||
-rw-r--r-- | third_party/libtiff/tif_read.c (renamed from third_party/tiff_v403/tif_read.c) | 90 | ||||
-rw-r--r-- | third_party/libtiff/tif_strip.c (renamed from third_party/tiff_v403/tif_strip.c) | 13 | ||||
-rw-r--r-- | third_party/libtiff/tif_swab.c (renamed from third_party/tiff_v403/tif_swab.c) | 1 | ||||
-rw-r--r-- | third_party/libtiff/tif_thunder.c (renamed from third_party/tiff_v403/tif_thunder.c) | 3 | ||||
-rw-r--r-- | third_party/libtiff/tif_tile.c (renamed from third_party/tiff_v403/tif_tile.c) | 30 | ||||
-rw-r--r-- | third_party/libtiff/tif_version.c (renamed from third_party/tiff_v403/tif_version.c) | 1 | ||||
-rw-r--r-- | third_party/libtiff/tif_warning.c (renamed from third_party/tiff_v403/tif_warning.c) | 6 | ||||
-rw-r--r-- | third_party/libtiff/tif_write.c (renamed from third_party/tiff_v403/tif_write.c) | 39 | ||||
-rw-r--r-- | third_party/libtiff/tif_zip.c (renamed from third_party/tiff_v403/tif_zip.c) | 31 | ||||
-rw-r--r-- | third_party/libtiff/tiff.h (renamed from third_party/tiff_v403/tiff.h) | 5 | ||||
-rw-r--r-- | third_party/libtiff/tiffconf.h (renamed from third_party/tiff_v403/tiffconf.h) | 2 | ||||
-rw-r--r-- | third_party/libtiff/tiffio.h (renamed from third_party/tiff_v403/tiffio.h) | 2 | ||||
-rw-r--r-- | third_party/libtiff/tiffiop.h (renamed from third_party/tiff_v403/tiffiop.h) | 55 | ||||
-rw-r--r-- | third_party/libtiff/uvcode.h (renamed from third_party/tiff_v403/uvcode.h) | 0 | ||||
-rw-r--r-- | third_party/third_party.gyp | 72 | ||||
-rw-r--r-- | third_party/tiff_v403/tiffvers.h | 9 |
50 files changed, 1328 insertions, 819 deletions
diff --git a/core/src/fxcodec/codec/fx_codec_tiff.cpp b/core/src/fxcodec/codec/fx_codec_tiff.cpp index cf7af8fe77..51a443bc3d 100644 --- a/core/src/fxcodec/codec/fx_codec_tiff.cpp +++ b/core/src/fxcodec/codec/fx_codec_tiff.cpp @@ -9,7 +9,7 @@ #include "codec_int.h"
extern "C" {
-#include "third_party/tiff_v403/tiffiop.h"
+#include "third_party/libtiff/tiffiop.h"
}
void* IccLib_CreateTransform_sRGB(const unsigned char* pProfileData,
@@ -181,22 +181,10 @@ void _TIFFmemcpy(void* des, const void* src, tmsize_t size) { int _TIFFmemcmp(const void* ptr1, const void* ptr2, tmsize_t size) {
return FXSYS_memcmp(ptr1, ptr2, (size_t)size);
}
-static void _tiff_warning_ext(thandle_t context,
- const char* module,
- const char* fmt,
- va_list ap) {
- if (module != NULL) {
- }
-}
-TIFFErrorHandlerExt _TIFFwarningHandlerExt = _tiff_warning_ext;
-static void _tiff_error_ext(thandle_t context,
- const char* module,
- const char* fmt,
- va_list ap) {
- if (module != NULL) {
- }
-}
-TIFFErrorHandlerExt _TIFFerrorHandlerExt = _tiff_error_ext;
+
+TIFFErrorHandler _TIFFwarningHandler = nullptr;
+TIFFErrorHandler _TIFFerrorHandler = nullptr;
+
int TIFFCmyk2Rgb(thandle_t context,
uint8 c,
uint8 m,
diff --git a/third_party/BUILD.gn b/third_party/BUILD.gn index 51481dddef..ed8037b385 100644 --- a/third_party/BUILD.gn +++ b/third_party/BUILD.gn @@ -305,42 +305,42 @@ if (pdf_enable_xfa) { "//third_party/pdfium:pdfium_config", ] sources = [ - "tiff_v403/tiffiop.h", - "tiff_v403/tif_aux.c", - "tiff_v403/tif_close.c", - "tiff_v403/tif_codec.c", - "tiff_v403/tif_color.c", - "tiff_v403/tif_compress.c", - "tiff_v403/tif_dir.c", - "tiff_v403/tif_dirinfo.c", - "tiff_v403/tif_dirread.c", - "tiff_v403/tif_dirwrite.c", - "tiff_v403/tif_dumpmode.c", - "tiff_v403/tif_error.c", - "tiff_v403/tif_extension.c", - "tiff_v403/tif_fax3.c", - "tiff_v403/tif_fax3sm.c", - "tiff_v403/tif_flush.c", - "tiff_v403/tif_getimage.c", - "tiff_v403/tif_jpeg.c", - "tiff_v403/tif_luv.c", - "tiff_v403/tif_lzw.c", - "tiff_v403/tif_next.c", - "tiff_v403/tif_ojpeg.c", - "tiff_v403/tif_open.c", - "tiff_v403/tif_packbits.c", - "tiff_v403/tif_pixarlog.c", - "tiff_v403/tif_predict.c", - "tiff_v403/tif_print.c", - "tiff_v403/tif_read.c", - "tiff_v403/tif_strip.c", - "tiff_v403/tif_swab.c", - "tiff_v403/tif_thunder.c", - "tiff_v403/tif_tile.c", - "tiff_v403/tif_version.c", - "tiff_v403/tif_warning.c", - "tiff_v403/tif_write.c", - "tiff_v403/tif_zip.c", + "libtiff/tiffiop.h", + "libtiff/tif_aux.c", + "libtiff/tif_close.c", + "libtiff/tif_codec.c", + "libtiff/tif_color.c", + "libtiff/tif_compress.c", + "libtiff/tif_dir.c", + "libtiff/tif_dirinfo.c", + "libtiff/tif_dirread.c", + "libtiff/tif_dirwrite.c", + "libtiff/tif_dumpmode.c", + "libtiff/tif_error.c", + "libtiff/tif_extension.c", + "libtiff/tif_fax3.c", + "libtiff/tif_fax3sm.c", + "libtiff/tif_flush.c", + "libtiff/tif_getimage.c", + "libtiff/tif_jpeg.c", + "libtiff/tif_luv.c", + "libtiff/tif_lzw.c", + "libtiff/tif_next.c", + "libtiff/tif_ojpeg.c", + "libtiff/tif_open.c", + "libtiff/tif_packbits.c", + "libtiff/tif_pixarlog.c", + "libtiff/tif_predict.c", + "libtiff/tif_print.c", + "libtiff/tif_read.c", + "libtiff/tif_strip.c", + "libtiff/tif_swab.c", + "libtiff/tif_thunder.c", + "libtiff/tif_tile.c", + "libtiff/tif_version.c", + "libtiff/tif_warning.c", + "libtiff/tif_write.c", + "libtiff/tif_zip.c", ] } } diff --git a/third_party/libtiff/0000-build-config.patch b/third_party/libtiff/0000-build-config.patch new file mode 100644 index 0000000000..50af2db529 --- /dev/null +++ b/third_party/libtiff/0000-build-config.patch @@ -0,0 +1,337 @@ +diff a/third_party/libtiff/tiffiop.h b/third_party/libtiff/tiffiop.h +--- a/third_party/libtiff/tiffiop.h ++++ b/third_party/libtiff/tiffiop.h +@@ -30,7 +30,7 @@ + * ``Library-private'' definitions. + */ + +-#include "tif_config.h" ++#include "tiffconf.h" + + #ifdef HAVE_FCNTL_H + # include <fcntl.h> +diff a/third_party/libtiff/tif_jpeg.c b/third_party/libtiff/tif_jpeg.c +--- a/third_party/libtiff/tif_jpeg.c ++++ b/third_party/libtiff/tif_jpeg.c +@@ -85,8 +85,16 @@ + # define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ + #endif + +-#include "jpeglib.h" +-#include "jerror.h" ++#if defined(USE_SYSTEM_LIBJPEG) ++#include <jerror.h> ++#include <jpeglib.h> ++#elif defined(USE_LIBJPEG_TURBO) ++#include "third_party/libjpeg_turbo/jerror.h" ++#include "third_party/libjpeg_turbo/jpeglib.h" ++#else ++#include "third_party/libjpeg/jerror.h" ++#include "third_party/libjpeg/jpeglib.h" ++#endif + + /* + * Do we want to do special processing suitable for when JSAMPLE is a +diff a/third_party/libtiff/tif_ojpeg.c b/third_party/libtiff/tif_ojpeg.c +--- a/third_party/libtiff/tif_ojpeg.c ++++ b/third_party/libtiff/tif_ojpeg.c +@@ -214,8 +214,17 @@ + # define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ + #endif + +-#include "jpeglib.h" +-#include "jerror.h" ++#if defined(USE_SYSTEM_LIBJPEG) ++#include <jerror.h> ++#include <jpeglib.h> ++#elif defined(USE_LIBJPEG_TURBO) ++#include "third_party/libjpeg_turbo/jerror.h" ++#include "third_party/libjpeg_turbo/jpeglib.h" ++#else ++#include "third_party/libjpeg/jerror.h" ++#include "third_party/libjpeg/jpeglib.h" ++#endif ++ + + typedef struct jpeg_error_mgr jpeg_error_mgr; + typedef struct jpeg_common_struct jpeg_common_struct; +diff a/third_party/libtiff/tif_pixarlog.c b/third_party/libtiff/tif_pixarlog.c +--- a/third_party/libtiff/tif_pixarlog.c ++++ b/third_party/libtiff/tif_pixarlog.c +@@ -90,7 +90,7 @@ + */ + + #include "tif_predict.h" +-#include "zlib.h" ++#include "../zlib_v128/zlib.h" + + #include <stdio.h> + #include <stdlib.h> +diff a/third_party/libtiff/tif_zip.c b/third_party/libtiff/tif_zip.c +--- a/third_party/libtiff/tif_zip.c ++++ b/third_party/libtiff/tif_zip.c +@@ -47,7 +47,7 @@ + * last found at ftp://ftp.uu.net/pub/archiving/zip/zlib/zlib-0.99.tar.gz. + */ + #include "tif_predict.h" +-#include "zlib.h" ++#include "../zlib_v128/zlib.h" + + #include <stdio.h> + +diff a/third_party/libtiff/tiffconf.h b/third_party/libtiff/tiffconf.h +--- /dev/null ++++ b/third_party/libtiff/tiffconf.h +@@ -0,0 +1,252 @@ ++/* libtiff/tiffconf.h. Generated by configure. */ ++/* ++ Configuration defines for installed libtiff. ++ This file maintained for backward compatibility. Do not use definitions ++ from this file in your programs. ++*/ ++#ifndef _TIFFCONF_ ++#define _TIFFCONF_ ++ ++#ifndef _FX_SYSTEM_H_ ++# include "../../core/include/fxcrt/fx_system.h" ++#endif ++ ++//NOTE: The tiff codec requires an ANSI C compiler environment for building and ++// presumes an ANSI C environment for use. ++ ++/* Define to 1 if you have the <fcntl.h> header file. */ ++/* Define to 1 if you have the <sys/types.h> header file. */ ++#if _FX_OS_ == _FX_WIN32_MOBILE_ ++# define O_RDONLY 0x0000 /* open for reading only */ ++# define O_WRONLY 0x0001 /* open for writing only */ ++# define O_RDWR 0x0002 /* open for reading and writing */ ++# define O_CREAT 0x0100 /* create and open file */ ++# define O_TRUNC 0x0200 /* open and truncate */ ++#else ++# define HAVE_SYS_TYPES_H 1 ++# define HAVE_FCNTL_H 1 ++#endif ++ ++/* Compatibility stuff. */ ++ ++/* Define to 1 if you have the <assert.h> header file. */ ++#define HAVE_ASSERT_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 <string.h> header file. */ ++//#define HAVE_STRING_H 1 ++//fx_system.h already include the string.h in ANSIC ++ ++/* 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. */ ++/* According typedef int int32_t; in the fx_system.h*/ ++#define SIZEOF_INT 4 ++ ++/* Sunliang.Liu 20110325. We should config the correct long size for tif ++ fax4decode optimize in tif_fax3.c -- Linux64 decode issue. ++ TESTDOC: Bug #23661 - z1.tif. */ ++#if _FX_CPU_ == _FX_WIN64_ || _FX_CPU_ == _FX_X64_ || _FX_CPU_ == _FX_IA64_ ++/* The size of `unsigned long', as computed by sizeof. */ ++#define SIZEOF_UNSIGNED_LONG 8 ++#else ++#define SIZEOF_UNSIGNED_LONG 4 ++#endif ++ ++#define HAVE_SNPRINTF 1 ++ ++/* Signed 8-bit type */ ++#define TIFF_INT8_T signed char ++ ++/* 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 */ ++#define TIFF_INT32_T signed int ++ ++/* Unsigned 32-bit type */ ++#define TIFF_UINT32_T unsigned int ++ ++/* Signed 32-bit type formatter */ ++#define TIFF_INT32_FORMAT "%d" ++ ++/* Unsigned 32-bit type formatter */ ++#define TIFF_UINT32_FORMAT "%u" ++ ++#ifdef _MSC_VER // windows ++ ++/* Signed 64-bit type formatter */ ++#define TIFF_INT64_FORMAT "%I64d" ++ ++/* Unsigned 64-bit type formatter */ ++#define TIFF_UINT64_FORMAT "%I64u" ++ ++/* Signed 64-bit type */ ++#define TIFF_INT64_T signed __int64 ++ ++/* Unsigned 64-bit type */ ++#define TIFF_UINT64_T unsigned __int64 ++ ++#else // linux/unix ++ ++#if 0 //_FX_CPU_ == _FX_X64_ // linux/unix 64 ++ ++/* Signed 64-bit type formatter */ ++#define TIFF_INT64_FORMAT "%ld" ++ ++/* Unsigned 64-bit type formatter */ ++#define TIFF_UINT64_FORMAT "%lu" ++ ++/* Signed 64-bit type */ ++#define TIFF_INT64_T signed long ++ ++#else // linux/unix 32 ++ ++/* Signed 64-bit type formatter */ ++#define TIFF_INT64_FORMAT "%lld" ++ ++/* Unsigned 64-bit type formatter */ ++#define TIFF_UINT64_FORMAT "%llu" ++ ++/* Signed 64-bit type */ ++#define TIFF_INT64_T signed long long ++ ++#endif // end _FX_CPU_ ++ ++/* Unsigned 64-bit type */ ++#define TIFF_UINT64_T unsigned long long ++ ++#endif ++ ++ ++/* Signed size type */ ++#ifdef _MSC_VER ++ ++#if defined(_WIN64) ++#define TIFF_SSIZE_T signed __int64 ++#else ++#define TIFF_SSIZE_T signed int ++#endif ++ ++#else ++ ++#define TIFF_SSIZE_T signed long ++ ++#endif ++ ++/* Signed size type formatter */ ++#if defined(_WIN64) ++#define TIFF_SSIZE_FORMAT "%I64d" ++#else ++#define TIFF_SSIZE_FORMAT "%ld" ++#endif ++ ++/* Pointer difference type */ ++#ifdef _MSC_VER ++#define TIFF_PTRDIFF_T long ++#else ++#define TIFF_PTRDIFF_T ptrdiff_t ++#endif ++ ++/* Signed 64-bit type */ ++/*#define TIFF_INT64_T signed __int64*/ ++ ++/* Unsigned 64-bit type */ ++/*#define TIFF_UINT64_T unsigned __int64*/ ++ ++/* 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 ++ ++#define BSDTYPES ++ ++/* 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) */ ++#if _FX_ENDIAN_ == _FX_BIG_ENDIAN_ ++# define HOST_BIGENDIAN 1 ++#else ++# define HOST_BIGENDIAN 0 ++#endif ++ ++/* Support CCITT Group 3 & 4 algorithms */ ++#define CCITT_SUPPORT 1 ++ ++/* Support JPEG compression (requires IJG JPEG library) */ ++#define JPEG_SUPPORT 1 ++ ++/* 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) */ ++#define OJPEG_SUPPORT 1 ++ ++/* Support Macintosh PackBits algorithm */ ++#define PACKBITS_SUPPORT 1 ++ ++/* Support Pixar log-format algorithm (requires Zlib) */ ++#define PIXARLOG_SUPPORT 1 ++ ++/* Support ThunderScan 4-bit RLE algorithm */ ++#define THUNDER_SUPPORT 1 ++ ++/* Support Deflate compression */ ++#define ZIP_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 ++ ++/* 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 ++ ++/* Support MS MDI magic number files as TIFF */ ++#define MDI_SUPPORT 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_ */ diff --git a/third_party/libtiff/README.pdfium b/third_party/libtiff/README.pdfium new file mode 100644 index 0000000000..bee4729556 --- /dev/null +++ b/third_party/libtiff/README.pdfium @@ -0,0 +1,12 @@ +Name: LibTIFF +URL: http://www.remotesensing.org/libtiff/ +Version: 4.0.6 +Security Critical: yes +License: BSD + +Description: +TIFF library. + +Local Modifications: + +0000-build-config.patch: Local build configuration changes. diff --git a/third_party/tiff_v403/t4.h b/third_party/libtiff/t4.h index b908f54f09..b908f54f09 100644 --- a/third_party/tiff_v403/t4.h +++ b/third_party/libtiff/t4.h diff --git a/third_party/tiff_v403/tif_aux.c b/third_party/libtiff/tif_aux.c index 7d712146dd..927150a493 100644 --- a/third_party/tiff_v403/tif_aux.c +++ b/third_party/libtiff/tif_aux.c @@ -356,4 +356,3 @@ _TIFFUInt64ToDouble(uint64 ui64) * fill-column: 78 * End: */ -
\ No newline at end of file diff --git a/third_party/tiff_v403/tif_close.c b/third_party/libtiff/tif_close.c index 6181b97e2e..13d2bab5ce 100644 --- a/third_party/tiff_v403/tif_close.c +++ b/third_party/libtiff/tif_close.c @@ -138,4 +138,3 @@ TIFFClose(TIFF* tif) * fill-column: 78 * End: */ - diff --git a/third_party/tiff_v403/tif_codec.c b/third_party/libtiff/tif_codec.c index 012a90b5e6..7cb46f6304 100644 --- a/third_party/tiff_v403/tif_codec.c +++ b/third_party/libtiff/tif_codec.c @@ -1,4 +1,4 @@ -/* $Id: tif_codec.c,v 1.15 2010-12-14 12:53:00 dron Exp $ */ +/* $Id: tif_codec.c,v 1.17 2015-08-19 02:31:04 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -108,7 +108,7 @@ _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 ); + 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 ); @@ -163,4 +163,3 @@ TIFFIsCODECConfigured(uint16 scheme) * fill-column: 78 * End: */ - diff --git a/third_party/tiff_v403/tif_color.c b/third_party/libtiff/tif_color.c index c55a4afeb2..be4850ce6b 100644 --- a/third_party/tiff_v403/tif_color.c +++ b/third_party/libtiff/tif_color.c @@ -35,6 +35,7 @@ * * Color space conversion routines. */ + #include "tiffiop.h" #include <math.h> @@ -284,4 +285,3 @@ TIFFYCbCrToRGBInit(TIFFYCbCrToRGB* ycbcr, float *luma, float *refBlackWhite) * fill-column: 78 * End: */ - diff --git a/third_party/tiff_v403/tif_compress.c b/third_party/libtiff/tif_compress.c index 3a1e15f3ba..20e72fd073 100644 --- a/third_party/tiff_v403/tif_compress.c +++ b/third_party/libtiff/tif_compress.c @@ -302,4 +302,3 @@ TIFFGetConfiguredCODECs() * fill-column: 78 * End: */ - diff --git a/third_party/tiff_v403/tif_dir.c b/third_party/libtiff/tif_dir.c index 06951b4d17..73212c02db 100644 --- a/third_party/tiff_v403/tif_dir.c +++ b/third_party/libtiff/tif_dir.c @@ -1,4 +1,4 @@ -/* $Id: tif_dir.c,v 1.113 2012-06-14 20:32:53 fwarmerdam Exp $ */ +/* $Id: tif_dir.c,v 1.121 2015-05-31 23:11:43 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -160,10 +160,12 @@ _TIFFVSetField(TIFF* tif, uint32 tag, va_list ap) TIFFDirectory* td = &tif->tif_dir; int status = 1; uint32 v32, i, 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 @@ -283,10 +285,16 @@ _TIFFVSetField(TIFF* tif, uint32 tag, va_list ap) setDoubleArrayOneValue(&td->td_smaxsamplevalue, va_arg(ap, double), td->td_samplesperpixel); break; case TIFFTAG_XRESOLUTION: - td->td_xresolution = (float) va_arg(ap, double); + dblval = va_arg(ap, double); + if( dblval < 0 ) + goto badvaluedouble; + td->td_xresolution = (float) dblval; break; case TIFFTAG_YRESOLUTION: - td->td_yresolution = (float) va_arg(ap, double); + dblval = va_arg(ap, double); + if( dblval < 0 ) + goto badvaluedouble; + td->td_yresolution = (float) dblval; break; case TIFFTAG_PLANARCONFIG: v = (uint16) va_arg(ap, uint16_vap); @@ -449,11 +457,11 @@ _TIFFVSetField(TIFF* tif, uint32 tag, va_list ap) * happens, for example, when tiffcp is used to convert between * compression schemes and codec-specific tags are blindly copied. */ - if(fip == NULL || fip->field_bit != FIELD_CUSTOM) { + 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 ? fip->field_name : "Unknown"); + fip->field_name); status = 0; break; } @@ -693,6 +701,16 @@ badvalue32: va_end(ap); } return (0); +badvaluedouble: + { + const TIFFField* fip=TIFFFieldWithTag(tif,tag); + TIFFErrorExt(tif->tif_clientdata, module, + "%s: Bad value %f for \"%s\" tag", + tif->tif_name, dblval, + fip ? fip->field_name : "Unknown"); + va_end(ap); + } + return (0); } /* @@ -809,6 +827,8 @@ _TIFFVGetField(TIFF* tif, uint32 tag, va_list ap) 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 @@ -1006,14 +1026,14 @@ _TIFFVGetField(TIFF* tif, uint32 tag, va_list ap) * get a tag that is not valid for the image's * codec then we'll arrive here. */ - if( fip == NULL || fip->field_bit != FIELD_CUSTOM ) + 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 ? fip->field_name : "Unknown"); + fip->field_name); ret_val = 0; break; } @@ -1302,8 +1322,20 @@ TIFFDefaultDirectory(TIFF* tif) tif->tif_tagmethods.printdir = NULL; /* * Give client code a chance to install their own - * tag extensions & methods, prior to compression overloads. + * 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); @@ -1344,6 +1376,7 @@ TIFFAdvanceDirectory(TIFF* tif, uint64* nextdir, uint64* off) 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)); @@ -1453,7 +1486,8 @@ TIFFAdvanceDirectory(TIFF* tif, uint64* nextdir, uint64* off) (void) TIFFSeekFile(tif, dircount16*20, SEEK_CUR); if (!ReadOK(tif, nextdir, sizeof (uint64))) { - TIFFErrorExt(tif->tif_clientdata, module, "%s: Error fetching directory link", + TIFFErrorExt(tif->tif_clientdata, module, + "%s: Error fetching directory link", tif->tif_name); return (0); } @@ -1470,6 +1504,7 @@ TIFFAdvanceDirectory(TIFF* tif, uint64* nextdir, uint64* off) uint16 TIFFNumberOfDirectories(TIFF* tif) { + static const char module[] = "TIFFNumberOfDirectories"; uint64 nextdir; uint16 n; if (!(tif->tif_flags&TIFF_BIGTIFF)) @@ -1478,7 +1513,18 @@ TIFFNumberOfDirectories(TIFF* tif) nextdir = tif->tif_header.big.tiff_diroff; n = 0; while (nextdir != 0 && TIFFAdvanceDirectory(tif, &nextdir, NULL)) - n++; + { + if (n != 65535) { + ++n; + } + else + { + TIFFErrorExt(tif->tif_clientdata, module, + "Directory count exceeded 65535 limit," + " giving up on counting."); + return (65535); + } + } return (n); } @@ -1657,4 +1703,3 @@ TIFFUnlinkDirectory(TIFF* tif, uint16 dirn) * fill-column: 78 * End: */ - diff --git a/third_party/tiff_v403/tif_dir.h b/third_party/libtiff/tif_dir.h index 6af5f3dc37..6af5f3dc37 100644 --- a/third_party/tiff_v403/tif_dir.h +++ b/third_party/libtiff/tif_dir.h diff --git a/third_party/tiff_v403/tif_dirinfo.c b/third_party/libtiff/tif_dirinfo.c index 2914d4079b..7db4bdb95c 100644 --- a/third_party/tiff_v403/tif_dirinfo.c +++ b/third_party/libtiff/tif_dirinfo.c @@ -1,4 +1,4 @@ -/* $Id: tif_dirinfo.c,v 1.117 2012-08-19 16:56:34 bfriesen Exp $ */ +/* $Id: tif_dirinfo.c,v 1.121 2014-05-07 01:58:46 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -128,6 +128,8 @@ tiffFields[] = { { 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 }, @@ -193,19 +195,19 @@ tiffFields[] = { { 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" }, - { TIFFTAG_GLOBALPARAMETERSIFD, 1, 1, TIFF_IFD, 0, TIFF_SETGET_UINT32, 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 DNG 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 */ }; @@ -494,13 +496,6 @@ _TIFFDataSize(TIFFDataType type) } } -/* Sync from 3.8.2's modified*/ -#ifdef _WIN32_WCE -void* wceex_bsearch(const void *key, const void *base, size_t nmemb, size_t size, - int (*compar)(const void *, const void *)); -#define bsearch wceex_bsearch -#endif - const TIFFField* TIFFFindField(TIFF* tif, uint32 tag, TIFFDataType dt) { @@ -546,21 +541,10 @@ _TIFFFindFieldByName(TIFF* tif, const char *field_name, TIFFDataType dt) key.field_name = (char *)field_name; key.field_type = dt; -#if 1 ret = (const TIFFField **) td_lfind(&pkey, tif->tif_fields, &tif->tif_nfields, sizeof(TIFFField *), tagNameCompare); -#else - // from old svn version - /*ret = (const TIFFFieldInfo **) lfind(&pkey, - tif->tif_fieldinfo, - &tif->tif_nfields, - sizeof(TIFFFieldInfo *), - tagNameCompare); - */ - /*modify by Sunliang.Liu 20090827 for some platform not support lfind*/ - ret = NULL; -#endif + return tif->tif_foundfield = (ret ? *ret : NULL); } @@ -729,7 +713,7 @@ _TIFFCreateAnonField(TIFF *tif, uint32 tag, TIFFDataType field_type) * note that this name is a special sign to TIFFClose() and * _TIFFSetupFields() to free the field */ - sprintf(fld->field_name, "Tag %d", (int) tag); + snprintf(fld->field_name, 32, "Tag %d", (int) tag); return fld; } @@ -973,4 +957,3 @@ TIFFMergeFieldInfo(TIFF* tif, const TIFFFieldInfo info[], uint32 n) * fill-column: 78 * End: */ - diff --git a/third_party/tiff_v403/tif_dirread.c b/third_party/libtiff/tif_dirread.c index b9e4ffae09..a0dc68b78e 100644 --- a/third_party/tiff_v403/tif_dirread.c +++ b/third_party/libtiff/tif_dirread.c @@ -1,4 +1,4 @@ -/* $Id: tif_dirread.c,v 1.178 2012-08-19 16:56:34 bfriesen Exp $ */ +/* $Id: tif_dirread.c,v 1.191 2015-09-05 20:31:41 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -38,7 +38,7 @@ * the pointer to the appropriate TIFFField structure early on in * TIFFReadDirectory, so as to eliminate current possibly repetitive lookup. */ - + #include "tiffiop.h" #define IGNORE 0 /* tag placeholder used below */ @@ -2172,11 +2172,6 @@ static enum TIFFReadDirEntryErr TIFFReadDirEntrySlong8Array(TIFF* tif, TIFFDirEn break; } _TIFFfree(origdata); - if (err!=TIFFReadDirEntryErrOk) - { - _TIFFfree(data); - return(err); - } *value=data; return(TIFFReadDirEntryErrOk); } @@ -2414,11 +2409,6 @@ static enum TIFFReadDirEntryErr TIFFReadDirEntryFloatArray(TIFF* tif, TIFFDirEnt break; } _TIFFfree(origdata); - if (err!=TIFFReadDirEntryErrOk) - { - _TIFFfree(data); - return(err); - } *value=data; return(TIFFReadDirEntryErrOk); } @@ -2657,11 +2647,6 @@ TIFFReadDirEntryDoubleArray(TIFF* tif, TIFFDirEntry* direntry, double** value) break; } _TIFFfree(origdata); - if (err!=TIFFReadDirEntryErrOk) - { - _TIFFfree(data); - return(err); - } *value=data; return(TIFFReadDirEntryErrOk); } @@ -2723,11 +2708,6 @@ static enum TIFFReadDirEntryErr TIFFReadDirEntryIfd8Array(TIFF* tif, TIFFDirEntr break; } _TIFFfree(origdata); - if (err!=TIFFReadDirEntryErrOk) - { - _TIFFfree(data); - return(err); - } *value=data; return(TIFFReadDirEntryErrOk); } @@ -3194,11 +3174,7 @@ static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSlong(int32 value) /* * Largest 32-bit unsigned integer value. */ -#if defined(__WIN32__) && defined(_MSC_VER) -# define TIFF_UINT32_MAX 0xFFFFFFFFI64 -#else -# define TIFF_UINT32_MAX 0xFFFFFFFFLL -#endif +#define TIFF_UINT32_MAX 0xFFFFFFFFU static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongLong8(uint64 value) @@ -3212,7 +3188,7 @@ TIFFReadDirEntryCheckRangeLongLong8(uint64 value) static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSlong8(int64 value) { - if ((value<0) || (value > TIFF_UINT32_MAX)) + if ((value < 0) || (value > (int64) TIFF_UINT32_MAX)) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); @@ -3229,19 +3205,21 @@ TIFFReadDirEntryCheckRangeSlongLong(uint32 value) return(TIFFReadDirEntryErrOk); } +/* Check that the 8-byte unsigned value can fit in a 4-byte unsigned range */ static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSlongLong8(uint64 value) { - if (value > 0x7FFFFFFFUL) + 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) { - if ((value < 0L-0x80000000L) || (value > 0x7FFFFFFFL)) + if ((value < 0-((int64) 0x7FFFFFFF+1)) || (value > 0x7FFFFFFF)) return(TIFFReadDirEntryErrRange); else return(TIFFReadDirEntryErrOk); @@ -3286,11 +3264,7 @@ TIFFReadDirEntryCheckRangeLong8Slong8(int64 value) /* * Largest 64-bit signed integer value. */ -#if defined(__WIN32__) && defined(_MSC_VER) -# define TIFF_INT64_MAX 0x7FFFFFFFFFFFFFFFI64 -#else -# define TIFF_INT64_MAX 0x7FFFFFFFFFFFFFFFLL -#endif +#define TIFF_INT64_MAX ((int64)(((uint64) ~0) >> 1)) static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeSlong8Long8(uint64 value) @@ -3374,7 +3348,7 @@ static void TIFFReadDirEntryOutputErr(TIFF* tif, enum TIFFReadDirEntryErr err, c } else { switch (err) { case TIFFReadDirEntryErrCount: - TIFFErrorExt(tif->tif_clientdata, module, + TIFFWarningExt(tif->tif_clientdata, module, "Incorrect count for \"%s\"; tag ignored", tagname); break; @@ -3430,6 +3404,8 @@ TIFFReadDirectory(TIFF* tif) const TIFFField* fip; uint32 fii=FAILED_FII; toff_t nextdiroff; + int bitspersample_read = FALSE; + tif->tif_diroff=tif->tif_nextdiroff; if (!TIFFCheckDirOffset(tif,tif->tif_nextdiroff)) return 0; /* last offset or bad offset (IFD looping) */ @@ -3706,6 +3682,8 @@ TIFFReadDirectory(TIFF* tif) } if (!TIFFSetField(tif,dp->tdir_tag,value)) goto bad; + if( dp->tdir_tag == TIFFTAG_BITSPERSAMPLE ) + bitspersample_read = TRUE; } break; case TIFFTAG_SMINSAMPLEVALUE: @@ -3763,6 +3741,19 @@ TIFFReadDirectory(TIFF* tif) uint32 countrequired; uint32 incrementpersample; uint16* value=NULL; + /* It would be dangerous to instanciate 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; + } countpersample=(1L<<tif->tif_dir.td_bitspersample); if ((dp->tdir_tag==TIFFTAG_TRANSFERFUNCTION)&&(dp->tdir_count==(uint64)countpersample)) { @@ -4278,7 +4269,8 @@ EstimateStripByteCounts(TIFF* tif, TIFFDirEntry* dir, uint16 dircount) TIFFDirectory *td = &tif->tif_dir; uint32 strip; - _TIFFFillStriles( tif ); + if( !_TIFFFillStriles( tif ) ) + return -1; if (td->td_stripbytecount) _TIFFfree(td->td_stripbytecount); @@ -4377,6 +4369,11 @@ TIFFCheckDirOffset(TIFF* tif, uint64 diroff) 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) @@ -4396,7 +4393,10 @@ TIFFCheckDirOffset(TIFF* tif, uint64 diroff) tif->tif_dirnumber, 2 * sizeof(uint64), "for IFD list"); if (!new_dirlist) return 0; - tif->tif_dirlistsize = 2 * tif->tif_dirnumber; + if( tif->tif_dirnumber >= 32768 ) + tif->tif_dirlistsize = 65535; + else + tif->tif_dirlistsize = 2 * tif->tif_dirnumber; tif->tif_dirlist = new_dirlist; } @@ -4708,6 +4708,7 @@ TIFFFetchNormalTag(TIFF* tif, TIFFDirEntry* dp, int recover) 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; @@ -5355,7 +5356,7 @@ TIFFFetchNormalTag(TIFF* tif, TIFFDirEntry* dp, int recover) } if (err!=TIFFReadDirEntryErrOk) { - TIFFReadDirEntryOutputErr(tif,err,module,fip ? fip->field_name : "unknown tagname",recover); + TIFFReadDirEntryOutputErr(tif,err,module,fip->field_name,recover); return(0); } return(1); @@ -5611,4 +5612,3 @@ int _TIFFFillStriles( TIFF *tif ) * fill-column: 78 * End: */ - diff --git a/third_party/tiff_v403/tif_dirwrite.c b/third_party/libtiff/tif_dirwrite.c index fa20609e2b..a0fd8dc2f6 100644 --- a/third_party/tiff_v403/tif_dirwrite.c +++ b/third_party/libtiff/tif_dirwrite.c @@ -1,4 +1,4 @@ -/* $Id: tif_dirwrite.c,v 1.77 2012-07-06 19:18:31 bfriesen Exp $ */ +/* $Id: tif_dirwrite.c,v 1.78 2015-05-31 00:38:46 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -2839,14 +2839,15 @@ _TIFFRewriteField(TIFF* tif, uint16 tag, TIFFDataType in_datatype, "Error writing directory link"); return (0); } - - _TIFFfree( buf_to_write ); } else { memcpy( &entry_offset, buf_to_write, count*TIFFDataWidth(datatype)); } + _TIFFfree( buf_to_write ); + buf_to_write = 0; + /* -------------------------------------------------------------------- */ /* Adjust the directory entry. */ /* -------------------------------------------------------------------- */ diff --git a/third_party/tiff_v403/tif_dumpmode.c b/third_party/libtiff/tif_dumpmode.c index 8f582e7be5..a94cf0b34a 100644 --- a/third_party/tiff_v403/tif_dumpmode.c +++ b/third_party/libtiff/tif_dumpmode.c @@ -141,4 +141,3 @@ TIFFInitDumpMode(TIFF* tif, int scheme) * fill-column: 78 * End: */ - diff --git a/third_party/tiff_v403/tif_error.c b/third_party/libtiff/tif_error.c index 8c0ef6cf9b..0bc8b878bd 100644 --- a/third_party/tiff_v403/tif_error.c +++ b/third_party/libtiff/tif_error.c @@ -29,9 +29,7 @@ */ #include "tiffiop.h" -/*TIFFErrorHandlerExt _TIFFerrorHandlerExt = NULL;*/ -/* Modify here for use _TIFFerrorHandlerExt by Sunliang.Liu 20090715 */ -TIFFErrorHandler _TIFFerrorHandler = NULL; +TIFFErrorHandlerExt _TIFFerrorHandlerExt = NULL; TIFFErrorHandler TIFFSetErrorHandler(TIFFErrorHandler handler) @@ -80,4 +78,3 @@ TIFFErrorExt(thandle_t fd, const char* module, const char* fmt, ...) * fill-column: 78 * End: */ - diff --git a/third_party/tiff_v403/tif_extension.c b/third_party/libtiff/tif_extension.c index 32d10cb7ad..10afd4162c 100644 --- a/third_party/tiff_v403/tif_extension.c +++ b/third_party/libtiff/tif_extension.c @@ -30,6 +30,7 @@ * Various routines support external extension of the tag set, and other * application extension capabilities. */ + #include "tiffiop.h" int TIFFGetTagListCount( TIFF *tif ) @@ -115,4 +116,3 @@ void TIFFSetClientInfo( TIFF *tif, void *data, const char *name ) * fill-column: 78 * End: */ - diff --git a/third_party/tiff_v403/tif_fax3.c b/third_party/libtiff/tif_fax3.c index 7ec8faa8b0..bbe72555be 100644 --- a/third_party/tiff_v403/tif_fax3.c +++ b/third_party/libtiff/tif_fax3.c @@ -1,4 +1,4 @@ -/* $Id: tif_fax3.c,v 1.74 2012-06-21 02:01:31 fwarmerdam Exp $ */ +/* $Id: tif_fax3.c,v 1.75 2015-08-30 20:49:55 erouault Exp $ */ /* * Copyright (c) 1990-1997 Sam Leffler @@ -23,6 +23,7 @@ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ + #include "tiffiop.h" #ifdef CCITT_SUPPORT /* @@ -369,7 +370,7 @@ _TIFFFax3fillruns(unsigned char* buf, uint32* runs, uint32* erun, uint32 lastx) static const unsigned char _fillmasks[] = { 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff }; unsigned char* cp; - uint32 x, bx, run,bx_;/* add bx_ = 8-bx for avoid ms evc compiler bug*/ + uint32 x, bx, run; int32 n, nw; long* lp; @@ -383,18 +384,10 @@ _TIFFFax3fillruns(unsigned char* buf, uint32* runs, uint32* erun, uint32 lastx) 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; -// } -//Modify by Sunliang.Liu 20090804 -//Detail: For avoid ms evc compiler bug in WCE ARMV4(I) Release - bx_ = 8-bx; - if (run > bx_) { + if (run > 8-bx) { if (bx) { /* align to byte boundary */ - *cp++ &= 0xff << bx_; - run -= bx_; + *cp++ &= 0xff << (8-bx); + run -= 8-bx; } if( (n = run >> 3) != 0 ) { /* multiple bytes to fill */ if ((n/sizeof (long)) > 1) { @@ -411,9 +404,6 @@ _TIFFFax3fillruns(unsigned char* buf, uint32* runs, uint32* erun, uint32 lastx) } while (--nw); cp = (unsigned char*) lp; } -#ifdef FAX3_DEBUG - printf("_TIFFFax3fillruns ZERO: %d\n",n); -#endif ZERO(n, cp); run &= 7; } @@ -449,14 +439,12 @@ _TIFFFax3fillruns(unsigned char* buf, uint32* runs, uint32* erun, uint32 lastx) } while (--nw); cp = (unsigned char*) lp; } -#ifdef FAX3_DEBUG - printf("_TIFFFax3fillruns FILL: %d\n",n); -#endif FILL(n, cp); run &= 7; } + /* Explicit 0xff masking to make icc -check=conversions happy */ if (run) - cp[0] |= 0xff00 >> run; + cp[0] = (unsigned char)((cp[0] | (0xff00 >> run))&0xff); } else cp[0] |= _fillmasks[run]>>bx; x += runs[1]; @@ -1393,11 +1381,7 @@ TIFFInitCCITTFax3(TIFF* tif, int scheme) static int Fax4Decode(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s) { -#ifdef FAX3_DEBUG - FILE* file; -#endif DECLARE_STATE_2D(tif, sp, "Fax4Decode"); - (void) s; if (occ % sp->b.rowbytes) { @@ -1420,11 +1404,6 @@ Fax4Decode(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s) if (EOLcnt) goto EOFG4; (*sp->fill)(buf, thisrun, pa, lastx); -#ifdef FAX3_DEBUG - file = fopen("fillbuf.txt", "a"); - fwrite(buf, sp->b.rowbytes, 1, file); - fclose(file); -#endif SETVALUE(0); /* imaginary change for reference */ SWAP(uint32*, sp->curruns, sp->refruns); buf += sp->b.rowbytes; @@ -1440,11 +1419,6 @@ Fax4Decode(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s) #endif ClrBits( 13 ); (*sp->fill)(buf, thisrun, pa, lastx); -#ifdef FAX3_DEBUG - file = fopen("fillbuf.txt", "a"); - fwrite(buf, sp->b.rowbytes, 1, file); - fclose(file); -#endif UNCACHE_STATE(tif, sp); return ( sp->line ? 1 : -1); /* don't error on badly-terminated strips */ } @@ -1620,4 +1594,3 @@ TIFFInitCCITTRLEW(TIFF* tif, int scheme) * fill-column: 78 * End: */ - diff --git a/third_party/tiff_v403/tif_fax3.h b/third_party/libtiff/tif_fax3.h index b0f46c9a43..b0f46c9a43 100644 --- a/third_party/tiff_v403/tif_fax3.h +++ b/third_party/libtiff/tif_fax3.h diff --git a/third_party/tiff_v403/tif_fax3sm.c b/third_party/libtiff/tif_fax3sm.c index c943f3e42f..822191ecf4 100644 --- a/third_party/tiff_v403/tif_fax3sm.c +++ b/third_party/libtiff/tif_fax3sm.c @@ -1258,4 +1258,3 @@ * fill-column: 78 * End: */ - diff --git a/third_party/tiff_v403/tif_flush.c b/third_party/libtiff/tif_flush.c index 976cbc4cde..fd14e4cdae 100644 --- a/third_party/tiff_v403/tif_flush.c +++ b/third_party/libtiff/tif_flush.c @@ -116,4 +116,3 @@ TIFFFlushData(TIFF* tif) * fill-column: 78 * End: */ - diff --git a/third_party/tiff_v403/tif_getimage.c b/third_party/libtiff/tif_getimage.c index 35c4786018..f49b73fd47 100644 --- a/third_party/tiff_v403/tif_getimage.c +++ b/third_party/libtiff/tif_getimage.c @@ -1,4 +1,4 @@ -/* $Id: tif_getimage.c,v 1.82 2012-06-06 00:17:49 fwarmerdam Exp $ */ +/* $Id: tif_getimage.c,v 1.90 2015-06-17 01:34:08 bfriesen Exp $ */ /* * Copyright (c) 1991-1997 Sam Leffler @@ -182,8 +182,23 @@ TIFFRGBAImageOK(TIFF* tif, char emsg[1024]) "Planarconfiguration", td->td_planarconfig); return (0); } + if( td->td_samplesperpixel != 3 ) + { + sprintf(emsg, + "Sorry, can not handle image with %s=%d", + "Samples/pixel", td->td_samplesperpixel); + return 0; + } break; case PHOTOMETRIC_CIELAB: + if( td->td_samplesperpixel != 3 || td->td_bitspersample != 8 ) + { + sprintf(emsg, + "Sorry, can not handle image with %s=%d and %s=%d", + "Samples/pixel", td->td_samplesperpixel, + "Bits/sample", td->td_bitspersample); + return 0; + } break; default: sprintf(emsg, "Sorry, can not handle image with %s=%d", @@ -597,6 +612,10 @@ gtTileContig(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h) int32 fromskew, toskew; uint32 nrow; int ret = 1, flip; + uint32 this_tw, tocol; + int32 this_toskew, leftmost_toskew; + int32 leftmost_fromskew; + uint32 leftmost_tw; buf = (unsigned char*) _TIFFmalloc(TIFFTileSize(tif)); if (buf == 0) { @@ -617,37 +636,50 @@ gtTileContig(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h) toskew = -(int32)(tw - w); } + /* + * 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; row < h; row += nrow) { rowstoread = th - (row + img->row_offset) % th; nrow = (row + rowstoread > h ? h - row : rowstoread); - for (col = 0; col < w; col += tw) + fromskew = leftmost_fromskew; + this_tw = leftmost_tw; + this_toskew = leftmost_toskew; + tocol = 0; + col = img->col_offset; + while (tocol < w) { - if (TIFFReadTile(tif, buf, col+img->col_offset, + if (TIFFReadTile(tif, buf, col, row+img->row_offset, 0, 0)==(tmsize_t)(-1) && img->stoponerr) { ret = 0; break; } - - pos = ((row+img->row_offset) % th) * TIFFTileRowSize(tif); - - if (col + tw > w) - { - /* - * Tile is clipped horizontally. Calculate - * visible portion and skewing factors. - */ - uint32 npix = w - col; - fromskew = tw - npix; - (*put)(img, raster+y*w+col, col, y, - npix, nrow, fromskew, toskew + fromskew, buf + pos); - } - else - { - (*put)(img, raster+y*w+col, col, y, tw, nrow, 0, toskew, buf + pos); - } - } + 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); } @@ -698,6 +730,10 @@ gtTileSeparate(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h) uint32 nrow; int ret = 1, flip; int colorchannels; + uint32 this_tw, tocol; + int32 this_toskew, leftmost_toskew; + int32 leftmost_fromskew; + uint32 leftmost_tw; tilesize = TIFFTileSize(tif); bufsize = TIFFSafeMultiply(tmsize_t,alpha?4:3,tilesize); @@ -742,20 +778,31 @@ gtTileSeparate(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h) 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; row < h; row += nrow) { rowstoread = th - (row + img->row_offset) % th; nrow = (row + rowstoread > h ? h - row : rowstoread); - for (col = 0; col < w; col += tw) + fromskew = leftmost_fromskew; + this_tw = leftmost_tw; + this_toskew = leftmost_toskew; + tocol = 0; + col = img->col_offset; + while (tocol < w) { - if (TIFFReadTile(tif, p0, col+img->col_offset, + 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+img->col_offset, + && TIFFReadTile(tif, p1, col, row+img->row_offset,0,1) == (tmsize_t)(-1) && img->stoponerr) { @@ -763,7 +810,7 @@ gtTileSeparate(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h) break; } if (colorchannels > 1 - && TIFFReadTile(tif, p2, col+img->col_offset, + && TIFFReadTile(tif, p2, col, row+img->row_offset,0,2) == (tmsize_t)(-1) && img->stoponerr) { @@ -771,7 +818,7 @@ gtTileSeparate(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h) break; } if (alpha - && TIFFReadTile(tif,pa,col+img->col_offset, + && TIFFReadTile(tif,pa,col, row+img->row_offset,0,colorchannels) == (tmsize_t)(-1) && img->stoponerr) { @@ -779,23 +826,27 @@ gtTileSeparate(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h) break; } - pos = ((row+img->row_offset) % th) * TIFFTileRowSize(tif); - - if (col + tw > w) + pos = ((row+img->row_offset) % th) * TIFFTileRowSize(tif) + \ + ((tmsize_t) fromskew * img->samplesperpixel); + if (tocol + this_tw > w) { /* - * Tile is clipped horizontally. Calculate - * visible portion and skewing factors. + * Rightmost tile is clipped on right side. */ - uint32 npix = w - col; - fromskew = tw - npix; - (*put)(img, raster+y*w+col, col, y, - npix, nrow, fromskew, toskew + fromskew, - p0 + pos, p1 + pos, p2 + pos, (alpha?(pa+pos):NULL)); - } else { - (*put)(img, raster+y*w+col, col, y, - tw, nrow, 0, toskew, p0 + pos, p1 + pos, p2 + pos, (alpha?(pa+pos):NULL)); + 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); @@ -842,6 +893,12 @@ gtStripContig(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h) int32 fromskew, toskew; int ret = 1, flip; + TIFFGetFieldDefaulted(tif, TIFFTAG_YCBCRSUBSAMPLING, &subsamplinghor, &subsamplingver); + if( subsamplingver == 0 ) { + TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "Invalid vertical YCbCr subsampling"); + return (0); + } + buf = (unsigned char*) _TIFFmalloc(TIFFStripSize(tif)); if (buf == 0) { TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "No space for strip buffer"); @@ -859,7 +916,7 @@ gtStripContig(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h) } TIFFGetFieldDefaulted(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip); - TIFFGetFieldDefaulted(tif, TIFFTAG_YCBCRSUBSAMPLING, &subsamplinghor, &subsamplingver); + scanline = TIFFScanlineSize(tif); fromskew = (w < imagewidth ? imagewidth - w : 0); for (row = 0; row < h; row += nrow) @@ -879,7 +936,8 @@ gtStripContig(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h) break; } - pos = ((row + img->row_offset) % rowsperstrip) * scanline; + 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); } @@ -1010,7 +1068,8 @@ gtStripSeparate(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h) } } - pos = ((row + img->row_offset) % rowsperstrip) * scanline; + 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); @@ -1443,79 +1502,24 @@ DECLAREContigPutFunc(putRGBUAcontig16bittile) * * NB: The conversion of CMYK->RGB is *very* crude. */ -/*DECLAREContigPutFunc(putRGBcontig8bitCMYKtile) +DECLAREContigPutFunc(putRGBcontig8bitCMYKtile) { int samplesperpixel = img->samplesperpixel; uint16 r, g, b, k; - + (void) x; (void) y; fromskew *= samplesperpixel; while (h-- > 0) { - 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; -}*/ -/* Modify in 20090723 by Sunliang.Liu */ -DECLAREContigPutFunc(putRGBcontig8bitCMYKtile) -{ - int samplesperpixel = img->samplesperpixel; - uint8 r, g, b, k; - - (void) x; (void) y; - fromskew *= samplesperpixel; - while (h-- > 0) { - UNROLL8(w, NOP, - if(!TIFFCmyk2Rgb(img->tif->tif_clientdata,pp[0],pp[1],pp[2],pp[3], - &r,&g,&b)){ - 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; - } -} - -/* - * 16-bit packed CMYK samples w/o Map => RGB(8-bit) - * - * NB: The conversion of CMYK->RGB is *very* crude. - */ -DECLAREContigPutFunc(putRGBcontig16bitCMYKtile) -{ - int samplesperpixel = img->samplesperpixel; - uint16* wp = (uint16*)pp; - uint8 C, M, Y, K; - uint8 r, g, b; - - (void) x; (void) y; - fromskew *= samplesperpixel; - while (h-- > 0) { - UNROLL8(w, NOP, - C = wp[0]>>8;M = wp[1]>>8;Y = wp[2]>>8;K = wp[3]>>8; - if(!TIFFCmyk2Rgb(img->tif->tif_clientdata,C,M,Y,K, - &r,&g,&b)){ - K = 255 - K; - r = (K*(255-C))/255; - g = (K*(255-M))/255; - b = (K*(255-Y))/255; - } - - *cp++ = PACK(r, g, b); - wp += samplesperpixel); - cp += toskew; - wp += fromskew; - } + 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; + } } /* @@ -1523,7 +1527,6 @@ DECLAREContigPutFunc(putRGBcontig16bitCMYKtile) * * NB: The conversion of CMYK->RGB is *very* crude. */ -/* DECLAREContigPutFunc(putRGBcontig8bitCMYKMaptile) { int samplesperpixel = img->samplesperpixel; @@ -1544,64 +1547,6 @@ DECLAREContigPutFunc(putRGBcontig8bitCMYKMaptile) pp += fromskew; cp += toskew; } -}*/ -/* Modify in 20090723 by Sunliang.Liu */ -DECLAREContigPutFunc(putRGBcontig8bitCMYKMaptile) -{ - int samplesperpixel = img->samplesperpixel; - TIFFRGBValue* Map = img->Map; - uint8 r, g, b, k; - - (void) y; - fromskew *= samplesperpixel; - while (h-- > 0) { - for (x = w; x-- > 0;) { - if(!TIFFCmyk2Rgb(img->tif->tif_clientdata,pp[0],pp[1],pp[2],pp[3], - &r,&g,&b)){ - 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; - } -} - -/* - * 16-bit packed CMYK samples w/Map => RGB(8-bit) - * - * NB: The conversion of CMYK->RGB is *very* crude. - */ -DECLAREContigPutFunc(putRGBcontig16bitCMYKMaptile) -{ - int samplesperpixel = img->samplesperpixel; - TIFFRGBValue* Map = img->Map; - uint16* wp = (uint16*)pp; - uint8 C, M, Y, K; - uint8 r, g, b; - - (void) y; - fromskew *= samplesperpixel; - while (h-- > 0) { - for (x = w; x-- > 0;) { - C = wp[0]>>8;M = wp[1]>>8;Y = wp[2]>>8;K = wp[3]>>8; - if(!TIFFCmyk2Rgb(img->tif->tif_clientdata,C,M,Y,K, - &r,&g,&b)){ - K = 255 - K; - r = (K*(255-C))/255; - g = (K*(255-M))/255; - b = (K*(255-Y))/255; - } - *cp++ = PACK(Map[r], Map[g], Map[b]); - wp += samplesperpixel; - } - wp += fromskew; - cp += toskew; - } } #define DECLARESepPutFunc(name) \ @@ -1966,7 +1911,7 @@ DECLAREContigPutFunc(putcontig8bitYCbCr42tile) (void) y; fromskew = (fromskew * 10) / 4; - if ((h & 3) == 0 && (w & 1) == 0) { + if ((w & 3) == 0 && (h & 1) == 0) { for (; h >= 2; h -= 2) { x = w>>2; do { @@ -2043,7 +1988,7 @@ DECLAREContigPutFunc(putcontig8bitYCbCr41tile) /* XXX adjust fromskew */ do { x = w>>2; - do { + while(x>0) { int32 Cb = pp[4]; int32 Cr = pp[5]; @@ -2054,7 +1999,8 @@ DECLAREContigPutFunc(putcontig8bitYCbCr41tile) cp += 4; pp += 6; - } while (--x); + x--; + } if( (w&3) != 0 ) { @@ -2145,7 +2091,7 @@ DECLAREContigPutFunc(putcontig8bitYCbCr21tile) fromskew = (fromskew * 4) / 2; do { x = w>>1; - do { + while(x>0) { int32 Cb = pp[2]; int32 Cr = pp[3]; @@ -2154,7 +2100,8 @@ DECLAREContigPutFunc(putcontig8bitYCbCr21tile) cp += 2; pp += 4; - } while (--x); + x --; + } if( (w&1) != 0 ) { @@ -2312,7 +2259,7 @@ initCIELabConversion(TIFFRGBAImage* img) return NULL; } - return (tileContigRoutine)putcontig8bitCIELab; + return putcontig8bitCIELab; } /* @@ -2594,21 +2541,14 @@ PickContigCase(TIFFRGBAImage* img) case PHOTOMETRIC_SEPARATED: if (buildMap(img)) { if (img->bitspersample == 8) { - if (!img->Map) - img->put.contig = putRGBcontig8bitCMYKtile; - else - img->put.contig = putRGBcontig8bitCMYKMaptile; - } - else if(img->bitspersample == 16) /*LiuSunliang added 16bpp CMYK support.*/ - { - if (!img->Map) - img->put.contig = putRGBcontig16bitCMYKtile; - else - img->put.contig = putRGBcontig16bitCMYKMaptile; + if (!img->Map) + img->put.contig = putRGBcontig8bitCMYKtile; + else + img->put.contig = putRGBcontig8bitCMYKMaptile; + } } - } - break; - case PHOTOMETRIC_PALETTE: + break; + case PHOTOMETRIC_PALETTE: if (buildMap(img)) { switch (img->bitspersample) { case 8: @@ -2662,7 +2602,7 @@ PickContigCase(TIFFRGBAImage* img) * 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 accomodate + * Joris: added support for the [1,2] case, nonetheless, to accommodate * some OJPEG files */ uint16 SubsamplingHor; @@ -2986,4 +2926,3 @@ TIFFReadRGBATile(TIFF* tif, uint32 col, uint32 row, uint32 * raster) * fill-column: 78 * End: */ - diff --git a/third_party/tiff_v403/tif_jpeg.c b/third_party/libtiff/tif_jpeg.c index d6f37dfce3..6659909299 100644 --- a/third_party/tiff_v403/tif_jpeg.c +++ b/third_party/libtiff/tif_jpeg.c @@ -1,4 +1,4 @@ -/* $Id: tif_jpeg.c,v 1.111 2012-07-06 18:48:04 bfriesen Exp $ */ +/* $Id: tif_jpeg.c,v 1.119 2015-08-15 20:13:07 bfriesen Exp $ */ /* * Copyright (c) 1994-1997 Sam Leffler @@ -23,6 +23,7 @@ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ + #define WIN32_LEAN_AND_MEAN #define VC_EXTRALEAN @@ -77,7 +78,7 @@ int TIFFReInitJPEG_12( TIFF *tif, int scheme, int is_encode ); */ /* Define "boolean" as unsigned char, not int, per Windows custom. */ -#if defined(WIN32) && !defined(__MINGW32__) +#if defined(__WIN32__) && !defined(__MINGW32__) # ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */ typedef unsigned char boolean; # endif @@ -259,6 +260,9 @@ TIFFjpeg_create_compress(JPEGState* sp) 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; + return CALLVJPEG(sp, jpeg_create_compress(&sp->cinfo.c)); } @@ -270,6 +274,9 @@ TIFFjpeg_create_decompress(JPEGState* sp) 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; + return CALLVJPEG(sp, jpeg_create_decompress(&sp->cinfo.d)); } @@ -665,7 +672,9 @@ alloc_downsampled_buffers(TIFF* tif, jpeg_component_info* comp_info, #define JPEG_MARKER_SOF0 0xC0 #define JPEG_MARKER_SOF1 0xC1 -#define JPEG_MARKER_SOF3 0xC3 +#define JPEG_MARKER_SOF2 0xC2 +#define JPEG_MARKER_SOF9 0xC9 +#define JPEG_MARKER_SOF10 0xCA #define JPEG_MARKER_DHT 0xC4 #define JPEG_MARKER_SOI 0xD8 #define JPEG_MARKER_SOS 0xDA @@ -736,6 +745,7 @@ JPEGFixupTagsSubsampling(TIFF* tif) _TIFFFillStriles( tif ); if( tif->tif_dir.td_stripbytecount == NULL + || tif->tif_dir.td_stripoffset == NULL || tif->tif_dir.td_stripbytecount[0] == 0 ) { /* Do not even try to check if the first strip/tile does not @@ -823,8 +833,11 @@ JPEGFixupTagsSubsamplingSec(struct JPEGFixupTagsSubsamplingData* data) JPEGFixupTagsSubsamplingSkip(data,n); } break; - case JPEG_MARKER_SOF0: - case JPEG_MARKER_SOF1: + 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; @@ -999,7 +1012,7 @@ JPEGSetupDecode(TIFF* tif) /* * Set up for decoding a strip or tile. */ -static int +/*ARGSUSED*/ static int JPEGPreDecode(TIFF* tif, uint16 s) { JPEGState *sp = JState(tif); @@ -1175,7 +1188,8 @@ JPEGPreDecode(TIFF* tif, uint16 s) * Decode a chunk of pixels. * "Standard" case: returned data is not downsampled. */ -/*ARGSUSED*/ static int +#if !JPEG_LIB_MK1_OR_12BIT +static int JPEGDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s) { JPEGState *sp = JState(tif); @@ -1194,91 +1208,137 @@ JPEGDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s) nrows = cc / sp->bytesperline; if (cc % sp->bytesperline) - TIFFWarningExt(tif->tif_clientdata, tif->tif_name, "fractional scanline not read"); + TIFFWarningExt(tif->tif_clientdata, tif->tif_name, + "fractional scanline not read"); 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) - { - JSAMPROW line_work_buf = NULL; + { + do + { + /* + * In the libjpeg6b-9a 8bit case. We read directly into + * the TIFF buffer. + */ + JSAMPROW bufptr = (JSAMPROW)buf; - /* - * For 6B, only use temporary buffer for 12 bit imagery. - * For Mk1 always use it. - */ -#if !defined(JPEG_LIB_MK1) - if( sp->cinfo.d.data_precision == 12 ) -#endif - { - line_work_buf = (JSAMPROW) - _TIFFmalloc(sizeof(short) * sp->cinfo.d.output_width - * sp->cinfo.d.num_components ); - } + if (TIFFjpeg_read_scanlines(sp, &bufptr, 1) != 1) + return (0); - do { - if( line_work_buf != NULL ) - { - /* - * In the MK1 case, we aways 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); + ++tif->tif_row; + buf += sp->bytesperline; + cc -= sp->bytesperline; + } while (--nrows > 0); + } - if( sp->cinfo.d.data_precision == 12 ) - { - int value_pairs = (sp->cinfo.d.output_width - * sp->cinfo.d.num_components) / 2; - int iPair; + /* 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); +} +#endif /* !JPEG_LIB_MK1_OR_12BIT */ - for( iPair = 0; iPair < value_pairs; iPair++ ) - { - unsigned char *out_ptr = - ((unsigned char *) buf) + iPair * 3; - JSAMPLE *in_ptr = line_work_buf + iPair * 2; +#if JPEG_LIB_MK1_OR_12BIT +/*ARGSUSED*/ static int +JPEGDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s) +{ + JPEGState *sp = JState(tif); + tmsize_t nrows; + (void) s; - out_ptr[0] = (in_ptr[0] & 0xff0) >> 4; - out_ptr[1] = ((in_ptr[0] & 0xf) << 4) - | ((in_ptr[1] & 0xf00) >> 8); - out_ptr[2] = ((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; + /* + ** 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; - for( iValue = 0; iValue < value_count; iValue++ ) - { - ((unsigned char *) buf)[iValue] = - line_work_buf[iValue] & 0xff; - } - } - } - else - { - /* - * In the libjpeg6b 8bit case. We read directly into the - * TIFF buffer. - */ - JSAMPROW bufptr = (JSAMPROW)buf; + 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 (TIFFjpeg_read_scanlines(sp, &bufptr, 1) != 1) - return (0); - } + if( nrows > (tmsize_t) sp->cinfo.d.image_height ) + nrows = sp->cinfo.d.image_height; - ++tif->tif_row; - buf += sp->bytesperline; - cc -= sp->bytesperline; - } while (--nrows > 0); + /* data is expected to be read in multiples of a scanline */ + if (nrows) + { + JSAMPROW line_work_buf = NULL; - if( line_work_buf != NULL ) - _TIFFfree( line_work_buf ); - } + /* + * For 6B, only use temporary buffer for 12 bit imagery. + * For Mk1 always use it. + */ + if( sp->cinfo.d.data_precision == 12 ) + { + line_work_buf = (JSAMPROW) + _TIFFmalloc(sizeof(short) * sp->cinfo.d.output_width + * sp->cinfo.d.num_components ); + } + + do + { + if( line_work_buf != NULL ) + { + /* + * In the MK1 case, we aways 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] = (in_ptr[0] & 0xff0) >> 4; + out_ptr[1] = ((in_ptr[0] & 0xf) << 4) + | ((in_ptr[1] & 0xf00) >> 8); + out_ptr[2] = ((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 ); + } /* Update information on consumed data */ tif->tif_rawcp = (uint8*) sp->src.next_input_byte; @@ -1286,8 +1346,9 @@ JPEGDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s) /* 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); + || TIFFjpeg_finish_decompress(sp); } +#endif /* JPEG_LIB_MK1_OR_12BIT */ /*ARGSUSED*/ static int DecodeRowError(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s) @@ -1458,6 +1519,15 @@ unsuppress_quant_table (JPEGState* sp, int tblno) } static void +suppress_quant_table (JPEGState* sp, int tblno) +{ + JQUANT_TBL* qtbl; + + if ((qtbl = sp->cinfo.c.quant_tbl_ptrs[tblno]) != NULL) + qtbl->sent_table = TRUE; +} + +static void unsuppress_huff_table (JPEGState* sp, int tblno) { JHUFF_TBL* htbl; @@ -1468,6 +1538,17 @@ unsuppress_huff_table (JPEGState* sp, int tblno) htbl->sent_table = FALSE; } +static void +suppress_huff_table (JPEGState* sp, int tblno) +{ + 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; +} + static int prepare_JPEGTables(TIFF* tif) { @@ -1517,17 +1598,38 @@ JPEGSetupEncode(TIFF* tif) 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. */ - sp->cinfo.c.in_color_space = JCS_UNKNOWN; - sp->cinfo.c.input_components = 1; + 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 */ - sp->photometric = td->td_photometric; switch (sp->photometric) { case PHOTOMETRIC_YCBCR: sp->h_sampling = td->td_ycbcrsubsampling[0]; @@ -1687,10 +1789,7 @@ JPEGPreEncode(TIFF* tif, uint16 s) 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; + if (sp->jpegcolormode != JPEGCOLORMODE_RGB) { if (sp->h_sampling != 1 || sp->v_sampling != 1) downsampled_input = TRUE; } @@ -1703,21 +1802,11 @@ JPEGPreEncode(TIFF* tif, uint16 s) 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 ((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; if (!TIFFjpeg_set_colorspace(sp, sp->cinfo.c.in_color_space)) return (0); /* jpeg_set_colorspace set all sampling factors to 1 */ } } else { - sp->cinfo.c.input_components = 1; - sp->cinfo.c.in_color_space = JCS_UNKNOWN; if (!TIFFjpeg_set_colorspace(sp, JCS_UNKNOWN)) return (0); sp->cinfo.c.comp_info[0].component_id = s; @@ -1732,14 +1821,30 @@ JPEGPreEncode(TIFF* tif, uint16 s) sp->cinfo.c.write_JFIF_header = FALSE; sp->cinfo.c.write_Adobe_marker = FALSE; /* set up table handling correctly */ - if (!TIFFjpeg_set_quality(sp, sp->jpegquality, FALSE)) + /* 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)) { + 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) { @@ -1796,9 +1901,16 @@ JPEGEncode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s) if( sp->cinfo.c.data_precision == 12 ) { - line16_count = (int)((sp->bytesperline * 2) / 3); + line16_count = (sp->bytesperline * 2) / 3; line16 = (short *) _TIFFmalloc(sizeof(short) * line16_count); - // FIXME: undiagnosed malloc failure + if (!line16) + { + TIFFErrorExt(tif->tif_clientdata, + "JPEGEncode", + "Failed to allocate memory"); + + return 0; + } } while (nrows-- > 0) { @@ -1973,13 +2085,10 @@ JPEGCleanup(TIFF* tif) tif->tif_tagmethods.vgetfield = sp->vgetparent; tif->tif_tagmethods.vsetfield = sp->vsetparent; tif->tif_tagmethods.printdir = sp->printdir; - - if( sp != NULL ) { - if( sp->cinfo_initialized ) - TIFFjpeg_destroy(sp); /* release libjpeg resources */ - if (sp->jpegtables) /* tag value */ - _TIFFfree(sp->jpegtables); - } + 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; @@ -2291,8 +2400,17 @@ here hopefully is harmless. */ sp->jpegtables_length = SIZE_OF_JPEGTABLES; sp->jpegtables = (void *) _TIFFmalloc(sp->jpegtables_length); - // FIXME: NULL-deref after malloc failure - _TIFFmemset(sp->jpegtables, 0, SIZE_OF_JPEGTABLES); + 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 } @@ -2309,4 +2427,3 @@ here hopefully is harmless. * fill-column: 78 * End: */ - diff --git a/third_party/tiff_v403/tif_luv.c b/third_party/libtiff/tif_luv.c index 88f4ee85a0..4e328bad80 100644 --- a/third_party/tiff_v403/tif_luv.c +++ b/third_party/libtiff/tif_luv.c @@ -1,4 +1,4 @@ -/* $Id: tif_luv.c,v 1.35 2011-04-02 20:54:09 bfriesen Exp $ */ +/* $Id: tif_luv.c,v 1.40 2015-06-21 01:09:09 bfriesen Exp $ */ /* * Copyright (c) 1997 Greg Ward Larson @@ -23,6 +23,7 @@ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ + #include "tiffiop.h" #ifdef LOGLUV_SUPPORT @@ -378,6 +379,9 @@ LogLuvDecodeStrip(TIFF* tif, uint8* bp, tmsize_t cc, uint16 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; @@ -394,6 +398,9 @@ LogLuvDecodeTile(TIFF* tif, uint8* bp, tmsize_t cc, uint16 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; @@ -643,6 +650,9 @@ LogLuvEncodeStrip(TIFF* tif, uint8* bp, tmsize_t cc, uint16 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; @@ -658,6 +668,9 @@ LogLuvEncodeTile(TIFF* tif, uint8* bp, tmsize_t cc, uint16 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; @@ -682,9 +695,9 @@ LogLuvEncodeTile(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s) #ifndef M_PI #define M_PI 3.14159265358979323846 #endif -#ifndef log2 +#undef log2 /* Conflict with C'99 function */ #define log2(x) ((1./M_LN2)*log(x)) -#endif +#undef exp2 /* Conflict with C'99 function */ #define exp2(x) exp(M_LN2*(x)) #define itrunc(x,m) ((m)==SGILOGENCODE_NODITHER ? \ @@ -1682,4 +1695,3 @@ bad: * fill-column: 78 * End: */ - diff --git a/third_party/tiff_v403/tif_lzw.c b/third_party/libtiff/tif_lzw.c index 3a6f4c82c7..9b76dd03b3 100644 --- a/third_party/tiff_v403/tif_lzw.c +++ b/third_party/libtiff/tif_lzw.c @@ -1,4 +1,4 @@ -/* $Id: tif_lzw.c,v 1.45 2011-04-02 20:54:09 bfriesen Exp $ */ +/* $Id: tif_lzw.c,v 1.49 2015-08-30 21:07:44 erouault Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -23,6 +23,7 @@ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ + #include "tiffiop.h" #ifdef LZW_SUPPORT /* @@ -93,7 +94,7 @@ typedef struct { unsigned short nbits; /* # of bits/code */ unsigned short maxcode; /* maximum code for lzw_nbits */ unsigned short free_ent; /* next free entry in hash table */ - long nextdata; /* next bits of i/o */ + unsigned long nextdata; /* next bits of i/o */ long nextbits; /* # of valid bits in lzw_nextdata */ int rw_mode; /* preserve rw_mode from init */ @@ -267,6 +268,8 @@ LZWPreDecode(TIFF* tif, uint16 s) if( sp->dec_codetab == NULL ) { tif->tif_setupdecode( tif ); + if( sp->dec_codetab == NULL ) + return (0); } /* @@ -364,7 +367,8 @@ LZWDecode(TIFF* tif, uint8* op0, tmsize_t occ0, uint16 s) unsigned char *bp; hcode_t code; int len; - long nbits, nextbits, nextdata, nbitsmask; + long nbits, nextbits, nbitsmask; + unsigned long nextdata; code_t *codep, *free_entp, *maxcodep, *oldcodep; (void) s; @@ -433,16 +437,18 @@ LZWDecode(TIFF* tif, uint8* op0, tmsize_t occ0, uint16 s) if (code == CODE_EOI) break; if (code == CODE_CLEAR) { - 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); + 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) { + if (code > CODE_CLEAR) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "LZWDecode: Corrupted LZW table at scanline %d", tif->tif_row); @@ -652,16 +658,18 @@ LZWDecodeCompat(TIFF* tif, uint8* op0, tmsize_t occ0, uint16 s) if (code == CODE_EOI) break; if (code == CODE_CLEAR) { - 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); + 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) { + if (code > CODE_CLEAR) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "LZWDecode: Corrupted LZW table at scanline %d", tif->tif_row); @@ -829,13 +837,15 @@ LZWPreEncode(TIFF* tif, uint16 s) } 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)); \ + *op++ = (unsigned char)((nextdata >> (nextbits-8))&0xff); \ nextbits -= 8; \ if (nextbits >= 8) { \ - *op++ = (unsigned char)(nextdata >> (nextbits-8)); \ + *op++ = (unsigned char)((nextdata >> (nextbits-8))&0xff); \ nextbits -= 8; \ } \ outcount += nbits; \ @@ -865,7 +875,8 @@ LZWEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s) hcode_t ent; long disp; long incount, outcount, checkpoint; - long nextdata, nextbits; + unsigned long nextdata; + long nextbits; int free_ent, maxcode, nbits; uint8* op; uint8* limit; @@ -1027,7 +1038,7 @@ LZWPostEncode(TIFF* tif) register LZWCodecState *sp = EncoderState(tif); uint8* op = tif->tif_rawcp; long nextbits = sp->lzw_nextbits; - long nextdata = sp->lzw_nextdata; + unsigned long nextdata = sp->lzw_nextdata; long outcount = sp->enc_outcount; int nbits = sp->lzw_nbits; @@ -1041,8 +1052,9 @@ LZWPostEncode(TIFF* tif) sp->enc_oldcode = (hcode_t) -1; } PutNextCode(op, CODE_EOI); + /* Explicit 0xff masking to make icc -check=conversions happy */ if (nextbits > 0) - *op++ = (unsigned char)(nextdata << (8-nextbits)); + *op++ = (unsigned char)((nextdata << (8-nextbits))&0xff); tif->tif_rawcc = (tmsize_t)(op - tif->tif_rawdata); return (1); } @@ -1164,4 +1176,3 @@ bad: * fill-column: 78 * End: */ - diff --git a/third_party/tiff_v403/tif_next.c b/third_party/libtiff/tif_next.c index 9f2f6d5307..17e031111a 100644 --- a/third_party/tiff_v403/tif_next.c +++ b/third_party/libtiff/tif_next.c @@ -1,4 +1,4 @@ -/* $Id: tif_next.c,v 1.13 2010-03-10 18:56:48 bfriesen Exp $ */ +/* $Id: tif_next.c,v 1.16 2014-12-29 12:09:11 erouault Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -23,6 +23,7 @@ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ + #include "tiffiop.h" #ifdef NEXT_SUPPORT /* @@ -70,7 +71,7 @@ NeXTDecode(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s) TIFFErrorExt(tif->tif_clientdata, module, "Fractional scanlines cannot be read"); return (0); } - for (row = buf; occ > 0; occ -= scanline, row += scanline) { + for (row = buf; cc > 0 && occ > 0; occ -= scanline, row += scanline) { n = *bp++, cc--; switch (n) { case LITERALROW: @@ -89,6 +90,8 @@ NeXTDecode(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s) * 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) @@ -101,6 +104,8 @@ NeXTDecode(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s) default: { uint32 npixels = 0, grey; uint32 imagewidth = tif->tif_dir.td_imagewidth; + if( isTiled(tif) ) + imagewidth = tif->tif_dir.td_tilewidth; /* * The scanline is composed of a sequence of constant @@ -138,10 +143,27 @@ bad: return (0); } +static int +NeXTPreDecode(TIFF* tif, uint16 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); +} + int TIFFInitNeXT(TIFF* tif, int scheme) { (void) scheme; + tif->tif_predecode = NeXTPreDecode; tif->tif_decoderow = NeXTDecode; tif->tif_decodestrip = NeXTDecode; tif->tif_decodetile = NeXTDecode; @@ -157,4 +179,3 @@ TIFFInitNeXT(TIFF* tif, int scheme) * fill-column: 78 * End: */ - diff --git a/third_party/tiff_v403/tif_ojpeg.c b/third_party/libtiff/tif_ojpeg.c index 0a774a526e..cc5449cd65 100644 --- a/third_party/tiff_v403/tif_ojpeg.c +++ b/third_party/libtiff/tif_ojpeg.c @@ -1,4 +1,4 @@ -/* $Id: tif_ojpeg.c,v 1.56 2012-05-24 03:15:18 fwarmerdam Exp $ */ +/* $Id: tif_ojpeg.c,v 1.60 2015-05-31 00:38:46 bfriesen Exp $ */ /* WARNING: The type of JPEG encapsulation defined by the TIFF Version 6.0 specification is now totally obsolete and deprecated for new applications and @@ -39,7 +39,7 @@ OF THIS SOFTWARE. Joris Van Damme and/or AWare Systems may be available for custom - developement. If you like what you see, and need anything similar or related, + development. If you like what you see, and need anything similar or related, contact <info@awaresystems.be>. */ @@ -120,7 +120,6 @@ session. */ - #define WIN32_LEAN_AND_MEAN #define VC_EXTRALEAN @@ -142,7 +141,7 @@ * 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 accomodate some structures (this is verified in asserts), but it would not be + * 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 @@ -216,13 +215,17 @@ static const TIFFField ojpegFields[] = { #endif #if defined(USE_SYSTEM_LIBJPEG) +#include <jerror.h> #include <jpeglib.h> #elif defined(USE_LIBJPEG_TURBO) +#include "third_party/libjpeg_turbo/jerror.h" #include "third_party/libjpeg_turbo/jpeglib.h" #else +#include "third_party/libjpeg/jerror.h" #include "third_party/libjpeg/jpeglib.h" #endif + typedef struct jpeg_error_mgr jpeg_error_mgr; typedef struct jpeg_common_struct jpeg_common_struct; typedef struct jpeg_decompress_struct jpeg_decompress_struct; @@ -439,8 +442,8 @@ TIFFInitOJPEG(TIFF* tif, int scheme) } /* state block */ - sp = (OJPEGState*)_TIFFmalloc(sizeof(OJPEGState)); // // add (OJPEGState*) cast - if (sp == NULL) + sp=_TIFFmalloc(sizeof(OJPEGState)); + if (sp==NULL) { TIFFErrorExt(tif->tif_clientdata,module,"No space for OJPEG state block"); return(0); @@ -534,6 +537,8 @@ OJPEGVSetField(TIFF* tif, uint32 tag, va_list ap) uint32 ma; uint64* mb; uint32 n; + const TIFFField* fip; + switch(tag) { case TIFFTAG_JPEGIFOFFSET: @@ -603,7 +608,10 @@ OJPEGVSetField(TIFF* tif, uint32 tag, va_list ap) default: return (*sp->vsetparent)(tif,tag,ap); } - TIFFSetFieldBit(tif,TIFFFieldWithTag(tif,tag)->field_bit); + fip = TIFFFieldWithTag(tif,tag); + if( fip == NULL ) /* shouldn't happen */ + return(0); + TIFFSetFieldBit(tif,fip->field_bit); tif->tif_flags|=TIFF_DIRTYDIRECT; return(1); } @@ -767,9 +775,8 @@ OJPEGPreDecodeSkipScanlines(TIFF* tif) uint32 m; if (sp->skip_buffer==NULL) { - // add (uint8*) cast - sp->skip_buffer = (uint8*)_TIFFmalloc(sp->bytes_per_line); - 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); @@ -1193,7 +1200,7 @@ OJPEGWriteHeaderInfo(TIFF* tif) 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; - sp->subsampling_convert_ycbcrbuf = (uint8*)_TIFFmalloc(sp->subsampling_convert_ycbcrbuflen); // add (uint8*) cast + sp->subsampling_convert_ycbcrbuf=_TIFFmalloc(sp->subsampling_convert_ycbcrbuflen); if (sp->subsampling_convert_ycbcrbuf==0) { TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); @@ -1203,7 +1210,7 @@ OJPEGWriteHeaderInfo(TIFF* tif) 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 = (uint8**)_TIFFmalloc(sp->subsampling_convert_ycbcrimagelen * sizeof(uint8*));// add (uint8**) cast + 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"); @@ -1430,9 +1437,9 @@ OJPEGReadHeaderInfoSecStreamDqt(TIFF* tif) TIFFErrorExt(tif->tif_clientdata,module,"Corrupt DQT marker in JPEG data"); return(0); } - na = sizeof(uint32) + 69; - nb = (uint8*)_TIFFmalloc(na); // add (uint8*) cast - if (nb == 0) + na=sizeof(uint32)+69; + nb=_TIFFmalloc(na); + if (nb==0) { TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); return(0); @@ -1487,9 +1494,9 @@ OJPEGReadHeaderInfoSecStreamDht(TIFF* tif) } else { - na = sizeof(uint32) + 2 + m; - nb = (uint8*)_TIFFmalloc(na); // add (uint8*) cast - if (nb == 0) + na=sizeof(uint32)+2+m; + nb=_TIFFmalloc(na); + if (nb==0) { TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); return(0); @@ -1499,14 +1506,17 @@ OJPEGReadHeaderInfoSecStreamDht(TIFF* tif) 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) + if (OJPEGReadBlock(sp,m-2,&nb[sizeof(uint32)+4])==0) { + _TIFFfree(nb); 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) @@ -1518,12 +1528,14 @@ OJPEGReadHeaderInfoSecStreamDht(TIFF* tif) 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) @@ -1763,7 +1775,7 @@ OJPEGReadHeaderInfoSecTablesQTable(TIFF* tif) } } oa=sizeof(uint32)+69; - ob = (uint8*)_TIFFmalloc(oa); // add (uint8*) cast + ob=_TIFFmalloc(oa); if (ob==0) { TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); @@ -1776,7 +1788,7 @@ OJPEGReadHeaderInfoSecTablesQTable(TIFF* tif) 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); + p=TIFFReadFile(tif,&ob[sizeof(uint32)+5],64); if (p!=64) return(0); sp->qtable[m]=ob; @@ -1819,14 +1831,14 @@ OJPEGReadHeaderInfoSecTablesDcTable(TIFF* tif) } } TIFFSeekFile(tif,sp->dctable_offset[m],SEEK_SET); - p=(uint32)TIFFReadFile(tif,o,16); + p=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 = (uint8*)_TIFFmalloc(ra); // add (uint8*) cast + rb=_TIFFmalloc(ra); if (rb==0) { TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); @@ -1840,7 +1852,7 @@ OJPEGReadHeaderInfoSecTablesDcTable(TIFF* tif) 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); + p=TIFFReadFile(tif,&(rb[sizeof(uint32)+21]),q); if (p!=q) return(0); sp->dctable[m]=rb; @@ -1883,14 +1895,14 @@ OJPEGReadHeaderInfoSecTablesAcTable(TIFF* tif) } } TIFFSeekFile(tif,sp->actable_offset[m],SEEK_SET); - p=(uint32)TIFFReadFile(tif,o,16); + p=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 = (uint8*)_TIFFmalloc(ra); // add (uint8*) cast + rb=_TIFFmalloc(ra); if (rb==0) { TIFFErrorExt(tif->tif_clientdata,module,"Out of memory"); @@ -1904,7 +1916,7 @@ OJPEGReadHeaderInfoSecTablesAcTable(TIFF* tif) 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); + p=TIFFReadFile(tif,&(rb[sizeof(uint32)+21]),q); if (p!=q) return(0); sp->actable[m]=rb; @@ -1962,6 +1974,7 @@ OJPEGReadBufferFill(OJPEGState* sp) break; case osibsJpegInterchangeFormat: sp->in_buffer_source=osibsStrile; + break; case osibsStrile: if (!_TIFFFillStriles( sp->tif ) || sp->tif->tif_dir.td_stripoffset == NULL @@ -2059,7 +2072,7 @@ OJPEGReadBlock(OJPEGState* sp, uint16 len, void* mem) uint16 n; assert(len>0); mlen=len; - mmem = (uint8*)mem; // add (uint8*) cast + mmem=mem; do { if (sp->in_buffer_togo==0) @@ -2461,8 +2474,8 @@ OJPEGLibjpegJpegSourceMgrFillInputBuffer(jpeg_decompress_struct* cinfo) 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 = (const JOCTET * )mem; // add (const JOCTET * ) cast + sp->libjpeg_jpeg_source_mgr.bytes_in_buffer=len; + sp->libjpeg_jpeg_source_mgr.next_input_byte=mem; return(1); } @@ -2501,4 +2514,3 @@ OJPEGLibjpegJpegSourceMgrTermSource(jpeg_decompress_struct* cinfo) * fill-column: 78 * End: */ - diff --git a/third_party/tiff_v403/tif_open.c b/third_party/libtiff/tif_open.c index f1c3e0a4a6..8c88328cf2 100644 --- a/third_party/tiff_v403/tif_open.c +++ b/third_party/libtiff/tif_open.c @@ -723,4 +723,3 @@ TIFFGetUnmapFileProc(TIFF* tif) * fill-column: 78 * End: */ - diff --git a/third_party/tiff_v403/tif_packbits.c b/third_party/libtiff/tif_packbits.c index b599934f1f..9e77190131 100644 --- a/third_party/tiff_v403/tif_packbits.c +++ b/third_party/libtiff/tif_packbits.c @@ -23,6 +23,7 @@ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ + #include "tiffiop.h" #ifdef PACKBITS_SUPPORT /* @@ -297,4 +298,3 @@ TIFFInitPackBits(TIFF* tif, int scheme) * fill-column: 78 * End: */ - diff --git a/third_party/tiff_v403/tif_pixarlog.c b/third_party/libtiff/tif_pixarlog.c index b30e6d4e9b..b93b4c77f1 100644 --- a/third_party/tiff_v403/tif_pixarlog.c +++ b/third_party/libtiff/tif_pixarlog.c @@ -1,4 +1,4 @@ -/* $Id: tif_pixarlog.c,v 1.38 2012-06-21 01:01:53 fwarmerdam Exp $ */ +/* $Id: tif_pixarlog.c,v 1.39 2012-12-10 17:27:13 tgl Exp $ */ /* * Copyright (c) 1996-1997 Sam Leffler @@ -23,6 +23,7 @@ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ + #include "tiffiop.h" #ifdef PIXARLOG_SUPPORT @@ -643,6 +644,20 @@ multiply_ms(tmsize_t m1, tmsize_t m2) return bytes; } +static tmsize_t +add_ms(tmsize_t m1, tmsize_t m2) +{ + tmsize_t bytes = m1 + m2; + + /* if either input is zero, assume overflow already occurred */ + if (m1 == 0 || m2 == 0) + bytes = 0; + else if (bytes <= m1 || bytes <= m2) + bytes = 0; + + return bytes; +} + static int PixarLogFixupTags(TIFF* tif) { @@ -670,9 +685,11 @@ PixarLogSetupDecode(TIFF* tif) td->td_samplesperpixel : 1); tbuf_size = multiply_ms(multiply_ms(multiply_ms(sp->stride, td->td_imagewidth), td->td_rowsperstrip), 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+sizeof(uint16)*sp->stride); + sp->tbuf = (uint16 *) _TIFFmalloc(tbuf_size); if (sp->tbuf == NULL) return (0); if (sp->user_datafmt == PIXARLOGDATAFMT_UNKNOWN) @@ -905,7 +922,7 @@ PixarLogPreEncode(TIFF* tif, uint16 s) 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 apropriately even before we simplify it */ - sp->stream.avail_out = (uInt)tif->tif_rawdatasize; + sp->stream.avail_out = 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"); @@ -1423,4 +1440,3 @@ bad: * fill-column: 78 * End: */ - diff --git a/third_party/tiff_v403/tif_predict.c b/third_party/libtiff/tif_predict.c index a34faf0a70..1388dde59c 100644 --- a/third_party/tiff_v403/tif_predict.c +++ b/third_party/libtiff/tif_predict.c @@ -1,4 +1,4 @@ -/* $Id: tif_predict.c,v 1.32 2010-03-10 18:56:49 bfriesen Exp $ */ +/* $Id: tif_predict.c,v 1.35 2015-08-31 15:05:57 erouault Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -42,6 +42,8 @@ static void swabHorAcc32(TIFF* tif, uint8* cp0, tmsize_t cc); static void horDiff8(TIFF* tif, uint8* cp0, tmsize_t cc); static void horDiff16(TIFF* tif, uint8* cp0, tmsize_t cc); static void horDiff32(TIFF* tif, uint8* cp0, tmsize_t cc); +static void swabHorDiff16(TIFF* tif, uint8* cp0, tmsize_t cc); +static void swabHorDiff32(TIFF* tif, uint8* cp0, tmsize_t cc); static void fpAcc(TIFF* tif, uint8* cp0, tmsize_t cc); static void fpDiff(TIFF* tif, uint8* cp0, tmsize_t cc); static int PredictorDecodeRow(TIFF* tif, uint8* op0, tmsize_t occ0, uint16 s); @@ -207,7 +209,24 @@ PredictorSetupEncode(TIFF* tif) 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 differenciation 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->predictor == 3) { sp->encodepfunc = fpDiff; @@ -239,18 +258,18 @@ PredictorSetupEncode(TIFF* tif) 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) */ +/* - when storing into the byte stream, we explicitly mask with 0xff so */ +/* as to make icc -check=conversions happy (not necessary by the standard) */ + static void horAcc8(TIFF* tif, uint8* cp0, tmsize_t cc) { - /* - * compare v4.0.3 with v3.9.5, - * we find that horAcc8 uses while loop in the v4.0.3 and uses do while loop in the v3.9.5. - * times of do while loop are less than while loop, so we use v3.9.5 instead of v4.0.3. - */ -#if 0 tmsize_t stride = PredictorState(tif)->stride; - char* cp = (char*) cp0; + unsigned char* cp = (unsigned char*) cp0; assert((cc%stride)==0); if (cc > stride) { /* @@ -263,9 +282,9 @@ horAcc8(TIFF* tif, uint8* cp0, tmsize_t cc) cc -= 3; cp += 3; while (cc>0) { - cp[0] = (char) (cr += cp[0]); - cp[1] = (char) (cg += cp[1]); - cp[2] = (char) (cb += cp[2]); + 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; } @@ -277,10 +296,10 @@ horAcc8(TIFF* tif, uint8* cp0, tmsize_t cc) cc -= 4; cp += 4; while (cc>0) { - cp[0] = (char) (cr += cp[0]); - cp[1] = (char) (cg += cp[1]); - cp[2] = (char) (cb += cp[2]); - cp[3] = (char) (ca += cp[3]); + 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; } @@ -288,70 +307,21 @@ horAcc8(TIFF* tif, uint8* cp0, tmsize_t cc) cc -= stride; do { REPEAT4(stride, cp[stride] = - (char) (cp[stride] + *cp); cp++) + (unsigned char) ((cp[stride] + *cp) & 0xff); cp++) cc -= stride; } while (cc>0); } } -#else - tsize_t stride = PredictorState(tif)->stride; - - char* cp = (char*) cp0; - if (cc > stride) { - 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]; - do { - cc -= 3, cp += 3; - cp[0] = (char) (cr += cp[0]); - cp[1] = (char) (cg += cp[1]); - cp[2] = (char) (cb += cp[2]); - } while ((int32) cc > 0); - } else if (stride == 4) { - unsigned int cr = cp[0]; - unsigned int cg = cp[1]; - unsigned int cb = cp[2]; - unsigned int ca = cp[3]; - do { - cc -= 4, cp += 4; - cp[0] = (char) (cr += cp[0]); - cp[1] = (char) (cg += cp[1]); - cp[2] = (char) (cb += cp[2]); - cp[3] = (char) (ca += cp[3]); - } while ((int32) cc > 0); - } else { - do { - REPEAT4(stride, cp[stride] = - (char) (cp[stride] + *cp); cp++) - cc -= stride; - } while ((int32) cc > 0); - } - } -#endif } static void swabHorAcc16(TIFF* tif, uint8* cp0, tmsize_t cc) { - tmsize_t stride = PredictorState(tif)->stride; uint16* wp = (uint16*) cp0; tmsize_t wc = cc / 2; - assert((cc%(2*stride))==0); - - if (wc > stride) { - TIFFSwabArrayOfShort(wp, wc); - wc -= stride; - do { - REPEAT4(stride, wp[stride] += wp[0]; wp++) - wc -= stride; - } while (wc > 0); - } + TIFFSwabArrayOfShort(wp, wc); + horAcc16(tif, cp0, cc); } static void @@ -366,7 +336,7 @@ horAcc16(TIFF* tif, uint8* cp0, tmsize_t cc) if (wc > stride) { wc -= stride; do { - REPEAT4(stride, wp[stride] += wp[0]; wp++) + REPEAT4(stride, wp[stride] = (uint16)(((unsigned int)wp[stride] + (unsigned int)wp[0]) & 0xffff); wp++) wc -= stride; } while (wc > 0); } @@ -375,20 +345,11 @@ horAcc16(TIFF* tif, uint8* cp0, tmsize_t cc) static void swabHorAcc32(TIFF* tif, uint8* cp0, tmsize_t cc) { - tmsize_t stride = PredictorState(tif)->stride; uint32* wp = (uint32*) cp0; tmsize_t wc = cc / 4; - assert((cc%(4*stride))==0); - - if (wc > stride) { - TIFFSwabArrayOfLong(wp, wc); - wc -= stride; - do { - REPEAT4(stride, wp[stride] += wp[0]; wp++) - wc -= stride; - } while (wc > 0); - } + TIFFSwabArrayOfLong(wp, wc); + horAcc32(tif, cp0, cc); } static void @@ -428,7 +389,8 @@ fpAcc(TIFF* tif, uint8* cp0, tmsize_t cc) return; while (count > stride) { - REPEAT4(stride, cp[stride] += cp[0]; cp++) + REPEAT4(stride, cp[stride] = + (unsigned char) ((cp[stride] + cp[0]) & 0xff); cp++) count -= stride; } @@ -502,7 +464,7 @@ horDiff8(TIFF* tif, uint8* cp0, tmsize_t cc) { TIFFPredictorState* sp = PredictorState(tif); tmsize_t stride = sp->stride; - char* cp = (char*) cp0; + unsigned char* cp = (unsigned char*) cp0; assert((cc%stride)==0); @@ -512,33 +474,33 @@ horDiff8(TIFF* tif, uint8* cp0, tmsize_t cc) * Pipeline the most common cases. */ if (stride == 3) { - int r1, g1, b1; - int r2 = cp[0]; - int g2 = cp[1]; - int b2 = cp[2]; + 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] = r1-r2; r2 = r1; - g1 = cp[4]; cp[4] = g1-g2; g2 = g1; - b1 = cp[5]; cp[5] = b1-b2; b2 = b1; + 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) { - int r1, g1, b1, a1; - int r2 = cp[0]; - int g2 = cp[1]; - int b2 = cp[2]; - int a2 = cp[3]; + 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] = r1-r2; r2 = r1; - g1 = cp[5]; cp[5] = g1-g2; g2 = g1; - b1 = cp[6]; cp[6] = b1-b2; b2 = b1; - a1 = cp[7]; cp[7] = a1-a2; a2 = a1; + 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] -= cp[0]; cp--) + REPEAT4(stride, cp[stride] = (unsigned char)((cp[stride] - cp[0])&0xff); cp--) } while ((cc -= stride) > 0); } } @@ -549,7 +511,7 @@ horDiff16(TIFF* tif, uint8* cp0, tmsize_t cc) { TIFFPredictorState* sp = PredictorState(tif); tmsize_t stride = sp->stride; - int16 *wp = (int16*) cp0; + uint16 *wp = (uint16*) cp0; tmsize_t wc = cc/2; assert((cc%(2*stride))==0); @@ -558,18 +520,29 @@ horDiff16(TIFF* tif, uint8* cp0, tmsize_t cc) wc -= stride; wp += wc - 1; do { - REPEAT4(stride, wp[stride] -= wp[0]; wp--) + REPEAT4(stride, wp[stride] = (uint16)(((unsigned int)wp[stride] - (unsigned int)wp[0]) & 0xffff); wp--) wc -= stride; } while (wc > 0); } } static void +swabHorDiff16(TIFF* tif, uint8* cp0, tmsize_t cc) +{ + uint16* wp = (uint16*) cp0; + tmsize_t wc = cc / 2; + + horDiff16(tif, cp0, cc); + + TIFFSwabArrayOfShort(wp, wc); +} + +static void horDiff32(TIFF* tif, uint8* cp0, tmsize_t cc) { TIFFPredictorState* sp = PredictorState(tif); tmsize_t stride = sp->stride; - int32 *wp = (int32*) cp0; + uint32 *wp = (uint32*) cp0; tmsize_t wc = cc/4; assert((cc%(4*stride))==0); @@ -584,6 +557,17 @@ horDiff32(TIFF* tif, uint8* cp0, tmsize_t cc) } } +static void +swabHorDiff32(TIFF* tif, uint8* cp0, tmsize_t cc) +{ + uint32* wp = (uint32*) cp0; + tmsize_t wc = cc / 4; + + horDiff32(tif, cp0, cc); + + TIFFSwabArrayOfLong(wp, wc); +} + /* * Floating point predictor differencing routine. */ @@ -619,7 +603,7 @@ fpDiff(TIFF* tif, uint8* cp0, tmsize_t cc) cp = (uint8 *) cp0; cp += cc - stride - 1; for (count = cc; count > stride; count -= stride) - REPEAT4(stride, cp[stride] -= cp[0]; cp--) + REPEAT4(stride, cp[stride] = (unsigned char)((cp[stride] - cp[0])&0xff); cp--) } static int @@ -808,4 +792,3 @@ TIFFPredictorCleanup(TIFF* tif) * fill-column: 78 * End: */ - diff --git a/third_party/tiff_v403/tif_predict.h b/third_party/libtiff/tif_predict.h index dc7144c69e..dc7144c69e 100644 --- a/third_party/tiff_v403/tif_predict.h +++ b/third_party/libtiff/tif_predict.h diff --git a/third_party/tiff_v403/tif_print.c b/third_party/libtiff/tif_print.c index f93e557f5c..7b1a4222a3 100644 --- a/third_party/tiff_v403/tif_print.c +++ b/third_party/libtiff/tif_print.c @@ -1,4 +1,4 @@ -/* $Id: tif_print.c,v 1.60 2012-08-19 16:56:35 bfriesen Exp $ */ +/* $Id: tif_print.c,v 1.62 2015-08-19 02:31:04 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -35,7 +35,7 @@ #include <ctype.h> static void -_TIFFprintAsciiBounded(FILE* fd, const char* cp, int max_chars); +_TIFFprintAsciiBounded(FILE* fd, const char* cp, size_t max_chars); static const char *photoNames[] = { "min-is-white", /* PHOTOMETRIC_MINISWHITE */ @@ -395,8 +395,8 @@ TIFFPrintDirectory(TIFF* tif, FILE* fd, long flags) for (cp = td->td_inknames; i > 0 && cp < td->td_inknames + td->td_inknameslen; cp = strchr(cp,'\0')+1, i--) { - int max_chars = - (int)(td->td_inknameslen - (cp - td->td_inknames)); + size_t max_chars = + td->td_inknameslen - (cp - td->td_inknames); fputs(sep, fd); _TIFFprintAsciiBounded(fd, cp, max_chars); sep = ", "; @@ -582,10 +582,10 @@ TIFFPrintDirectory(TIFF* tif, FILE* fd, long flags) continue; if(fip->field_passcount) { - if (fip->field_readcount == TIFF_VARIABLE ) { + if (fip->field_readcount == TIFF_VARIABLE2 ) { if(TIFFGetField(tif, tag, &value_count, &raw_data) != 1) continue; - } else if (fip->field_readcount == TIFF_VARIABLE2 ) { + } else if (fip->field_readcount == TIFF_VARIABLE ) { uint16 small_value_count; if(TIFFGetField(tif, tag, &small_value_count, &raw_data) != 1) continue; @@ -675,11 +675,11 @@ TIFFPrintDirectory(TIFF* tif, FILE* fd, long flags) void _TIFFprintAscii(FILE* fd, const char* cp) { - _TIFFprintAsciiBounded( fd, cp, (int)strlen(cp)); + _TIFFprintAsciiBounded( fd, cp, strlen(cp)); } static void -_TIFFprintAsciiBounded(FILE* fd, const char* cp, int max_chars) +_TIFFprintAsciiBounded(FILE* fd, const char* cp, size_t max_chars) { for (; max_chars > 0 && *cp != '\0'; cp++, max_chars--) { const char* tp; @@ -714,4 +714,3 @@ _TIFFprintAsciiTag(FILE* fd, const char* name, const char* value) * fill-column: 78 * End: */ - diff --git a/third_party/tiff_v403/tif_read.c b/third_party/libtiff/tif_read.c index eb9350846e..5cb419bd41 100644 --- a/third_party/tiff_v403/tif_read.c +++ b/third_party/libtiff/tif_read.c @@ -1,4 +1,4 @@ -/* $Id: tif_read.c,v 1.41 2012-07-06 19:22:58 bfriesen Exp $ */ +/* $Id: tif_read.c,v 1.45 2015-06-07 22:35:40 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -47,7 +47,7 @@ TIFFFillStripPartial( TIFF *tif, int strip, tmsize_t read_ahead, int restart ) { static const char module[] = "TIFFFillStripPartial"; register TIFFDirectory *td = &tif->tif_dir; - uint64 unused_data; + tmsize_t unused_data; uint64 read_offset; tmsize_t cc, to_read; /* tmsize_t bytecountm; */ @@ -94,7 +94,7 @@ TIFFFillStripPartial( TIFF *tif, int strip, tmsize_t read_ahead, int restart ) if( unused_data > 0 ) { assert((tif->tif_flags&TIFF_BUFFERMMAP)==0); - memmove( tif->tif_rawdata, tif->tif_rawcp, (size_t)unused_data ); + memmove( tif->tif_rawdata, tif->tif_rawcp, unused_data ); } /* @@ -113,12 +113,12 @@ TIFFFillStripPartial( TIFF *tif, int strip, tmsize_t read_ahead, int restart ) /* ** How much do we want to read? */ - to_read = (tmsize_t)(tif->tif_rawdatasize - unused_data); + to_read = tif->tif_rawdatasize - unused_data; if( (uint64) to_read > td->td_stripbytecount[strip] - tif->tif_rawdataoff - tif->tif_rawdataloaded ) { - to_read = (tmsize_t)(td->td_stripbytecount[strip] - - tif->tif_rawdataoff - tif->tif_rawdataloaded); + to_read = (tmsize_t) td->td_stripbytecount[strip] + - tif->tif_rawdataoff - tif->tif_rawdataloaded; } assert((tif->tif_flags&TIFF_BUFFERMMAP)==0); @@ -141,8 +141,8 @@ TIFFFillStripPartial( TIFF *tif, int strip, tmsize_t read_ahead, int restart ) return 0; } - tif->tif_rawdataoff = (tmsize_t)(tif->tif_rawdataoff + tif->tif_rawdataloaded - unused_data) ; - tif->tif_rawdataloaded = (tmsize_t)unused_data + to_read; + tif->tif_rawdataoff = tif->tif_rawdataoff + tif->tif_rawdataloaded - unused_data ; + tif->tif_rawdataloaded = unused_data + to_read; tif->tif_rawcp = tif->tif_rawdata; @@ -321,7 +321,7 @@ TIFFReadEncodedStrip(TIFF* tif, uint32 strip, void* buf, tmsize_t size) uint32 rowsperstrip; uint32 stripsperplane; uint32 stripinplane; - uint16 plane, comp; + uint16 plane; uint32 rows; tmsize_t stripsize; if (!TIFFCheckRead(tif,0)) @@ -352,42 +352,12 @@ TIFFReadEncodedStrip(TIFF* tif, uint32 strip, void* buf, tmsize_t size) return((tmsize_t)(-1)); if ((size!=(tmsize_t)(-1))&&(size<stripsize)) stripsize=size; - - /* - * discard those. - * keep code modified by Changjin Gao. - * Xiaochuan Liu 20100828. - */ - /*if (!TIFFFillStrip(tif,strip)) + 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);*/ - - /* - * Changjin Gao 20110726 fixed decode error issue. - * Test file: mantis #27308 020511-1158450.tiff. - */ - comp = COMPRESSION_NONE; -StripDecode: - if (TIFFFillStrip(tif, strip) && (*tif->tif_decodestrip)(tif, buf, stripsize, plane) > 0) - { - (*tif->tif_postdecode)(tif, buf, stripsize); - return (stripsize); - } - else - { - if (comp < 9) - { - TIFFSetField(tif, TIFFTAG_COMPRESSION, comp); - TIFFSetField(tif, TIFFTAG_FAXMODE,FAXMODE_CLASSIC); - comp++; - goto StripDecode; - } - - return ((tsize_t) -1); - } + return(stripsize); } static tmsize_t @@ -488,7 +458,7 @@ TIFFReadRawStrip(TIFF* tif, uint32 strip, void* buf, tmsize_t size) return ((tmsize_t)(-1)); } bytecount = td->td_stripbytecount[strip]; - if (bytecount <= 0) { + if ((int64)bytecount <= 0) { #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) TIFFErrorExt(tif->tif_clientdata, module, "%I64u: Invalid strip byte count, strip %lu", @@ -528,7 +498,7 @@ TIFFFillStrip(TIFF* tif, uint32 strip) if ((tif->tif_flags&TIFF_NOREADRAW)==0) { uint64 bytecount = td->td_stripbytecount[strip]; - if (bytecount <= 0) { + if ((int64)bytecount <= 0) { #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) TIFFErrorExt(tif->tif_clientdata, module, "Invalid strip byte count %I64u, strip %lu", @@ -831,7 +801,7 @@ TIFFFillTile(TIFF* tif, uint32 tile) if ((tif->tif_flags&TIFF_NOREADRAW)==0) { uint64 bytecount = td->td_stripbytecount[tile]; - if (bytecount <= 0) { + if ((int64)bytecount <= 0) { #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) TIFFErrorExt(tif->tif_clientdata, module, "%I64u: Invalid tile byte count, tile %lu", @@ -960,8 +930,11 @@ TIFFReadBufferSetup(TIFF* tif, void* bp, tmsize_t size) tif->tif_flags &= ~TIFF_MYBUFFER; } else { tif->tif_rawdatasize = (tmsize_t)TIFFroundup_64((uint64)size, 1024); - if (tif->tif_rawdatasize==0) - tif->tif_rawdatasize=(tmsize_t)(-1); + if (tif->tif_rawdatasize==0) { + TIFFErrorExt(tif->tif_clientdata, module, + "Invalid buffer size"); + return (0); + } tif->tif_rawdata = (uint8*) _TIFFmalloc(tif->tif_rawdatasize); tif->tif_flags |= TIFF_MYBUFFER; } @@ -1017,10 +990,12 @@ TIFFStartStrip(TIFF* tif, uint32 strip) static int TIFFStartTile(TIFF* tif, uint32 tile) { + static const char module[] = "TIFFStartTile"; TIFFDirectory *td = &tif->tif_dir; + uint32 howmany32; - if (!_TIFFFillStriles( tif ) || !tif->tif_dir.td_stripbytecount) - return 0; + if (!_TIFFFillStriles( tif ) || !tif->tif_dir.td_stripbytecount) + return 0; if ((tif->tif_flags & TIFF_CODERSETUP) == 0) { if (!(*tif->tif_setupdecode)(tif)) @@ -1028,12 +1003,18 @@ TIFFStartTile(TIFF* tif, uint32 tile) tif->tif_flags |= TIFF_CODERSETUP; } tif->tif_curtile = tile; - tif->tif_row = - (tile % TIFFhowmany_32(td->td_imagewidth, td->td_tilewidth)) * - td->td_tilelength; - tif->tif_col = - (tile % TIFFhowmany_32(td->td_imagelength, td->td_tilelength)) * - td->td_tilewidth; + 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) { @@ -1111,4 +1092,3 @@ _TIFFSwab64BitData(TIFF* tif, uint8* buf, tmsize_t cc) * fill-column: 78 * End: */ - diff --git a/third_party/tiff_v403/tif_strip.c b/third_party/libtiff/tif_strip.c index 2c15a70bdc..6cac71dd92 100644 --- a/third_party/tiff_v403/tif_strip.c +++ b/third_party/libtiff/tif_strip.c @@ -1,4 +1,4 @@ -/* $Id: tif_strip.c,v 1.35 2012-06-06 05:33:55 fwarmerdam Exp $ */ +/* $Id: tif_strip.c,v 1.36 2015-06-07 22:35:40 bfriesen Exp $ */ /* * Copyright (c) 1991-1997 Sam Leffler @@ -317,7 +317,14 @@ TIFFScanlineSize64(TIFF* tif) } } else + { scanline_size=TIFFhowmany_64(_TIFFMultiply64(tif,td->td_imagewidth,td->td_bitspersample,module),8); + } + if (scanline_size == 0) + { + TIFFErrorExt(tif->tif_clientdata,module,"Computed scanline size is zero"); + return 0; + } return(scanline_size); } tmsize_t @@ -328,8 +335,7 @@ TIFFScanlineSize(TIFF* tif) tmsize_t n; m=TIFFScanlineSize64(tif); n=(tmsize_t)m; - if ((uint64)n!=m) - { + if ((uint64)n!=m) { TIFFErrorExt(tif->tif_clientdata,module,"Integer arithmetic overflow"); n=0; } @@ -381,4 +387,3 @@ TIFFRasterScanlineSize(TIFF* tif) * fill-column: 78 * End: */ - diff --git a/third_party/tiff_v403/tif_swab.c b/third_party/libtiff/tif_swab.c index 205e529c2c..f37e33f1c9 100644 --- a/third_party/tiff_v403/tif_swab.c +++ b/third_party/libtiff/tif_swab.c @@ -308,4 +308,3 @@ TIFFReverseBits(uint8* cp, tmsize_t n) * fill-column: 78 * End: */ - diff --git a/third_party/tiff_v403/tif_thunder.c b/third_party/libtiff/tif_thunder.c index e2d4ac0439..390891c98b 100644 --- a/third_party/tiff_v403/tif_thunder.c +++ b/third_party/libtiff/tif_thunder.c @@ -23,6 +23,7 @@ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ + #include "tiffiop.h" #include <assert.h> #ifdef THUNDER_SUPPORT @@ -204,5 +205,3 @@ TIFFInitThunderScan(TIFF* tif, int scheme) * fill-column: 78 * End: */ - - diff --git a/third_party/tiff_v403/tif_tile.c b/third_party/libtiff/tif_tile.c index cb59a598e8..388e168ac6 100644 --- a/third_party/tiff_v403/tif_tile.c +++ b/third_party/libtiff/tif_tile.c @@ -1,4 +1,4 @@ -/* $Id: tif_tile.c,v 1.23 2012-06-06 05:33:55 fwarmerdam Exp $ */ +/* $Id: tif_tile.c,v 1.24 2015-06-07 22:35:40 bfriesen Exp $ */ /* * Copyright (c) 1991-1997 Sam Leffler @@ -143,17 +143,40 @@ TIFFNumberOfTiles(TIFF* tif) uint64 TIFFTileRowSize64(TIFF* tif) { + static const char module[] = "TIFFTileRowSize64"; TIFFDirectory *td = &tif->tif_dir; uint64 rowsize; + uint64 tilerowsize; - if (td->td_tilelength == 0 || td->td_tilewidth == 0) + if (td->td_tilelength == 0) + { + TIFFErrorExt(tif->tif_clientdata,module,"Tile length is zero"); + return 0; + } + if (td->td_tilewidth == 0) + { + TIFFErrorExt(tif->tif_clientdata,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,"Samples per pixel is zero"); + return 0; + } rowsize = _TIFFMultiply64(tif, rowsize, td->td_samplesperpixel, "TIFFTileRowSize"); - return (TIFFhowmany8_64(rowsize)); + } + tilerowsize=TIFFhowmany8_64(rowsize); + if (tilerowsize == 0) + { + TIFFErrorExt(tif->tif_clientdata,module,"Computed tile row size is zero"); + return 0; + } + return (tilerowsize); } tmsize_t TIFFTileRowSize(TIFF* tif) @@ -297,4 +320,3 @@ _TIFFDefaultTileSize(TIFF* tif, uint32* tw, uint32* th) * fill-column: 78 * End: */ - diff --git a/third_party/tiff_v403/tif_version.c b/third_party/libtiff/tif_version.c index 30119d205c..f92c843d88 100644 --- a/third_party/tiff_v403/tif_version.c +++ b/third_party/libtiff/tif_version.c @@ -38,4 +38,3 @@ TIFFGetVersion(void) * fill-column: 78 * End: */ - diff --git a/third_party/tiff_v403/tif_warning.c b/third_party/libtiff/tif_warning.c index 997f353688..423b636e6e 100644 --- a/third_party/tiff_v403/tif_warning.c +++ b/third_party/libtiff/tif_warning.c @@ -29,9 +29,7 @@ */ #include "tiffiop.h" -/*TIFFErrorHandlerExt _TIFFwarningHandlerExt = NULL;*/ -/* Modify here for use _TIFFwarningHandlerExt by Sunliang.Liu 20090715 */ -TIFFErrorHandler _TIFFwarningHandler = NULL; +TIFFErrorHandlerExt _TIFFwarningHandlerExt = NULL; TIFFErrorHandler TIFFSetWarningHandler(TIFFErrorHandler handler) @@ -81,5 +79,3 @@ TIFFWarningExt(thandle_t fd, const char* module, const char* fmt, ...) * fill-column: 78 * End: */ - - diff --git a/third_party/tiff_v403/tif_write.c b/third_party/libtiff/tif_write.c index f32ee9078b..7996c31e08 100644 --- a/third_party/tiff_v403/tif_write.c +++ b/third_party/libtiff/tif_write.c @@ -1,4 +1,4 @@ -/* $Id: tif_write.c,v 1.37 2012-08-13 22:10:17 fwarmerdam Exp $ */ +/* $Id: tif_write.c,v 1.42 2015-06-07 23:00:23 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -115,6 +115,10 @@ TIFFWriteScanline(TIFF* tif, void* buf, uint32 row, uint16 sample) 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) { @@ -220,6 +224,11 @@ TIFFWriteEncodedStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc) tif->tif_flags |= TIFF_BUF4WRITE; tif->tif_curstrip = strip; + if (td->td_stripsperimage == 0) { + TIFFErrorExt(tif->tif_clientdata, 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)) @@ -311,6 +320,10 @@ TIFFWriteRawStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc) 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); + } tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip; return (TIFFAppendToStrip(tif, strip, (uint8*) data, cc) ? cc : (tmsize_t) -1); @@ -353,6 +366,7 @@ TIFFWriteEncodedTile(TIFF* tif, uint32 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)); @@ -379,7 +393,7 @@ TIFFWriteEncodedTile(TIFF* tif, uint32 tile, void* data, tmsize_t cc) /* 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 */ /* time if the new compressed tile is bigger than the older one. (GDAL #4771) */ - if( tif->tif_rawdatasize <= (tmsize_t)td->td_stripbytecount[tile] ) + if( tif->tif_rawdatasize <= (tmsize_t) td->td_stripbytecount[tile] ) { if( !(TIFFWriteBufferSetup(tif, NULL, (tmsize_t)TIFFroundup_64((uint64)(td->td_stripbytecount[tile] + 1), 1024))) ) @@ -391,17 +405,25 @@ TIFFWriteEncodedTile(TIFF* tif, uint32 tile, void* data, tmsize_t cc) tif->tif_curoff = 0; } - tif->tif_rawcc = 0; - tif->tif_rawcp = tif->tif_rawdata; + tif->tif_rawcc = 0; + tif->tif_rawcp = tif->tif_rawdata; /* * Compute tiles per row & per column to compute * current row and column */ - tif->tif_row = (tile % TIFFhowmany_32(td->td_imagelength, td->td_tilelength)) - * td->td_tilelength; - tif->tif_col = (tile % TIFFhowmany_32(td->td_imagewidth, td->td_tilewidth)) - * td->td_tilewidth; + 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)) @@ -769,4 +791,3 @@ TIFFSetWriteOffset(TIFF* tif, toff_t off) * fill-column: 78 * End: */ - diff --git a/third_party/tiff_v403/tif_zip.c b/third_party/libtiff/tif_zip.c index 1a0d821ba8..b3ac9b956e 100644 --- a/third_party/tiff_v403/tif_zip.c +++ b/third_party/libtiff/tif_zip.c @@ -1,4 +1,4 @@ -/* $Id: tif_zip.c,v 1.31 2011-01-06 16:00:23 fwarmerdam Exp $ */ +/* $Id: tif_zip.c,v 1.33 2014-12-25 18:29:11 erouault Exp $ */ /* * Copyright (c) 1995-1997 Sam Leffler @@ -23,6 +23,7 @@ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ + #include "tiffiop.h" #ifdef ZIP_SUPPORT /* @@ -35,7 +36,7 @@ * 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 supressing the header + * 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. @@ -60,6 +61,8 @@ #error "Antiquated ZLIB software; you must use version 1.0 or later" #endif +#define SAFE_MSG(sp) ((sp)->stream.msg == NULL ? "" : (sp)->stream.msg) + /* * State block for each open TIFF * file using ZIP compression/decompression. @@ -105,7 +108,7 @@ ZIPSetupDecode(TIFF* tif) } if (inflateInit(&sp->stream) != Z_OK) { - TIFFErrorExt(tif->tif_clientdata, module, "%s", sp->stream.msg); + TIFFErrorExt(tif->tif_clientdata, module, "%s", SAFE_MSG(sp)); return (0); } else { sp->state |= ZSTATE_INIT_DECODE; @@ -173,14 +176,14 @@ ZIPDecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s) if (state == Z_DATA_ERROR) { TIFFErrorExt(tif->tif_clientdata, module, "Decoding error at scanline %lu, %s", - (unsigned long) tif->tif_row, sp->stream.msg); + (unsigned long) tif->tif_row, SAFE_MSG(sp)); if (inflateSync(&sp->stream) != Z_OK) return (0); continue; } if (state != Z_OK) { - TIFFErrorExt(tif->tif_clientdata, module, "ZLib error: %s", - sp->stream.msg); + TIFFErrorExt(tif->tif_clientdata, module, + "ZLib error: %s", SAFE_MSG(sp)); return (0); } } while (sp->stream.avail_out > 0); @@ -210,7 +213,7 @@ ZIPSetupEncode(TIFF* tif) } if (deflateInit(&sp->stream, sp->zipquality) != Z_OK) { - TIFFErrorExt(tif->tif_clientdata, module, "%s", sp->stream.msg); + TIFFErrorExt(tif->tif_clientdata, module, "%s", SAFE_MSG(sp)); return (0); } else { sp->state |= ZSTATE_INIT_ENCODE; @@ -237,7 +240,7 @@ ZIPPreEncode(TIFF* tif, uint16 s) 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 apropriately even before we simplify it */ - sp->stream.avail_out = (uInt)tif->tif_rawdatasize; + sp->stream.avail_out = 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"); @@ -272,8 +275,9 @@ ZIPEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s) } do { if (deflate(&sp->stream, Z_NO_FLUSH) != Z_OK) { - TIFFErrorExt(tif->tif_clientdata, module, "Encoder error: %s", - sp->stream.msg); + TIFFErrorExt(tif->tif_clientdata, module, + "Encoder error: %s", + SAFE_MSG(sp)); return (0); } if (sp->stream.avail_out == 0) { @@ -312,8 +316,8 @@ ZIPPostEncode(TIFF* tif) } break; default: - TIFFErrorExt(tif->tif_clientdata, module, "ZLib error: %s", - sp->stream.msg); + TIFFErrorExt(tif->tif_clientdata, module, + "ZLib error: %s", SAFE_MSG(sp)); return (0); } } while (state != Z_STREAM_END); @@ -358,7 +362,7 @@ ZIPVSetField(TIFF* tif, uint32 tag, va_list ap) if (deflateParams(&sp->stream, sp->zipquality, Z_DEFAULT_STRATEGY) != Z_OK) { TIFFErrorExt(tif->tif_clientdata, module, "ZLib error: %s", - sp->stream.msg); + SAFE_MSG(sp)); return (0); } } @@ -466,4 +470,3 @@ bad: * fill-column: 78 * End: */ - diff --git a/third_party/tiff_v403/tiff.h b/third_party/libtiff/tiff.h index 19b4e7976d..bc46acd02b 100644 --- a/third_party/tiff_v403/tiff.h +++ b/third_party/libtiff/tiff.h @@ -1,4 +1,4 @@ -/* $Id: tiff.h,v 1.68 2012-08-19 16:56:35 bfriesen Exp $ */ +/* $Id: tiff.h,v 1.69 2014-04-02 17:23:06 fwarmerdam Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -201,6 +201,7 @@ typedef enum { #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 */ @@ -402,6 +403,8 @@ typedef enum { #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 */ /* tag 33432 is listed in the 6.0 spec w/ unknown ownership */ #define TIFFTAG_COPYRIGHT 33432 /* copyright string */ /* IPTC TAG from RichTIFF specifications */ diff --git a/third_party/tiff_v403/tiffconf.h b/third_party/libtiff/tiffconf.h index e36bde6571..fab7e0d27f 100644 --- a/third_party/tiff_v403/tiffconf.h +++ b/third_party/libtiff/tiffconf.h @@ -57,6 +57,8 @@ #define SIZEOF_UNSIGNED_LONG 4 #endif +#define HAVE_SNPRINTF 1 + /* Signed 8-bit type */ #define TIFF_INT8_T signed char diff --git a/third_party/tiff_v403/tiffio.h b/third_party/libtiff/tiffio.h index 4c749edc9e..038b67013f 100644 --- a/third_party/tiff_v403/tiffio.h +++ b/third_party/libtiff/tiffio.h @@ -298,8 +298,6 @@ 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); -/* Do cmyk to rgb convert, add by Sunliang.Liu 20090723. */ -extern int TIFFCmyk2Rgb(thandle_t context, uint8 c, uint8 m, uint8 y, uint8 k, uint8* r, uint8* g, uint8* b); /* ** Stuff, related to tag handling and creating custom tags. diff --git a/third_party/tiff_v403/tiffiop.h b/third_party/libtiff/tiffiop.h index c5ddc3c173..c647b8df3b 100644 --- a/third_party/tiff_v403/tiffiop.h +++ b/third_party/libtiff/tiffiop.h @@ -1,4 +1,4 @@ -/* $Id: tiffiop.h,v 1.84 2012-05-30 01:50:17 fwarmerdam Exp $ */ +/* $Id: tiffiop.h,v 1.87 2015-08-23 17:49:01 bfriesen Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -57,6 +57,12 @@ 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, ...); +#endif + #include "tiffio.h" #include "tif_dir.h" @@ -258,6 +264,53 @@ struct tiff { #define TIFFArrayCount(a) (sizeof (a) / sizeof ((a)[0])) +/* + Support for large files. + + Windows read/write APIs support only 'unsigned int' rather than 'size_t'. + Windows off_t is only 32-bit, even in 64-bit builds. +*/ +#if defined(HAVE_FSEEKO) +/* + Use fseeko() and ftello() if they are available since they use + 'off_t' rather than 'long'. It is wrong to use fseeko() and + ftello() only on systems with special LFS support since some systems + (e.g. FreeBSD) support a 64-bit off_t by default. + + For MinGW, __MSVCRT_VERSION__ must be at least 0x800 to expose these + interfaces. The MinGW compiler must support the requested version. MinGW + does not distribute the CRT (it is supplied by Microsoft) so the correct CRT + 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) +#endif +#endif +#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_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_ftell_f(stream) /\* __int64 *\/ _ftelli64(stream) */ +/* #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_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_ftell_f(stream) ftell(stream) */ +/* #define _TIFF_stat_f(path,stat_buff) stat(path,stat_buff) */ +#define _TIFF_stat_s struct stat +#define _TIFF_off_t off_t +#endif + #if defined(__cplusplus) extern "C" { #endif diff --git a/third_party/tiff_v403/uvcode.h b/third_party/libtiff/uvcode.h index 50f11d7e0a..50f11d7e0a 100644 --- a/third_party/tiff_v403/uvcode.h +++ b/third_party/libtiff/uvcode.h diff --git a/third_party/third_party.gyp b/third_party/third_party.gyp index 89a4632633..b57009c43e 100644 --- a/third_party/third_party.gyp +++ b/third_party/third_party.gyp @@ -329,42 +329,42 @@ 'target_name': 'fx_tiff', 'type': 'static_library', 'sources': [ - 'tiff_v403/tiffiop.h', - 'tiff_v403/tif_aux.c', - 'tiff_v403/tif_close.c', - 'tiff_v403/tif_codec.c', - 'tiff_v403/tif_color.c', - 'tiff_v403/tif_compress.c', - 'tiff_v403/tif_dir.c', - 'tiff_v403/tif_dirinfo.c', - 'tiff_v403/tif_dirread.c', - 'tiff_v403/tif_dirwrite.c', - 'tiff_v403/tif_dumpmode.c', - 'tiff_v403/tif_error.c', - 'tiff_v403/tif_extension.c', - 'tiff_v403/tif_fax3.c', - 'tiff_v403/tif_fax3sm.c', - 'tiff_v403/tif_flush.c', - 'tiff_v403/tif_getimage.c', - 'tiff_v403/tif_jpeg.c', - 'tiff_v403/tif_luv.c', - 'tiff_v403/tif_lzw.c', - 'tiff_v403/tif_next.c', - 'tiff_v403/tif_ojpeg.c', - 'tiff_v403/tif_open.c', - 'tiff_v403/tif_packbits.c', - 'tiff_v403/tif_pixarlog.c', - 'tiff_v403/tif_predict.c', - 'tiff_v403/tif_print.c', - 'tiff_v403/tif_read.c', - 'tiff_v403/tif_strip.c', - 'tiff_v403/tif_swab.c', - 'tiff_v403/tif_thunder.c', - 'tiff_v403/tif_tile.c', - 'tiff_v403/tif_version.c', - 'tiff_v403/tif_warning.c', - 'tiff_v403/tif_write.c', - 'tiff_v403/tif_zip.c', + 'libtiff/tiffiop.h', + 'libtiff/tif_aux.c', + 'libtiff/tif_close.c', + 'libtiff/tif_codec.c', + 'libtiff/tif_color.c', + 'libtiff/tif_compress.c', + 'libtiff/tif_dir.c', + 'libtiff/tif_dirinfo.c', + 'libtiff/tif_dirread.c', + 'libtiff/tif_dirwrite.c', + 'libtiff/tif_dumpmode.c', + 'libtiff/tif_error.c', + 'libtiff/tif_extension.c', + 'libtiff/tif_fax3.c', + 'libtiff/tif_fax3sm.c', + 'libtiff/tif_flush.c', + 'libtiff/tif_getimage.c', + 'libtiff/tif_jpeg.c', + 'libtiff/tif_luv.c', + 'libtiff/tif_lzw.c', + 'libtiff/tif_next.c', + 'libtiff/tif_ojpeg.c', + 'libtiff/tif_open.c', + 'libtiff/tif_packbits.c', + 'libtiff/tif_pixarlog.c', + 'libtiff/tif_predict.c', + 'libtiff/tif_print.c', + 'libtiff/tif_read.c', + 'libtiff/tif_strip.c', + 'libtiff/tif_swab.c', + 'libtiff/tif_thunder.c', + 'libtiff/tif_tile.c', + 'libtiff/tif_version.c', + 'libtiff/tif_warning.c', + 'libtiff/tif_write.c', + 'libtiff/tif_zip.c', ], }, ], diff --git a/third_party/tiff_v403/tiffvers.h b/third_party/tiff_v403/tiffvers.h deleted file mode 100644 index 40edc813d5..0000000000 --- a/third_party/tiff_v403/tiffvers.h +++ /dev/null @@ -1,9 +0,0 @@ -#define TIFFLIB_VERSION_STR "LIBTIFF, Version 4.0.3\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 - * version or versions of the library. Runtime - * version checking should be done based on the - * string returned by TIFFGetVersion. - */ -#define TIFFLIB_VERSION 20120922 |