mirror of
https://github.com/opencv/opencv.git
synced 2025-06-10 19:24:07 +08:00
libtiff upgrade to version 4.6.0 (#25096)
* libtiff upgrade to version 4.6.0 * fix tiffvers.h cmake generation * temp: force build 3rd party deps from source * remove libport.h and spintf.c * cmake fixes * don't use tiff_dummy_namespace on windows * introduce numeric_types namespace alias * include cstdint * uint16_t is not a numeric_types type * fix uint16 and uint32 type defs * use standard c++ types * remove unused files * remove more unused files * revert build 3rd party code from source --------- Co-authored-by: Misha Klatis <misha.klatis@autodesk.com>
This commit is contained in:
parent
3afe8ddaf8
commit
52f3f5a3f6
40
3rdparty/libtiff/CMakeLists.txt
vendored
40
3rdparty/libtiff/CMakeLists.txt
vendored
@ -124,17 +124,17 @@ elseif(SIZEOF_UNSIGNED_LONG_LONG EQUAL 8)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(SIZEOF_UNSIGNED_INT EQUAL SIZEOF_SIZE_T)
|
if(SIZEOF_UNSIGNED_INT EQUAL SIZEOF_SIZE_T)
|
||||||
set(TIFF_SIZE_T "unsigned int")
|
set(TIFF_SIZE_T "uint32_t")
|
||||||
set(TIFF_SIZE_FORMAT "%u")
|
set(TIFF_SIZE_FORMAT "%u")
|
||||||
set(TIFF_SSIZE_T "signed int")
|
set(TIFF_SSIZE_T "int32_t")
|
||||||
set(TIFF_SSIZE_FORMAT "%d")
|
set(TIFF_SSIZE_FORMAT "%d")
|
||||||
elseif(SIZEOF_UNSIGNED_LONG EQUAL SIZEOF_SIZE_T)
|
elseif(SIZEOF_UNSIGNED_LONG EQUAL SIZEOF_SIZE_T)
|
||||||
set(TIFF_SIZE_T "unsigned long")
|
set(TIFF_SIZE_T "uint64_t")
|
||||||
set(TIFF_SIZE_FORMAT "%lu")
|
set(TIFF_SIZE_FORMAT "%lu")
|
||||||
set(TIFF_SSIZE_T "signed long")
|
set(TIFF_SSIZE_T "int64_t")
|
||||||
set(TIFF_SSIZE_FORMAT "%ld")
|
set(TIFF_SSIZE_FORMAT "%ld")
|
||||||
elseif(SIZEOF_UNSIGNED_LONG_LONG EQUAL SIZEOF_SIZE_T)
|
elseif(SIZEOF_UNSIGNED_LONG_LONG EQUAL SIZEOF_SIZE_T)
|
||||||
set(TIFF_SIZE_T "unsigned long")
|
set(TIFF_SIZE_T "uint64_t")
|
||||||
if(MINGW)
|
if(MINGW)
|
||||||
set(TIFF_SIZE_FORMAT "%I64u")
|
set(TIFF_SIZE_FORMAT "%I64u")
|
||||||
set(TIFF_SSIZE_FORMAT "%I64d")
|
set(TIFF_SSIZE_FORMAT "%I64d")
|
||||||
@ -198,20 +198,6 @@ check_function_exists(strtol HAVE_STRTOUL)
|
|||||||
check_function_exists(strtoull HAVE_STRTOULL)
|
check_function_exists(strtoull HAVE_STRTOULL)
|
||||||
check_function_exists(lfind HAVE_LFIND)
|
check_function_exists(lfind HAVE_LFIND)
|
||||||
|
|
||||||
# May be inlined, so check it compiles:
|
|
||||||
check_c_source_compiles("
|
|
||||||
#include <stdio.h>
|
|
||||||
int main(void) {
|
|
||||||
char buf[10];
|
|
||||||
snprintf(buf, 10, \"Test %d\", 1);
|
|
||||||
return 0;
|
|
||||||
}"
|
|
||||||
HAVE_SNPRINTF)
|
|
||||||
|
|
||||||
if(NOT HAVE_SNPRINTF)
|
|
||||||
add_definitions(-DNEED_LIBPORT)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# CPU bit order
|
# CPU bit order
|
||||||
set(fillorder FILLORDER_MSB2LSB)
|
set(fillorder FILLORDER_MSB2LSB)
|
||||||
if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "i.*86.*" OR
|
if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "i.*86.*" OR
|
||||||
@ -371,7 +357,12 @@ if(LIBLZMA_LIBRARIES)
|
|||||||
list(APPEND TIFF_LIBRARY_DEPS ${LIBLZMA_LIBRARIES})
|
list(APPEND TIFF_LIBRARY_DEPS ${LIBLZMA_LIBRARIES})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
set(LIBTIFF_MAJOR_VERSION "4")
|
||||||
|
set(LIBTIFF_MINOR_VERSION "6")
|
||||||
|
set(LIBTIFF_MICRO_VERSION "0")
|
||||||
|
set(LIBTIFF_VERSION "${LIBTIFF_MAJOR_VERSION}.${LIBTIFF_MINOR_VERSION}.${LIBTIFF_MICRO_VERSION}")
|
||||||
|
|
||||||
|
set(TIFF_MAX_DIR_COUNT "1048576")
|
||||||
|
|
||||||
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/tif_config.h.cmake.in"
|
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/tif_config.h.cmake.in"
|
||||||
"${CMAKE_CURRENT_BINARY_DIR}/tif_config.h"
|
"${CMAKE_CURRENT_BINARY_DIR}/tif_config.h"
|
||||||
@ -379,6 +370,9 @@ configure_file("${CMAKE_CURRENT_SOURCE_DIR}/tif_config.h.cmake.in"
|
|||||||
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/tiffconf.h.cmake.in"
|
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/tiffconf.h.cmake.in"
|
||||||
"${CMAKE_CURRENT_BINARY_DIR}/tiffconf.h"
|
"${CMAKE_CURRENT_BINARY_DIR}/tiffconf.h"
|
||||||
@ONLY)
|
@ONLY)
|
||||||
|
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/tiffvers.h.cmake.in"
|
||||||
|
"${CMAKE_CURRENT_BINARY_DIR}/tiffvers.h"
|
||||||
|
@ONLY)
|
||||||
|
|
||||||
ocv_include_directories("${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}" ${ZLIB_INCLUDE_DIRS})
|
ocv_include_directories("${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}" ${ZLIB_INCLUDE_DIRS})
|
||||||
|
|
||||||
@ -399,6 +393,7 @@ set(lib_srcs
|
|||||||
tif_fax3sm.c
|
tif_fax3sm.c
|
||||||
tif_flush.c
|
tif_flush.c
|
||||||
tif_getimage.c
|
tif_getimage.c
|
||||||
|
tif_hash_set.c
|
||||||
tif_jbig.c
|
tif_jbig.c
|
||||||
tif_jpeg_12.c
|
tif_jpeg_12.c
|
||||||
tif_jpeg.c
|
tif_jpeg.c
|
||||||
@ -427,21 +422,18 @@ set(lib_srcs
|
|||||||
t4.h
|
t4.h
|
||||||
tif_dir.h
|
tif_dir.h
|
||||||
tif_fax3.h
|
tif_fax3.h
|
||||||
|
tif_hash_set.h
|
||||||
|
tif_predict.h
|
||||||
tiff.h
|
tiff.h
|
||||||
tiffio.h
|
tiffio.h
|
||||||
tiffiop.h
|
tiffiop.h
|
||||||
tiffvers.h
|
tiffvers.h
|
||||||
tif_predict.h
|
|
||||||
uvcode.h
|
uvcode.h
|
||||||
tiffio.hxx
|
tiffio.hxx
|
||||||
"${CMAKE_CURRENT_BINARY_DIR}/tif_config.h"
|
"${CMAKE_CURRENT_BINARY_DIR}/tif_config.h"
|
||||||
"${CMAKE_CURRENT_BINARY_DIR}/tiffconf.h"
|
"${CMAKE_CURRENT_BINARY_DIR}/tiffconf.h"
|
||||||
)
|
)
|
||||||
|
|
||||||
if(WIN32 AND NOT HAVE_SNPRINTF)
|
|
||||||
list(APPEND lib_srcs snprintf.c libport.h)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(WIN32 AND NOT WINRT)
|
if(WIN32 AND NOT WINRT)
|
||||||
list(APPEND lib_srcs tif_win32.c)
|
list(APPEND lib_srcs tif_win32.c)
|
||||||
else()
|
else()
|
||||||
|
4819
3rdparty/libtiff/ChangeLog
vendored
4819
3rdparty/libtiff/ChangeLog
vendored
File diff suppressed because it is too large
Load Diff
69
3rdparty/libtiff/README.md
vendored
Normal file
69
3rdparty/libtiff/README.md
vendored
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
TIFF Software Distribution
|
||||||
|
--------------------------
|
||||||
|
This file is just a placeholder; the entire documentation is now located
|
||||||
|
as reStructuredText in the doc directory. To view the documentation
|
||||||
|
as HTML, visit https://libtiff.gitlab.io/libtiff/ or
|
||||||
|
http://www.simplesystems.org/libtiff/ or within the release package
|
||||||
|
in the doc/html-prebuilt directory. The manual pages are
|
||||||
|
located at doc/man-prebuilt.
|
||||||
|
|
||||||
|
The release package can be downloaded at
|
||||||
|
|
||||||
|
http://download.osgeo.org/libtiff/
|
||||||
|
|
||||||
|
If you can't hack either of these options then basically what you
|
||||||
|
want to do is:
|
||||||
|
|
||||||
|
% ./configure
|
||||||
|
% make
|
||||||
|
% su
|
||||||
|
# make install
|
||||||
|
|
||||||
|
More information, email contacts, and mailing list information can be
|
||||||
|
found online at http://www.simplesystems.org/libtiff/
|
||||||
|
|
||||||
|
Source code repository
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
[GitLab](https://gitlab.com/libtiff/libtiff)
|
||||||
|
|
||||||
|
Bug database
|
||||||
|
------------
|
||||||
|
|
||||||
|
[GitLab issues](https://gitlab.com/libtiff/libtiff/issues)
|
||||||
|
|
||||||
|
Previously, the project used
|
||||||
|
[Bugzilla](http://bugzilla.maptools.org/buglist.cgi?product=libtiff). This
|
||||||
|
is no longer in use, and all remaining issues have been migrated to GitLab.
|
||||||
|
|
||||||
|
Use and Copyright
|
||||||
|
-----------------
|
||||||
|
Silicon Graphics has seen fit to allow us to give this work away. It
|
||||||
|
is free. There is no support or guarantee of any sort as to its
|
||||||
|
operations, correctness, or whatever. If you do anything useful with
|
||||||
|
all or parts of it you need to honor the copyright notices. I would
|
||||||
|
also be interested in knowing about it and, hopefully, be acknowledged.
|
||||||
|
|
||||||
|
The legal way of saying that is:
|
||||||
|
|
||||||
|
Copyright (c) 1988-1997 Sam Leffler
|
||||||
|
Copyright (c) 1991-1997 Silicon Graphics, Inc.
|
||||||
|
|
||||||
|
Permission to use, copy, modify, distribute, and sell this software and
|
||||||
|
its documentation for any purpose is hereby granted without fee, provided
|
||||||
|
that (i) the above copyright notices and this permission notice appear in
|
||||||
|
all copies of the software and related documentation, and (ii) the names of
|
||||||
|
Sam Leffler and Silicon Graphics may not be used in any advertising or
|
||||||
|
publicity relating to the software without the specific, prior written
|
||||||
|
permission of Sam Leffler and Silicon Graphics.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||||
|
WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
||||||
|
ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
||||||
|
OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||||
|
WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||||
|
LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||||
|
OF THIS SOFTWARE.
|
71
3rdparty/libtiff/libport.h
vendored
71
3rdparty/libtiff/libport.h
vendored
@ -1,71 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2009 Frank Warmerdam
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, distribute, and sell this software and
|
|
||||||
* its documentation for any purpose is hereby granted without fee, provided
|
|
||||||
* that (i) the above copyright notices and this permission notice appear in
|
|
||||||
* all copies of the software and related documentation, and (ii) the names of
|
|
||||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
|
||||||
* publicity relating to the software without the specific, prior written
|
|
||||||
* permission of Sam Leffler and Silicon Graphics.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
|
||||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
|
||||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
|
||||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
|
||||||
* OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _LIBPORT_
|
|
||||||
#define _LIBPORT_
|
|
||||||
|
|
||||||
#if defined(HAVE_CONFIG_H)
|
|
||||||
# include <tif_config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int getopt(int argc, char * const argv[], const char *optstring);
|
|
||||||
extern char *optarg;
|
|
||||||
extern int opterr;
|
|
||||||
extern int optind;
|
|
||||||
extern int optopt;
|
|
||||||
|
|
||||||
int strcasecmp(const char *s1, const char *s2);
|
|
||||||
|
|
||||||
#ifndef HAVE_GETOPT
|
|
||||||
# define HAVE_GETOPT 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(HAVE_STRTOL)
|
|
||||||
long strtol(const char *nptr, char **endptr, int base);
|
|
||||||
#endif
|
|
||||||
#if !defined(HAVE_STRTOLL)
|
|
||||||
long long strtoll(const char *nptr, char **endptr, int base);
|
|
||||||
#endif
|
|
||||||
#if !defined(HAVE_STRTOUL)
|
|
||||||
unsigned long strtoul(const char *nptr, char **endptr, int base);
|
|
||||||
#endif
|
|
||||||
#if !defined(HAVE_STRTOULL)
|
|
||||||
unsigned long long strtoull(const char *nptr, char **endptr, int base);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
void *
|
|
||||||
lfind(const void *key, const void *base, size_t *nmemb, size_t size,
|
|
||||||
int(*compar)(const void *, const void *));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(HAVE_SNPRINTF)
|
|
||||||
#undef vsnprintf
|
|
||||||
#define vsnprintf _TIFF_vsnprintf_f
|
|
||||||
|
|
||||||
#undef snprintf
|
|
||||||
#define snprintf _TIFF_snprintf_f
|
|
||||||
int snprintf(char* str, size_t size, const char* format, ...);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* ndef _LIBPORT_ */
|
|
42
3rdparty/libtiff/snprintf.c
vendored
42
3rdparty/libtiff/snprintf.c
vendored
@ -1,42 +0,0 @@
|
|||||||
/**
|
|
||||||
* Workaround for lack of snprintf(3) in Visual Studio. See
|
|
||||||
* http://stackoverflow.com/questions/2915672/snprintf-and-visual-studio-2010/8712996#8712996
|
|
||||||
* It's a trivial wrapper around the builtin _vsnprintf_s and
|
|
||||||
* _vscprintf functions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include "libport.h"
|
|
||||||
|
|
||||||
int _TIFF_vsnprintf_f(char* str, size_t size, const char* format, va_list ap)
|
|
||||||
{
|
|
||||||
int count = -1;
|
|
||||||
|
|
||||||
if (size != 0)
|
|
||||||
#if _MSC_VER <= 1310
|
|
||||||
count = _vsnprintf(str, size, format, ap);
|
|
||||||
#else
|
|
||||||
count = _vsnprintf_s(str, size, _TRUNCATE, format, ap);
|
|
||||||
#endif
|
|
||||||
if (count == -1)
|
|
||||||
count = _vscprintf(format, ap);
|
|
||||||
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
|
|
||||||
int _TIFF_snprintf_f(char* str, size_t size, const char* format, ...)
|
|
||||||
{
|
|
||||||
int count;
|
|
||||||
va_list ap;
|
|
||||||
|
|
||||||
va_start(ap, format);
|
|
||||||
count = vsnprintf(str, size, format, ap);
|
|
||||||
va_end(ap);
|
|
||||||
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // _MSC_VER
|
|
10
3rdparty/libtiff/t4.h
vendored
10
3rdparty/libtiff/t4.h
vendored
@ -30,7 +30,8 @@
|
|||||||
* of these tables it does not seem
|
* of these tables it does not seem
|
||||||
* worthwhile to make code & length 8 bits.
|
* worthwhile to make code & length 8 bits.
|
||||||
*/
|
*/
|
||||||
typedef struct tableentry {
|
typedef struct tableentry
|
||||||
|
{
|
||||||
unsigned short length; /* bit length of g3 code */
|
unsigned short length; /* bit length of g3 code */
|
||||||
unsigned short code; /* g3 code */
|
unsigned short code; /* g3 code */
|
||||||
short runlen; /* run length in bits */
|
short runlen; /* run length in bits */
|
||||||
@ -281,10 +282,3 @@ extern const tableentry TIFFFaxWhiteCodes[];
|
|||||||
extern const tableentry TIFFFaxBlackCodes[];
|
extern const tableentry TIFFFaxBlackCodes[];
|
||||||
#endif
|
#endif
|
||||||
#endif /* _T4_ */
|
#endif /* _T4_ */
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
263
3rdparty/libtiff/tif_aux.c
vendored
263
3rdparty/libtiff/tif_aux.c
vendored
@ -27,42 +27,45 @@
|
|||||||
*
|
*
|
||||||
* Auxiliary Support Routines.
|
* Auxiliary Support Routines.
|
||||||
*/
|
*/
|
||||||
#include "tiffiop.h"
|
|
||||||
#include "tif_predict.h"
|
#include "tif_predict.h"
|
||||||
#include <math.h>
|
#include "tiffiop.h"
|
||||||
#include <float.h>
|
#include <float.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
uint32
|
uint32_t _TIFFMultiply32(TIFF *tif, uint32_t first, uint32_t second,
|
||||||
_TIFFMultiply32(TIFF* tif, uint32 first, uint32 second, const char* where)
|
const char *where)
|
||||||
{
|
{
|
||||||
if (second && first > TIFF_UINT32_MAX / second) {
|
if (second && first > UINT32_MAX / second)
|
||||||
TIFFErrorExt(tif->tif_clientdata, where, "Integer overflow in %s", where);
|
{
|
||||||
|
TIFFErrorExtR(tif, where, "Integer overflow in %s", where);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return first * second;
|
return first * second;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64
|
uint64_t _TIFFMultiply64(TIFF *tif, uint64_t first, uint64_t second,
|
||||||
_TIFFMultiply64(TIFF* tif, uint64 first, uint64 second, const char* where)
|
const char *where)
|
||||||
{
|
{
|
||||||
if (second && first > TIFF_UINT64_MAX / second) {
|
if (second && first > UINT64_MAX / second)
|
||||||
TIFFErrorExt(tif->tif_clientdata, where, "Integer overflow in %s", where);
|
{
|
||||||
|
TIFFErrorExtR(tif, where, "Integer overflow in %s", where);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return first * second;
|
return first * second;
|
||||||
}
|
}
|
||||||
|
|
||||||
tmsize_t
|
tmsize_t _TIFFMultiplySSize(TIFF *tif, tmsize_t first, tmsize_t second,
|
||||||
_TIFFMultiplySSize(TIFF* tif, tmsize_t first, tmsize_t second, const char* where)
|
const char *where)
|
||||||
{
|
{
|
||||||
if (first <= 0 || second <= 0)
|
if (first <= 0 || second <= 0)
|
||||||
{
|
{
|
||||||
if (tif != NULL && where != NULL)
|
if (tif != NULL && where != NULL)
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, where,
|
TIFFErrorExtR(tif, where,
|
||||||
"Invalid argument to _TIFFMultiplySSize() in %s", where);
|
"Invalid argument to _TIFFMultiplySSize() in %s",
|
||||||
|
where);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -71,30 +74,28 @@ _TIFFMultiplySSize(TIFF* tif, tmsize_t first, tmsize_t second, const char* where
|
|||||||
{
|
{
|
||||||
if (tif != NULL && where != NULL)
|
if (tif != NULL && where != NULL)
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, where,
|
TIFFErrorExtR(tif, where, "Integer overflow in %s", where);
|
||||||
"Integer overflow in %s", where);
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return first * second;
|
return first * second;
|
||||||
}
|
}
|
||||||
|
|
||||||
tmsize_t _TIFFCastUInt64ToSSize(TIFF* tif, uint64 val, const char* module)
|
tmsize_t _TIFFCastUInt64ToSSize(TIFF *tif, uint64_t val, const char *module)
|
||||||
{
|
{
|
||||||
if( val > (uint64)TIFF_TMSIZE_T_MAX )
|
if (val > (uint64_t)TIFF_TMSIZE_T_MAX)
|
||||||
{
|
{
|
||||||
if (tif != NULL && module != NULL)
|
if (tif != NULL && module != NULL)
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata,module,"Integer overflow");
|
TIFFErrorExtR(tif, module, "Integer overflow");
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return (tmsize_t)val;
|
return (tmsize_t)val;
|
||||||
}
|
}
|
||||||
|
|
||||||
void*
|
void *_TIFFCheckRealloc(TIFF *tif, void *buffer, tmsize_t nmemb,
|
||||||
_TIFFCheckRealloc(TIFF* tif, void* buffer,
|
tmsize_t elem_size, const char *what)
|
||||||
tmsize_t nmemb, tmsize_t elem_size, const char* what)
|
|
||||||
{
|
{
|
||||||
void *cp = NULL;
|
void *cp = NULL;
|
||||||
tmsize_t count = _TIFFMultiplySSize(tif, nmemb, elem_size, NULL);
|
tmsize_t count = _TIFFMultiplySSize(tif, nmemb, elem_size, NULL);
|
||||||
@ -103,29 +104,30 @@ _TIFFCheckRealloc(TIFF* tif, void* buffer,
|
|||||||
*/
|
*/
|
||||||
if (count != 0)
|
if (count != 0)
|
||||||
{
|
{
|
||||||
cp = _TIFFrealloc(buffer, count);
|
cp = _TIFFreallocExt(tif, buffer, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cp == NULL) {
|
if (cp == NULL)
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
{
|
||||||
|
TIFFErrorExtR(tif, tif->tif_name,
|
||||||
"Failed to allocate memory for %s "
|
"Failed to allocate memory for %s "
|
||||||
"(%ld elements of %ld bytes each)",
|
"(%" TIFF_SSIZE_FORMAT " elements of %" TIFF_SSIZE_FORMAT
|
||||||
what,(long) nmemb, (long) elem_size);
|
" bytes each)",
|
||||||
|
what, nmemb, elem_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
return cp;
|
return cp;
|
||||||
}
|
}
|
||||||
|
|
||||||
void*
|
void *_TIFFCheckMalloc(TIFF *tif, tmsize_t nmemb, tmsize_t elem_size,
|
||||||
_TIFFCheckMalloc(TIFF* tif, tmsize_t nmemb, tmsize_t elem_size, const char* what)
|
const char *what)
|
||||||
{
|
{
|
||||||
return _TIFFCheckRealloc(tif, NULL, nmemb, elem_size, what);
|
return _TIFFCheckRealloc(tif, NULL, nmemb, elem_size, what);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int TIFFDefaultTransferFunction(TIFF *tif, TIFFDirectory *td)
|
||||||
TIFFDefaultTransferFunction(TIFFDirectory* td)
|
|
||||||
{
|
{
|
||||||
uint16 **tf = td->td_transferfunction;
|
uint16_t **tf = td->td_transferfunction;
|
||||||
tmsize_t i, n, nbytes;
|
tmsize_t i, n, nbytes;
|
||||||
|
|
||||||
tf[0] = tf[1] = tf[2] = 0;
|
tf[0] = tf[1] = tf[2] = 0;
|
||||||
@ -133,22 +135,24 @@ TIFFDefaultTransferFunction(TIFFDirectory* td)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
n = ((tmsize_t)1) << td->td_bitspersample;
|
n = ((tmsize_t)1) << td->td_bitspersample;
|
||||||
nbytes = n * sizeof (uint16);
|
nbytes = n * sizeof(uint16_t);
|
||||||
tf[0] = (uint16 *)_TIFFmalloc(nbytes);
|
tf[0] = (uint16_t *)_TIFFmallocExt(tif, nbytes);
|
||||||
if (tf[0] == NULL)
|
if (tf[0] == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
tf[0][0] = 0;
|
tf[0][0] = 0;
|
||||||
for (i = 1; i < n; i++) {
|
for (i = 1; i < n; i++)
|
||||||
|
{
|
||||||
double t = (double)i / ((double)n - 1.);
|
double t = (double)i / ((double)n - 1.);
|
||||||
tf[0][i] = (uint16)floor(65535.*pow(t, 2.2) + .5);
|
tf[0][i] = (uint16_t)floor(65535. * pow(t, 2.2) + .5);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (td->td_samplesperpixel - td->td_extrasamples > 1) {
|
if (td->td_samplesperpixel - td->td_extrasamples > 1)
|
||||||
tf[1] = (uint16 *)_TIFFmalloc(nbytes);
|
{
|
||||||
|
tf[1] = (uint16_t *)_TIFFmallocExt(tif, nbytes);
|
||||||
if (tf[1] == NULL)
|
if (tf[1] == NULL)
|
||||||
goto bad;
|
goto bad;
|
||||||
_TIFFmemcpy(tf[1], tf[0], nbytes);
|
_TIFFmemcpy(tf[1], tf[0], nbytes);
|
||||||
tf[2] = (uint16 *)_TIFFmalloc(nbytes);
|
tf[2] = (uint16_t *)_TIFFmallocExt(tif, nbytes);
|
||||||
if (tf[2] == NULL)
|
if (tf[2] == NULL)
|
||||||
goto bad;
|
goto bad;
|
||||||
_TIFFmemcpy(tf[2], tf[0], nbytes);
|
_TIFFmemcpy(tf[2], tf[0], nbytes);
|
||||||
@ -157,24 +161,24 @@ TIFFDefaultTransferFunction(TIFFDirectory* td)
|
|||||||
|
|
||||||
bad:
|
bad:
|
||||||
if (tf[0])
|
if (tf[0])
|
||||||
_TIFFfree(tf[0]);
|
_TIFFfreeExt(tif, tf[0]);
|
||||||
if (tf[1])
|
if (tf[1])
|
||||||
_TIFFfree(tf[1]);
|
_TIFFfreeExt(tif, tf[1]);
|
||||||
if (tf[2])
|
if (tf[2])
|
||||||
_TIFFfree(tf[2]);
|
_TIFFfreeExt(tif, tf[2]);
|
||||||
tf[0] = tf[1] = tf[2] = 0;
|
tf[0] = tf[1] = tf[2] = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int TIFFDefaultRefBlackWhite(TIFF *tif, TIFFDirectory *td)
|
||||||
TIFFDefaultRefBlackWhite(TIFFDirectory* td)
|
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
td->td_refblackwhite = (float *)_TIFFmalloc(6*sizeof (float));
|
td->td_refblackwhite = (float *)_TIFFmallocExt(tif, 6 * sizeof(float));
|
||||||
if (td->td_refblackwhite == NULL)
|
if (td->td_refblackwhite == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
if (td->td_photometric == PHOTOMETRIC_YCBCR) {
|
if (td->td_photometric == PHOTOMETRIC_YCBCR)
|
||||||
|
{
|
||||||
/*
|
/*
|
||||||
* YCbCr (Class Y) images must have the ReferenceBlackWhite
|
* YCbCr (Class Y) images must have the ReferenceBlackWhite
|
||||||
* tag set. Fix the broken images, which lacks that tag.
|
* tag set. Fix the broken images, which lacks that tag.
|
||||||
@ -183,11 +187,14 @@ TIFFDefaultRefBlackWhite(TIFFDirectory* td)
|
|||||||
td->td_refblackwhite[1] = td->td_refblackwhite[3] =
|
td->td_refblackwhite[1] = td->td_refblackwhite[3] =
|
||||||
td->td_refblackwhite[5] = 255.0F;
|
td->td_refblackwhite[5] = 255.0F;
|
||||||
td->td_refblackwhite[2] = td->td_refblackwhite[4] = 128.0F;
|
td->td_refblackwhite[2] = td->td_refblackwhite[4] = 128.0F;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
/*
|
/*
|
||||||
* Assume RGB (Class R)
|
* Assume RGB (Class R)
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < 3; i++) {
|
for (i = 0; i < 3; i++)
|
||||||
|
{
|
||||||
td->td_refblackwhite[2 * i + 0] = 0;
|
td->td_refblackwhite[2 * i + 0] = 0;
|
||||||
td->td_refblackwhite[2 * i + 1] =
|
td->td_refblackwhite[2 * i + 1] =
|
||||||
(float)((1L << td->td_bitspersample) - 1L);
|
(float)((1L << td->td_bitspersample) - 1L);
|
||||||
@ -204,90 +211,115 @@ TIFFDefaultRefBlackWhite(TIFFDirectory* td)
|
|||||||
* explicit values so that defaults exist only one
|
* explicit values so that defaults exist only one
|
||||||
* place in the library -- in TIFFDefaultDirectory.
|
* place in the library -- in TIFFDefaultDirectory.
|
||||||
*/
|
*/
|
||||||
int
|
int TIFFVGetFieldDefaulted(TIFF *tif, uint32_t tag, va_list ap)
|
||||||
TIFFVGetFieldDefaulted(TIFF* tif, uint32 tag, va_list ap)
|
|
||||||
{
|
{
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
TIFFDirectory *td = &tif->tif_dir;
|
||||||
|
|
||||||
if (TIFFVGetField(tif, tag, ap))
|
if (TIFFVGetField(tif, tag, ap))
|
||||||
return (1);
|
return (1);
|
||||||
switch (tag) {
|
switch (tag)
|
||||||
|
{
|
||||||
case TIFFTAG_SUBFILETYPE:
|
case TIFFTAG_SUBFILETYPE:
|
||||||
*va_arg(ap, uint32 *) = td->td_subfiletype;
|
*va_arg(ap, uint32_t *) = td->td_subfiletype;
|
||||||
return (1);
|
return (1);
|
||||||
case TIFFTAG_BITSPERSAMPLE:
|
case TIFFTAG_BITSPERSAMPLE:
|
||||||
*va_arg(ap, uint16 *) = td->td_bitspersample;
|
*va_arg(ap, uint16_t *) = td->td_bitspersample;
|
||||||
return (1);
|
return (1);
|
||||||
case TIFFTAG_THRESHHOLDING:
|
case TIFFTAG_THRESHHOLDING:
|
||||||
*va_arg(ap, uint16 *) = td->td_threshholding;
|
*va_arg(ap, uint16_t *) = td->td_threshholding;
|
||||||
return (1);
|
return (1);
|
||||||
case TIFFTAG_FILLORDER:
|
case TIFFTAG_FILLORDER:
|
||||||
*va_arg(ap, uint16 *) = td->td_fillorder;
|
*va_arg(ap, uint16_t *) = td->td_fillorder;
|
||||||
return (1);
|
return (1);
|
||||||
case TIFFTAG_ORIENTATION:
|
case TIFFTAG_ORIENTATION:
|
||||||
*va_arg(ap, uint16 *) = td->td_orientation;
|
*va_arg(ap, uint16_t *) = td->td_orientation;
|
||||||
return (1);
|
return (1);
|
||||||
case TIFFTAG_SAMPLESPERPIXEL:
|
case TIFFTAG_SAMPLESPERPIXEL:
|
||||||
*va_arg(ap, uint16 *) = td->td_samplesperpixel;
|
*va_arg(ap, uint16_t *) = td->td_samplesperpixel;
|
||||||
return (1);
|
return (1);
|
||||||
case TIFFTAG_ROWSPERSTRIP:
|
case TIFFTAG_ROWSPERSTRIP:
|
||||||
*va_arg(ap, uint32 *) = td->td_rowsperstrip;
|
*va_arg(ap, uint32_t *) = td->td_rowsperstrip;
|
||||||
return (1);
|
return (1);
|
||||||
case TIFFTAG_MINSAMPLEVALUE:
|
case TIFFTAG_MINSAMPLEVALUE:
|
||||||
*va_arg(ap, uint16 *) = td->td_minsamplevalue;
|
*va_arg(ap, uint16_t *) = td->td_minsamplevalue;
|
||||||
return (1);
|
return (1);
|
||||||
case TIFFTAG_MAXSAMPLEVALUE:
|
case TIFFTAG_MAXSAMPLEVALUE:
|
||||||
*va_arg(ap, uint16 *) = td->td_maxsamplevalue;
|
{
|
||||||
|
uint16_t maxsamplevalue;
|
||||||
|
/* td_bitspersample=1 is always set in TIFFDefaultDirectory().
|
||||||
|
* Therefore, td_maxsamplevalue has to be re-calculated in
|
||||||
|
* TIFFGetFieldDefaulted(). */
|
||||||
|
if (td->td_bitspersample > 0)
|
||||||
|
{
|
||||||
|
/* This shift operation into a uint16_t limits the value to
|
||||||
|
* 65535 even if td_bitspersamle is > 16 */
|
||||||
|
if (td->td_bitspersample <= 16)
|
||||||
|
{
|
||||||
|
maxsamplevalue = (1 << td->td_bitspersample) -
|
||||||
|
1; /* 2**(BitsPerSample) - 1 */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
maxsamplevalue = 65535;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
maxsamplevalue = 0;
|
||||||
|
}
|
||||||
|
*va_arg(ap, uint16_t *) = maxsamplevalue;
|
||||||
return (1);
|
return (1);
|
||||||
|
}
|
||||||
case TIFFTAG_PLANARCONFIG:
|
case TIFFTAG_PLANARCONFIG:
|
||||||
*va_arg(ap, uint16 *) = td->td_planarconfig;
|
*va_arg(ap, uint16_t *) = td->td_planarconfig;
|
||||||
return (1);
|
return (1);
|
||||||
case TIFFTAG_RESOLUTIONUNIT:
|
case TIFFTAG_RESOLUTIONUNIT:
|
||||||
*va_arg(ap, uint16 *) = td->td_resolutionunit;
|
*va_arg(ap, uint16_t *) = td->td_resolutionunit;
|
||||||
return (1);
|
return (1);
|
||||||
case TIFFTAG_PREDICTOR:
|
case TIFFTAG_PREDICTOR:
|
||||||
{
|
{
|
||||||
TIFFPredictorState *sp = (TIFFPredictorState *)tif->tif_data;
|
TIFFPredictorState *sp = (TIFFPredictorState *)tif->tif_data;
|
||||||
if (sp == NULL)
|
if (sp == NULL)
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
TIFFErrorExtR(
|
||||||
|
tif, tif->tif_name,
|
||||||
"Cannot get \"Predictor\" tag as plugin is not configured");
|
"Cannot get \"Predictor\" tag as plugin is not configured");
|
||||||
*va_arg(ap, uint16*) = 0;
|
*va_arg(ap, uint16_t *) = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
*va_arg(ap, uint16*) = (uint16) sp->predictor;
|
*va_arg(ap, uint16_t *) = (uint16_t)sp->predictor;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
case TIFFTAG_DOTRANGE:
|
case TIFFTAG_DOTRANGE:
|
||||||
*va_arg(ap, uint16 *) = 0;
|
*va_arg(ap, uint16_t *) = 0;
|
||||||
*va_arg(ap, uint16 *) = (1<<td->td_bitspersample)-1;
|
*va_arg(ap, uint16_t *) = (1 << td->td_bitspersample) - 1;
|
||||||
return (1);
|
return (1);
|
||||||
case TIFFTAG_INKSET:
|
case TIFFTAG_INKSET:
|
||||||
*va_arg(ap, uint16 *) = INKSET_CMYK;
|
*va_arg(ap, uint16_t *) = INKSET_CMYK;
|
||||||
return 1;
|
return 1;
|
||||||
case TIFFTAG_NUMBEROFINKS:
|
case TIFFTAG_NUMBEROFINKS:
|
||||||
*va_arg(ap, uint16 *) = 4;
|
*va_arg(ap, uint16_t *) = 4;
|
||||||
return (1);
|
return (1);
|
||||||
case TIFFTAG_EXTRASAMPLES:
|
case TIFFTAG_EXTRASAMPLES:
|
||||||
*va_arg(ap, uint16 *) = td->td_extrasamples;
|
*va_arg(ap, uint16_t *) = td->td_extrasamples;
|
||||||
*va_arg(ap, const uint16 **) = td->td_sampleinfo;
|
*va_arg(ap, const uint16_t **) = td->td_sampleinfo;
|
||||||
return (1);
|
return (1);
|
||||||
case TIFFTAG_MATTEING:
|
case TIFFTAG_MATTEING:
|
||||||
*va_arg(ap, uint16 *) =
|
*va_arg(ap, uint16_t *) =
|
||||||
(td->td_extrasamples == 1 &&
|
(td->td_extrasamples == 1 &&
|
||||||
td->td_sampleinfo[0] == EXTRASAMPLE_ASSOCALPHA);
|
td->td_sampleinfo[0] == EXTRASAMPLE_ASSOCALPHA);
|
||||||
return (1);
|
return (1);
|
||||||
case TIFFTAG_TILEDEPTH:
|
case TIFFTAG_TILEDEPTH:
|
||||||
*va_arg(ap, uint32 *) = td->td_tiledepth;
|
*va_arg(ap, uint32_t *) = td->td_tiledepth;
|
||||||
return (1);
|
return (1);
|
||||||
case TIFFTAG_DATATYPE:
|
case TIFFTAG_DATATYPE:
|
||||||
*va_arg(ap, uint16 *) = td->td_sampleformat-1;
|
*va_arg(ap, uint16_t *) = td->td_sampleformat - 1;
|
||||||
return (1);
|
return (1);
|
||||||
case TIFFTAG_SAMPLEFORMAT:
|
case TIFFTAG_SAMPLEFORMAT:
|
||||||
*va_arg(ap, uint16 *) = td->td_sampleformat;
|
*va_arg(ap, uint16_t *) = td->td_sampleformat;
|
||||||
return (1);
|
return (1);
|
||||||
case TIFFTAG_IMAGEDEPTH:
|
case TIFFTAG_IMAGEDEPTH:
|
||||||
*va_arg(ap, uint32 *) = td->td_imagedepth;
|
*va_arg(ap, uint32_t *) = td->td_imagedepth;
|
||||||
return (1);
|
return (1);
|
||||||
case TIFFTAG_YCBCRCOEFFICIENTS:
|
case TIFFTAG_YCBCRCOEFFICIENTS:
|
||||||
{
|
{
|
||||||
@ -297,11 +329,11 @@ TIFFVGetFieldDefaulted(TIFF* tif, uint32 tag, va_list ap)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
case TIFFTAG_YCBCRSUBSAMPLING:
|
case TIFFTAG_YCBCRSUBSAMPLING:
|
||||||
*va_arg(ap, uint16 *) = td->td_ycbcrsubsampling[0];
|
*va_arg(ap, uint16_t *) = td->td_ycbcrsubsampling[0];
|
||||||
*va_arg(ap, uint16 *) = td->td_ycbcrsubsampling[1];
|
*va_arg(ap, uint16_t *) = td->td_ycbcrsubsampling[1];
|
||||||
return (1);
|
return (1);
|
||||||
case TIFFTAG_YCBCRPOSITIONING:
|
case TIFFTAG_YCBCRPOSITIONING:
|
||||||
*va_arg(ap, uint16 *) = td->td_ycbcrpositioning;
|
*va_arg(ap, uint16_t *) = td->td_ycbcrpositioning;
|
||||||
return (1);
|
return (1);
|
||||||
case TIFFTAG_WHITEPOINT:
|
case TIFFTAG_WHITEPOINT:
|
||||||
{
|
{
|
||||||
@ -310,25 +342,27 @@ TIFFVGetFieldDefaulted(TIFF* tif, uint32 tag, va_list ap)
|
|||||||
Technical Note tells that it should be CIE D50. */
|
Technical Note tells that it should be CIE D50. */
|
||||||
static const float whitepoint[] = {
|
static const float whitepoint[] = {
|
||||||
D50_X0 / (D50_X0 + D50_Y0 + D50_Z0),
|
D50_X0 / (D50_X0 + D50_Y0 + D50_Z0),
|
||||||
D50_Y0 / (D50_X0 + D50_Y0 + D50_Z0)
|
D50_Y0 / (D50_X0 + D50_Y0 + D50_Z0)};
|
||||||
};
|
|
||||||
*va_arg(ap, const float **) = whitepoint;
|
*va_arg(ap, const float **) = whitepoint;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
case TIFFTAG_TRANSFERFUNCTION:
|
case TIFFTAG_TRANSFERFUNCTION:
|
||||||
if (!td->td_transferfunction[0] &&
|
if (!td->td_transferfunction[0] &&
|
||||||
!TIFFDefaultTransferFunction(td)) {
|
!TIFFDefaultTransferFunction(tif, td))
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "No space for \"TransferFunction\" tag");
|
{
|
||||||
|
TIFFErrorExtR(tif, tif->tif_name,
|
||||||
|
"No space for \"TransferFunction\" tag");
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
*va_arg(ap, const uint16 **) = td->td_transferfunction[0];
|
*va_arg(ap, const uint16_t **) = td->td_transferfunction[0];
|
||||||
if (td->td_samplesperpixel - td->td_extrasamples > 1) {
|
if (td->td_samplesperpixel - td->td_extrasamples > 1)
|
||||||
*va_arg(ap, const uint16 **) = td->td_transferfunction[1];
|
{
|
||||||
*va_arg(ap, const uint16 **) = td->td_transferfunction[2];
|
*va_arg(ap, const uint16_t **) = td->td_transferfunction[1];
|
||||||
|
*va_arg(ap, const uint16_t **) = td->td_transferfunction[2];
|
||||||
}
|
}
|
||||||
return (1);
|
return (1);
|
||||||
case TIFFTAG_REFERENCEBLACKWHITE:
|
case TIFFTAG_REFERENCEBLACKWHITE:
|
||||||
if (!td->td_refblackwhite && !TIFFDefaultRefBlackWhite(td))
|
if (!td->td_refblackwhite && !TIFFDefaultRefBlackWhite(tif, td))
|
||||||
return (0);
|
return (0);
|
||||||
*va_arg(ap, const float **) = td->td_refblackwhite;
|
*va_arg(ap, const float **) = td->td_refblackwhite;
|
||||||
return (1);
|
return (1);
|
||||||
@ -340,8 +374,7 @@ TIFFVGetFieldDefaulted(TIFF* tif, uint32 tag, va_list ap)
|
|||||||
* Like TIFFGetField, but return any default
|
* Like TIFFGetField, but return any default
|
||||||
* value if the tag is not present in the directory.
|
* value if the tag is not present in the directory.
|
||||||
*/
|
*/
|
||||||
int
|
int TIFFGetFieldDefaulted(TIFF *tif, uint32_t tag, ...)
|
||||||
TIFFGetFieldDefaulted(TIFF* tif, uint32 tag, ...)
|
|
||||||
{
|
{
|
||||||
int ok;
|
int ok;
|
||||||
va_list ap;
|
va_list ap;
|
||||||
@ -352,24 +385,28 @@ TIFFGetFieldDefaulted(TIFF* tif, uint32 tag, ...)
|
|||||||
return (ok);
|
return (ok);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct _Int64Parts {
|
struct _Int64Parts
|
||||||
int32 low, high;
|
{
|
||||||
|
int32_t low, high;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef union {
|
typedef union
|
||||||
|
{
|
||||||
struct _Int64Parts part;
|
struct _Int64Parts part;
|
||||||
int64 value;
|
int64_t value;
|
||||||
} _Int64;
|
} _Int64;
|
||||||
|
|
||||||
float
|
float _TIFFUInt64ToFloat(uint64_t ui64)
|
||||||
_TIFFUInt64ToFloat(uint64 ui64)
|
|
||||||
{
|
{
|
||||||
_Int64 i;
|
_Int64 i;
|
||||||
|
|
||||||
i.value = ui64;
|
i.value = ui64;
|
||||||
if (i.part.high >= 0) {
|
if (i.part.high >= 0)
|
||||||
|
{
|
||||||
return (float)i.value;
|
return (float)i.value;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
long double df;
|
long double df;
|
||||||
df = (long double)i.value;
|
df = (long double)i.value;
|
||||||
df += 18446744073709551616.0; /* adding 2**64 */
|
df += 18446744073709551616.0; /* adding 2**64 */
|
||||||
@ -377,15 +414,17 @@ _TIFFUInt64ToFloat(uint64 ui64)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
double
|
double _TIFFUInt64ToDouble(uint64_t ui64)
|
||||||
_TIFFUInt64ToDouble(uint64 ui64)
|
|
||||||
{
|
{
|
||||||
_Int64 i;
|
_Int64 i;
|
||||||
|
|
||||||
i.value = ui64;
|
i.value = ui64;
|
||||||
if (i.part.high >= 0) {
|
if (i.part.high >= 0)
|
||||||
|
{
|
||||||
return (double)i.value;
|
return (double)i.value;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
long double df;
|
long double df;
|
||||||
df = (long double)i.value;
|
df = (long double)i.value;
|
||||||
df += 18446744073709551616.0; /* adding 2**64 */
|
df += 18446744073709551616.0; /* adding 2**64 */
|
||||||
@ -402,18 +441,18 @@ float _TIFFClampDoubleToFloat( double val )
|
|||||||
return (float)val;
|
return (float)val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t _TIFFClampDoubleToUInt32(double val)
|
||||||
|
{
|
||||||
|
if (val < 0)
|
||||||
|
return 0;
|
||||||
|
if (val > 0xFFFFFFFFU || val != val)
|
||||||
|
return 0xFFFFFFFFU;
|
||||||
|
return (uint32_t)val;
|
||||||
|
}
|
||||||
|
|
||||||
int _TIFFSeekOK(TIFF *tif, toff_t off)
|
int _TIFFSeekOK(TIFF *tif, toff_t off)
|
||||||
{
|
{
|
||||||
/* Huge offsets, especially -1 / UINT64_MAX, can cause issues */
|
/* Huge offsets, especially -1 / UINT64_MAX, can cause issues */
|
||||||
/* See http://bugzilla.maptools.org/show_bug.cgi?id=2726 */
|
/* See http://bugzilla.maptools.org/show_bug.cgi?id=2726 */
|
||||||
return off <= (~(uint64)0)/2 && TIFFSeekFile(tif,off,SEEK_SET)==off;
|
return off <= (~(uint64_t)0) / 2 && TIFFSeekFile(tif, off, SEEK_SET) == off;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
84
3rdparty/libtiff/tif_close.c
vendored
84
3rdparty/libtiff/tif_close.c
vendored
@ -41,8 +41,7 @@
|
|||||||
* @param tif A TIFF pointer.
|
* @param tif A TIFF pointer.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void
|
void TIFFCleanup(TIFF *tif)
|
||||||
TIFFCleanup(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Flush buffered data and directory (if dirty).
|
* Flush buffered data and directory (if dirty).
|
||||||
@ -52,8 +51,7 @@ TIFFCleanup(TIFF* tif)
|
|||||||
(*tif->tif_cleanup)(tif);
|
(*tif->tif_cleanup)(tif);
|
||||||
TIFFFreeDirectory(tif);
|
TIFFFreeDirectory(tif);
|
||||||
|
|
||||||
if (tif->tif_dirlist)
|
_TIFFCleanupIFDOffsetAndNumberMaps(tif);
|
||||||
_TIFFfree(tif->tif_dirlist);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Clean up client info links.
|
* Clean up client info links.
|
||||||
@ -63,44 +61,74 @@ TIFFCleanup(TIFF* tif)
|
|||||||
TIFFClientInfoLink *psLink = tif->tif_clientinfo;
|
TIFFClientInfoLink *psLink = tif->tif_clientinfo;
|
||||||
|
|
||||||
tif->tif_clientinfo = psLink->next;
|
tif->tif_clientinfo = psLink->next;
|
||||||
_TIFFfree( psLink->name );
|
_TIFFfreeExt(tif, psLink->name);
|
||||||
_TIFFfree( psLink );
|
_TIFFfreeExt(tif, psLink);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tif->tif_rawdata && (tif->tif_flags & TIFF_MYBUFFER))
|
if (tif->tif_rawdata && (tif->tif_flags & TIFF_MYBUFFER))
|
||||||
_TIFFfree(tif->tif_rawdata);
|
_TIFFfreeExt(tif, tif->tif_rawdata);
|
||||||
if (isMapped(tif))
|
if (isMapped(tif))
|
||||||
TIFFUnmapFileContents(tif, tif->tif_base, (toff_t)tif->tif_size);
|
TIFFUnmapFileContents(tif, tif->tif_base, (toff_t)tif->tif_size);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Clean up custom fields.
|
* Clean up custom fields.
|
||||||
*/
|
*/
|
||||||
if (tif->tif_fields && tif->tif_nfields > 0) {
|
if (tif->tif_fields && tif->tif_nfields > 0)
|
||||||
uint32 i;
|
{
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
for (i = 0; i < tif->tif_nfields; i++) {
|
for (i = 0; i < tif->tif_nfields; i++)
|
||||||
|
{
|
||||||
TIFFField *fld = tif->tif_fields[i];
|
TIFFField *fld = tif->tif_fields[i];
|
||||||
|
if (fld->field_name != NULL)
|
||||||
|
{
|
||||||
if (fld->field_bit == FIELD_CUSTOM &&
|
if (fld->field_bit == FIELD_CUSTOM &&
|
||||||
strncmp("Tag ", fld->field_name, 4) == 0) {
|
/* caution: tif_fields[i] must not be the beginning of a
|
||||||
_TIFFfree(fld->field_name);
|
* fields-array. Otherwise the following tags are also freed
|
||||||
_TIFFfree(fld);
|
* with the first free().
|
||||||
|
*/
|
||||||
|
TIFFFieldIsAnonymous(fld))
|
||||||
|
{
|
||||||
|
_TIFFfreeExt(tif, fld->field_name);
|
||||||
|
_TIFFfreeExt(tif, fld);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_TIFFfree(tif->tif_fields);
|
_TIFFfreeExt(tif, tif->tif_fields);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tif->tif_nfieldscompat > 0) {
|
if (tif->tif_nfieldscompat > 0)
|
||||||
uint32 i;
|
{
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
for (i = 0; i < tif->tif_nfieldscompat; i++) {
|
for (i = 0; i < tif->tif_nfieldscompat; i++)
|
||||||
|
{
|
||||||
if (tif->tif_fieldscompat[i].allocated_size)
|
if (tif->tif_fieldscompat[i].allocated_size)
|
||||||
_TIFFfree(tif->tif_fieldscompat[i].fields);
|
_TIFFfreeExt(tif, tif->tif_fieldscompat[i].fields);
|
||||||
}
|
}
|
||||||
_TIFFfree(tif->tif_fieldscompat);
|
_TIFFfreeExt(tif, tif->tif_fieldscompat);
|
||||||
}
|
}
|
||||||
|
|
||||||
_TIFFfree(tif);
|
_TIFFfreeExt(NULL, tif);
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
/* _TIFFCleanupIFDOffsetAndNumberMaps() */
|
||||||
|
/************************************************************************/
|
||||||
|
|
||||||
|
void _TIFFCleanupIFDOffsetAndNumberMaps(TIFF *tif)
|
||||||
|
{
|
||||||
|
if (tif->tif_map_dir_offset_to_number)
|
||||||
|
{
|
||||||
|
TIFFHashSetDestroy(tif->tif_map_dir_offset_to_number);
|
||||||
|
tif->tif_map_dir_offset_to_number = NULL;
|
||||||
|
}
|
||||||
|
if (tif->tif_map_dir_number_to_offset)
|
||||||
|
{
|
||||||
|
TIFFHashSetDestroy(tif->tif_map_dir_number_to_offset);
|
||||||
|
tif->tif_map_dir_number_to_offset = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************/
|
/************************************************************************/
|
||||||
@ -117,8 +145,9 @@ TIFFCleanup(TIFF* tif)
|
|||||||
* @param tif A TIFF pointer.
|
* @param tif A TIFF pointer.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void
|
void TIFFClose(TIFF *tif)
|
||||||
TIFFClose(TIFF* tif)
|
{
|
||||||
|
if (tif != NULL)
|
||||||
{
|
{
|
||||||
TIFFCloseProc closeproc = tif->tif_closeproc;
|
TIFFCloseProc closeproc = tif->tif_closeproc;
|
||||||
thandle_t fd = tif->tif_clientdata;
|
thandle_t fd = tif->tif_clientdata;
|
||||||
@ -126,13 +155,4 @@ TIFFClose(TIFF* tif)
|
|||||||
TIFFCleanup(tif);
|
TIFFCleanup(tif);
|
||||||
(void)(*closeproc)(fd);
|
(void)(*closeproc)(fd);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
42
3rdparty/libtiff/tif_codec.c
vendored
42
3rdparty/libtiff/tif_codec.c
vendored
@ -67,6 +67,9 @@ static int NotConfigured(TIFF*, int);
|
|||||||
#ifndef LOGLUV_SUPPORT
|
#ifndef LOGLUV_SUPPORT
|
||||||
#define TIFFInitSGILog NotConfigured
|
#define TIFFInitSGILog NotConfigured
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef LERC_SUPPORT
|
||||||
|
#define TIFFInitLERC NotConfigured
|
||||||
|
#endif
|
||||||
#ifndef LZMA_SUPPORT
|
#ifndef LZMA_SUPPORT
|
||||||
#define TIFFInitLZMA NotConfigured
|
#define TIFFInitLZMA NotConfigured
|
||||||
#endif
|
#endif
|
||||||
@ -80,11 +83,7 @@ static int NotConfigured(TIFF*, int);
|
|||||||
/*
|
/*
|
||||||
* Compression schemes statically built into the library.
|
* Compression schemes statically built into the library.
|
||||||
*/
|
*/
|
||||||
#ifdef VMS
|
|
||||||
const TIFFCodec _TIFFBuiltinCODECS[] = {
|
const TIFFCodec _TIFFBuiltinCODECS[] = {
|
||||||
#else
|
|
||||||
TIFFCodec _TIFFBuiltinCODECS[] = {
|
|
||||||
#endif
|
|
||||||
{"None", COMPRESSION_NONE, TIFFInitDumpMode},
|
{"None", COMPRESSION_NONE, TIFFInitDumpMode},
|
||||||
{"LZW", COMPRESSION_LZW, TIFFInitLZW},
|
{"LZW", COMPRESSION_LZW, TIFFInitLZW},
|
||||||
{"PackBits", COMPRESSION_PACKBITS, TIFFInitPackBits},
|
{"PackBits", COMPRESSION_PACKBITS, TIFFInitPackBits},
|
||||||
@ -105,24 +104,23 @@ TIFFCodec _TIFFBuiltinCODECS[] = {
|
|||||||
{"LZMA", COMPRESSION_LZMA, TIFFInitLZMA},
|
{"LZMA", COMPRESSION_LZMA, TIFFInitLZMA},
|
||||||
{"ZSTD", COMPRESSION_ZSTD, TIFFInitZSTD},
|
{"ZSTD", COMPRESSION_ZSTD, TIFFInitZSTD},
|
||||||
{"WEBP", COMPRESSION_WEBP, TIFFInitWebP},
|
{"WEBP", COMPRESSION_WEBP, TIFFInitWebP},
|
||||||
{ NULL, 0, NULL }
|
{"LERC", COMPRESSION_LERC, TIFFInitLERC},
|
||||||
};
|
{NULL, 0, NULL}};
|
||||||
|
|
||||||
static int
|
static int _notConfigured(TIFF *tif)
|
||||||
_notConfigured(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
const TIFFCodec *c = TIFFFindCODEC(tif->tif_dir.td_compression);
|
const TIFFCodec *c = TIFFFindCODEC(tif->tif_dir.td_compression);
|
||||||
char compression_code[20];
|
char compression_code[20];
|
||||||
|
|
||||||
sprintf(compression_code, "%d",tif->tif_dir.td_compression );
|
snprintf(compression_code, sizeof(compression_code), "%" PRIu16,
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
tif->tif_dir.td_compression);
|
||||||
|
TIFFErrorExtR(tif, tif->tif_name,
|
||||||
"%s compression support is not configured",
|
"%s compression support is not configured",
|
||||||
c ? c->name : compression_code);
|
c ? c->name : compression_code);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int NotConfigured(TIFF *tif, int scheme)
|
||||||
NotConfigured(TIFF* tif, int scheme)
|
|
||||||
{
|
{
|
||||||
(void)scheme;
|
(void)scheme;
|
||||||
|
|
||||||
@ -145,27 +143,21 @@ NotConfigured(TIFF* tif, int scheme)
|
|||||||
* 0 will be returned.
|
* 0 will be returned.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int
|
int TIFFIsCODECConfigured(uint16_t scheme)
|
||||||
TIFFIsCODECConfigured(uint16 scheme)
|
|
||||||
{
|
{
|
||||||
const TIFFCodec *codec = TIFFFindCODEC(scheme);
|
const TIFFCodec *codec = TIFFFindCODEC(scheme);
|
||||||
|
|
||||||
if(codec == NULL) {
|
if (codec == NULL)
|
||||||
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if(codec->init == NULL) {
|
if (codec->init == NULL)
|
||||||
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if(codec->init != NotConfigured){
|
if (codec->init != NotConfigured)
|
||||||
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
131
3rdparty/libtiff/tif_color.c
vendored
131
3rdparty/libtiff/tif_color.c
vendored
@ -40,41 +40,54 @@
|
|||||||
/*
|
/*
|
||||||
* Convert color value from the CIE L*a*b* 1976 space to CIE XYZ.
|
* Convert color value from the CIE L*a*b* 1976 space to CIE XYZ.
|
||||||
*/
|
*/
|
||||||
void
|
void TIFFCIELabToXYZ(TIFFCIELabToRGB *cielab, uint32_t l, int32_t a, int32_t b,
|
||||||
TIFFCIELabToXYZ(TIFFCIELabToRGB *cielab, uint32 l, int32 a, int32 b,
|
|
||||||
float *X, float *Y, float *Z)
|
float *X, float *Y, float *Z)
|
||||||
{
|
{
|
||||||
float L = (float)l * 100.0F / 255.0F;
|
TIFFCIELab16ToXYZ(cielab, l * 257, a * 256, b * 256, X, Y, Z);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For CIELab encoded in 16 bits, L is an unsigned integer range [0,65535].
|
||||||
|
* The a* and b* components are signed integers range [-32768,32767]. The 16
|
||||||
|
* bit chrominance values are encoded as 256 times the 1976 CIE a* and b*
|
||||||
|
* values
|
||||||
|
*/
|
||||||
|
void TIFFCIELab16ToXYZ(TIFFCIELabToRGB *cielab, uint32_t l, int32_t a,
|
||||||
|
int32_t b, float *X, float *Y, float *Z)
|
||||||
|
{
|
||||||
|
float L = (float)l * 100.0F / 65535.0F;
|
||||||
float cby, tmp;
|
float cby, tmp;
|
||||||
|
|
||||||
if( L < 8.856F ) {
|
if (L < 8.856F)
|
||||||
|
{
|
||||||
*Y = (L * cielab->Y0) / 903.292F;
|
*Y = (L * cielab->Y0) / 903.292F;
|
||||||
cby = 7.787F * (*Y / cielab->Y0) + 16.0F / 116.0F;
|
cby = 7.787F * (*Y / cielab->Y0) + 16.0F / 116.0F;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
cby = (L + 16.0F) / 116.0F;
|
cby = (L + 16.0F) / 116.0F;
|
||||||
*Y = cielab->Y0 * cby * cby * cby;
|
*Y = cielab->Y0 * cby * cby * cby;
|
||||||
}
|
}
|
||||||
|
|
||||||
tmp = (float)a / 500.0F + cby;
|
tmp = (float)a / 256.0F / 500.0F + cby;
|
||||||
if (tmp < 0.2069F)
|
if (tmp < 0.2069F)
|
||||||
*X = cielab->X0 * (tmp - 0.13793F) / 7.787F;
|
*X = cielab->X0 * (tmp - 0.13793F) / 7.787F;
|
||||||
else
|
else
|
||||||
*X = cielab->X0 * tmp * tmp * tmp;
|
*X = cielab->X0 * tmp * tmp * tmp;
|
||||||
|
|
||||||
tmp = cby - (float)b / 200.0F;
|
tmp = cby - (float)b / 256.0F / 200.0F;
|
||||||
if (tmp < 0.2069F)
|
if (tmp < 0.2069F)
|
||||||
*Z = cielab->Z0 * (tmp - 0.13793F) / 7.787F;
|
*Z = cielab->Z0 * (tmp - 0.13793F) / 7.787F;
|
||||||
else
|
else
|
||||||
*Z = cielab->Z0 * tmp * tmp * tmp;
|
*Z = cielab->Z0 * tmp * tmp * tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define RINT(R) ((uint32)((R)>0?((R)+0.5):((R)-0.5)))
|
#define RINT(R) ((uint32_t)((R) > 0 ? ((R) + 0.5) : ((R)-0.5)))
|
||||||
/*
|
/*
|
||||||
* Convert color value from the XYZ space to RGB.
|
* Convert color value from the XYZ space to RGB.
|
||||||
*/
|
*/
|
||||||
void
|
void TIFFXYZToRGB(TIFFCIELabToRGB *cielab, float X, float Y, float Z,
|
||||||
TIFFXYZToRGB(TIFFCIELabToRGB *cielab, float X, float Y, float Z,
|
uint32_t *r, uint32_t *g, uint32_t *b)
|
||||||
uint32 *r, uint32 *g, uint32 *b)
|
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
float Yr, Yg, Yb;
|
float Yr, Yg, Yb;
|
||||||
@ -119,9 +132,8 @@ TIFFXYZToRGB(TIFFCIELabToRGB *cielab, float X, float Y, float Z,
|
|||||||
* Allocate conversion state structures and make look_up tables for
|
* Allocate conversion state structures and make look_up tables for
|
||||||
* the Yr,Yb,Yg <=> r,g,b conversions.
|
* the Yr,Yb,Yg <=> r,g,b conversions.
|
||||||
*/
|
*/
|
||||||
int
|
int TIFFCIELabToRGBInit(TIFFCIELabToRGB *cielab, const TIFFDisplay *display,
|
||||||
TIFFCIELabToRGBInit(TIFFCIELabToRGB* cielab,
|
float *refWhite)
|
||||||
const TIFFDisplay *display, float *refWhite)
|
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
double dfGamma;
|
double dfGamma;
|
||||||
@ -134,27 +146,30 @@ TIFFCIELabToRGBInit(TIFFCIELabToRGB* cielab,
|
|||||||
dfGamma = 1.0 / cielab->display.d_gammaR;
|
dfGamma = 1.0 / cielab->display.d_gammaR;
|
||||||
cielab->rstep =
|
cielab->rstep =
|
||||||
(cielab->display.d_YCR - cielab->display.d_Y0R) / cielab->range;
|
(cielab->display.d_YCR - cielab->display.d_Y0R) / cielab->range;
|
||||||
for(i = 0; i <= cielab->range; i++) {
|
for (i = 0; i <= cielab->range; i++)
|
||||||
cielab->Yr2r[i] = cielab->display.d_Vrwr
|
{
|
||||||
* ((float)pow((double)i / cielab->range, dfGamma));
|
cielab->Yr2r[i] = cielab->display.d_Vrwr *
|
||||||
|
((float)pow((double)i / cielab->range, dfGamma));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Green */
|
/* Green */
|
||||||
dfGamma = 1.0 / cielab->display.d_gammaG;
|
dfGamma = 1.0 / cielab->display.d_gammaG;
|
||||||
cielab->gstep =
|
cielab->gstep =
|
||||||
(cielab->display.d_YCR - cielab->display.d_Y0R) / cielab->range;
|
(cielab->display.d_YCR - cielab->display.d_Y0R) / cielab->range;
|
||||||
for(i = 0; i <= cielab->range; i++) {
|
for (i = 0; i <= cielab->range; i++)
|
||||||
cielab->Yg2g[i] = cielab->display.d_Vrwg
|
{
|
||||||
* ((float)pow((double)i / cielab->range, dfGamma));
|
cielab->Yg2g[i] = cielab->display.d_Vrwg *
|
||||||
|
((float)pow((double)i / cielab->range, dfGamma));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Blue */
|
/* Blue */
|
||||||
dfGamma = 1.0 / cielab->display.d_gammaB;
|
dfGamma = 1.0 / cielab->display.d_gammaB;
|
||||||
cielab->bstep =
|
cielab->bstep =
|
||||||
(cielab->display.d_YCR - cielab->display.d_Y0R) / cielab->range;
|
(cielab->display.d_YCR - cielab->display.d_Y0R) / cielab->range;
|
||||||
for(i = 0; i <= cielab->range; i++) {
|
for (i = 0; i <= cielab->range; i++)
|
||||||
cielab->Yb2b[i] = cielab->display.d_Vrwb
|
{
|
||||||
* ((float)pow((double)i / cielab->range, dfGamma));
|
cielab->Yb2b[i] = cielab->display.d_Vrwb *
|
||||||
|
((float)pow((double)i / cielab->range, dfGamma));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Init reference white point */
|
/* Init reference white point */
|
||||||
@ -171,17 +186,20 @@ TIFFCIELabToRGBInit(TIFFCIELabToRGB* cielab,
|
|||||||
* see below for more information on how it works.
|
* see below for more information on how it works.
|
||||||
*/
|
*/
|
||||||
#define SHIFT 16
|
#define SHIFT 16
|
||||||
#define FIX(x) ((int32)((x) * (1L<<SHIFT) + 0.5))
|
#define FIX(x) ((int32_t)((x) * (1L << SHIFT) + 0.5))
|
||||||
#define ONE_HALF ((int32)(1<<(SHIFT-1)))
|
#define ONE_HALF ((int32_t)(1 << (SHIFT - 1)))
|
||||||
#define Code2V(c, RB, RW, CR) ((((c)-(int32)(RB))*(float)(CR))/(float)(((RW)-(RB)!=0) ? ((RW)-(RB)) : 1))
|
#define Code2V(c, RB, RW, CR) \
|
||||||
#define CLAMP(f,min,max) ((f)<(min)?(min):(f)>(max)?(max):(f))
|
((((c) - (int32_t)(RB)) * (float)(CR)) / \
|
||||||
|
(float)(((RW) - (RB) != 0) ? ((RW) - (RB)) : 1))
|
||||||
|
/* !((f)>=(min)) written that way to deal with NaN */
|
||||||
|
#define CLAMP(f, min, max) \
|
||||||
|
((!((f) >= (min))) ? (min) : (f) > (max) ? (max) : (f))
|
||||||
#define HICLAMP(f, max) ((f) > (max) ? (max) : (f))
|
#define HICLAMP(f, max) ((f) > (max) ? (max) : (f))
|
||||||
|
|
||||||
void
|
void TIFFYCbCrtoRGB(TIFFYCbCrToRGB *ycbcr, uint32_t Y, int32_t Cb, int32_t Cr,
|
||||||
TIFFYCbCrtoRGB(TIFFYCbCrToRGB *ycbcr, uint32 Y, int32 Cb, int32 Cr,
|
uint32_t *r, uint32_t *g, uint32_t *b)
|
||||||
uint32 *r, uint32 *g, uint32 *b)
|
|
||||||
{
|
{
|
||||||
int32 i;
|
int32_t i;
|
||||||
|
|
||||||
/* XXX: Only 8-bit YCbCr input supported for now */
|
/* XXX: Only 8-bit YCbCr input supported for now */
|
||||||
Y = HICLAMP(Y, 255);
|
Y = HICLAMP(Y, 255);
|
||||||
@ -190,8 +208,8 @@ TIFFYCbCrtoRGB(TIFFYCbCrToRGB *ycbcr, uint32 Y, int32 Cb, int32 Cr,
|
|||||||
|
|
||||||
i = ycbcr->Y_tab[Y] + ycbcr->Cr_r_tab[Cr];
|
i = ycbcr->Y_tab[Y] + ycbcr->Cr_r_tab[Cr];
|
||||||
*r = CLAMP(i, 0, 255);
|
*r = CLAMP(i, 0, 255);
|
||||||
i = ycbcr->Y_tab[Y]
|
i = ycbcr->Y_tab[Y] +
|
||||||
+ (int)((ycbcr->Cb_g_tab[Cb] + ycbcr->Cr_g_tab[Cr]) >> SHIFT);
|
(int)((ycbcr->Cb_g_tab[Cb] + ycbcr->Cr_g_tab[Cr]) >> SHIFT);
|
||||||
*g = CLAMP(i, 0, 255);
|
*g = CLAMP(i, 0, 255);
|
||||||
i = ycbcr->Y_tab[Y] + ycbcr->Cb_b_tab[Cb];
|
i = ycbcr->Y_tab[Y] + ycbcr->Cb_b_tab[Cb];
|
||||||
*b = CLAMP(i, 0, 255);
|
*b = CLAMP(i, 0, 255);
|
||||||
@ -230,8 +248,7 @@ static float CLAMPw(float v, float vmin, float vmax)
|
|||||||
* pre-calculating possible values indexed by Cb and Cr (this code
|
* pre-calculating possible values indexed by Cb and Cr (this code
|
||||||
* assumes conversion is being done for 8-bit samples).
|
* assumes conversion is being done for 8-bit samples).
|
||||||
*/
|
*/
|
||||||
int
|
int TIFFYCbCrToRGBInit(TIFFYCbCrToRGB *ycbcr, float *luma, float *refBlackWhite)
|
||||||
TIFFYCbCrToRGBInit(TIFFYCbCrToRGB* ycbcr, float *luma, float *refBlackWhite)
|
|
||||||
{
|
{
|
||||||
TIFFRGBValue *clamptab;
|
TIFFRGBValue *clamptab;
|
||||||
int i;
|
int i;
|
||||||
@ -240,8 +257,9 @@ TIFFYCbCrToRGBInit(TIFFYCbCrToRGB* ycbcr, float *luma, float *refBlackWhite)
|
|||||||
#define LumaGreen luma[1]
|
#define LumaGreen luma[1]
|
||||||
#define LumaBlue luma[2]
|
#define LumaBlue luma[2]
|
||||||
|
|
||||||
clamptab = (TIFFRGBValue*)(
|
clamptab =
|
||||||
(uint8*) ycbcr+TIFFroundup_32(sizeof (TIFFYCbCrToRGB), sizeof (long)));
|
(TIFFRGBValue *)((uint8_t *)ycbcr +
|
||||||
|
TIFFroundup_32(sizeof(TIFFYCbCrToRGB), sizeof(long)));
|
||||||
_TIFFmemset(clamptab, 0, 256); /* v < 0 => 0 */
|
_TIFFmemset(clamptab, 0, 256); /* v < 0 => 0 */
|
||||||
ycbcr->clamptab = (clamptab += 256);
|
ycbcr->clamptab = (clamptab += 256);
|
||||||
for (i = 0; i < 256; i++)
|
for (i = 0; i < 256; i++)
|
||||||
@ -249,14 +267,19 @@ TIFFYCbCrToRGBInit(TIFFYCbCrToRGB* ycbcr, float *luma, float *refBlackWhite)
|
|||||||
_TIFFmemset(clamptab + 256, 255, 2 * 256); /* v > 255 => 255 */
|
_TIFFmemset(clamptab + 256, 255, 2 * 256); /* v > 255 => 255 */
|
||||||
ycbcr->Cr_r_tab = (int *)(clamptab + 3 * 256);
|
ycbcr->Cr_r_tab = (int *)(clamptab + 3 * 256);
|
||||||
ycbcr->Cb_b_tab = ycbcr->Cr_r_tab + 256;
|
ycbcr->Cb_b_tab = ycbcr->Cr_r_tab + 256;
|
||||||
ycbcr->Cr_g_tab = (int32*) (ycbcr->Cb_b_tab + 256);
|
ycbcr->Cr_g_tab = (int32_t *)(ycbcr->Cb_b_tab + 256);
|
||||||
ycbcr->Cb_g_tab = ycbcr->Cr_g_tab + 256;
|
ycbcr->Cb_g_tab = ycbcr->Cr_g_tab + 256;
|
||||||
ycbcr->Y_tab = ycbcr->Cb_g_tab + 256;
|
ycbcr->Y_tab = ycbcr->Cb_g_tab + 256;
|
||||||
|
|
||||||
{ float f1 = 2-2*LumaRed; int32 D1 = FIX(CLAMP(f1,0.0F,2.0F));
|
{
|
||||||
float f2 = LumaRed*f1/LumaGreen; int32 D2 = -FIX(CLAMP(f2,0.0F,2.0F));
|
float f1 = 2 - 2 * LumaRed;
|
||||||
float f3 = 2-2*LumaBlue; int32 D3 = FIX(CLAMP(f3,0.0F,2.0F));
|
int32_t D1 = FIX(CLAMP(f1, 0.0F, 2.0F));
|
||||||
float f4 = LumaBlue*f3/LumaGreen; int32 D4 = -FIX(CLAMP(f4,0.0F,2.0F));
|
float f2 = LumaRed * f1 / LumaGreen;
|
||||||
|
int32_t D2 = -FIX(CLAMP(f2, 0.0F, 2.0F));
|
||||||
|
float f3 = 2 - 2 * LumaBlue;
|
||||||
|
int32_t D3 = FIX(CLAMP(f3, 0.0F, 2.0F));
|
||||||
|
float f4 = LumaBlue * f3 / LumaGreen;
|
||||||
|
int32_t D4 = -FIX(CLAMP(f4, 0.0F, 2.0F));
|
||||||
int x;
|
int x;
|
||||||
|
|
||||||
#undef LumaBlue
|
#undef LumaBlue
|
||||||
@ -270,20 +293,21 @@ TIFFYCbCrToRGBInit(TIFFYCbCrToRGB* ycbcr, float *luma, float *refBlackWhite)
|
|||||||
* tag) so there is some range shifting to do here when
|
* tag) so there is some range shifting to do here when
|
||||||
* constructing tables indexed by the raw pixel data.
|
* constructing tables indexed by the raw pixel data.
|
||||||
*/
|
*/
|
||||||
for (i = 0, x = -128; i < 256; i++, x++) {
|
for (i = 0, x = -128; i < 256; i++, x++)
|
||||||
int32 Cr = (int32)CLAMPw(Code2V(x, refBlackWhite[4] - 128.0F,
|
{
|
||||||
|
int32_t Cr = (int32_t)CLAMPw(Code2V(x, refBlackWhite[4] - 128.0F,
|
||||||
refBlackWhite[5] - 128.0F, 127),
|
refBlackWhite[5] - 128.0F, 127),
|
||||||
-128.0F * 32, 128.0F * 32);
|
-128.0F * 32, 128.0F * 32);
|
||||||
int32 Cb = (int32)CLAMPw(Code2V(x, refBlackWhite[2] - 128.0F,
|
int32_t Cb = (int32_t)CLAMPw(Code2V(x, refBlackWhite[2] - 128.0F,
|
||||||
refBlackWhite[3] - 128.0F, 127),
|
refBlackWhite[3] - 128.0F, 127),
|
||||||
-128.0F * 32, 128.0F * 32);
|
-128.0F * 32, 128.0F * 32);
|
||||||
|
|
||||||
ycbcr->Cr_r_tab[i] = (int32)((D1*Cr + ONE_HALF)>>SHIFT);
|
ycbcr->Cr_r_tab[i] = (int32_t)((D1 * Cr + ONE_HALF) >> SHIFT);
|
||||||
ycbcr->Cb_b_tab[i] = (int32)((D3*Cb + ONE_HALF)>>SHIFT);
|
ycbcr->Cb_b_tab[i] = (int32_t)((D3 * Cb + ONE_HALF) >> SHIFT);
|
||||||
ycbcr->Cr_g_tab[i] = D2 * Cr;
|
ycbcr->Cr_g_tab[i] = D2 * Cr;
|
||||||
ycbcr->Cb_g_tab[i] = D4 * Cb + ONE_HALF;
|
ycbcr->Cb_g_tab[i] = D4 * Cb + ONE_HALF;
|
||||||
ycbcr->Y_tab[i] =
|
ycbcr->Y_tab[i] = (int32_t)CLAMPw(
|
||||||
(int32)CLAMPw(Code2V(x + 128, refBlackWhite[0], refBlackWhite[1], 255),
|
Code2V(x + 128, refBlackWhite[0], refBlackWhite[1], 255),
|
||||||
-128.0F * 32, 128.0F * 32);
|
-128.0F * 32, 128.0F * 32);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -296,12 +320,3 @@ TIFFYCbCrToRGBInit(TIFFYCbCrToRGB* ycbcr, float *luma, float *refBlackWhite)
|
|||||||
#undef SHIFT
|
#undef SHIFT
|
||||||
#undef ONE_HALF
|
#undef ONE_HALF
|
||||||
#undef FIX
|
#undef FIX
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
184
3rdparty/libtiff/tif_compress.c
vendored
184
3rdparty/libtiff/tif_compress.c
vendored
@ -29,109 +29,117 @@
|
|||||||
*/
|
*/
|
||||||
#include "tiffiop.h"
|
#include "tiffiop.h"
|
||||||
|
|
||||||
static int
|
static int TIFFNoEncode(TIFF *tif, const char *method)
|
||||||
TIFFNoEncode(TIFF* tif, const char* method)
|
|
||||||
{
|
{
|
||||||
const TIFFCodec *c = TIFFFindCODEC(tif->tif_dir.td_compression);
|
const TIFFCodec *c = TIFFFindCODEC(tif->tif_dir.td_compression);
|
||||||
|
|
||||||
if (c) {
|
if (c)
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
{
|
||||||
"%s %s encoding is not implemented",
|
TIFFErrorExtR(tif, tif->tif_name, "%s %s encoding is not implemented",
|
||||||
c->name, method);
|
c->name, method);
|
||||||
} else {
|
}
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
else
|
||||||
"Compression scheme %u %s encoding is not implemented",
|
{
|
||||||
|
TIFFErrorExtR(tif, tif->tif_name,
|
||||||
|
"Compression scheme %" PRIu16
|
||||||
|
" %s encoding is not implemented",
|
||||||
tif->tif_dir.td_compression, method);
|
tif->tif_dir.td_compression, method);
|
||||||
}
|
}
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int _TIFFNoRowEncode(TIFF *tif, uint8_t *pp, tmsize_t cc, uint16_t s)
|
||||||
_TIFFNoRowEncode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s)
|
|
||||||
{
|
{
|
||||||
(void) pp; (void) cc; (void) s;
|
(void)pp;
|
||||||
|
(void)cc;
|
||||||
|
(void)s;
|
||||||
return (TIFFNoEncode(tif, "scanline"));
|
return (TIFFNoEncode(tif, "scanline"));
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int _TIFFNoStripEncode(TIFF *tif, uint8_t *pp, tmsize_t cc, uint16_t s)
|
||||||
_TIFFNoStripEncode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s)
|
|
||||||
{
|
{
|
||||||
(void) pp; (void) cc; (void) s;
|
(void)pp;
|
||||||
|
(void)cc;
|
||||||
|
(void)s;
|
||||||
return (TIFFNoEncode(tif, "strip"));
|
return (TIFFNoEncode(tif, "strip"));
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int _TIFFNoTileEncode(TIFF *tif, uint8_t *pp, tmsize_t cc, uint16_t s)
|
||||||
_TIFFNoTileEncode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s)
|
|
||||||
{
|
{
|
||||||
(void) pp; (void) cc; (void) s;
|
(void)pp;
|
||||||
|
(void)cc;
|
||||||
|
(void)s;
|
||||||
return (TIFFNoEncode(tif, "tile"));
|
return (TIFFNoEncode(tif, "tile"));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int TIFFNoDecode(TIFF *tif, const char *method)
|
||||||
TIFFNoDecode(TIFF* tif, const char* method)
|
|
||||||
{
|
{
|
||||||
const TIFFCodec *c = TIFFFindCODEC(tif->tif_dir.td_compression);
|
const TIFFCodec *c = TIFFFindCODEC(tif->tif_dir.td_compression);
|
||||||
|
|
||||||
if (c)
|
if (c)
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
TIFFErrorExtR(tif, tif->tif_name, "%s %s decoding is not implemented",
|
||||||
"%s %s decoding is not implemented",
|
|
||||||
c->name, method);
|
c->name, method);
|
||||||
else
|
else
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
TIFFErrorExtR(tif, tif->tif_name,
|
||||||
"Compression scheme %u %s decoding is not implemented",
|
"Compression scheme %" PRIu16
|
||||||
|
" %s decoding is not implemented",
|
||||||
tif->tif_dir.td_compression, method);
|
tif->tif_dir.td_compression, method);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int _TIFFNoFixupTags(TIFF *tif)
|
||||||
_TIFFNoFixupTags(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
(void)tif;
|
(void)tif;
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int _TIFFNoRowDecode(TIFF *tif, uint8_t *pp, tmsize_t cc, uint16_t s)
|
||||||
_TIFFNoRowDecode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s)
|
|
||||||
{
|
{
|
||||||
(void) pp; (void) cc; (void) s;
|
(void)pp;
|
||||||
|
(void)cc;
|
||||||
|
(void)s;
|
||||||
return (TIFFNoDecode(tif, "scanline"));
|
return (TIFFNoDecode(tif, "scanline"));
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int _TIFFNoStripDecode(TIFF *tif, uint8_t *pp, tmsize_t cc, uint16_t s)
|
||||||
_TIFFNoStripDecode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s)
|
|
||||||
{
|
{
|
||||||
(void) pp; (void) cc; (void) s;
|
(void)pp;
|
||||||
|
(void)cc;
|
||||||
|
(void)s;
|
||||||
return (TIFFNoDecode(tif, "strip"));
|
return (TIFFNoDecode(tif, "strip"));
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int _TIFFNoTileDecode(TIFF *tif, uint8_t *pp, tmsize_t cc, uint16_t s)
|
||||||
_TIFFNoTileDecode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s)
|
|
||||||
{
|
{
|
||||||
(void) pp; (void) cc; (void) s;
|
(void)pp;
|
||||||
|
(void)cc;
|
||||||
|
(void)s;
|
||||||
return (TIFFNoDecode(tif, "tile"));
|
return (TIFFNoDecode(tif, "tile"));
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int _TIFFNoSeek(TIFF *tif, uint32_t off)
|
||||||
_TIFFNoSeek(TIFF* tif, uint32 off)
|
|
||||||
{
|
{
|
||||||
(void)off;
|
(void)off;
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
TIFFErrorExtR(tif, tif->tif_name,
|
||||||
"Compression algorithm does not support random access");
|
"Compression algorithm does not support random access");
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int _TIFFNoPreCode(TIFF *tif, uint16_t s)
|
||||||
_TIFFNoPreCode(TIFF* tif, uint16 s)
|
|
||||||
{
|
{
|
||||||
(void) tif; (void) s;
|
(void)tif;
|
||||||
|
(void)s;
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _TIFFtrue(TIFF* tif) { (void) tif; return (1); }
|
static int _TIFFtrue(TIFF *tif)
|
||||||
|
{
|
||||||
|
(void)tif;
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
static void _TIFFvoid(TIFF *tif) { (void)tif; }
|
static void _TIFFvoid(TIFF *tif) { (void)tif; }
|
||||||
|
|
||||||
void
|
void _TIFFSetDefaultCompressionState(TIFF *tif)
|
||||||
_TIFFSetDefaultCompressionState(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
tif->tif_fixuptags = _TIFFNoFixupTags;
|
tif->tif_fixuptags = _TIFFNoFixupTags;
|
||||||
tif->tif_decodestatus = TRUE;
|
tif->tif_decodestatus = TRUE;
|
||||||
@ -155,10 +163,9 @@ _TIFFSetDefaultCompressionState(TIFF* tif)
|
|||||||
tif->tif_flags &= ~(TIFF_NOBITREV | TIFF_NOREADRAW);
|
tif->tif_flags &= ~(TIFF_NOBITREV | TIFF_NOREADRAW);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int TIFFSetCompressionScheme(TIFF *tif, int scheme)
|
||||||
TIFFSetCompressionScheme(TIFF* tif, int scheme)
|
|
||||||
{
|
{
|
||||||
const TIFFCodec *c = TIFFFindCODEC((uint16) scheme);
|
const TIFFCodec *c = TIFFFindCODEC((uint16_t)scheme);
|
||||||
|
|
||||||
_TIFFSetDefaultCompressionState(tif);
|
_TIFFSetDefaultCompressionState(tif);
|
||||||
/*
|
/*
|
||||||
@ -175,14 +182,14 @@ TIFFSetCompressionScheme(TIFF* tif, int scheme)
|
|||||||
* schemes can also override the builtin versions provided
|
* schemes can also override the builtin versions provided
|
||||||
* by this library.
|
* by this library.
|
||||||
*/
|
*/
|
||||||
typedef struct _codec {
|
typedef struct _codec
|
||||||
|
{
|
||||||
struct _codec *next;
|
struct _codec *next;
|
||||||
TIFFCodec *info;
|
TIFFCodec *info;
|
||||||
} codec_t;
|
} codec_t;
|
||||||
static codec_t *registeredCODECS = NULL;
|
static codec_t *registeredCODECS = NULL;
|
||||||
|
|
||||||
const TIFFCodec*
|
const TIFFCodec *TIFFFindCODEC(uint16_t scheme)
|
||||||
TIFFFindCODEC(uint16 scheme)
|
|
||||||
{
|
{
|
||||||
const TIFFCodec *c;
|
const TIFFCodec *c;
|
||||||
codec_t *cd;
|
codec_t *cd;
|
||||||
@ -196,22 +203,25 @@ TIFFFindCODEC(uint16 scheme)
|
|||||||
return ((const TIFFCodec *)0);
|
return ((const TIFFCodec *)0);
|
||||||
}
|
}
|
||||||
|
|
||||||
TIFFCodec*
|
TIFFCodec *TIFFRegisterCODEC(uint16_t scheme, const char *name,
|
||||||
TIFFRegisterCODEC(uint16 scheme, const char* name, TIFFInitMethod init)
|
TIFFInitMethod init)
|
||||||
{
|
{
|
||||||
codec_t* cd = (codec_t*)
|
codec_t *cd = (codec_t *)_TIFFmallocExt(
|
||||||
_TIFFmalloc((tmsize_t)(sizeof (codec_t) + sizeof (TIFFCodec) + strlen(name)+1));
|
NULL,
|
||||||
|
(tmsize_t)(sizeof(codec_t) + sizeof(TIFFCodec) + strlen(name) + 1));
|
||||||
|
|
||||||
if (cd != NULL) {
|
if (cd != NULL)
|
||||||
cd->info = (TIFFCodec*) ((uint8*) cd + sizeof (codec_t));
|
{
|
||||||
cd->info->name = (char*)
|
cd->info = (TIFFCodec *)((uint8_t *)cd + sizeof(codec_t));
|
||||||
((uint8*) cd->info + sizeof (TIFFCodec));
|
cd->info->name = (char *)((uint8_t *)cd->info + sizeof(TIFFCodec));
|
||||||
strcpy(cd->info->name, name);
|
strcpy(cd->info->name, name);
|
||||||
cd->info->scheme = scheme;
|
cd->info->scheme = scheme;
|
||||||
cd->info->init = init;
|
cd->info->init = init;
|
||||||
cd->next = registeredCODECS;
|
cd->next = registeredCODECS;
|
||||||
registeredCODECS = cd;
|
registeredCODECS = cd;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
TIFFErrorExt(0, "TIFFRegisterCODEC",
|
TIFFErrorExt(0, "TIFFRegisterCODEC",
|
||||||
"No space to register compression scheme %s", name);
|
"No space to register compression scheme %s", name);
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -219,20 +229,21 @@ TIFFRegisterCODEC(uint16 scheme, const char* name, TIFFInitMethod init)
|
|||||||
return (cd->info);
|
return (cd->info);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void TIFFUnRegisterCODEC(TIFFCodec *c)
|
||||||
TIFFUnRegisterCODEC(TIFFCodec* c)
|
|
||||||
{
|
{
|
||||||
codec_t *cd;
|
codec_t *cd;
|
||||||
codec_t **pcd;
|
codec_t **pcd;
|
||||||
|
|
||||||
for (pcd = ®isteredCODECS; (cd = *pcd) != NULL; pcd = &cd->next)
|
for (pcd = ®isteredCODECS; (cd = *pcd) != NULL; pcd = &cd->next)
|
||||||
if (cd->info == c) {
|
if (cd->info == c)
|
||||||
|
{
|
||||||
*pcd = cd->next;
|
*pcd = cd->next;
|
||||||
_TIFFfree(cd);
|
_TIFFfreeExt(NULL, cd);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
TIFFErrorExt(0, "TIFFUnRegisterCODEC",
|
TIFFErrorExt(0, "TIFFUnRegisterCODEC",
|
||||||
"Cannot remove compression scheme %s; not registered", c->name);
|
"Cannot remove compression scheme %s; not registered",
|
||||||
|
c->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************/
|
/************************************************************************/
|
||||||
@ -247,8 +258,7 @@ TIFFUnRegisterCODEC(TIFFCodec* c)
|
|||||||
* or NULL if function failed.
|
* or NULL if function failed.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
TIFFCodec*
|
TIFFCodec *TIFFGetConfiguredCODECs()
|
||||||
TIFFGetConfiguredCODECs()
|
|
||||||
{
|
{
|
||||||
int i = 1;
|
int i = 1;
|
||||||
codec_t *cd;
|
codec_t *cd;
|
||||||
@ -256,23 +266,28 @@ TIFFGetConfiguredCODECs()
|
|||||||
TIFFCodec *codecs = NULL;
|
TIFFCodec *codecs = NULL;
|
||||||
TIFFCodec *new_codecs;
|
TIFFCodec *new_codecs;
|
||||||
|
|
||||||
for (cd = registeredCODECS; cd; cd = cd->next) {
|
for (cd = registeredCODECS; cd; cd = cd->next)
|
||||||
new_codecs = (TIFFCodec *)
|
{
|
||||||
_TIFFrealloc(codecs, i * sizeof(TIFFCodec));
|
new_codecs =
|
||||||
if (!new_codecs) {
|
(TIFFCodec *)_TIFFreallocExt(NULL, codecs, i * sizeof(TIFFCodec));
|
||||||
_TIFFfree (codecs);
|
if (!new_codecs)
|
||||||
|
{
|
||||||
|
_TIFFfreeExt(NULL, codecs);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
codecs = new_codecs;
|
codecs = new_codecs;
|
||||||
_TIFFmemcpy(codecs + i - 1, cd->info, sizeof(TIFFCodec));
|
_TIFFmemcpy(codecs + i - 1, cd->info, sizeof(TIFFCodec));
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
for (c = _TIFFBuiltinCODECS; c->name; c++) {
|
for (c = _TIFFBuiltinCODECS; c->name; c++)
|
||||||
if (TIFFIsCODECConfigured(c->scheme)) {
|
{
|
||||||
new_codecs = (TIFFCodec *)
|
if (TIFFIsCODECConfigured(c->scheme))
|
||||||
_TIFFrealloc(codecs, i * sizeof(TIFFCodec));
|
{
|
||||||
if (!new_codecs) {
|
new_codecs = (TIFFCodec *)_TIFFreallocExt(NULL, codecs,
|
||||||
_TIFFfree (codecs);
|
i * sizeof(TIFFCodec));
|
||||||
|
if (!new_codecs)
|
||||||
|
{
|
||||||
|
_TIFFfreeExt(NULL, codecs);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
codecs = new_codecs;
|
codecs = new_codecs;
|
||||||
@ -281,9 +296,11 @@ TIFFGetConfiguredCODECs()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
new_codecs = (TIFFCodec *) _TIFFrealloc(codecs, i * sizeof(TIFFCodec));
|
new_codecs =
|
||||||
if (!new_codecs) {
|
(TIFFCodec *)_TIFFreallocExt(NULL, codecs, i * sizeof(TIFFCodec));
|
||||||
_TIFFfree (codecs);
|
if (!new_codecs)
|
||||||
|
{
|
||||||
|
_TIFFfreeExt(NULL, codecs);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
codecs = new_codecs;
|
codecs = new_codecs;
|
||||||
@ -291,12 +308,3 @@ TIFFGetConfiguredCODECs()
|
|||||||
|
|
||||||
return codecs;
|
return codecs;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
182
3rdparty/libtiff/tif_config.h.cmake.in
vendored
182
3rdparty/libtiff/tif_config.h.cmake.in
vendored
@ -1,6 +1,14 @@
|
|||||||
|
/* clang-format off */
|
||||||
|
/* clang-format disabled because CMake scripts are very sensitive to the
|
||||||
|
* formatting of this file. configure_file variables of type "@VAR@" are
|
||||||
|
* modified by clang-format and won't be substituted.
|
||||||
|
*/
|
||||||
|
|
||||||
/* libtiff/tif_config.h.cmake.in. Not generated, but originated from autoheader. */
|
/* libtiff/tif_config.h.cmake.in. Not generated, but originated from autoheader. */
|
||||||
/* This file must be kept up-to-date with needed substitutions from libtiff/tif_config.h.in. */
|
/* This file must be kept up-to-date with needed substitutions from libtiff/tif_config.h.in. */
|
||||||
|
|
||||||
|
#include "tiffconf.h"
|
||||||
|
|
||||||
/* Support CCITT Group 3 & 4 algorithms */
|
/* Support CCITT Group 3 & 4 algorithms */
|
||||||
#cmakedefine CCITT_SUPPORT 1
|
#cmakedefine CCITT_SUPPORT 1
|
||||||
|
|
||||||
@ -20,84 +28,33 @@
|
|||||||
/* Define to 1 if you have the <assert.h> header file. */
|
/* Define to 1 if you have the <assert.h> header file. */
|
||||||
#cmakedefine HAVE_ASSERT_H 1
|
#cmakedefine HAVE_ASSERT_H 1
|
||||||
|
|
||||||
/* Define to 1 if you have the <dlfcn.h> header file. */
|
/* Define to 1 if you have the declaration of `optarg', and to 0 if you don't. */
|
||||||
#cmakedefine HAVE_DLFCN_H 1
|
#cmakedefine HAVE_DECL_OPTARG 1
|
||||||
|
|
||||||
/* Define to 1 if you have the <fcntl.h> header file. */
|
/* Define to 1 if you have the <fcntl.h> header file. */
|
||||||
#cmakedefine HAVE_FCNTL_H 1
|
#cmakedefine HAVE_FCNTL_H 1
|
||||||
|
|
||||||
|
/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
|
||||||
|
#cmakedefine HAVE_FSEEKO 1
|
||||||
|
|
||||||
/* Define to 1 if you have the `getopt' function. */
|
/* Define to 1 if you have the `getopt' function. */
|
||||||
#cmakedefine HAVE_GETOPT 1
|
#cmakedefine HAVE_GETOPT 1
|
||||||
|
|
||||||
/* Define to 1 if you have the <GLUT/glut.h> header file. */
|
|
||||||
#cmakedefine HAVE_GLUT_GLUT_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <GL/glut.h> header file. */
|
|
||||||
#cmakedefine HAVE_GL_GLUT_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <GL/glu.h> header file. */
|
|
||||||
#cmakedefine HAVE_GL_GLU_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <GL/gl.h> header file. */
|
|
||||||
#cmakedefine HAVE_GL_GL_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
|
||||||
#cmakedefine HAVE_INTTYPES_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <io.h> header file. */
|
/* Define to 1 if you have the <io.h> header file. */
|
||||||
#cmakedefine HAVE_IO_H 1
|
#cmakedefine HAVE_IO_H 1
|
||||||
|
|
||||||
/* Define to 1 if you have the `jbg_newlen' function. */
|
/* Define to 1 if you have the `jbg_newlen' function. */
|
||||||
#cmakedefine HAVE_JBG_NEWLEN 1
|
#cmakedefine HAVE_JBG_NEWLEN 1
|
||||||
|
|
||||||
/* Define to 1 if you have the `lfind' function. */
|
|
||||||
#cmakedefine HAVE_LFIND 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `mmap' function. */
|
/* Define to 1 if you have the `mmap' function. */
|
||||||
#cmakedefine HAVE_MMAP 1
|
#cmakedefine HAVE_MMAP 1
|
||||||
|
|
||||||
/* Define to 1 if you have the <OpenGL/glu.h> header file. */
|
|
||||||
#cmakedefine HAVE_OPENGL_GLU_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <OpenGL/gl.h> header file. */
|
|
||||||
#cmakedefine HAVE_OPENGL_GL_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <search.h> header file. */
|
|
||||||
#cmakedefine HAVE_SEARCH_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `setmode' function. */
|
/* Define to 1 if you have the `setmode' function. */
|
||||||
#cmakedefine HAVE_SETMODE 1
|
#cmakedefine HAVE_SETMODE 1
|
||||||
|
|
||||||
/* Define to 1 if you have the `snprintf' function. */
|
|
||||||
#cmakedefine HAVE_SNPRINTF 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <stdint.h> header file. */
|
|
||||||
#cmakedefine HAVE_STDINT_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strcasecmp' function. */
|
|
||||||
#cmakedefine HAVE_STRCASECMP 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <strings.h> header file. */
|
/* Define to 1 if you have the <strings.h> header file. */
|
||||||
#cmakedefine HAVE_STRINGS_H 1
|
#cmakedefine HAVE_STRINGS_H 1
|
||||||
|
|
||||||
/* Define to 1 if you have the <string.h> header file. */
|
|
||||||
#cmakedefine HAVE_STRING_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strtol' function. */
|
|
||||||
#cmakedefine HAVE_STRTOL 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strtoll' function. */
|
|
||||||
#cmakedefine HAVE_STRTOLL 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strtoul' function. */
|
|
||||||
#cmakedefine HAVE_STRTOUL 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strtoull' function. */
|
|
||||||
#cmakedefine HAVE_STRTOULL 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/time.h> header file. */
|
|
||||||
#cmakedefine HAVE_SYS_TIME_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||||
#cmakedefine HAVE_SYS_TYPES_H 1
|
#cmakedefine HAVE_SYS_TYPES_H 1
|
||||||
|
|
||||||
@ -105,20 +62,17 @@
|
|||||||
#cmakedefine HAVE_UNISTD_H 1
|
#cmakedefine HAVE_UNISTD_H 1
|
||||||
|
|
||||||
/* 8/12 bit libjpeg dual mode enabled */
|
/* 8/12 bit libjpeg dual mode enabled */
|
||||||
#cmakedefine JPEG_DUAL_MODE_8_12 1
|
#cmakedefine JPEG_DUAL_MODE_8_12 1 1
|
||||||
|
|
||||||
|
/* Support LERC compression */
|
||||||
|
#cmakedefine LERC_SUPPORT 1
|
||||||
|
|
||||||
/* 12bit libjpeg primary include file with path */
|
/* 12bit libjpeg primary include file with path */
|
||||||
#define LIBJPEG_12_PATH @LIBJPEG_12_PATH@
|
#define LIBJPEG_12_PATH "@LIBJPEG_12_PATH@"
|
||||||
|
|
||||||
/* Support LZMA2 compression */
|
/* Support LZMA2 compression */
|
||||||
#cmakedefine LZMA_SUPPORT 1
|
#cmakedefine LZMA_SUPPORT 1
|
||||||
|
|
||||||
/* Support ZSTD compression */
|
|
||||||
#cmakedefine ZSTD_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support WEBP compression */
|
|
||||||
#cmakedefine WEBP_SUPPORT 1
|
|
||||||
|
|
||||||
/* Name of package */
|
/* Name of package */
|
||||||
#define PACKAGE "@PACKAGE_NAME@"
|
#define PACKAGE "@PACKAGE_NAME@"
|
||||||
|
|
||||||
@ -128,80 +82,30 @@
|
|||||||
/* Define to the full name of this package. */
|
/* Define to the full name of this package. */
|
||||||
#define PACKAGE_NAME "@PACKAGE_NAME@"
|
#define PACKAGE_NAME "@PACKAGE_NAME@"
|
||||||
|
|
||||||
/* Define to the full name and version of this package. */
|
|
||||||
#define PACKAGE_STRING "@PACKAGE_STRING@"
|
|
||||||
|
|
||||||
/* Define to the one symbol short name of this package. */
|
/* Define to the one symbol short name of this package. */
|
||||||
#define PACKAGE_TARNAME "@PACKAGE_TARNAME@"
|
#define PACKAGE_TARNAME "@PACKAGE_TARNAME@"
|
||||||
|
|
||||||
/* Define to the home page for this package. */
|
/* Define to the home page for this package. */
|
||||||
#define PACKAGE_URL "@PACKAGE_URL@"
|
#define PACKAGE_URL "@PACKAGE_URL@"
|
||||||
|
|
||||||
/* Define to the version of this package. */
|
/* Size of size_t */
|
||||||
#define PACKAGE_VERSION "@PACKAGE_VERSION@"
|
#define SIZEOF_SIZE_T @SIZEOF_SIZE_T@
|
||||||
|
|
||||||
/* The size of `signed int', as computed by sizeof. */
|
|
||||||
#define SIZEOF_SIGNED_INT @SIZEOF_SIGNED_INT@
|
|
||||||
|
|
||||||
/* The size of `signed long', as computed by sizeof. */
|
|
||||||
#define SIZEOF_SIGNED_LONG @SIZEOF_SIGNED_LONG@
|
|
||||||
|
|
||||||
/* The size of `signed long long', as computed by sizeof. */
|
|
||||||
#define SIZEOF_SIGNED_LONG_LONG @SIZEOF_SIGNED_LONG_LONG@
|
|
||||||
|
|
||||||
/* The size of `unsigned char *', as computed by sizeof. */
|
|
||||||
#define SIZEOF_UNSIGNED_CHAR_P @SIZEOF_UNSIGNED_CHAR_P@
|
|
||||||
|
|
||||||
/* The size of `unsigned int', as computed by sizeof. */
|
|
||||||
#define SIZEOF_UNSIGNED_INT @SIZEOF_UNSIGNED_INT@
|
|
||||||
|
|
||||||
/* The size of `unsigned long', as computed by sizeof. */
|
|
||||||
#define SIZEOF_UNSIGNED_LONG @SIZEOF_UNSIGNED_LONG@
|
|
||||||
|
|
||||||
/* The size of `unsigned long long', as computed by sizeof. */
|
|
||||||
#define SIZEOF_UNSIGNED_LONG_LONG @SIZEOF_UNSIGNED_LONG_LONG@
|
|
||||||
|
|
||||||
/* The size of `unsigned short', as computed by sizeof. */
|
|
||||||
#define SIZEOF_UNSIGNED_SHORT @SIZEOF_UNSIGNED_SHORT@
|
|
||||||
|
|
||||||
/* Default size of the strip in bytes (when strip chopping enabled) */
|
/* Default size of the strip in bytes (when strip chopping enabled) */
|
||||||
#define STRIP_SIZE_DEFAULT @STRIP_SIZE_DEFAULT@
|
#cmakedefine STRIP_SIZE_DEFAULT @STRIP_SIZE_DEFAULT@
|
||||||
|
|
||||||
/* Signed 32-bit type formatter */
|
/** Maximum number of TIFF IFDs that libtiff can iterate through in a file. */
|
||||||
#define TIFF_INT32_FORMAT "@TIFF_INT32_FORMAT@"
|
#define TIFF_MAX_DIR_COUNT @TIFF_MAX_DIR_COUNT@
|
||||||
|
|
||||||
/* Signed 64-bit type formatter */
|
|
||||||
#define TIFF_INT64_FORMAT "@TIFF_INT64_FORMAT@"
|
|
||||||
|
|
||||||
/* Pointer difference type formatter */
|
|
||||||
#define TIFF_PTRDIFF_FORMAT "@TIFF_PTRDIFF_FORMAT@"
|
|
||||||
|
|
||||||
/* Unsigned size type formatter */
|
|
||||||
#define TIFF_SIZE_FORMAT "@TIFF_SIZE_FORMAT@"
|
|
||||||
|
|
||||||
/* Signed size type formatter */
|
|
||||||
#define TIFF_SSIZE_FORMAT "@TIFF_SSIZE_FORMAT@"
|
|
||||||
|
|
||||||
/* Unsigned 32-bit type formatter */
|
|
||||||
#define TIFF_UINT32_FORMAT "@TIFF_UINT32_FORMAT@"
|
|
||||||
|
|
||||||
/* Unsigned 64-bit type formatter */
|
|
||||||
#define TIFF_UINT64_FORMAT "@TIFF_UINT64_FORMAT@"
|
|
||||||
|
|
||||||
/* Unsigned 8-bit type */
|
|
||||||
#define TIFF_UINT8_T @TIFF_UINT8_T@
|
|
||||||
|
|
||||||
/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
|
|
||||||
#undef TIME_WITH_SYS_TIME
|
|
||||||
|
|
||||||
/* Define to 1 if your <sys/time.h> declares `struct tm'. */
|
|
||||||
#cmakedefine TM_IN_SYS_TIME 1
|
|
||||||
|
|
||||||
/* define to use win32 IO system */
|
/* define to use win32 IO system */
|
||||||
#cmakedefine USE_WIN32_FILEIO 1
|
#cmakedefine USE_WIN32_FILEIO 1
|
||||||
|
|
||||||
/* Version number of package */
|
/* Support WEBP compression */
|
||||||
#define VERSION "@PACKAGE_VERSION@"
|
#cmakedefine WEBP_SUPPORT 1
|
||||||
|
|
||||||
|
/* Support ZSTD compression */
|
||||||
|
#cmakedefine ZSTD_SUPPORT 1
|
||||||
|
|
||||||
|
|
||||||
/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
|
/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
|
||||||
significant byte first (like Motorola and SPARC, unlike Intel). */
|
significant byte first (like Motorola and SPARC, unlike Intel). */
|
||||||
@ -215,17 +119,21 @@
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Number of bits in a file offset, on hosts where this is settable. */
|
#if !defined(__MINGW32__)
|
||||||
#define _FILE_OFFSET_BITS @FILE_OFFSET_BITS@
|
# define TIFF_SIZE_FORMAT "zu"
|
||||||
|
#endif
|
||||||
/* Define to `__inline__' or `__inline' if that's what the C compiler
|
#if SIZEOF_SIZE_T == 8
|
||||||
calls it, or to nothing if 'inline' is not supported under any name. */
|
# define TIFF_SSIZE_FORMAT PRId64
|
||||||
#ifndef __cplusplus
|
# if defined(__MINGW32__)
|
||||||
#define inline @INLINE_KEYWORD@
|
# define TIFF_SIZE_FORMAT PRIu64
|
||||||
|
# endif
|
||||||
|
#elif SIZEOF_SIZE_T == 4
|
||||||
|
# define TIFF_SSIZE_FORMAT PRId32
|
||||||
|
# if defined(__MINGW32__)
|
||||||
|
# define TIFF_SIZE_FORMAT PRIu32
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# error "Unsupported size_t size; please submit a bug report"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Define to `long int' if <sys/types.h> does not define. */
|
/* clang-format on */
|
||||||
#undef off_t
|
|
||||||
|
|
||||||
/* Define to `unsigned int' if <sys/types.h> does not define. */
|
|
||||||
#undef size_t
|
|
||||||
|
1633
3rdparty/libtiff/tif_dir.c
vendored
1633
3rdparty/libtiff/tif_dir.c
vendored
File diff suppressed because it is too large
Load Diff
169
3rdparty/libtiff/tif_dir.h
vendored
169
3rdparty/libtiff/tif_dir.h
vendored
@ -32,7 +32,8 @@
|
|||||||
* ``Library-private'' Directory-related Definitions.
|
* ``Library-private'' Directory-related Definitions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef struct {
|
typedef struct
|
||||||
|
{
|
||||||
const TIFFField *info;
|
const TIFFField *info;
|
||||||
int count;
|
int count;
|
||||||
void *value;
|
void *value;
|
||||||
@ -49,79 +50,91 @@ typedef struct {
|
|||||||
* BigTIFF, then it is placed in the offset field to save space. If so,
|
* BigTIFF, then it is placed in the offset field to save space. If so,
|
||||||
* it is left-justified in the offset field.
|
* it is left-justified in the offset field.
|
||||||
*/
|
*/
|
||||||
typedef struct {
|
typedef struct
|
||||||
uint16 tdir_tag; /* see below */
|
{
|
||||||
uint16 tdir_type; /* data type; see below */
|
uint16_t tdir_tag; /* see below */
|
||||||
uint64 tdir_count; /* number of items; length in spec */
|
uint16_t tdir_type; /* data type; see below */
|
||||||
union {
|
uint64_t tdir_count; /* number of items; length in spec */
|
||||||
uint16 toff_short;
|
union
|
||||||
uint32 toff_long;
|
{
|
||||||
uint64 toff_long8;
|
uint16_t toff_short;
|
||||||
|
uint32_t toff_long;
|
||||||
|
uint64_t toff_long8;
|
||||||
} tdir_offset; /* either offset or the data itself if fits */
|
} tdir_offset; /* either offset or the data itself if fits */
|
||||||
uint8 tdir_ignore; /* flag status to ignore tag when parsing tags in tif_dirread.c */
|
uint8_t tdir_ignore; /* flag status to ignore tag when parsing tags in
|
||||||
|
tif_dirread.c */
|
||||||
} TIFFDirEntry;
|
} TIFFDirEntry;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Internal format of a TIFF directory entry.
|
* Internal format of a TIFF directory entry.
|
||||||
*/
|
*/
|
||||||
typedef struct {
|
typedef struct
|
||||||
#define FIELD_SETLONGS 4
|
{
|
||||||
|
#define FIELDSET_ITEMS 4
|
||||||
/* bit vector of fields that are set */
|
/* bit vector of fields that are set */
|
||||||
unsigned long td_fieldsset[FIELD_SETLONGS];
|
uint32_t td_fieldsset[FIELDSET_ITEMS];
|
||||||
|
|
||||||
uint32 td_imagewidth, td_imagelength, td_imagedepth;
|
uint32_t td_imagewidth, td_imagelength, td_imagedepth;
|
||||||
uint32 td_tilewidth, td_tilelength, td_tiledepth;
|
uint32_t td_tilewidth, td_tilelength, td_tiledepth;
|
||||||
uint32 td_subfiletype;
|
uint32_t td_subfiletype;
|
||||||
uint16 td_bitspersample;
|
uint16_t td_bitspersample;
|
||||||
uint16 td_sampleformat;
|
uint16_t td_sampleformat;
|
||||||
uint16 td_compression;
|
uint16_t td_compression;
|
||||||
uint16 td_photometric;
|
uint16_t td_photometric;
|
||||||
uint16 td_threshholding;
|
uint16_t td_threshholding;
|
||||||
uint16 td_fillorder;
|
uint16_t td_fillorder;
|
||||||
uint16 td_orientation;
|
uint16_t td_orientation;
|
||||||
uint16 td_samplesperpixel;
|
uint16_t td_samplesperpixel;
|
||||||
uint32 td_rowsperstrip;
|
uint32_t td_rowsperstrip;
|
||||||
uint16 td_minsamplevalue, td_maxsamplevalue;
|
uint16_t td_minsamplevalue, td_maxsamplevalue;
|
||||||
double *td_sminsamplevalue;
|
double *td_sminsamplevalue;
|
||||||
double *td_smaxsamplevalue;
|
double *td_smaxsamplevalue;
|
||||||
float td_xresolution, td_yresolution;
|
float td_xresolution, td_yresolution;
|
||||||
uint16 td_resolutionunit;
|
uint16_t td_resolutionunit;
|
||||||
uint16 td_planarconfig;
|
uint16_t td_planarconfig;
|
||||||
float td_xposition, td_yposition;
|
float td_xposition, td_yposition;
|
||||||
uint16 td_pagenumber[2];
|
uint16_t td_pagenumber[2];
|
||||||
uint16* td_colormap[3];
|
uint16_t *td_colormap[3];
|
||||||
uint16 td_halftonehints[2];
|
uint16_t td_halftonehints[2];
|
||||||
uint16 td_extrasamples;
|
uint16_t td_extrasamples;
|
||||||
uint16* td_sampleinfo;
|
uint16_t *td_sampleinfo;
|
||||||
/* even though the name is misleading, td_stripsperimage is the number
|
/* even though the name is misleading, td_stripsperimage is the number
|
||||||
* of striles (=strips or tiles) per plane, and td_nstrips the total
|
* of striles (=strips or tiles) per plane, and td_nstrips the total
|
||||||
* number of striles */
|
* number of striles */
|
||||||
uint32 td_stripsperimage;
|
uint32_t td_stripsperimage;
|
||||||
uint32 td_nstrips; /* size of offset & bytecount arrays */
|
uint32_t td_nstrips; /* size of offset & bytecount arrays */
|
||||||
uint64* td_stripoffset_p; /* should be accessed with TIFFGetStrileOffset */
|
uint64_t
|
||||||
uint64* td_stripbytecount_p; /* should be accessed with TIFFGetStrileByteCount */
|
*td_stripoffset_p; /* should be accessed with TIFFGetStrileOffset */
|
||||||
uint32 td_stripoffsetbyteallocsize; /* number of elements currently allocated for td_stripoffset/td_stripbytecount. Only used if TIFF_LAZYSTRILELOAD is set */
|
uint64_t *td_stripbytecount_p; /* should be accessed with
|
||||||
|
TIFFGetStrileByteCount */
|
||||||
|
uint32_t
|
||||||
|
td_stripoffsetbyteallocsize; /* number of elements currently allocated
|
||||||
|
for td_stripoffset/td_stripbytecount.
|
||||||
|
Only used if TIFF_LAZYSTRILELOAD is set
|
||||||
|
*/
|
||||||
#ifdef STRIPBYTECOUNTSORTED_UNUSED
|
#ifdef STRIPBYTECOUNTSORTED_UNUSED
|
||||||
int td_stripbytecountsorted; /* is the bytecount array sorted ascending? */
|
int td_stripbytecountsorted; /* is the bytecount array sorted ascending? */
|
||||||
#endif
|
#endif
|
||||||
TIFFDirEntry td_stripoffset_entry; /* for deferred loading */
|
TIFFDirEntry td_stripoffset_entry; /* for deferred loading */
|
||||||
TIFFDirEntry td_stripbytecount_entry; /* for deferred loading */
|
TIFFDirEntry td_stripbytecount_entry; /* for deferred loading */
|
||||||
uint16 td_nsubifd;
|
uint16_t td_nsubifd;
|
||||||
uint64* td_subifd;
|
uint64_t *td_subifd;
|
||||||
/* YCbCr parameters */
|
/* YCbCr parameters */
|
||||||
uint16 td_ycbcrsubsampling[2];
|
uint16_t td_ycbcrsubsampling[2];
|
||||||
uint16 td_ycbcrpositioning;
|
uint16_t td_ycbcrpositioning;
|
||||||
/* Colorimetry parameters */
|
/* Colorimetry parameters */
|
||||||
uint16* td_transferfunction[3];
|
uint16_t *td_transferfunction[3];
|
||||||
float *td_refblackwhite;
|
float *td_refblackwhite;
|
||||||
/* CMYK parameters */
|
/* CMYK parameters */
|
||||||
int td_inknameslen;
|
int td_inknameslen;
|
||||||
char *td_inknames;
|
char *td_inknames;
|
||||||
|
uint16_t td_numberofinks; /* number of inks in InkNames string */
|
||||||
|
|
||||||
int td_customValueCount;
|
int td_customValueCount;
|
||||||
TIFFTagValue *td_customValues;
|
TIFFTagValue *td_customValues;
|
||||||
|
|
||||||
unsigned char td_deferstrilearraywriting; /* see TIFFDeferStrileArrayWriting() */
|
unsigned char
|
||||||
|
td_deferstrilearraywriting; /* see TIFFDeferStrileArrayWriting() */
|
||||||
} TIFFDirectory;
|
} TIFFDirectory;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -174,11 +187,11 @@ typedef struct {
|
|||||||
#define FIELD_TRANSFERFUNCTION 44
|
#define FIELD_TRANSFERFUNCTION 44
|
||||||
#define FIELD_INKNAMES 46
|
#define FIELD_INKNAMES 46
|
||||||
#define FIELD_SUBIFD 49
|
#define FIELD_SUBIFD 49
|
||||||
|
#define FIELD_NUMBEROFINKS 50
|
||||||
/* FIELD_CUSTOM (see tiffio.h) 65 */
|
/* FIELD_CUSTOM (see tiffio.h) 65 */
|
||||||
/* end of support for well-known tags; codec-private tags follow */
|
/* end of support for well-known tags; codec-private tags follow */
|
||||||
#define FIELD_CODEC 66 /* base of codec-private tags */
|
#define FIELD_CODEC 66 /* base of codec-private tags */
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Pseudo-tags don't normally need field bits since they are not written to an
|
* Pseudo-tags don't normally need field bits since they are not written to an
|
||||||
* output file (by definition). The library also has express logic to always
|
* output file (by definition). The library also has express logic to always
|
||||||
@ -189,9 +202,9 @@ typedef struct {
|
|||||||
*/
|
*/
|
||||||
#define FIELD_PSEUDO 0
|
#define FIELD_PSEUDO 0
|
||||||
|
|
||||||
#define FIELD_LAST (32*FIELD_SETLONGS-1)
|
#define FIELD_LAST (32 * FIELDSET_ITEMS - 1)
|
||||||
|
|
||||||
#define BITn(n) (((unsigned long)1L)<<((n)&0x1f))
|
#define BITn(n) (((uint32_t)1L) << ((n)&0x1f))
|
||||||
#define BITFIELDn(tif, n) ((tif)->tif_dir.td_fieldsset[(n) / 32])
|
#define BITFIELDn(tif, n) ((tif)->tif_dir.td_fieldsset[(n) / 32])
|
||||||
#define TIFFFieldSet(tif, field) (BITFIELDn(tif, field) & BITn(field))
|
#define TIFFFieldSet(tif, field) (BITFIELDn(tif, field) & BITn(field))
|
||||||
#define TIFFSetFieldBit(tif, field) (BITFIELDn(tif, field) |= BITn(field))
|
#define TIFFSetFieldBit(tif, field) (BITFIELDn(tif, field) |= BITn(field))
|
||||||
@ -200,7 +213,8 @@ typedef struct {
|
|||||||
#define FieldSet(fields, f) (fields[(f) / 32] & BITn(f))
|
#define FieldSet(fields, f) (fields[(f) / 32] & BITn(f))
|
||||||
#define ResetFieldBit(fields, f) (fields[(f) / 32] &= ~BITn(f))
|
#define ResetFieldBit(fields, f) (fields[(f) / 32] &= ~BITn(f))
|
||||||
|
|
||||||
typedef enum {
|
typedef enum
|
||||||
|
{
|
||||||
TIFF_SETGET_UNDEFINED = 0,
|
TIFF_SETGET_UNDEFINED = 0,
|
||||||
TIFF_SETGET_ASCII = 1,
|
TIFF_SETGET_ASCII = 1,
|
||||||
TIFF_SETGET_UINT8 = 2,
|
TIFF_SETGET_UINT8 = 2,
|
||||||
@ -256,7 +270,8 @@ typedef enum {
|
|||||||
} TIFFSetGetFieldType;
|
} TIFFSetGetFieldType;
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
extern "C" {
|
extern "C"
|
||||||
|
{
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern const TIFFFieldArray *_TIFFGetFields(void);
|
extern const TIFFFieldArray *_TIFFGetFields(void);
|
||||||
@ -267,51 +282,59 @@ extern void _TIFFPrintFieldInfo(TIFF*, FILE*);
|
|||||||
|
|
||||||
extern int _TIFFFillStriles(TIFF *);
|
extern int _TIFFFillStriles(TIFF *);
|
||||||
|
|
||||||
typedef enum {
|
typedef enum
|
||||||
|
{
|
||||||
tfiatImage,
|
tfiatImage,
|
||||||
tfiatExif,
|
tfiatExif,
|
||||||
tfiatGps, /* EXIF-GPS fields array type */
|
tfiatGps, /* EXIF-GPS fields array type */
|
||||||
tfiatOther
|
tfiatOther
|
||||||
} TIFFFieldArrayType;
|
} TIFFFieldArrayType;
|
||||||
|
|
||||||
struct _TIFFFieldArray {
|
struct _TIFFFieldArray
|
||||||
TIFFFieldArrayType type; /* array type, will be used to determine if IFD is image and such */
|
{
|
||||||
uint32 allocated_size; /* 0 if array is constant, other if modified by future definition extension support */
|
TIFFFieldArrayType type; /* array type, will be used to determine if IFD
|
||||||
uint32 count; /* number of elements in fields array */
|
is image and such */
|
||||||
|
uint32_t allocated_size; /* 0 if array is constant, other if modified by
|
||||||
|
future definition extension support */
|
||||||
|
uint32_t count; /* number of elements in fields array */
|
||||||
TIFFField *fields; /* actual field info */
|
TIFFField *fields; /* actual field info */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _TIFFField {
|
struct _TIFFField
|
||||||
uint32 field_tag; /* field's tag */
|
{
|
||||||
|
uint32_t field_tag; /* field's tag */
|
||||||
short field_readcount; /* read count/TIFF_VARIABLE/TIFF_SPP */
|
short field_readcount; /* read count/TIFF_VARIABLE/TIFF_SPP */
|
||||||
short field_writecount; /* write count/TIFF_VARIABLE */
|
short field_writecount; /* write count/TIFF_VARIABLE */
|
||||||
TIFFDataType field_type; /* type of associated data */
|
TIFFDataType field_type; /* type of associated data */
|
||||||
uint32 reserved; /* reserved for future extension */
|
uint32_t
|
||||||
TIFFSetGetFieldType set_field_type; /* type to be passed to TIFFSetField */
|
field_anonymous; /* if true, this is a unknown / anonymous tag */
|
||||||
TIFFSetGetFieldType get_field_type; /* type to be passed to TIFFGetField */
|
TIFFSetGetFieldType
|
||||||
|
set_field_type; /* type to be passed to TIFFSetField */
|
||||||
|
TIFFSetGetFieldType
|
||||||
|
get_field_type; /* type to be passed to TIFFGetField */
|
||||||
unsigned short field_bit; /* bit in fieldsset bit vector */
|
unsigned short field_bit; /* bit in fieldsset bit vector */
|
||||||
unsigned char field_oktochange; /* if true, can change while writing */
|
unsigned char field_oktochange; /* if true, can change while writing */
|
||||||
unsigned char field_passcount; /* if true, pass dir count on set */
|
unsigned char field_passcount; /* if true, pass dir count on set */
|
||||||
char *field_name; /* ASCII name */
|
char *field_name; /* ASCII name */
|
||||||
TIFFFieldArray* field_subfields; /* if field points to child ifds, child ifd field definition array */
|
TIFFFieldArray *field_subfields; /* if field points to child ifds, child
|
||||||
|
ifd field definition array */
|
||||||
};
|
};
|
||||||
|
|
||||||
extern int _TIFFMergeFields(TIFF*, const TIFFField[], uint32);
|
extern int _TIFFMergeFields(TIFF *, const TIFFField[], uint32_t);
|
||||||
extern const TIFFField* _TIFFFindOrRegisterField(TIFF *, uint32, TIFFDataType);
|
extern const TIFFField *_TIFFFindOrRegisterField(TIFF *, uint32_t,
|
||||||
extern TIFFField* _TIFFCreateAnonField(TIFF *, uint32, TIFFDataType);
|
TIFFDataType);
|
||||||
|
extern TIFFField *_TIFFCreateAnonField(TIFF *, uint32_t, TIFFDataType);
|
||||||
extern int _TIFFCheckFieldIsValidForCodec(TIFF *tif, ttag_t tag);
|
extern int _TIFFCheckFieldIsValidForCodec(TIFF *tif, ttag_t tag);
|
||||||
|
extern int _TIFFCheckDirNumberAndOffset(TIFF *tif, tdir_t dirn,
|
||||||
|
uint64_t diroff);
|
||||||
|
extern int _TIFFGetDirNumberFromOffset(TIFF *tif, uint64_t diroff,
|
||||||
|
tdir_t *dirn);
|
||||||
|
extern int _TIFFGetOffsetFromDirNumber(TIFF *tif, tdir_t dirn,
|
||||||
|
uint64_t *diroff);
|
||||||
|
extern int _TIFFRemoveEntryFromDirectoryListByOffset(TIFF *tif,
|
||||||
|
uint64_t diroff);
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif /* _TIFFDIR_ */
|
#endif /* _TIFFDIR_ */
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
766
3rdparty/libtiff/tif_dirinfo.c
vendored
766
3rdparty/libtiff/tif_dirinfo.c
vendored
File diff suppressed because it is too large
Load Diff
4707
3rdparty/libtiff/tif_dirread.c
vendored
4707
3rdparty/libtiff/tif_dirread.c
vendored
File diff suppressed because it is too large
Load Diff
3056
3rdparty/libtiff/tif_dirwrite.c
vendored
3056
3rdparty/libtiff/tif_dirwrite.c
vendored
File diff suppressed because it is too large
Load Diff
49
3rdparty/libtiff/tif_dumpmode.c
vendored
49
3rdparty/libtiff/tif_dumpmode.c
vendored
@ -29,8 +29,7 @@
|
|||||||
*/
|
*/
|
||||||
#include "tiffiop.h"
|
#include "tiffiop.h"
|
||||||
|
|
||||||
static int
|
static int DumpFixupTags(TIFF *tif)
|
||||||
DumpFixupTags(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
(void)tif;
|
(void)tif;
|
||||||
return (1);
|
return (1);
|
||||||
@ -39,11 +38,11 @@ DumpFixupTags(TIFF* tif)
|
|||||||
/*
|
/*
|
||||||
* Encode a hunk of pixels.
|
* Encode a hunk of pixels.
|
||||||
*/
|
*/
|
||||||
static int
|
static int DumpModeEncode(TIFF *tif, uint8_t *pp, tmsize_t cc, uint16_t s)
|
||||||
DumpModeEncode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s)
|
|
||||||
{
|
{
|
||||||
(void)s;
|
(void)s;
|
||||||
while (cc > 0) {
|
while (cc > 0)
|
||||||
|
{
|
||||||
tmsize_t n;
|
tmsize_t n;
|
||||||
|
|
||||||
n = cc;
|
n = cc;
|
||||||
@ -62,8 +61,7 @@ DumpModeEncode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s)
|
|||||||
tif->tif_rawcc += n;
|
tif->tif_rawcc += n;
|
||||||
pp += n;
|
pp += n;
|
||||||
cc -= n;
|
cc -= n;
|
||||||
if (tif->tif_rawcc >= tif->tif_rawdatasize &&
|
if (tif->tif_rawcc >= tif->tif_rawdatasize && !TIFFFlushData1(tif))
|
||||||
!TIFFFlushData1(tif))
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
return (1);
|
return (1);
|
||||||
@ -72,25 +70,17 @@ DumpModeEncode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s)
|
|||||||
/*
|
/*
|
||||||
* Decode a hunk of pixels.
|
* Decode a hunk of pixels.
|
||||||
*/
|
*/
|
||||||
static int
|
static int DumpModeDecode(TIFF *tif, uint8_t *buf, tmsize_t cc, uint16_t s)
|
||||||
DumpModeDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "DumpModeDecode";
|
static const char module[] = "DumpModeDecode";
|
||||||
(void)s;
|
(void)s;
|
||||||
if (tif->tif_rawcc < cc) {
|
if (tif->tif_rawcc < cc)
|
||||||
#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
TIFFErrorExtR(tif, module,
|
||||||
"Not enough data for scanline %lu, expected a request for at most %I64d bytes, got a request for %I64d bytes",
|
"Not enough data for scanline %" PRIu32
|
||||||
(unsigned long) tif->tif_row,
|
", expected a request for at most %" TIFF_SSIZE_FORMAT
|
||||||
(signed __int64) tif->tif_rawcc,
|
" bytes, got a request for %" TIFF_SSIZE_FORMAT " bytes",
|
||||||
(signed __int64) cc);
|
tif->tif_row, tif->tif_rawcc, cc);
|
||||||
#else
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
|
||||||
"Not enough data for scanline %lu, expected a request for at most %lld bytes, got a request for %lld bytes",
|
|
||||||
(unsigned long) tif->tif_row,
|
|
||||||
(signed long long) tif->tif_rawcc,
|
|
||||||
(signed long long) cc);
|
|
||||||
#endif
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
@ -107,8 +97,7 @@ DumpModeDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
|
|||||||
/*
|
/*
|
||||||
* Seek forwards nrows in the current strip.
|
* Seek forwards nrows in the current strip.
|
||||||
*/
|
*/
|
||||||
static int
|
static int DumpModeSeek(TIFF *tif, uint32_t nrows)
|
||||||
DumpModeSeek(TIFF* tif, uint32 nrows)
|
|
||||||
{
|
{
|
||||||
tif->tif_rawcp += nrows * tif->tif_scanlinesize;
|
tif->tif_rawcp += nrows * tif->tif_scanlinesize;
|
||||||
tif->tif_rawcc -= nrows * tif->tif_scanlinesize;
|
tif->tif_rawcc -= nrows * tif->tif_scanlinesize;
|
||||||
@ -118,8 +107,7 @@ DumpModeSeek(TIFF* tif, uint32 nrows)
|
|||||||
/*
|
/*
|
||||||
* Initialize dump mode.
|
* Initialize dump mode.
|
||||||
*/
|
*/
|
||||||
int
|
int TIFFInitDumpMode(TIFF *tif, int scheme)
|
||||||
TIFFInitDumpMode(TIFF* tif, int scheme)
|
|
||||||
{
|
{
|
||||||
(void)scheme;
|
(void)scheme;
|
||||||
tif->tif_fixuptags = DumpFixupTags;
|
tif->tif_fixuptags = DumpFixupTags;
|
||||||
@ -132,10 +120,3 @@ TIFFInitDumpMode(TIFF* tif, int scheme)
|
|||||||
tif->tif_seek = DumpModeSeek;
|
tif->tif_seek = DumpModeSeek;
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
84
3rdparty/libtiff/tif_error.c
vendored
84
3rdparty/libtiff/tif_error.c
vendored
@ -29,58 +29,104 @@
|
|||||||
|
|
||||||
TIFFErrorHandlerExt _TIFFerrorHandlerExt = NULL;
|
TIFFErrorHandlerExt _TIFFerrorHandlerExt = NULL;
|
||||||
|
|
||||||
TIFFErrorHandler
|
TIFFErrorHandler TIFFSetErrorHandler(TIFFErrorHandler handler)
|
||||||
TIFFSetErrorHandler(TIFFErrorHandler handler)
|
|
||||||
{
|
{
|
||||||
TIFFErrorHandler prev = _TIFFerrorHandler;
|
TIFFErrorHandler prev = _TIFFerrorHandler;
|
||||||
_TIFFerrorHandler = handler;
|
_TIFFerrorHandler = handler;
|
||||||
return (prev);
|
return (prev);
|
||||||
}
|
}
|
||||||
|
|
||||||
TIFFErrorHandlerExt
|
TIFFErrorHandlerExt TIFFSetErrorHandlerExt(TIFFErrorHandlerExt handler)
|
||||||
TIFFSetErrorHandlerExt(TIFFErrorHandlerExt handler)
|
|
||||||
{
|
{
|
||||||
TIFFErrorHandlerExt prev = _TIFFerrorHandlerExt;
|
TIFFErrorHandlerExt prev = _TIFFerrorHandlerExt;
|
||||||
_TIFFerrorHandlerExt = handler;
|
_TIFFerrorHandlerExt = handler;
|
||||||
return (prev);
|
return (prev);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void TIFFError(const char *module, const char *fmt, ...)
|
||||||
TIFFError(const char* module, const char* fmt, ...)
|
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
if (_TIFFerrorHandler) {
|
if (_TIFFerrorHandler)
|
||||||
|
{
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
(*_TIFFerrorHandler)(module, fmt, ap);
|
(*_TIFFerrorHandler)(module, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
}
|
}
|
||||||
if (_TIFFerrorHandlerExt) {
|
if (_TIFFerrorHandlerExt)
|
||||||
|
{
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
(*_TIFFerrorHandlerExt)(0, module, fmt, ap);
|
(*_TIFFerrorHandlerExt)(0, module, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void TIFFErrorExt(thandle_t fd, const char *module, const char *fmt, ...)
|
||||||
TIFFErrorExt(thandle_t fd, const char* module, const char* fmt, ...)
|
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
if (_TIFFerrorHandler) {
|
if (_TIFFerrorHandler)
|
||||||
|
{
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
(*_TIFFerrorHandler)(module, fmt, ap);
|
(*_TIFFerrorHandler)(module, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
}
|
}
|
||||||
if (_TIFFerrorHandlerExt) {
|
if (_TIFFerrorHandlerExt)
|
||||||
|
{
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
(*_TIFFerrorHandlerExt)(fd, module, fmt, ap);
|
(*_TIFFerrorHandlerExt)(fd, module, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
void _TIFFErrorEarly(TIFFOpenOptions *opts, thandle_t clientdata,
|
||||||
* Local Variables:
|
const char *module, const char *fmt, ...)
|
||||||
* mode: c
|
{
|
||||||
* c-basic-offset: 8
|
va_list ap;
|
||||||
* fill-column: 78
|
if (opts && opts->errorhandler)
|
||||||
* End:
|
{
|
||||||
*/
|
va_start(ap, fmt);
|
||||||
|
int stop = opts->errorhandler(NULL, opts->errorhandler_user_data,
|
||||||
|
module, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
if (stop)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (_TIFFerrorHandler)
|
||||||
|
{
|
||||||
|
va_start(ap, fmt);
|
||||||
|
(*_TIFFerrorHandler)(module, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
}
|
||||||
|
if (_TIFFerrorHandlerExt)
|
||||||
|
{
|
||||||
|
va_start(ap, fmt);
|
||||||
|
(*_TIFFerrorHandlerExt)(clientdata, module, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TIFFErrorExtR(TIFF *tif, const char *module, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
if (tif && tif->tif_errorhandler)
|
||||||
|
{
|
||||||
|
va_start(ap, fmt);
|
||||||
|
int stop = (*tif->tif_errorhandler)(
|
||||||
|
tif, tif->tif_errorhandler_user_data, module, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
if (stop)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (_TIFFerrorHandler)
|
||||||
|
{
|
||||||
|
va_start(ap, fmt);
|
||||||
|
(*_TIFFerrorHandler)(module, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
}
|
||||||
|
if (_TIFFerrorHandlerExt)
|
||||||
|
{
|
||||||
|
va_start(ap, fmt);
|
||||||
|
(*_TIFFerrorHandlerExt)(tif ? tif->tif_clientdata : NULL, module, fmt,
|
||||||
|
ap);
|
||||||
|
va_end(ap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
16
3rdparty/libtiff/tif_extension.c
vendored
16
3rdparty/libtiff/tif_extension.c
vendored
@ -39,13 +39,13 @@ int TIFFGetTagListCount( TIFF *tif )
|
|||||||
return td->td_customValueCount;
|
return td->td_customValueCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 TIFFGetTagListEntry( TIFF *tif, int tag_index )
|
uint32_t TIFFGetTagListEntry(TIFF *tif, int tag_index)
|
||||||
|
|
||||||
{
|
{
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
TIFFDirectory *td = &tif->tif_dir;
|
||||||
|
|
||||||
if (tag_index < 0 || tag_index >= td->td_customValueCount)
|
if (tag_index < 0 || tag_index >= td->td_customValueCount)
|
||||||
return (uint32)(-1);
|
return (uint32_t)(-1);
|
||||||
else
|
else
|
||||||
return td->td_customValues[tag_index].info->field_tag;
|
return td->td_customValues[tag_index].info->field_tag;
|
||||||
}
|
}
|
||||||
@ -97,20 +97,14 @@ void TIFFSetClientInfo( TIFF *tif, void *data, const char *name )
|
|||||||
** Create a new link.
|
** Create a new link.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
psLink = (TIFFClientInfoLink *) _TIFFmalloc(sizeof(TIFFClientInfoLink));
|
psLink =
|
||||||
|
(TIFFClientInfoLink *)_TIFFmallocExt(tif, sizeof(TIFFClientInfoLink));
|
||||||
assert(psLink != NULL);
|
assert(psLink != NULL);
|
||||||
psLink->next = tif->tif_clientinfo;
|
psLink->next = tif->tif_clientinfo;
|
||||||
psLink->name = (char *) _TIFFmalloc((tmsize_t)(strlen(name)+1));
|
psLink->name = (char *)_TIFFmallocExt(tif, (tmsize_t)(strlen(name) + 1));
|
||||||
assert(psLink->name != NULL);
|
assert(psLink->name != NULL);
|
||||||
strcpy(psLink->name, name);
|
strcpy(psLink->name, name);
|
||||||
psLink->data = data;
|
psLink->data = data;
|
||||||
|
|
||||||
tif->tif_clientinfo = psLink;
|
tif->tif_clientinfo = psLink;
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
905
3rdparty/libtiff/tif_fax3.c
vendored
905
3rdparty/libtiff/tif_fax3.c
vendored
File diff suppressed because it is too large
Load Diff
283
3rdparty/libtiff/tif_fax3.h
vendored
283
3rdparty/libtiff/tif_fax3.h
vendored
@ -41,7 +41,7 @@
|
|||||||
* The routine must have the type signature given below;
|
* The routine must have the type signature given below;
|
||||||
* for example:
|
* for example:
|
||||||
*
|
*
|
||||||
* fillruns(unsigned char* buf, uint32* runs, uint32* erun, uint32 lastx)
|
* fillruns(unsigned char* buf, uint32_t* runs, uint32_t* erun, uint32_t lastx)
|
||||||
*
|
*
|
||||||
* where buf is place to set the bits, runs is the array of b&w run
|
* where buf is place to set the bits, runs is the array of b&w run
|
||||||
* lengths (white then black), erun is the last run in the array, and
|
* lengths (white then black), erun is the last run in the array, and
|
||||||
@ -50,20 +50,22 @@
|
|||||||
* data in the run array as needed (e.g. to append zero runs to bring
|
* data in the run array as needed (e.g. to append zero runs to bring
|
||||||
* the count up to a nice multiple).
|
* the count up to a nice multiple).
|
||||||
*/
|
*/
|
||||||
typedef void (*TIFFFaxFillFunc)(unsigned char*, uint32*, uint32*, uint32);
|
typedef void (*TIFFFaxFillFunc)(unsigned char *, uint32_t *, uint32_t *,
|
||||||
|
uint32_t);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The default run filler; made external for other decoders.
|
* The default run filler; made external for other decoders.
|
||||||
*/
|
*/
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
extern "C" {
|
extern "C"
|
||||||
|
{
|
||||||
#endif
|
#endif
|
||||||
extern void _TIFFFax3fillruns(unsigned char*, uint32*, uint32*, uint32);
|
extern void _TIFFFax3fillruns(unsigned char *, uint32_t *, uint32_t *,
|
||||||
|
uint32_t);
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* finite state machine codes */
|
/* finite state machine codes */
|
||||||
#define S_Null 0
|
#define S_Null 0
|
||||||
#define S_Pass 1
|
#define S_Pass 1
|
||||||
@ -79,12 +81,16 @@ extern void _TIFFFax3fillruns(unsigned char*, uint32*, uint32*, uint32);
|
|||||||
#define S_MakeUp 11
|
#define S_MakeUp 11
|
||||||
#define S_EOL 12
|
#define S_EOL 12
|
||||||
|
|
||||||
/* WARNING: do not change the layout of this structure as the HylaFAX software */
|
/* WARNING: do not change the layout of this structure as the HylaFAX software
|
||||||
/* really depends on it. See http://bugzilla.maptools.org/show_bug.cgi?id=2636 */
|
*/
|
||||||
typedef struct { /* state table entry */
|
/* really depends on it. See http://bugzilla.maptools.org/show_bug.cgi?id=2636
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{ /* state table entry */
|
||||||
unsigned char State; /* see above */
|
unsigned char State; /* see above */
|
||||||
unsigned char Width; /* width of code in bits */
|
unsigned char Width; /* width of code in bits */
|
||||||
uint32 Param; /* unsigned 32-bit run length in bits (holds on 16 bit actually, but cannot be changed. See above warning) */
|
uint32_t Param; /* unsigned 32-bit run length in bits (holds on 16 bit
|
||||||
|
actually, but cannot be changed. See above warning) */
|
||||||
} TIFFFaxTabEnt;
|
} TIFFFaxTabEnt;
|
||||||
|
|
||||||
extern const TIFFFaxTabEnt TIFFFaxMainTable[];
|
extern const TIFFFaxTabEnt TIFFFaxMainTable[];
|
||||||
@ -134,34 +140,50 @@ extern const TIFFFaxTabEnt TIFFFaxBlackTable[];
|
|||||||
* otherwise we should get the right answer.
|
* otherwise we should get the right answer.
|
||||||
*/
|
*/
|
||||||
#ifndef NeedBits8
|
#ifndef NeedBits8
|
||||||
#define NeedBits8(n,eoflab) do { \
|
#define NeedBits8(n, eoflab) \
|
||||||
if (BitsAvail < (n)) { \
|
do \
|
||||||
if (EndOfData()) { \
|
{ \
|
||||||
|
if (BitsAvail < (n)) \
|
||||||
|
{ \
|
||||||
|
if (EndOfData()) \
|
||||||
|
{ \
|
||||||
if (BitsAvail == 0) /* no valid bits */ \
|
if (BitsAvail == 0) /* no valid bits */ \
|
||||||
goto eoflab; \
|
goto eoflab; \
|
||||||
BitsAvail = (n); /* pad with zeros */ \
|
BitsAvail = (n); /* pad with zeros */ \
|
||||||
} else { \
|
} \
|
||||||
BitAcc |= ((uint32) bitmap[*cp++])<<BitsAvail; \
|
else \
|
||||||
|
{ \
|
||||||
|
BitAcc |= ((uint32_t)bitmap[*cp++]) << BitsAvail; \
|
||||||
BitsAvail += 8; \
|
BitsAvail += 8; \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
#endif
|
#endif
|
||||||
#ifndef NeedBits16
|
#ifndef NeedBits16
|
||||||
#define NeedBits16(n,eoflab) do { \
|
#define NeedBits16(n, eoflab) \
|
||||||
if (BitsAvail < (n)) { \
|
do \
|
||||||
if (EndOfData()) { \
|
{ \
|
||||||
|
if (BitsAvail < (n)) \
|
||||||
|
{ \
|
||||||
|
if (EndOfData()) \
|
||||||
|
{ \
|
||||||
if (BitsAvail == 0) /* no valid bits */ \
|
if (BitsAvail == 0) /* no valid bits */ \
|
||||||
goto eoflab; \
|
goto eoflab; \
|
||||||
BitsAvail = (n); /* pad with zeros */ \
|
BitsAvail = (n); /* pad with zeros */ \
|
||||||
} else { \
|
} \
|
||||||
BitAcc |= ((uint32) bitmap[*cp++])<<BitsAvail; \
|
else \
|
||||||
if ((BitsAvail += 8) < (n)) { \
|
{ \
|
||||||
if (EndOfData()) { \
|
BitAcc |= ((uint32_t)bitmap[*cp++]) << BitsAvail; \
|
||||||
|
if ((BitsAvail += 8) < (n)) \
|
||||||
|
{ \
|
||||||
|
if (EndOfData()) \
|
||||||
|
{ \
|
||||||
/* NB: we know BitsAvail is non-zero here */ \
|
/* NB: we know BitsAvail is non-zero here */ \
|
||||||
BitsAvail = (n); /* pad with zeros */ \
|
BitsAvail = (n); /* pad with zeros */ \
|
||||||
} else { \
|
} \
|
||||||
BitAcc |= ((uint32) bitmap[*cp++])<<BitsAvail; \
|
else \
|
||||||
|
{ \
|
||||||
|
BitAcc |= ((uint32_t)bitmap[*cp++]) << BitsAvail; \
|
||||||
BitsAvail += 8; \
|
BitsAvail += 8; \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
@ -170,29 +192,22 @@ extern const TIFFFaxTabEnt TIFFFaxBlackTable[];
|
|||||||
} while (0)
|
} while (0)
|
||||||
#endif
|
#endif
|
||||||
#define GetBits(n) (BitAcc & ((1 << (n)) - 1))
|
#define GetBits(n) (BitAcc & ((1 << (n)) - 1))
|
||||||
#define ClrBits(n) do { \
|
#define ClrBits(n) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
BitsAvail -= (n); \
|
BitsAvail -= (n); \
|
||||||
BitAcc >>= (n); \
|
BitAcc >>= (n); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#ifdef FAX3_DEBUG
|
#ifdef FAX3_DEBUG
|
||||||
static const char *StateNames[] = {
|
static const char *StateNames[] = {
|
||||||
"Null ",
|
"Null ", "Pass ", "Horiz ", "V0 ", "VR ", "VL ", "Ext ",
|
||||||
"Pass ",
|
"TermW ", "TermB ", "MakeUpW", "MakeUpB", "MakeUp ", "EOL ",
|
||||||
"Horiz ",
|
|
||||||
"V0 ",
|
|
||||||
"VR ",
|
|
||||||
"VL ",
|
|
||||||
"Ext ",
|
|
||||||
"TermW ",
|
|
||||||
"TermB ",
|
|
||||||
"MakeUpW",
|
|
||||||
"MakeUpB",
|
|
||||||
"MakeUp ",
|
|
||||||
"EOL ",
|
|
||||||
};
|
};
|
||||||
#define DEBUG_SHOW putchar(BitAcc & (1 << t) ? '1' : '0')
|
#define DEBUG_SHOW putchar(BitAcc & (1 << t) ? '1' : '0')
|
||||||
#define LOOKUP8(wid,tab,eoflab) do { \
|
#define LOOKUP8(wid, tab, eoflab) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
int t; \
|
int t; \
|
||||||
NeedBits8(wid, eoflab); \
|
NeedBits8(wid, eoflab); \
|
||||||
TabEnt = tab + GetBits(wid); \
|
TabEnt = tab + GetBits(wid); \
|
||||||
@ -204,7 +219,9 @@ static const char* StateNames[] = {
|
|||||||
fflush(stdout); \
|
fflush(stdout); \
|
||||||
ClrBits(TabEnt->Width); \
|
ClrBits(TabEnt->Width); \
|
||||||
} while (0)
|
} while (0)
|
||||||
#define LOOKUP16(wid,tab,eoflab) do { \
|
#define LOOKUP16(wid, tab, eoflab) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
int t; \
|
int t; \
|
||||||
NeedBits16(wid, eoflab); \
|
NeedBits16(wid, eoflab); \
|
||||||
TabEnt = tab + GetBits(wid); \
|
TabEnt = tab + GetBits(wid); \
|
||||||
@ -217,19 +234,25 @@ static const char* StateNames[] = {
|
|||||||
ClrBits(TabEnt->Width); \
|
ClrBits(TabEnt->Width); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define SETVALUE(x) do { \
|
#define SETVALUE(x) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
*pa++ = RunLength + (x); \
|
*pa++ = RunLength + (x); \
|
||||||
printf("SETVALUE: %d\t%d\n", RunLength + (x), a0); \
|
printf("SETVALUE: %d\t%d\n", RunLength + (x), a0); \
|
||||||
a0 += x; \
|
a0 += x; \
|
||||||
RunLength = 0; \
|
RunLength = 0; \
|
||||||
} while (0)
|
} while (0)
|
||||||
#else
|
#else
|
||||||
#define LOOKUP8(wid,tab,eoflab) do { \
|
#define LOOKUP8(wid, tab, eoflab) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
NeedBits8(wid, eoflab); \
|
NeedBits8(wid, eoflab); \
|
||||||
TabEnt = tab + GetBits(wid); \
|
TabEnt = tab + GetBits(wid); \
|
||||||
ClrBits(TabEnt->Width); \
|
ClrBits(TabEnt->Width); \
|
||||||
} while (0)
|
} while (0)
|
||||||
#define LOOKUP16(wid,tab,eoflab) do { \
|
#define LOOKUP16(wid, tab, eoflab) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
NeedBits16(wid, eoflab); \
|
NeedBits16(wid, eoflab); \
|
||||||
TabEnt = tab + GetBits(wid); \
|
TabEnt = tab + GetBits(wid); \
|
||||||
ClrBits(TabEnt->Width); \
|
ClrBits(TabEnt->Width); \
|
||||||
@ -239,10 +262,15 @@ static const char* StateNames[] = {
|
|||||||
* Append a run to the run length array for the
|
* Append a run to the run length array for the
|
||||||
* current row and reset decoding state.
|
* current row and reset decoding state.
|
||||||
*/
|
*/
|
||||||
#define SETVALUE(x) do { \
|
#define SETVALUE(x) \
|
||||||
if (pa >= thisrun + sp->nruns) { \
|
do \
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "Buffer overflow at line %u of %s %u", \
|
{ \
|
||||||
sp->line, isTiled(tif) ? "tile" : "strip", isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip); \
|
if (pa >= thisrun + sp->nruns) \
|
||||||
|
{ \
|
||||||
|
TIFFErrorExtR(tif, module, "Buffer overflow at line %u of %s %u", \
|
||||||
|
sp->line, isTiled(tif) ? "tile" : "strip", \
|
||||||
|
isTiled(tif) ? tif->tif_curtile \
|
||||||
|
: tif->tif_curstrip); \
|
||||||
return (-1); \
|
return (-1); \
|
||||||
} \
|
} \
|
||||||
*pa++ = RunLength + (x); \
|
*pa++ = RunLength + (x); \
|
||||||
@ -261,16 +289,21 @@ static const char* StateNames[] = {
|
|||||||
* is non-zero then we still need to scan for the final flag
|
* is non-zero then we still need to scan for the final flag
|
||||||
* bit that is part of the EOL code.
|
* bit that is part of the EOL code.
|
||||||
*/
|
*/
|
||||||
#define SYNC_EOL(eoflab) do { \
|
#define SYNC_EOL(eoflab) \
|
||||||
if (EOLcnt == 0) { \
|
do \
|
||||||
for (;;) { \
|
{ \
|
||||||
|
if (EOLcnt == 0) \
|
||||||
|
{ \
|
||||||
|
for (;;) \
|
||||||
|
{ \
|
||||||
NeedBits16(11, eoflab); \
|
NeedBits16(11, eoflab); \
|
||||||
if (GetBits(11) == 0) \
|
if (GetBits(11) == 0) \
|
||||||
break; \
|
break; \
|
||||||
ClrBits(1); \
|
ClrBits(1); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
for (;;) { \
|
for (;;) \
|
||||||
|
{ \
|
||||||
NeedBits8(8, eoflab); \
|
NeedBits8(8, eoflab); \
|
||||||
if (GetBits(8)) \
|
if (GetBits(8)) \
|
||||||
break; \
|
break; \
|
||||||
@ -287,20 +320,26 @@ static const char* StateNames[] = {
|
|||||||
* We adjust final runs to insure the user buffer is not
|
* We adjust final runs to insure the user buffer is not
|
||||||
* overwritten and/or undecoded area is white filled.
|
* overwritten and/or undecoded area is white filled.
|
||||||
*/
|
*/
|
||||||
#define CLEANUP_RUNS() do { \
|
#define CLEANUP_RUNS() \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
if (RunLength) \
|
if (RunLength) \
|
||||||
SETVALUE(0); \
|
SETVALUE(0); \
|
||||||
if (a0 != lastx) { \
|
if (a0 != lastx) \
|
||||||
|
{ \
|
||||||
badlength(a0, lastx); \
|
badlength(a0, lastx); \
|
||||||
while (a0 > lastx && pa > thisrun) \
|
while (a0 > lastx && pa > thisrun) \
|
||||||
a0 -= *--pa; \
|
a0 -= *--pa; \
|
||||||
if (a0 < lastx) { \
|
if (a0 < lastx) \
|
||||||
|
{ \
|
||||||
if (a0 < 0) \
|
if (a0 < 0) \
|
||||||
a0 = 0; \
|
a0 = 0; \
|
||||||
if ((pa - thisrun) & 1) \
|
if ((pa - thisrun) & 1) \
|
||||||
SETVALUE(0); \
|
SETVALUE(0); \
|
||||||
SETVALUE(lastx - a0); \
|
SETVALUE(lastx - a0); \
|
||||||
} else if (a0 > lastx) { \
|
} \
|
||||||
|
else if (a0 > lastx) \
|
||||||
|
{ \
|
||||||
SETVALUE(lastx); \
|
SETVALUE(lastx); \
|
||||||
SETVALUE(0); \
|
SETVALUE(0); \
|
||||||
} \
|
} \
|
||||||
@ -319,11 +358,16 @@ static const char* StateNames[] = {
|
|||||||
* the original code depended on the input data being zero-padded to
|
* the original code depended on the input data being zero-padded to
|
||||||
* insure the decoder recognized an EOL before running out of data.
|
* insure the decoder recognized an EOL before running out of data.
|
||||||
*/
|
*/
|
||||||
#define EXPAND1D(eoflab) do { \
|
#define EXPAND1D(eoflab) \
|
||||||
for (;;) { \
|
do \
|
||||||
for (;;) { \
|
{ \
|
||||||
|
for (;;) \
|
||||||
|
{ \
|
||||||
|
for (;;) \
|
||||||
|
{ \
|
||||||
LOOKUP16(12, TIFFFaxWhiteTable, eof1d); \
|
LOOKUP16(12, TIFFFaxWhiteTable, eof1d); \
|
||||||
switch (TabEnt->State) { \
|
switch (TabEnt->State) \
|
||||||
|
{ \
|
||||||
case S_EOL: \
|
case S_EOL: \
|
||||||
EOLcnt = 1; \
|
EOLcnt = 1; \
|
||||||
goto done1d; \
|
goto done1d; \
|
||||||
@ -343,9 +387,11 @@ static const char* StateNames[] = {
|
|||||||
doneWhite1d: \
|
doneWhite1d: \
|
||||||
if (a0 >= lastx) \
|
if (a0 >= lastx) \
|
||||||
goto done1d; \
|
goto done1d; \
|
||||||
for (;;) { \
|
for (;;) \
|
||||||
|
{ \
|
||||||
LOOKUP16(13, TIFFFaxBlackTable, eof1d); \
|
LOOKUP16(13, TIFFFaxBlackTable, eof1d); \
|
||||||
switch (TabEnt->State) { \
|
switch (TabEnt->State) \
|
||||||
|
{ \
|
||||||
case S_EOL: \
|
case S_EOL: \
|
||||||
EOLcnt = 1; \
|
EOLcnt = 1; \
|
||||||
goto done1d; \
|
goto done1d; \
|
||||||
@ -380,11 +426,18 @@ done1d: \
|
|||||||
* Update the value of b1 using the array
|
* Update the value of b1 using the array
|
||||||
* of runs for the reference line.
|
* of runs for the reference line.
|
||||||
*/
|
*/
|
||||||
#define CHECK_b1 do { \
|
#define CHECK_b1 \
|
||||||
if (pa != thisrun) while (b1 <= a0 && b1 < lastx) { \
|
do \
|
||||||
if( pb + 1 >= sp->refruns + sp->nruns) { \
|
{ \
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "Buffer overflow at line %u of %s %u", \
|
if (pa != thisrun) \
|
||||||
sp->line, isTiled(tif) ? "tile" : "strip", isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip); \
|
while (b1 <= a0 && b1 < lastx) \
|
||||||
|
{ \
|
||||||
|
if (pb + 1 >= sp->refruns + sp->nruns) \
|
||||||
|
{ \
|
||||||
|
TIFFErrorExtR( \
|
||||||
|
tif, module, "Buffer overflow at line %u of %s %u", \
|
||||||
|
sp->line, isTiled(tif) ? "tile" : "strip", \
|
||||||
|
isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip); \
|
||||||
return (-1); \
|
return (-1); \
|
||||||
} \
|
} \
|
||||||
b1 += pb[0] + pb[1]; \
|
b1 += pb[0] + pb[1]; \
|
||||||
@ -395,20 +448,32 @@ done1d: \
|
|||||||
/*
|
/*
|
||||||
* Expand a row of 2D-encoded data.
|
* Expand a row of 2D-encoded data.
|
||||||
*/
|
*/
|
||||||
#define EXPAND2D(eoflab) do { \
|
#define EXPAND2D(eoflab) \
|
||||||
while (a0 < lastx) { \
|
do \
|
||||||
if (pa >= thisrun + sp->nruns) { \
|
{ \
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "Buffer overflow at line %u of %s %u", \
|
while (a0 < lastx) \
|
||||||
sp->line, isTiled(tif) ? "tile" : "strip", isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip); \
|
{ \
|
||||||
|
if (pa >= thisrun + sp->nruns) \
|
||||||
|
{ \
|
||||||
|
TIFFErrorExtR( \
|
||||||
|
tif, module, "Buffer overflow at line %u of %s %u", \
|
||||||
|
sp->line, isTiled(tif) ? "tile" : "strip", \
|
||||||
|
isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip); \
|
||||||
return (-1); \
|
return (-1); \
|
||||||
} \
|
} \
|
||||||
LOOKUP8(7, TIFFFaxMainTable, eof2d); \
|
LOOKUP8(7, TIFFFaxMainTable, eof2d); \
|
||||||
switch (TabEnt->State) { \
|
switch (TabEnt->State) \
|
||||||
|
{ \
|
||||||
case S_Pass: \
|
case S_Pass: \
|
||||||
CHECK_b1; \
|
CHECK_b1; \
|
||||||
if( pb + 1 >= sp->refruns + sp->nruns) { \
|
if (pb + 1 >= sp->refruns + sp->nruns) \
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "Buffer overflow at line %u of %s %u", \
|
{ \
|
||||||
sp->line, isTiled(tif) ? "tile" : "strip", isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip); \
|
TIFFErrorExtR(tif, module, \
|
||||||
|
"Buffer overflow at line %u of %s %u", \
|
||||||
|
sp->line, \
|
||||||
|
isTiled(tif) ? "tile" : "strip", \
|
||||||
|
isTiled(tif) ? tif->tif_curtile \
|
||||||
|
: tif->tif_curstrip); \
|
||||||
return (-1); \
|
return (-1); \
|
||||||
} \
|
} \
|
||||||
b1 += *pb++; \
|
b1 += *pb++; \
|
||||||
@ -417,10 +482,13 @@ done1d: \
|
|||||||
b1 += *pb++; \
|
b1 += *pb++; \
|
||||||
break; \
|
break; \
|
||||||
case S_Horiz: \
|
case S_Horiz: \
|
||||||
if ((pa-thisrun)&1) { \
|
if ((pa - thisrun) & 1) \
|
||||||
for (;;) { /* black first */ \
|
{ \
|
||||||
|
for (;;) \
|
||||||
|
{ /* black first */ \
|
||||||
LOOKUP16(13, TIFFFaxBlackTable, eof2d); \
|
LOOKUP16(13, TIFFFaxBlackTable, eof2d); \
|
||||||
switch (TabEnt->State) { \
|
switch (TabEnt->State) \
|
||||||
|
{ \
|
||||||
case S_TermB: \
|
case S_TermB: \
|
||||||
SETVALUE(TabEnt->Param); \
|
SETVALUE(TabEnt->Param); \
|
||||||
goto doneWhite2da; \
|
goto doneWhite2da; \
|
||||||
@ -434,9 +502,11 @@ done1d: \
|
|||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
doneWhite2da:; \
|
doneWhite2da:; \
|
||||||
for (;;) { /* then white */ \
|
for (;;) \
|
||||||
|
{ /* then white */ \
|
||||||
LOOKUP16(12, TIFFFaxWhiteTable, eof2d); \
|
LOOKUP16(12, TIFFFaxWhiteTable, eof2d); \
|
||||||
switch (TabEnt->State) { \
|
switch (TabEnt->State) \
|
||||||
|
{ \
|
||||||
case S_TermW: \
|
case S_TermW: \
|
||||||
SETVALUE(TabEnt->Param); \
|
SETVALUE(TabEnt->Param); \
|
||||||
goto doneBlack2da; \
|
goto doneBlack2da; \
|
||||||
@ -450,10 +520,14 @@ done1d: \
|
|||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
doneBlack2da:; \
|
doneBlack2da:; \
|
||||||
} else { \
|
} \
|
||||||
for (;;) { /* white first */ \
|
else \
|
||||||
|
{ \
|
||||||
|
for (;;) \
|
||||||
|
{ /* white first */ \
|
||||||
LOOKUP16(12, TIFFFaxWhiteTable, eof2d); \
|
LOOKUP16(12, TIFFFaxWhiteTable, eof2d); \
|
||||||
switch (TabEnt->State) { \
|
switch (TabEnt->State) \
|
||||||
|
{ \
|
||||||
case S_TermW: \
|
case S_TermW: \
|
||||||
SETVALUE(TabEnt->Param); \
|
SETVALUE(TabEnt->Param); \
|
||||||
goto doneWhite2db; \
|
goto doneWhite2db; \
|
||||||
@ -467,9 +541,11 @@ done1d: \
|
|||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
doneWhite2db:; \
|
doneWhite2db:; \
|
||||||
for (;;) { /* then black */ \
|
for (;;) \
|
||||||
|
{ /* then black */ \
|
||||||
LOOKUP16(13, TIFFFaxBlackTable, eof2d); \
|
LOOKUP16(13, TIFFFaxBlackTable, eof2d); \
|
||||||
switch (TabEnt->State) { \
|
switch (TabEnt->State) \
|
||||||
|
{ \
|
||||||
case S_TermB: \
|
case S_TermB: \
|
||||||
SETVALUE(TabEnt->Param); \
|
SETVALUE(TabEnt->Param); \
|
||||||
goto doneBlack2db; \
|
goto doneBlack2db; \
|
||||||
@ -489,9 +565,14 @@ done1d: \
|
|||||||
case S_V0: \
|
case S_V0: \
|
||||||
CHECK_b1; \
|
CHECK_b1; \
|
||||||
SETVALUE(b1 - a0); \
|
SETVALUE(b1 - a0); \
|
||||||
if( pb >= sp->refruns + sp->nruns) { \
|
if (pb >= sp->refruns + sp->nruns) \
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "Buffer overflow at line %u of %s %u", \
|
{ \
|
||||||
sp->line, isTiled(tif) ? "tile" : "strip", isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip); \
|
TIFFErrorExtR(tif, module, \
|
||||||
|
"Buffer overflow at line %u of %s %u", \
|
||||||
|
sp->line, \
|
||||||
|
isTiled(tif) ? "tile" : "strip", \
|
||||||
|
isTiled(tif) ? tif->tif_curtile \
|
||||||
|
: tif->tif_curstrip); \
|
||||||
return (-1); \
|
return (-1); \
|
||||||
} \
|
} \
|
||||||
b1 += *pb++; \
|
b1 += *pb++; \
|
||||||
@ -499,16 +580,22 @@ done1d: \
|
|||||||
case S_VR: \
|
case S_VR: \
|
||||||
CHECK_b1; \
|
CHECK_b1; \
|
||||||
SETVALUE(b1 - a0 + TabEnt->Param); \
|
SETVALUE(b1 - a0 + TabEnt->Param); \
|
||||||
if( pb >= sp->refruns + sp->nruns) { \
|
if (pb >= sp->refruns + sp->nruns) \
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "Buffer overflow at line %u of %s %u", \
|
{ \
|
||||||
sp->line, isTiled(tif) ? "tile" : "strip", isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip); \
|
TIFFErrorExtR(tif, module, \
|
||||||
|
"Buffer overflow at line %u of %s %u", \
|
||||||
|
sp->line, \
|
||||||
|
isTiled(tif) ? "tile" : "strip", \
|
||||||
|
isTiled(tif) ? tif->tif_curtile \
|
||||||
|
: tif->tif_curstrip); \
|
||||||
return (-1); \
|
return (-1); \
|
||||||
} \
|
} \
|
||||||
b1 += *pb++; \
|
b1 += *pb++; \
|
||||||
break; \
|
break; \
|
||||||
case S_VL: \
|
case S_VL: \
|
||||||
CHECK_b1; \
|
CHECK_b1; \
|
||||||
if (b1 < (int) (a0 + TabEnt->Param)) { \
|
if (b1 < (int)(a0 + TabEnt->Param)) \
|
||||||
|
{ \
|
||||||
unexpected("VL", a0); \
|
unexpected("VL", a0); \
|
||||||
goto eol2d; \
|
goto eol2d; \
|
||||||
} \
|
} \
|
||||||
@ -543,8 +630,10 @@ done1d: \
|
|||||||
goto eoflab; \
|
goto eoflab; \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
if (RunLength) { \
|
if (RunLength) \
|
||||||
if (RunLength + a0 < lastx) { \
|
{ \
|
||||||
|
if (RunLength + a0 < lastx) \
|
||||||
|
{ \
|
||||||
/* expect a final V0 */ \
|
/* expect a final V0 */ \
|
||||||
NeedBits8(1, eof2d); \
|
NeedBits8(1, eof2d); \
|
||||||
if (!GetBits(1)) \
|
if (!GetBits(1)) \
|
||||||
@ -557,11 +646,3 @@ eol2d: \
|
|||||||
CLEANUP_RUNS(); \
|
CLEANUP_RUNS(); \
|
||||||
} while (0)
|
} while (0)
|
||||||
#endif /* _FAX3_ */
|
#endif /* _FAX3_ */
|
||||||
/* vim: set ts=8 sts=4 sw=4 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
53
3rdparty/libtiff/tif_flush.c
vendored
53
3rdparty/libtiff/tif_flush.c
vendored
@ -27,8 +27,7 @@
|
|||||||
*/
|
*/
|
||||||
#include "tiffiop.h"
|
#include "tiffiop.h"
|
||||||
|
|
||||||
int
|
int TIFFFlush(TIFF *tif)
|
||||||
TIFFFlush(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
if (tif->tif_mode == O_RDONLY)
|
if (tif->tif_mode == O_RDONLY)
|
||||||
return 1;
|
return 1;
|
||||||
@ -41,16 +40,15 @@ TIFFFlush(TIFF* tif)
|
|||||||
rewrite only that portion of the directory without
|
rewrite only that portion of the directory without
|
||||||
making any other changes */
|
making any other changes */
|
||||||
|
|
||||||
if( (tif->tif_flags & TIFF_DIRTYSTRIP)
|
if ((tif->tif_flags & TIFF_DIRTYSTRIP) &&
|
||||||
&& !(tif->tif_flags & TIFF_DIRTYDIRECT)
|
!(tif->tif_flags & TIFF_DIRTYDIRECT) && tif->tif_mode == O_RDWR)
|
||||||
&& tif->tif_mode == O_RDWR )
|
|
||||||
{
|
{
|
||||||
if (TIFFForceStrileArrayWriting(tif))
|
if (TIFFForceStrileArrayWriting(tif))
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((tif->tif_flags & (TIFF_DIRTYDIRECT|TIFF_DIRTYSTRIP))
|
if ((tif->tif_flags & (TIFF_DIRTYDIRECT | TIFF_DIRTYSTRIP)) &&
|
||||||
&& !TIFFRewriteDirectory(tif))
|
!TIFFRewriteDirectory(tif))
|
||||||
return (0);
|
return (0);
|
||||||
|
|
||||||
return (1);
|
return (1);
|
||||||
@ -82,19 +80,17 @@ int TIFFForceStrileArrayWriting(TIFF* tif)
|
|||||||
|
|
||||||
if (tif->tif_mode == O_RDONLY)
|
if (tif->tif_mode == O_RDONLY)
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
TIFFErrorExtR(tif, tif->tif_name, "File opened in read-only mode");
|
||||||
"File opened in read-only mode");
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (tif->tif_diroff == 0)
|
if (tif->tif_diroff == 0)
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
TIFFErrorExtR(tif, module, "Directory has not yet been written");
|
||||||
"Directory has not yet been written");
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if ((tif->tif_flags & TIFF_DIRTYDIRECT) != 0)
|
if ((tif->tif_flags & TIFF_DIRTYDIRECT) != 0)
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
TIFFErrorExtR(tif, module,
|
||||||
"Directory has changes other than the strile arrays. "
|
"Directory has changes other than the strile arrays. "
|
||||||
"TIFFRewriteDirectory() should be called instead");
|
"TIFFRewriteDirectory() should be called instead");
|
||||||
return 0;
|
return 0;
|
||||||
@ -111,7 +107,7 @@ int TIFFForceStrileArrayWriting(TIFF* tif)
|
|||||||
tif->tif_dir.td_stripbytecount_entry.tdir_type == 0 &&
|
tif->tif_dir.td_stripbytecount_entry.tdir_type == 0 &&
|
||||||
tif->tif_dir.td_stripbytecount_entry.tdir_offset.toff_long8 == 0))
|
tif->tif_dir.td_stripbytecount_entry.tdir_offset.toff_long8 == 0))
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
TIFFErrorExtR(tif, module,
|
||||||
"Function not called together with "
|
"Function not called together with "
|
||||||
"TIFFDeferStrileArrayWriting()");
|
"TIFFDeferStrileArrayWriting()");
|
||||||
return 0;
|
return 0;
|
||||||
@ -122,16 +118,12 @@ int TIFFForceStrileArrayWriting(TIFF* tif)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (_TIFFRewriteField(tif,
|
if (_TIFFRewriteField(tif,
|
||||||
isTiled ? TIFFTAG_TILEOFFSETS :
|
isTiled ? TIFFTAG_TILEOFFSETS : TIFFTAG_STRIPOFFSETS,
|
||||||
TIFFTAG_STRIPOFFSETS,
|
TIFF_LONG8, tif->tif_dir.td_nstrips,
|
||||||
TIFF_LONG8,
|
tif->tif_dir.td_stripoffset_p) &&
|
||||||
tif->tif_dir.td_nstrips,
|
_TIFFRewriteField(
|
||||||
tif->tif_dir.td_stripoffset_p )
|
tif, isTiled ? TIFFTAG_TILEBYTECOUNTS : TIFFTAG_STRIPBYTECOUNTS,
|
||||||
&& _TIFFRewriteField( tif,
|
TIFF_LONG8, tif->tif_dir.td_nstrips,
|
||||||
isTiled ? TIFFTAG_TILEBYTECOUNTS :
|
|
||||||
TIFFTAG_STRIPBYTECOUNTS,
|
|
||||||
TIFF_LONG8,
|
|
||||||
tif->tif_dir.td_nstrips,
|
|
||||||
tif->tif_dir.td_stripbytecount_p))
|
tif->tif_dir.td_stripbytecount_p))
|
||||||
{
|
{
|
||||||
tif->tif_flags &= ~TIFF_DIRTYSTRIP;
|
tif->tif_flags &= ~TIFF_DIRTYSTRIP;
|
||||||
@ -151,24 +143,15 @@ int TIFFForceStrileArrayWriting(TIFF* tif)
|
|||||||
* been writing isn't exactly a an error. Hopefully this doesn't cause
|
* been writing isn't exactly a an error. Hopefully this doesn't cause
|
||||||
* problems for other people.
|
* problems for other people.
|
||||||
*/
|
*/
|
||||||
int
|
int TIFFFlushData(TIFF *tif)
|
||||||
TIFFFlushData(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
if ((tif->tif_flags & TIFF_BEENWRITING) == 0)
|
if ((tif->tif_flags & TIFF_BEENWRITING) == 0)
|
||||||
return (1);
|
return (1);
|
||||||
if (tif->tif_flags & TIFF_POSTENCODE) {
|
if (tif->tif_flags & TIFF_POSTENCODE)
|
||||||
|
{
|
||||||
tif->tif_flags &= ~TIFF_POSTENCODE;
|
tif->tif_flags &= ~TIFF_POSTENCODE;
|
||||||
if (!(*tif->tif_postencode)(tif))
|
if (!(*tif->tif_postencode)(tif))
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
return (TIFFFlushData1(tif));
|
return (TIFFFlushData1(tif));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
2033
3rdparty/libtiff/tif_getimage.c
vendored
2033
3rdparty/libtiff/tif_getimage.c
vendored
File diff suppressed because it is too large
Load Diff
603
3rdparty/libtiff/tif_hash_set.c
vendored
Normal file
603
3rdparty/libtiff/tif_hash_set.c
vendored
Normal file
@ -0,0 +1,603 @@
|
|||||||
|
/**********************************************************************
|
||||||
|
*
|
||||||
|
* Name: tif_hash_set.c
|
||||||
|
* Purpose: Hash set functions.
|
||||||
|
* Author: Even Rouault, <even dot rouault at spatialys.com>
|
||||||
|
*
|
||||||
|
**********************************************************************
|
||||||
|
* Copyright (c) 2008-2009, Even Rouault <even dot rouault at spatialys.com>
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
* copy of this software and associated documentation files (the "Software"),
|
||||||
|
* to deal in the Software without restriction, including without limitation
|
||||||
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
* and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
* Software is furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included
|
||||||
|
* in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
* DEALINGS IN THE SOFTWARE.
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include "tif_config.h"
|
||||||
|
|
||||||
|
#include "tif_hash_set.h"
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/** List element structure. */
|
||||||
|
typedef struct _TIFFList TIFFList;
|
||||||
|
|
||||||
|
/** List element structure. */
|
||||||
|
struct _TIFFList
|
||||||
|
{
|
||||||
|
/*! Pointer to the data object. Should be allocated and freed by the
|
||||||
|
* caller.
|
||||||
|
* */
|
||||||
|
void *pData;
|
||||||
|
/*! Pointer to the next element in list. NULL, if current element is the
|
||||||
|
* last one.
|
||||||
|
*/
|
||||||
|
struct _TIFFList *psNext;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _TIFFHashSet
|
||||||
|
{
|
||||||
|
TIFFHashSetHashFunc fnHashFunc;
|
||||||
|
TIFFHashSetEqualFunc fnEqualFunc;
|
||||||
|
TIFFHashSetFreeEltFunc fnFreeEltFunc;
|
||||||
|
TIFFList **tabList;
|
||||||
|
int nSize;
|
||||||
|
int nIndiceAllocatedSize;
|
||||||
|
int nAllocatedSize;
|
||||||
|
TIFFList *psRecyclingList;
|
||||||
|
int nRecyclingListSize;
|
||||||
|
bool bRehash;
|
||||||
|
#ifdef HASH_DEBUG
|
||||||
|
int nCollisions;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
static const int anPrimes[] = {
|
||||||
|
53, 97, 193, 389, 769, 1543, 3079,
|
||||||
|
6151, 12289, 24593, 49157, 98317, 196613, 393241,
|
||||||
|
786433, 1572869, 3145739, 6291469, 12582917, 25165843, 50331653,
|
||||||
|
100663319, 201326611, 402653189, 805306457, 1610612741};
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
/* TIFFHashSetHashPointer() */
|
||||||
|
/************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hash function for an arbitrary pointer
|
||||||
|
*
|
||||||
|
* @param elt the arbitrary pointer to hash
|
||||||
|
*
|
||||||
|
* @return the hash value of the pointer
|
||||||
|
*/
|
||||||
|
|
||||||
|
static unsigned long TIFFHashSetHashPointer(const void *elt)
|
||||||
|
{
|
||||||
|
return (unsigned long)(uintptr_t)((void *)(elt));
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
/* TIFFHashSetEqualPointer() */
|
||||||
|
/************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Equality function for arbitrary pointers
|
||||||
|
*
|
||||||
|
* @param elt1 the first arbitrary pointer to compare
|
||||||
|
* @param elt2 the second arbitrary pointer to compare
|
||||||
|
*
|
||||||
|
* @return true if the pointers are equal
|
||||||
|
*/
|
||||||
|
|
||||||
|
static bool TIFFHashSetEqualPointer(const void *elt1, const void *elt2)
|
||||||
|
{
|
||||||
|
return elt1 == elt2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
/* TIFFHashSetNew() */
|
||||||
|
/************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new hash set
|
||||||
|
*
|
||||||
|
* The hash function must return a hash value for the elements to insert.
|
||||||
|
* If fnHashFunc is NULL, TIFFHashSetHashPointer will be used.
|
||||||
|
*
|
||||||
|
* The equal function must return if two elements are equal.
|
||||||
|
* If fnEqualFunc is NULL, TIFFHashSetEqualPointer will be used.
|
||||||
|
*
|
||||||
|
* The free function is used to free elements inserted in the hash set,
|
||||||
|
* when the hash set is destroyed, when elements are removed or replaced.
|
||||||
|
* If fnFreeEltFunc is NULL, elements inserted into the hash set will not be
|
||||||
|
* freed.
|
||||||
|
*
|
||||||
|
* @param fnHashFunc hash function. May be NULL.
|
||||||
|
* @param fnEqualFunc equal function. May be NULL.
|
||||||
|
* @param fnFreeEltFunc element free function. May be NULL.
|
||||||
|
*
|
||||||
|
* @return a new hash set
|
||||||
|
*/
|
||||||
|
|
||||||
|
TIFFHashSet *TIFFHashSetNew(TIFFHashSetHashFunc fnHashFunc,
|
||||||
|
TIFFHashSetEqualFunc fnEqualFunc,
|
||||||
|
TIFFHashSetFreeEltFunc fnFreeEltFunc)
|
||||||
|
{
|
||||||
|
TIFFHashSet *set = (TIFFHashSet *)malloc(sizeof(TIFFHashSet));
|
||||||
|
if (set == NULL)
|
||||||
|
return NULL;
|
||||||
|
set->fnHashFunc = fnHashFunc ? fnHashFunc : TIFFHashSetHashPointer;
|
||||||
|
set->fnEqualFunc = fnEqualFunc ? fnEqualFunc : TIFFHashSetEqualPointer;
|
||||||
|
set->fnFreeEltFunc = fnFreeEltFunc;
|
||||||
|
set->nSize = 0;
|
||||||
|
set->tabList = (TIFFList **)(calloc(sizeof(TIFFList *), 53));
|
||||||
|
if (set->tabList == NULL)
|
||||||
|
{
|
||||||
|
free(set);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
set->nIndiceAllocatedSize = 0;
|
||||||
|
set->nAllocatedSize = 53;
|
||||||
|
set->psRecyclingList = NULL;
|
||||||
|
set->nRecyclingListSize = 0;
|
||||||
|
set->bRehash = false;
|
||||||
|
#ifdef HASH_DEBUG
|
||||||
|
set->nCollisions = 0;
|
||||||
|
#endif
|
||||||
|
return set;
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
/* TIFFHashSetSize() */
|
||||||
|
/************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the number of elements inserted in the hash set
|
||||||
|
*
|
||||||
|
* Note: this is not the internal size of the hash set
|
||||||
|
*
|
||||||
|
* @param set the hash set
|
||||||
|
*
|
||||||
|
* @return the number of elements in the hash set
|
||||||
|
*/
|
||||||
|
|
||||||
|
int TIFFHashSetSize(const TIFFHashSet *set)
|
||||||
|
{
|
||||||
|
assert(set != NULL);
|
||||||
|
return set->nSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
/* TIFFHashSetGetNewListElt() */
|
||||||
|
/************************************************************************/
|
||||||
|
|
||||||
|
static TIFFList *TIFFHashSetGetNewListElt(TIFFHashSet *set)
|
||||||
|
{
|
||||||
|
if (set->psRecyclingList)
|
||||||
|
{
|
||||||
|
TIFFList *psRet = set->psRecyclingList;
|
||||||
|
psRet->pData = NULL;
|
||||||
|
set->nRecyclingListSize--;
|
||||||
|
set->psRecyclingList = psRet->psNext;
|
||||||
|
return psRet;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (TIFFList *)malloc(sizeof(TIFFList));
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
/* TIFFHashSetReturnListElt() */
|
||||||
|
/************************************************************************/
|
||||||
|
|
||||||
|
static void TIFFHashSetReturnListElt(TIFFHashSet *set, TIFFList *psList)
|
||||||
|
{
|
||||||
|
if (set->nRecyclingListSize < 128)
|
||||||
|
{
|
||||||
|
psList->psNext = set->psRecyclingList;
|
||||||
|
set->psRecyclingList = psList;
|
||||||
|
set->nRecyclingListSize++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
free(psList);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
/* TIFFHashSetClearInternal() */
|
||||||
|
/************************************************************************/
|
||||||
|
|
||||||
|
static void TIFFHashSetClearInternal(TIFFHashSet *set, bool bFinalize)
|
||||||
|
{
|
||||||
|
assert(set != NULL);
|
||||||
|
for (int i = 0; i < set->nAllocatedSize; i++)
|
||||||
|
{
|
||||||
|
TIFFList *cur = set->tabList[i];
|
||||||
|
while (cur)
|
||||||
|
{
|
||||||
|
if (set->fnFreeEltFunc)
|
||||||
|
set->fnFreeEltFunc(cur->pData);
|
||||||
|
TIFFList *psNext = cur->psNext;
|
||||||
|
if (bFinalize)
|
||||||
|
free(cur);
|
||||||
|
else
|
||||||
|
TIFFHashSetReturnListElt(set, cur);
|
||||||
|
cur = psNext;
|
||||||
|
}
|
||||||
|
set->tabList[i] = NULL;
|
||||||
|
}
|
||||||
|
set->bRehash = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
/* TIFFListDestroy() */
|
||||||
|
/************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destroy a list. Caller responsible for freeing data objects contained in
|
||||||
|
* list elements.
|
||||||
|
*
|
||||||
|
* @param psList pointer to list head.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void TIFFListDestroy(TIFFList *psList)
|
||||||
|
{
|
||||||
|
TIFFList *psCurrent = psList;
|
||||||
|
|
||||||
|
while (psCurrent)
|
||||||
|
{
|
||||||
|
TIFFList *const psNext = psCurrent->psNext;
|
||||||
|
free(psCurrent);
|
||||||
|
psCurrent = psNext;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
/* TIFFHashSetDestroy() */
|
||||||
|
/************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destroys an allocated hash set.
|
||||||
|
*
|
||||||
|
* This function also frees the elements if a free function was
|
||||||
|
* provided at the creation of the hash set.
|
||||||
|
*
|
||||||
|
* @param set the hash set
|
||||||
|
*/
|
||||||
|
|
||||||
|
void TIFFHashSetDestroy(TIFFHashSet *set)
|
||||||
|
{
|
||||||
|
if (set)
|
||||||
|
{
|
||||||
|
TIFFHashSetClearInternal(set, true);
|
||||||
|
free(set->tabList);
|
||||||
|
TIFFListDestroy(set->psRecyclingList);
|
||||||
|
free(set);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef notused
|
||||||
|
/************************************************************************/
|
||||||
|
/* TIFFHashSetClear() */
|
||||||
|
/************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear all elements from a hash set.
|
||||||
|
*
|
||||||
|
* This function also frees the elements if a free function was
|
||||||
|
* provided at the creation of the hash set.
|
||||||
|
*
|
||||||
|
* @param set the hash set
|
||||||
|
*/
|
||||||
|
|
||||||
|
void TIFFHashSetClear(TIFFHashSet *set)
|
||||||
|
{
|
||||||
|
TIFFHashSetClearInternal(set, false);
|
||||||
|
set->nIndiceAllocatedSize = 0;
|
||||||
|
set->nAllocatedSize = 53;
|
||||||
|
#ifdef HASH_DEBUG
|
||||||
|
set->nCollisions = 0;
|
||||||
|
#endif
|
||||||
|
set->nSize = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
/* TIFFHashSetForeach() */
|
||||||
|
/************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Walk through the hash set and runs the provided function on all the
|
||||||
|
* elements
|
||||||
|
*
|
||||||
|
* This function is provided the user_data argument of TIFFHashSetForeach.
|
||||||
|
* It must return true to go on the walk through the hash set, or FALSE to
|
||||||
|
* make it stop.
|
||||||
|
*
|
||||||
|
* Note : the structure of the hash set must *NOT* be modified during the
|
||||||
|
* walk.
|
||||||
|
*
|
||||||
|
* @param set the hash set.
|
||||||
|
* @param fnIterFunc the function called on each element.
|
||||||
|
* @param user_data the user data provided to the function.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void TIFFHashSetForeach(TIFFHashSet *set, TIFFHashSetIterEltFunc fnIterFunc,
|
||||||
|
void *user_data)
|
||||||
|
{
|
||||||
|
assert(set != NULL);
|
||||||
|
if (!fnIterFunc)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (int i = 0; i < set->nAllocatedSize; i++)
|
||||||
|
{
|
||||||
|
TIFFList *cur = set->tabList[i];
|
||||||
|
while (cur)
|
||||||
|
{
|
||||||
|
if (!fnIterFunc(cur->pData, user_data))
|
||||||
|
return;
|
||||||
|
|
||||||
|
cur = cur->psNext;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
/* TIFFHashSetRehash() */
|
||||||
|
/************************************************************************/
|
||||||
|
|
||||||
|
static bool TIFFHashSetRehash(TIFFHashSet *set)
|
||||||
|
{
|
||||||
|
int nNewAllocatedSize = anPrimes[set->nIndiceAllocatedSize];
|
||||||
|
TIFFList **newTabList =
|
||||||
|
(TIFFList **)(calloc(sizeof(TIFFList *), nNewAllocatedSize));
|
||||||
|
if (newTabList == NULL)
|
||||||
|
return false;
|
||||||
|
#ifdef HASH_DEBUG
|
||||||
|
TIFFDebug("TIFFHASH",
|
||||||
|
"hashSet=%p, nSize=%d, nCollisions=%d, "
|
||||||
|
"fCollisionRate=%.02f",
|
||||||
|
set, set->nSize, set->nCollisions,
|
||||||
|
set->nCollisions * 100.0 / set->nSize);
|
||||||
|
set->nCollisions = 0;
|
||||||
|
#endif
|
||||||
|
for (int i = 0; i < set->nAllocatedSize; i++)
|
||||||
|
{
|
||||||
|
TIFFList *cur = set->tabList[i];
|
||||||
|
while (cur)
|
||||||
|
{
|
||||||
|
const unsigned long nNewHashVal =
|
||||||
|
set->fnHashFunc(cur->pData) % nNewAllocatedSize;
|
||||||
|
#ifdef HASH_DEBUG
|
||||||
|
if (newTabList[nNewHashVal])
|
||||||
|
set->nCollisions++;
|
||||||
|
#endif
|
||||||
|
TIFFList *psNext = cur->psNext;
|
||||||
|
cur->psNext = newTabList[nNewHashVal];
|
||||||
|
newTabList[nNewHashVal] = cur;
|
||||||
|
cur = psNext;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(set->tabList);
|
||||||
|
set->tabList = newTabList;
|
||||||
|
set->nAllocatedSize = nNewAllocatedSize;
|
||||||
|
set->bRehash = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
/* TIFFHashSetFindPtr() */
|
||||||
|
/************************************************************************/
|
||||||
|
|
||||||
|
static void **TIFFHashSetFindPtr(TIFFHashSet *set, const void *elt)
|
||||||
|
{
|
||||||
|
const unsigned long nHashVal = set->fnHashFunc(elt) % set->nAllocatedSize;
|
||||||
|
TIFFList *cur = set->tabList[nHashVal];
|
||||||
|
while (cur)
|
||||||
|
{
|
||||||
|
if (set->fnEqualFunc(cur->pData, elt))
|
||||||
|
return &cur->pData;
|
||||||
|
cur = cur->psNext;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
/* TIFFHashSetInsert() */
|
||||||
|
/************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inserts an element into a hash set.
|
||||||
|
*
|
||||||
|
* If the element was already inserted in the hash set, the previous
|
||||||
|
* element is replaced by the new element. If a free function was provided,
|
||||||
|
* it is used to free the previously inserted element
|
||||||
|
*
|
||||||
|
* @param set the hash set
|
||||||
|
* @param elt the new element to insert in the hash set
|
||||||
|
*
|
||||||
|
* @return true if success. If false is returned, elt has not been inserted,
|
||||||
|
* but TIFFHashSetInsert() will have run the free function if provided.
|
||||||
|
*/
|
||||||
|
|
||||||
|
bool TIFFHashSetInsert(TIFFHashSet *set, void *elt)
|
||||||
|
{
|
||||||
|
assert(set != NULL);
|
||||||
|
void **pElt = TIFFHashSetFindPtr(set, elt);
|
||||||
|
if (pElt)
|
||||||
|
{
|
||||||
|
if (set->fnFreeEltFunc)
|
||||||
|
set->fnFreeEltFunc(*pElt);
|
||||||
|
|
||||||
|
*pElt = elt;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (set->nSize >= 2 * set->nAllocatedSize / 3 ||
|
||||||
|
(set->bRehash && set->nIndiceAllocatedSize > 0 &&
|
||||||
|
set->nSize <= set->nAllocatedSize / 2))
|
||||||
|
{
|
||||||
|
set->nIndiceAllocatedSize++;
|
||||||
|
if (!TIFFHashSetRehash(set))
|
||||||
|
{
|
||||||
|
set->nIndiceAllocatedSize--;
|
||||||
|
if (set->fnFreeEltFunc)
|
||||||
|
set->fnFreeEltFunc(elt);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const unsigned long nHashVal = set->fnHashFunc(elt) % set->nAllocatedSize;
|
||||||
|
#ifdef HASH_DEBUG
|
||||||
|
if (set->tabList[nHashVal])
|
||||||
|
set->nCollisions++;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
TIFFList *new_elt = TIFFHashSetGetNewListElt(set);
|
||||||
|
if (new_elt == NULL)
|
||||||
|
{
|
||||||
|
if (set->fnFreeEltFunc)
|
||||||
|
set->fnFreeEltFunc(elt);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
new_elt->pData = elt;
|
||||||
|
new_elt->psNext = set->tabList[nHashVal];
|
||||||
|
set->tabList[nHashVal] = new_elt;
|
||||||
|
set->nSize++;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
/* TIFFHashSetLookup() */
|
||||||
|
/************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the element found in the hash set corresponding to the element to
|
||||||
|
* look up The element must not be modified.
|
||||||
|
*
|
||||||
|
* @param set the hash set
|
||||||
|
* @param elt the element to look up in the hash set
|
||||||
|
*
|
||||||
|
* @return the element found in the hash set or NULL
|
||||||
|
*/
|
||||||
|
|
||||||
|
void *TIFFHashSetLookup(TIFFHashSet *set, const void *elt)
|
||||||
|
{
|
||||||
|
assert(set != NULL);
|
||||||
|
void **pElt = TIFFHashSetFindPtr(set, elt);
|
||||||
|
if (pElt)
|
||||||
|
return *pElt;
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
/* TIFFHashSetRemoveInternal() */
|
||||||
|
/************************************************************************/
|
||||||
|
|
||||||
|
static bool TIFFHashSetRemoveInternal(TIFFHashSet *set, const void *elt,
|
||||||
|
bool bDeferRehash)
|
||||||
|
{
|
||||||
|
assert(set != NULL);
|
||||||
|
if (set->nIndiceAllocatedSize > 0 && set->nSize <= set->nAllocatedSize / 2)
|
||||||
|
{
|
||||||
|
set->nIndiceAllocatedSize--;
|
||||||
|
if (bDeferRehash)
|
||||||
|
set->bRehash = true;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!TIFFHashSetRehash(set))
|
||||||
|
{
|
||||||
|
set->nIndiceAllocatedSize++;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int nHashVal = (int)(set->fnHashFunc(elt) % set->nAllocatedSize);
|
||||||
|
TIFFList *cur = set->tabList[nHashVal];
|
||||||
|
TIFFList *prev = NULL;
|
||||||
|
while (cur)
|
||||||
|
{
|
||||||
|
if (set->fnEqualFunc(cur->pData, elt))
|
||||||
|
{
|
||||||
|
if (prev)
|
||||||
|
prev->psNext = cur->psNext;
|
||||||
|
else
|
||||||
|
set->tabList[nHashVal] = cur->psNext;
|
||||||
|
|
||||||
|
if (set->fnFreeEltFunc)
|
||||||
|
set->fnFreeEltFunc(cur->pData);
|
||||||
|
|
||||||
|
TIFFHashSetReturnListElt(set, cur);
|
||||||
|
#ifdef HASH_DEBUG
|
||||||
|
if (set->tabList[nHashVal])
|
||||||
|
set->nCollisions--;
|
||||||
|
#endif
|
||||||
|
set->nSize--;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
prev = cur;
|
||||||
|
cur = cur->psNext;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
/* TIFFHashSetRemove() */
|
||||||
|
/************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes an element from a hash set
|
||||||
|
*
|
||||||
|
* @param set the hash set
|
||||||
|
* @param elt the new element to remove from the hash set
|
||||||
|
*
|
||||||
|
* @return true if the element was in the hash set
|
||||||
|
*/
|
||||||
|
|
||||||
|
bool TIFFHashSetRemove(TIFFHashSet *set, const void *elt)
|
||||||
|
{
|
||||||
|
return TIFFHashSetRemoveInternal(set, elt, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef notused
|
||||||
|
/************************************************************************/
|
||||||
|
/* TIFFHashSetRemoveDeferRehash() */
|
||||||
|
/************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes an element from a hash set.
|
||||||
|
*
|
||||||
|
* This will defer potential rehashing of the set to later calls to
|
||||||
|
* TIFFHashSetInsert() or TIFFHashSetRemove().
|
||||||
|
*
|
||||||
|
* @param set the hash set
|
||||||
|
* @param elt the new element to remove from the hash set
|
||||||
|
*
|
||||||
|
* @return true if the element was in the hash set
|
||||||
|
*/
|
||||||
|
|
||||||
|
bool TIFFHashSetRemoveDeferRehash(TIFFHashSet *set, const void *elt)
|
||||||
|
{
|
||||||
|
return TIFFHashSetRemoveInternal(set, elt, true);
|
||||||
|
}
|
||||||
|
#endif
|
100
3rdparty/libtiff/tif_hash_set.h
vendored
Normal file
100
3rdparty/libtiff/tif_hash_set.h
vendored
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
/**********************************************************************
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
* Name: tif_hash_set.h
|
||||||
|
* Project: TIFF - Common Portability Library
|
||||||
|
* Purpose: Hash set functions.
|
||||||
|
* Author: Even Rouault, <even dot rouault at spatialys.com>
|
||||||
|
*
|
||||||
|
**********************************************************************
|
||||||
|
* Copyright (c) 2008-2009, Even Rouault <even dot rouault at spatialys.com>
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
* copy of this software and associated documentation files (the "Software"),
|
||||||
|
* to deal in the Software without restriction, including without limitation
|
||||||
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
* and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
* Software is furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included
|
||||||
|
* in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
* DEALINGS IN THE SOFTWARE.
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef TIFF_HASH_SET_H_INCLUDED
|
||||||
|
#define TIFF_HASH_SET_H_INCLUDED
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \file tif_hash_set.h
|
||||||
|
*
|
||||||
|
* Hash set implementation.
|
||||||
|
*
|
||||||
|
* An hash set is a data structure that holds elements that are unique
|
||||||
|
* according to a comparison function. Operations on the hash set, such as
|
||||||
|
* insertion, removal or lookup, are supposed to be fast if an efficient
|
||||||
|
* "hash" function is provided.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Types */
|
||||||
|
|
||||||
|
/** Opaque type for a hash set */
|
||||||
|
typedef struct _TIFFHashSet TIFFHashSet;
|
||||||
|
|
||||||
|
/** TIFFHashSetHashFunc */
|
||||||
|
typedef unsigned long (*TIFFHashSetHashFunc)(const void *elt);
|
||||||
|
|
||||||
|
/** TIFFHashSetEqualFunc */
|
||||||
|
typedef bool (*TIFFHashSetEqualFunc)(const void *elt1, const void *elt2);
|
||||||
|
|
||||||
|
/** TIFFHashSetFreeEltFunc */
|
||||||
|
typedef void (*TIFFHashSetFreeEltFunc)(void *elt);
|
||||||
|
|
||||||
|
/* Functions */
|
||||||
|
|
||||||
|
TIFFHashSet *TIFFHashSetNew(TIFFHashSetHashFunc fnHashFunc,
|
||||||
|
TIFFHashSetEqualFunc fnEqualFunc,
|
||||||
|
TIFFHashSetFreeEltFunc fnFreeEltFunc);
|
||||||
|
|
||||||
|
void TIFFHashSetDestroy(TIFFHashSet *set);
|
||||||
|
|
||||||
|
int TIFFHashSetSize(const TIFFHashSet *set);
|
||||||
|
|
||||||
|
#ifdef notused
|
||||||
|
void TIFFHashSetClear(TIFFHashSet *set);
|
||||||
|
|
||||||
|
/** TIFFHashSetIterEltFunc */
|
||||||
|
typedef int (*TIFFHashSetIterEltFunc)(void *elt, void *user_data);
|
||||||
|
|
||||||
|
void TIFFHashSetForeach(TIFFHashSet *set, TIFFHashSetIterEltFunc fnIterFunc,
|
||||||
|
void *user_data);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
bool TIFFHashSetInsert(TIFFHashSet *set, void *elt);
|
||||||
|
|
||||||
|
void *TIFFHashSetLookup(TIFFHashSet *set, const void *elt);
|
||||||
|
|
||||||
|
bool TIFFHashSetRemove(TIFFHashSet *set, const void *elt);
|
||||||
|
|
||||||
|
#ifdef notused
|
||||||
|
bool TIFFHashSetRemoveDeferRehash(TIFFHashSet *set, const void *elt);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* TIFF_HASH_SET_H_INCLUDED */
|
64
3rdparty/libtiff/tif_jbig.c
vendored
64
3rdparty/libtiff/tif_jbig.c
vendored
@ -39,14 +39,15 @@ static int JBIGSetupDecode(TIFF* tif)
|
|||||||
{
|
{
|
||||||
if (TIFFNumberOfStrips(tif) != 1)
|
if (TIFFNumberOfStrips(tif) != 1)
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, "JBIG", "Multistrip images not supported in decoder");
|
TIFFErrorExtR(tif, "JBIG",
|
||||||
|
"Multistrip images not supported in decoder");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int JBIGDecode(TIFF* tif, uint8* buffer, tmsize_t size, uint16 s)
|
static int JBIGDecode(TIFF *tif, uint8_t *buffer, tmsize_t size, uint16_t s)
|
||||||
{
|
{
|
||||||
struct jbg_dec_state decoder;
|
struct jbg_dec_state decoder;
|
||||||
int decodeStatus = 0;
|
int decodeStatus = 0;
|
||||||
@ -84,9 +85,7 @@ static int JBIGDecode(TIFF* tif, uint8* buffer, tmsize_t size, uint16 s)
|
|||||||
* JBIG-KIT. Since the 2.0 the error reporting functions were
|
* JBIG-KIT. Since the 2.0 the error reporting functions were
|
||||||
* changed. We will handle both cases here.
|
* changed. We will handle both cases here.
|
||||||
*/
|
*/
|
||||||
TIFFErrorExt(tif->tif_clientdata,
|
TIFFErrorExtR(tif, "JBIG", "Error (%d) decoding: %s", decodeStatus,
|
||||||
"JBIG", "Error (%d) decoding: %s",
|
|
||||||
decodeStatus,
|
|
||||||
#if defined(JBG_EN)
|
#if defined(JBG_EN)
|
||||||
jbg_strerror(decodeStatus, JBG_EN)
|
jbg_strerror(decodeStatus, JBG_EN)
|
||||||
#else
|
#else
|
||||||
@ -100,15 +99,17 @@ static int JBIGDecode(TIFF* tif, uint8* buffer, tmsize_t size, uint16 s)
|
|||||||
decodedSize = jbg_dec_getsize(&decoder);
|
decodedSize = jbg_dec_getsize(&decoder);
|
||||||
if ((tmsize_t)decodedSize < size)
|
if ((tmsize_t)decodedSize < size)
|
||||||
{
|
{
|
||||||
TIFFWarningExt(tif->tif_clientdata, "JBIG",
|
TIFFWarningExtR(tif, "JBIG",
|
||||||
"Only decoded %lu bytes, whereas %lu requested",
|
"Only decoded %lu bytes, whereas %" TIFF_SSIZE_FORMAT
|
||||||
decodedSize, (unsigned long)size);
|
" requested",
|
||||||
|
decodedSize, size);
|
||||||
}
|
}
|
||||||
else if ((tmsize_t)decodedSize > size)
|
else if ((tmsize_t)decodedSize > size)
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, "JBIG",
|
TIFFErrorExtR(tif, "JBIG",
|
||||||
"Decoded %lu bytes, whereas %lu were requested",
|
"Decoded %lu bytes, whereas %" TIFF_SSIZE_FORMAT
|
||||||
decodedSize, (unsigned long)size);
|
" were requested",
|
||||||
|
decodedSize, size);
|
||||||
jbg_dec_free(&decoder);
|
jbg_dec_free(&decoder);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -126,14 +127,16 @@ static int JBIGSetupEncode(TIFF* tif)
|
|||||||
{
|
{
|
||||||
if (TIFFNumberOfStrips(tif) != 1)
|
if (TIFFNumberOfStrips(tif) != 1)
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, "JBIG", "Multistrip images not supported in encoder");
|
TIFFErrorExtR(tif, "JBIG",
|
||||||
|
"Multistrip images not supported in encoder");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int JBIGCopyEncodedData(TIFF* tif, unsigned char* pp, size_t cc, uint16 s)
|
static int JBIGCopyEncodedData(TIFF *tif, unsigned char *pp, size_t cc,
|
||||||
|
uint16_t s)
|
||||||
{
|
{
|
||||||
(void)s;
|
(void)s;
|
||||||
while (cc > 0)
|
while (cc > 0)
|
||||||
@ -151,8 +154,7 @@ static int JBIGCopyEncodedData(TIFF* tif, unsigned char* pp, size_t cc, uint16 s
|
|||||||
tif->tif_rawcc += n;
|
tif->tif_rawcc += n;
|
||||||
pp += n;
|
pp += n;
|
||||||
cc -= (size_t)n;
|
cc -= (size_t)n;
|
||||||
if (tif->tif_rawcc >= tif->tif_rawdatasize &&
|
if (tif->tif_rawcc >= tif->tif_rawdatasize && !TIFFFlushData1(tif))
|
||||||
!TIFFFlushData1(tif))
|
|
||||||
{
|
{
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
@ -173,20 +175,15 @@ static void JBIGOutputBie(unsigned char* buffer, size_t len, void* userData)
|
|||||||
JBIGCopyEncodedData(tif, buffer, len, 0);
|
JBIGCopyEncodedData(tif, buffer, len, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int JBIGEncode(TIFF* tif, uint8* buffer, tmsize_t size, uint16 s)
|
static int JBIGEncode(TIFF *tif, uint8_t *buffer, tmsize_t size, uint16_t s)
|
||||||
{
|
{
|
||||||
TIFFDirectory *dir = &tif->tif_dir;
|
TIFFDirectory *dir = &tif->tif_dir;
|
||||||
struct jbg_enc_state encoder;
|
struct jbg_enc_state encoder;
|
||||||
|
|
||||||
(void)size, (void)s;
|
(void)size, (void)s;
|
||||||
|
|
||||||
jbg_enc_init(&encoder,
|
jbg_enc_init(&encoder, dir->td_imagewidth, dir->td_imagelength, 1, &buffer,
|
||||||
dir->td_imagewidth,
|
JBIGOutputBie, tif);
|
||||||
dir->td_imagelength,
|
|
||||||
1,
|
|
||||||
&buffer,
|
|
||||||
JBIGOutputBie,
|
|
||||||
tif);
|
|
||||||
/*
|
/*
|
||||||
* jbg_enc_out does the "real" encoding. As data is encoded,
|
* jbg_enc_out does the "real" encoding. As data is encoded,
|
||||||
* JBIGOutputBie is called, which writes the data to the directory.
|
* JBIGOutputBie is called, which writes the data to the directory.
|
||||||
@ -209,6 +206,17 @@ int TIFFInitJBIG(TIFF* tif, int scheme)
|
|||||||
*/
|
*/
|
||||||
tif->tif_flags |= TIFF_NOBITREV;
|
tif->tif_flags |= TIFF_NOBITREV;
|
||||||
tif->tif_flags &= ~TIFF_MAPPED;
|
tif->tif_flags &= ~TIFF_MAPPED;
|
||||||
|
/* We may have read from a previous IFD and thus set TIFF_BUFFERMMAP and
|
||||||
|
* cleared TIFF_MYBUFFER. It is necessary to restore them to their initial
|
||||||
|
* value to be consistent with the state of a non-memory mapped file.
|
||||||
|
*/
|
||||||
|
if (tif->tif_flags & TIFF_BUFFERMMAP)
|
||||||
|
{
|
||||||
|
tif->tif_rawdata = NULL;
|
||||||
|
tif->tif_rawdatasize = 0;
|
||||||
|
tif->tif_flags &= ~TIFF_BUFFERMMAP;
|
||||||
|
tif->tif_flags |= TIFF_MYBUFFER;
|
||||||
|
}
|
||||||
|
|
||||||
/* Setup the function pointers for encode, decode, and cleanup. */
|
/* Setup the function pointers for encode, decode, and cleanup. */
|
||||||
tif->tif_setupdecode = JBIGSetupDecode;
|
tif->tif_setupdecode = JBIGSetupDecode;
|
||||||
@ -221,13 +229,3 @@ int TIFFInitJBIG(TIFF* tif, int scheme)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif /* JBIG_SUPPORT */
|
#endif /* JBIG_SUPPORT */
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
1537
3rdparty/libtiff/tif_jpeg.c
vendored
1537
3rdparty/libtiff/tif_jpeg.c
vendored
File diff suppressed because it is too large
Load Diff
78
3rdparty/libtiff/tif_jpeg_12.c
vendored
78
3rdparty/libtiff/tif_jpeg_12.c
vendored
@ -1,56 +1,58 @@
|
|||||||
|
|
||||||
#include "tiffiop.h"
|
#include "tiffiop.h"
|
||||||
|
|
||||||
|
#if defined(HAVE_JPEGTURBO_DUAL_MODE_8_12)
|
||||||
|
#define JPEG_DUAL_MODE_8_12
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(JPEG_DUAL_MODE_8_12)
|
#if defined(JPEG_DUAL_MODE_8_12)
|
||||||
|
|
||||||
|
#define FROM_TIF_JPEG_12
|
||||||
|
|
||||||
|
#ifdef TIFFInitJPEG
|
||||||
|
#undef TIFFInitJPEG
|
||||||
|
#endif
|
||||||
#define TIFFInitJPEG TIFFInitJPEG_12
|
#define TIFFInitJPEG TIFFInitJPEG_12
|
||||||
|
|
||||||
|
#ifdef TIFFJPEGIsFullStripRequired
|
||||||
|
#undef TIFFJPEGIsFullStripRequired
|
||||||
|
#endif
|
||||||
#define TIFFJPEGIsFullStripRequired TIFFJPEGIsFullStripRequired_12
|
#define TIFFJPEGIsFullStripRequired TIFFJPEGIsFullStripRequired_12
|
||||||
|
|
||||||
int
|
int TIFFInitJPEG_12(TIFF *tif, int scheme);
|
||||||
TIFFInitJPEG_12(TIFF* tif, int scheme);
|
|
||||||
|
|
||||||
|
#if !defined(HAVE_JPEGTURBO_DUAL_MODE_8_12)
|
||||||
#include LIBJPEG_12_PATH
|
#include LIBJPEG_12_PATH
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "tif_jpeg.c"
|
#include "tif_jpeg.c"
|
||||||
|
|
||||||
int TIFFReInitJPEG_12( TIFF *tif, int scheme, int is_encode )
|
int TIFFReInitJPEG_12(TIFF *tif, const JPEGOtherSettings *otherSettings,
|
||||||
|
int scheme, int is_encode)
|
||||||
{
|
{
|
||||||
JPEGState *sp;
|
JPEGState *sp;
|
||||||
|
uint8_t *new_tif_data;
|
||||||
|
|
||||||
|
(void)scheme;
|
||||||
assert(scheme == COMPRESSION_JPEG);
|
assert(scheme == COMPRESSION_JPEG);
|
||||||
|
|
||||||
|
new_tif_data =
|
||||||
|
(uint8_t *)_TIFFreallocExt(tif, tif->tif_data, sizeof(JPEGState));
|
||||||
|
|
||||||
|
if (new_tif_data == NULL)
|
||||||
|
{
|
||||||
|
TIFFErrorExtR(tif, "TIFFReInitJPEG_12",
|
||||||
|
"No space for JPEG state block");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
tif->tif_data = new_tif_data;
|
||||||
|
_TIFFmemset(tif->tif_data, 0, sizeof(JPEGState));
|
||||||
|
|
||||||
|
TIFFInitJPEGCommon(tif);
|
||||||
|
|
||||||
sp = JState(tif);
|
sp = JState(tif);
|
||||||
sp->tif = tif; /* back link */
|
sp->otherSettings = *otherSettings;
|
||||||
|
|
||||||
/*
|
|
||||||
* Override parent get/set field methods.
|
|
||||||
*/
|
|
||||||
tif->tif_tagmethods.vgetfield = JPEGVGetField; /* hook for codec tags */
|
|
||||||
tif->tif_tagmethods.vsetfield = JPEGVSetField; /* hook for codec tags */
|
|
||||||
tif->tif_tagmethods.printdir = JPEGPrintDir; /* hook for codec tags */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Install codec methods.
|
|
||||||
*/
|
|
||||||
tif->tif_fixuptags = JPEGFixupTags;
|
|
||||||
tif->tif_setupdecode = JPEGSetupDecode;
|
|
||||||
tif->tif_predecode = JPEGPreDecode;
|
|
||||||
tif->tif_decoderow = JPEGDecode;
|
|
||||||
tif->tif_decodestrip = JPEGDecode;
|
|
||||||
tif->tif_decodetile = JPEGDecode;
|
|
||||||
tif->tif_setupencode = JPEGSetupEncode;
|
|
||||||
tif->tif_preencode = JPEGPreEncode;
|
|
||||||
tif->tif_postencode = JPEGPostEncode;
|
|
||||||
tif->tif_encoderow = JPEGEncode;
|
|
||||||
tif->tif_encodestrip = JPEGEncode;
|
|
||||||
tif->tif_encodetile = JPEGEncode;
|
|
||||||
tif->tif_cleanup = JPEGCleanup;
|
|
||||||
tif->tif_defstripsize = JPEGDefaultStripSize;
|
|
||||||
tif->tif_deftilesize = JPEGDefaultTileSize;
|
|
||||||
tif->tif_flags |= TIFF_NOBITREV; /* no bit reversal, please */
|
|
||||||
|
|
||||||
sp->cinfo_initialized = FALSE;
|
|
||||||
|
|
||||||
if (is_encode)
|
if (is_encode)
|
||||||
return JPEGSetupEncode(tif);
|
return JPEGSetupEncode(tif);
|
||||||
@ -59,11 +61,3 @@ int TIFFReInitJPEG_12( TIFF *tif, int scheme, int is_encode )
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif /* defined(JPEG_DUAL_MODE_8_12) */
|
#endif /* defined(JPEG_DUAL_MODE_8_12) */
|
||||||
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
1206
3rdparty/libtiff/tif_lerc.c
vendored
Normal file
1206
3rdparty/libtiff/tif_lerc.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
844
3rdparty/libtiff/tif_luv.c
vendored
844
3rdparty/libtiff/tif_luv.c
vendored
File diff suppressed because it is too large
Load Diff
211
3rdparty/libtiff/tif_lzma.c
vendored
211
3rdparty/libtiff/tif_lzma.c
vendored
@ -33,15 +33,16 @@
|
|||||||
* The codec is derived from ZLIB codec (tif_zip.c).
|
* The codec is derived from ZLIB codec (tif_zip.c).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "tif_predict.h"
|
|
||||||
#include "lzma.h"
|
#include "lzma.h"
|
||||||
|
#include "tif_predict.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* State block for each open TIFF file using LZMA2 compression/decompression.
|
* State block for each open TIFF file using LZMA2 compression/decompression.
|
||||||
*/
|
*/
|
||||||
typedef struct {
|
typedef struct
|
||||||
|
{
|
||||||
TIFFPredictorState predict;
|
TIFFPredictorState predict;
|
||||||
lzma_stream stream;
|
lzma_stream stream;
|
||||||
lzma_filter filters[LZMA_FILTERS_MAX + 1];
|
lzma_filter filters[LZMA_FILTERS_MAX + 1];
|
||||||
@ -61,13 +62,13 @@ typedef struct {
|
|||||||
#define DecoderState(tif) LState(tif)
|
#define DecoderState(tif) LState(tif)
|
||||||
#define EncoderState(tif) LState(tif)
|
#define EncoderState(tif) LState(tif)
|
||||||
|
|
||||||
static int LZMAEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s);
|
static int LZMAEncode(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s);
|
||||||
static int LZMADecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s);
|
static int LZMADecode(TIFF *tif, uint8_t *op, tmsize_t occ, uint16_t s);
|
||||||
|
|
||||||
static const char *
|
static const char *LZMAStrerror(lzma_ret ret)
|
||||||
LZMAStrerror(lzma_ret ret)
|
{
|
||||||
|
switch (ret)
|
||||||
{
|
{
|
||||||
switch (ret) {
|
|
||||||
case LZMA_OK:
|
case LZMA_OK:
|
||||||
return "operation completed successfully";
|
return "operation completed successfully";
|
||||||
case LZMA_STREAM_END:
|
case LZMA_STREAM_END:
|
||||||
@ -97,22 +98,21 @@ LZMAStrerror(lzma_ret ret)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int LZMAFixupTags(TIFF *tif)
|
||||||
LZMAFixupTags(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
(void)tif;
|
(void)tif;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int LZMASetupDecode(TIFF *tif)
|
||||||
LZMASetupDecode(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
LZMAState *sp = DecoderState(tif);
|
LZMAState *sp = DecoderState(tif);
|
||||||
|
|
||||||
assert(sp != NULL);
|
assert(sp != NULL);
|
||||||
|
|
||||||
/* if we were last encoding, terminate this mode */
|
/* if we were last encoding, terminate this mode */
|
||||||
if (sp->state & LSTATE_INIT_ENCODE) {
|
if (sp->state & LSTATE_INIT_ENCODE)
|
||||||
|
{
|
||||||
lzma_end(&sp->stream);
|
lzma_end(&sp->stream);
|
||||||
sp->state = 0;
|
sp->state = 0;
|
||||||
}
|
}
|
||||||
@ -124,8 +124,7 @@ LZMASetupDecode(TIFF* tif)
|
|||||||
/*
|
/*
|
||||||
* Setup state for decoding a strip.
|
* Setup state for decoding a strip.
|
||||||
*/
|
*/
|
||||||
static int
|
static int LZMAPreDecode(TIFF *tif, uint16_t s)
|
||||||
LZMAPreDecode(TIFF* tif, uint16 s)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "LZMAPreDecode";
|
static const char module[] = "LZMAPreDecode";
|
||||||
LZMAState *sp = DecoderState(tif);
|
LZMAState *sp = DecoderState(tif);
|
||||||
@ -139,8 +138,9 @@ LZMAPreDecode(TIFF* tif, uint16 s)
|
|||||||
|
|
||||||
sp->stream.next_in = tif->tif_rawdata;
|
sp->stream.next_in = tif->tif_rawdata;
|
||||||
sp->stream.avail_in = (size_t)tif->tif_rawcc;
|
sp->stream.avail_in = (size_t)tif->tif_rawcc;
|
||||||
if ((tmsize_t)sp->stream.avail_in != tif->tif_rawcc) {
|
if ((tmsize_t)sp->stream.avail_in != tif->tif_rawcc)
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
|
TIFFErrorExtR(tif, module,
|
||||||
"Liblzma cannot deal with buffers this size");
|
"Liblzma cannot deal with buffers this size");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -150,17 +150,16 @@ LZMAPreDecode(TIFF* tif, uint16 s)
|
|||||||
* the limit, we are passing (uint64_t)-1 which should be the same.
|
* the limit, we are passing (uint64_t)-1 which should be the same.
|
||||||
*/
|
*/
|
||||||
ret = lzma_stream_decoder(&sp->stream, (uint64_t)-1, 0);
|
ret = lzma_stream_decoder(&sp->stream, (uint64_t)-1, 0);
|
||||||
if (ret != LZMA_OK) {
|
if (ret != LZMA_OK)
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
"Error initializing the stream decoder, %s",
|
TIFFErrorExtR(tif, module, "Error initializing the stream decoder, %s",
|
||||||
LZMAStrerror(ret));
|
LZMAStrerror(ret));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int LZMADecode(TIFF *tif, uint8_t *op, tmsize_t occ, uint16_t s)
|
||||||
LZMADecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "LZMADecode";
|
static const char module[] = "LZMADecode";
|
||||||
LZMAState *sp = DecoderState(tif);
|
LZMAState *sp = DecoderState(tif);
|
||||||
@ -174,13 +173,15 @@ LZMADecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s)
|
|||||||
|
|
||||||
sp->stream.next_out = op;
|
sp->stream.next_out = op;
|
||||||
sp->stream.avail_out = (size_t)occ;
|
sp->stream.avail_out = (size_t)occ;
|
||||||
if ((tmsize_t)sp->stream.avail_out != occ) {
|
if ((tmsize_t)sp->stream.avail_out != occ)
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
|
TIFFErrorExtR(tif, module,
|
||||||
"Liblzma cannot deal with buffers this size");
|
"Liblzma cannot deal with buffers this size");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
do {
|
do
|
||||||
|
{
|
||||||
/*
|
/*
|
||||||
* Save the current stream state to properly recover from the
|
* Save the current stream state to properly recover from the
|
||||||
* decoding errors later.
|
* decoding errors later.
|
||||||
@ -191,11 +192,13 @@ LZMADecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s)
|
|||||||
lzma_ret ret = lzma_code(&sp->stream, LZMA_RUN);
|
lzma_ret ret = lzma_code(&sp->stream, LZMA_RUN);
|
||||||
if (ret == LZMA_STREAM_END)
|
if (ret == LZMA_STREAM_END)
|
||||||
break;
|
break;
|
||||||
if (ret == LZMA_MEMLIMIT_ERROR) {
|
if (ret == LZMA_MEMLIMIT_ERROR)
|
||||||
lzma_ret r = lzma_stream_decoder(&sp->stream,
|
{
|
||||||
lzma_memusage(&sp->stream), 0);
|
lzma_ret r =
|
||||||
if (r != LZMA_OK) {
|
lzma_stream_decoder(&sp->stream, lzma_memusage(&sp->stream), 0);
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
if (r != LZMA_OK)
|
||||||
|
{
|
||||||
|
TIFFErrorExtR(tif, module,
|
||||||
"Error initializing the stream decoder, %s",
|
"Error initializing the stream decoder, %s",
|
||||||
LZMAStrerror(r));
|
LZMAStrerror(r));
|
||||||
break;
|
break;
|
||||||
@ -204,33 +207,36 @@ LZMADecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s)
|
|||||||
sp->stream.avail_in = avail_in;
|
sp->stream.avail_in = avail_in;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (ret != LZMA_OK) {
|
if (ret != LZMA_OK)
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
"Decoding error at scanline %lu, %s",
|
TIFFErrorExtR(tif, module,
|
||||||
(unsigned long) tif->tif_row, LZMAStrerror(ret));
|
"Decoding error at scanline %" PRIu32 ", %s",
|
||||||
|
tif->tif_row, LZMAStrerror(ret));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} while (sp->stream.avail_out > 0);
|
} while (sp->stream.avail_out > 0);
|
||||||
if (sp->stream.avail_out != 0) {
|
if (sp->stream.avail_out != 0)
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
"Not enough data at scanline %lu (short %lu bytes)",
|
TIFFErrorExtR(tif, module,
|
||||||
(unsigned long) tif->tif_row, (unsigned long) sp->stream.avail_out);
|
"Not enough data at scanline %" PRIu32
|
||||||
|
" (short %" TIFF_SIZE_FORMAT " bytes)",
|
||||||
|
tif->tif_row, sp->stream.avail_out);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
tif->tif_rawcp = (uint8 *)sp->stream.next_in; /* cast away const */
|
tif->tif_rawcp = (uint8_t *)sp->stream.next_in; /* cast away const */
|
||||||
tif->tif_rawcc = sp->stream.avail_in;
|
tif->tif_rawcc = sp->stream.avail_in;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int LZMASetupEncode(TIFF *tif)
|
||||||
LZMASetupEncode(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
LZMAState *sp = EncoderState(tif);
|
LZMAState *sp = EncoderState(tif);
|
||||||
|
|
||||||
assert(sp != NULL);
|
assert(sp != NULL);
|
||||||
if (sp->state & LSTATE_INIT_DECODE) {
|
if (sp->state & LSTATE_INIT_DECODE)
|
||||||
|
{
|
||||||
lzma_end(&sp->stream);
|
lzma_end(&sp->stream);
|
||||||
sp->state = 0;
|
sp->state = 0;
|
||||||
}
|
}
|
||||||
@ -242,8 +248,7 @@ LZMASetupEncode(TIFF* tif)
|
|||||||
/*
|
/*
|
||||||
* Reset encoding state at the start of a strip.
|
* Reset encoding state at the start of a strip.
|
||||||
*/
|
*/
|
||||||
static int
|
static int LZMAPreEncode(TIFF *tif, uint16_t s)
|
||||||
LZMAPreEncode(TIFF* tif, uint16 s)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "LZMAPreEncode";
|
static const char module[] = "LZMAPreEncode";
|
||||||
LZMAState *sp = EncoderState(tif);
|
LZMAState *sp = EncoderState(tif);
|
||||||
@ -256,15 +261,17 @@ LZMAPreEncode(TIFF* tif, uint16 s)
|
|||||||
|
|
||||||
sp->stream.next_out = tif->tif_rawdata;
|
sp->stream.next_out = tif->tif_rawdata;
|
||||||
sp->stream.avail_out = (size_t)tif->tif_rawdatasize;
|
sp->stream.avail_out = (size_t)tif->tif_rawdatasize;
|
||||||
if ((tmsize_t)sp->stream.avail_out != tif->tif_rawdatasize) {
|
if ((tmsize_t)sp->stream.avail_out != tif->tif_rawdatasize)
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
|
TIFFErrorExtR(tif, module,
|
||||||
"Liblzma cannot deal with buffers this size");
|
"Liblzma cannot deal with buffers this size");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
ret = lzma_stream_encoder(&sp->stream, sp->filters, sp->check);
|
ret = lzma_stream_encoder(&sp->stream, sp->filters, sp->check);
|
||||||
if (ret != LZMA_OK) {
|
if (ret != LZMA_OK)
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
"Error in lzma_stream_encoder(): %s", LZMAStrerror(ret));
|
TIFFErrorExtR(tif, module, "Error in lzma_stream_encoder(): %s",
|
||||||
|
LZMAStrerror(ret));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
@ -273,8 +280,7 @@ LZMAPreEncode(TIFF* tif, uint16 s)
|
|||||||
/*
|
/*
|
||||||
* Encode a chunk of pixels.
|
* Encode a chunk of pixels.
|
||||||
*/
|
*/
|
||||||
static int
|
static int LZMAEncode(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s)
|
||||||
LZMAEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "LZMAEncode";
|
static const char module[] = "LZMAEncode";
|
||||||
LZMAState *sp = EncoderState(tif);
|
LZMAState *sp = EncoderState(tif);
|
||||||
@ -285,25 +291,32 @@ LZMAEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
|
|||||||
(void)s;
|
(void)s;
|
||||||
sp->stream.next_in = bp;
|
sp->stream.next_in = bp;
|
||||||
sp->stream.avail_in = (size_t)cc;
|
sp->stream.avail_in = (size_t)cc;
|
||||||
if ((tmsize_t)sp->stream.avail_in != cc) {
|
if ((tmsize_t)sp->stream.avail_in != cc)
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
|
TIFFErrorExtR(tif, module,
|
||||||
"Liblzma cannot deal with buffers this size");
|
"Liblzma cannot deal with buffers this size");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
do {
|
do
|
||||||
|
{
|
||||||
lzma_ret ret = lzma_code(&sp->stream, LZMA_RUN);
|
lzma_ret ret = lzma_code(&sp->stream, LZMA_RUN);
|
||||||
if (ret != LZMA_OK) {
|
if (ret != LZMA_OK)
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
"Encoding error at scanline %lu, %s",
|
TIFFErrorExtR(tif, module,
|
||||||
(unsigned long) tif->tif_row, LZMAStrerror(ret));
|
"Encoding error at scanline %" PRIu32 ", %s",
|
||||||
|
tif->tif_row, LZMAStrerror(ret));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (sp->stream.avail_out == 0) {
|
if (sp->stream.avail_out == 0)
|
||||||
|
{
|
||||||
tif->tif_rawcc = tif->tif_rawdatasize;
|
tif->tif_rawcc = tif->tif_rawdatasize;
|
||||||
if (!TIFFFlushData1(tif))
|
if (!TIFFFlushData1(tif))
|
||||||
return 0;
|
return 0;
|
||||||
sp->stream.next_out = tif->tif_rawdata;
|
sp->stream.next_out = tif->tif_rawdata;
|
||||||
sp->stream.avail_out = (size_t)tif->tif_rawdatasize; /* this is a safe typecast, as check is made already in LZMAPreEncode */
|
sp->stream.avail_out =
|
||||||
|
(size_t)
|
||||||
|
tif->tif_rawdatasize; /* this is a safe typecast, as check
|
||||||
|
is made already in LZMAPreEncode */
|
||||||
}
|
}
|
||||||
} while (sp->stream.avail_in > 0);
|
} while (sp->stream.avail_in > 0);
|
||||||
return 1;
|
return 1;
|
||||||
@ -313,30 +326,36 @@ LZMAEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
|
|||||||
* Finish off an encoded strip by flushing the last
|
* Finish off an encoded strip by flushing the last
|
||||||
* string and tacking on an End Of Information code.
|
* string and tacking on an End Of Information code.
|
||||||
*/
|
*/
|
||||||
static int
|
static int LZMAPostEncode(TIFF *tif)
|
||||||
LZMAPostEncode(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "LZMAPostEncode";
|
static const char module[] = "LZMAPostEncode";
|
||||||
LZMAState *sp = EncoderState(tif);
|
LZMAState *sp = EncoderState(tif);
|
||||||
lzma_ret ret;
|
lzma_ret ret;
|
||||||
|
|
||||||
sp->stream.avail_in = 0;
|
sp->stream.avail_in = 0;
|
||||||
do {
|
do
|
||||||
|
{
|
||||||
ret = lzma_code(&sp->stream, LZMA_FINISH);
|
ret = lzma_code(&sp->stream, LZMA_FINISH);
|
||||||
switch (ret) {
|
switch (ret)
|
||||||
|
{
|
||||||
case LZMA_STREAM_END:
|
case LZMA_STREAM_END:
|
||||||
case LZMA_OK:
|
case LZMA_OK:
|
||||||
if ((tmsize_t)sp->stream.avail_out != tif->tif_rawdatasize) {
|
if ((tmsize_t)sp->stream.avail_out != tif->tif_rawdatasize)
|
||||||
|
{
|
||||||
tif->tif_rawcc =
|
tif->tif_rawcc =
|
||||||
tif->tif_rawdatasize - sp->stream.avail_out;
|
tif->tif_rawdatasize - sp->stream.avail_out;
|
||||||
if (!TIFFFlushData1(tif))
|
if (!TIFFFlushData1(tif))
|
||||||
return 0;
|
return 0;
|
||||||
sp->stream.next_out = tif->tif_rawdata;
|
sp->stream.next_out = tif->tif_rawdata;
|
||||||
sp->stream.avail_out = (size_t)tif->tif_rawdatasize; /* this is a safe typecast, as check is made already in ZIPPreEncode */
|
sp->stream.avail_out =
|
||||||
|
(size_t)
|
||||||
|
tif->tif_rawdatasize; /* this is a safe typecast, as
|
||||||
|
check is made already in
|
||||||
|
ZIPPreEncode */
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "Liblzma error: %s",
|
TIFFErrorExtR(tif, module, "Liblzma error: %s",
|
||||||
LZMAStrerror(ret));
|
LZMAStrerror(ret));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -344,8 +363,7 @@ LZMAPostEncode(TIFF* tif)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void LZMACleanup(TIFF *tif)
|
||||||
LZMACleanup(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
LZMAState *sp = LState(tif);
|
LZMAState *sp = LState(tif);
|
||||||
|
|
||||||
@ -356,33 +374,34 @@ LZMACleanup(TIFF* tif)
|
|||||||
tif->tif_tagmethods.vgetfield = sp->vgetparent;
|
tif->tif_tagmethods.vgetfield = sp->vgetparent;
|
||||||
tif->tif_tagmethods.vsetfield = sp->vsetparent;
|
tif->tif_tagmethods.vsetfield = sp->vsetparent;
|
||||||
|
|
||||||
if (sp->state) {
|
if (sp->state)
|
||||||
|
{
|
||||||
lzma_end(&sp->stream);
|
lzma_end(&sp->stream);
|
||||||
sp->state = 0;
|
sp->state = 0;
|
||||||
}
|
}
|
||||||
_TIFFfree(sp);
|
_TIFFfreeExt(tif, sp);
|
||||||
tif->tif_data = NULL;
|
tif->tif_data = NULL;
|
||||||
|
|
||||||
_TIFFSetDefaultCompressionState(tif);
|
_TIFFSetDefaultCompressionState(tif);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int LZMAVSetField(TIFF *tif, uint32_t tag, va_list ap)
|
||||||
LZMAVSetField(TIFF* tif, uint32 tag, va_list ap)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "LZMAVSetField";
|
static const char module[] = "LZMAVSetField";
|
||||||
LZMAState *sp = LState(tif);
|
LZMAState *sp = LState(tif);
|
||||||
|
|
||||||
switch (tag) {
|
switch (tag)
|
||||||
|
{
|
||||||
case TIFFTAG_LZMAPRESET:
|
case TIFFTAG_LZMAPRESET:
|
||||||
sp->preset = (int)va_arg(ap, int);
|
sp->preset = (int)va_arg(ap, int);
|
||||||
lzma_lzma_preset(&sp->opt_lzma, sp->preset);
|
lzma_lzma_preset(&sp->opt_lzma, sp->preset);
|
||||||
if (sp->state & LSTATE_INIT_ENCODE) {
|
if (sp->state & LSTATE_INIT_ENCODE)
|
||||||
lzma_ret ret = lzma_stream_encoder(&sp->stream,
|
{
|
||||||
sp->filters,
|
lzma_ret ret =
|
||||||
sp->check);
|
lzma_stream_encoder(&sp->stream, sp->filters, sp->check);
|
||||||
if (ret != LZMA_OK) {
|
if (ret != LZMA_OK)
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
"Liblzma error: %s",
|
TIFFErrorExtR(tif, module, "Liblzma error: %s",
|
||||||
LZMAStrerror(ret));
|
LZMAStrerror(ret));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -393,12 +412,12 @@ LZMAVSetField(TIFF* tif, uint32 tag, va_list ap)
|
|||||||
/*NOTREACHED*/
|
/*NOTREACHED*/
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int LZMAVGetField(TIFF *tif, uint32_t tag, va_list ap)
|
||||||
LZMAVGetField(TIFF* tif, uint32 tag, va_list ap)
|
|
||||||
{
|
{
|
||||||
LZMAState *sp = LState(tif);
|
LZMAState *sp = LState(tif);
|
||||||
|
|
||||||
switch (tag) {
|
switch (tag)
|
||||||
|
{
|
||||||
case TIFFTAG_LZMAPRESET:
|
case TIFFTAG_LZMAPRESET:
|
||||||
*va_arg(ap, int *) = sp->preset;
|
*va_arg(ap, int *) = sp->preset;
|
||||||
break;
|
break;
|
||||||
@ -409,12 +428,12 @@ LZMAVGetField(TIFF* tif, uint32 tag, va_list ap)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static const TIFFField lzmaFields[] = {
|
static const TIFFField lzmaFields[] = {
|
||||||
{ TIFFTAG_LZMAPRESET, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT, TIFF_SETGET_UNDEFINED,
|
{TIFFTAG_LZMAPRESET, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT,
|
||||||
FIELD_PSEUDO, TRUE, FALSE, "LZMA2 Compression Preset", NULL },
|
TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE,
|
||||||
|
"LZMA2 Compression Preset", NULL},
|
||||||
};
|
};
|
||||||
|
|
||||||
int
|
int TIFFInitLZMA(TIFF *tif, int scheme)
|
||||||
TIFFInitLZMA(TIFF* tif, int scheme)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "TIFFInitLZMA";
|
static const char module[] = "TIFFInitLZMA";
|
||||||
LZMAState *sp;
|
LZMAState *sp;
|
||||||
@ -426,16 +445,16 @@ TIFFInitLZMA(TIFF* tif, int scheme)
|
|||||||
/*
|
/*
|
||||||
* Merge codec-specific tag information.
|
* Merge codec-specific tag information.
|
||||||
*/
|
*/
|
||||||
if (!_TIFFMergeFields(tif, lzmaFields, TIFFArrayCount(lzmaFields))) {
|
if (!_TIFFMergeFields(tif, lzmaFields, TIFFArrayCount(lzmaFields)))
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
"Merging LZMA2 codec-specific tags failed");
|
TIFFErrorExtR(tif, module, "Merging LZMA2 codec-specific tags failed");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Allocate state block so tag methods have storage to record values.
|
* Allocate state block so tag methods have storage to record values.
|
||||||
*/
|
*/
|
||||||
tif->tif_data = (uint8*) _TIFFmalloc(sizeof(LZMAState));
|
tif->tif_data = (uint8_t *)_TIFFmallocExt(tif, sizeof(LZMAState));
|
||||||
if (tif->tif_data == NULL)
|
if (tif->tif_data == NULL)
|
||||||
goto bad;
|
goto bad;
|
||||||
sp = LState(tif);
|
sp = LState(tif);
|
||||||
@ -460,8 +479,9 @@ TIFFInitLZMA(TIFF* tif, int scheme)
|
|||||||
* The sample size in bytes seems to be reasonable distance for delta
|
* The sample size in bytes seems to be reasonable distance for delta
|
||||||
* filter.
|
* filter.
|
||||||
*/
|
*/
|
||||||
sp->opt_delta.dist = (tif->tif_dir.td_bitspersample % 8) ?
|
sp->opt_delta.dist = (tif->tif_dir.td_bitspersample % 8)
|
||||||
1 : tif->tif_dir.td_bitspersample / 8;
|
? 1
|
||||||
|
: tif->tif_dir.td_bitspersample / 8;
|
||||||
sp->filters[0].id = LZMA_FILTER_DELTA;
|
sp->filters[0].id = LZMA_FILTER_DELTA;
|
||||||
sp->filters[0].options = &sp->opt_delta;
|
sp->filters[0].options = &sp->opt_delta;
|
||||||
|
|
||||||
@ -494,10 +514,7 @@ TIFFInitLZMA(TIFF* tif, int scheme)
|
|||||||
(void)TIFFPredictorInit(tif);
|
(void)TIFFPredictorInit(tif);
|
||||||
return 1;
|
return 1;
|
||||||
bad:
|
bad:
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
TIFFErrorExtR(tif, module, "No space for LZMA2 state block");
|
||||||
"No space for LZMA2 state block");
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif /* LZMA_SUPPORT */
|
#endif /* LZMA_SUPPORT */
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
|
966
3rdparty/libtiff/tif_lzw.c
vendored
966
3rdparty/libtiff/tif_lzw.c
vendored
File diff suppressed because it is too large
Load Diff
85
3rdparty/libtiff/tif_next.c
vendored
85
3rdparty/libtiff/tif_next.c
vendored
@ -30,12 +30,23 @@
|
|||||||
* NeXT 2-bit Grey Scale Compression Algorithm Support
|
* NeXT 2-bit Grey Scale Compression Algorithm Support
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define SETPIXEL(op, v) { \
|
#define SETPIXEL(op, v) \
|
||||||
switch (npixels++ & 3) { \
|
{ \
|
||||||
case 0: op[0] = (unsigned char) ((v) << 6); break; \
|
switch (npixels++ & 3) \
|
||||||
case 1: op[0] |= (v) << 4; break; \
|
{ \
|
||||||
case 2: op[0] |= (v) << 2; break; \
|
case 0: \
|
||||||
case 3: *op++ |= (v); op_offset++; break; \
|
op[0] = (unsigned char)((v) << 6); \
|
||||||
|
break; \
|
||||||
|
case 1: \
|
||||||
|
op[0] |= (v) << 4; \
|
||||||
|
break; \
|
||||||
|
case 2: \
|
||||||
|
op[0] |= (v) << 2; \
|
||||||
|
break; \
|
||||||
|
case 3: \
|
||||||
|
*op++ |= (v); \
|
||||||
|
op_offset++; \
|
||||||
|
break; \
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -43,13 +54,12 @@
|
|||||||
#define LITERALSPAN 0x40
|
#define LITERALSPAN 0x40
|
||||||
#define WHITE ((1 << 2) - 1)
|
#define WHITE ((1 << 2) - 1)
|
||||||
|
|
||||||
static int
|
static int NeXTDecode(TIFF *tif, uint8_t *buf, tmsize_t occ, uint16_t s)
|
||||||
NeXTDecode(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "NeXTDecode";
|
static const char module[] = "NeXTDecode";
|
||||||
unsigned char *bp, *op;
|
unsigned char *bp, *op;
|
||||||
tmsize_t cc;
|
tmsize_t cc;
|
||||||
uint8* row;
|
uint8_t *row;
|
||||||
tmsize_t scanline, n;
|
tmsize_t scanline, n;
|
||||||
|
|
||||||
(void)s;
|
(void)s;
|
||||||
@ -66,13 +76,15 @@ NeXTDecode(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s)
|
|||||||
scanline = tif->tif_scanlinesize;
|
scanline = tif->tif_scanlinesize;
|
||||||
if (occ % scanline)
|
if (occ % scanline)
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "Fractional scanlines cannot be read");
|
TIFFErrorExtR(tif, module, "Fractional scanlines cannot be read");
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
for (row = buf; cc > 0 && occ > 0; occ -= scanline, row += scanline) {
|
for (row = buf; cc > 0 && occ > 0; occ -= scanline, row += scanline)
|
||||||
|
{
|
||||||
n = *bp++;
|
n = *bp++;
|
||||||
cc--;
|
cc--;
|
||||||
switch (n) {
|
switch (n)
|
||||||
|
{
|
||||||
case LITERALROW:
|
case LITERALROW:
|
||||||
/*
|
/*
|
||||||
* The entire scanline is given as literal values.
|
* The entire scanline is given as literal values.
|
||||||
@ -83,7 +95,8 @@ NeXTDecode(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s)
|
|||||||
bp += scanline;
|
bp += scanline;
|
||||||
cc -= scanline;
|
cc -= scanline;
|
||||||
break;
|
break;
|
||||||
case LITERALSPAN: {
|
case LITERALSPAN:
|
||||||
|
{
|
||||||
tmsize_t off;
|
tmsize_t off;
|
||||||
/*
|
/*
|
||||||
* The scanline has a literal span that begins at some
|
* The scanline has a literal span that begins at some
|
||||||
@ -100,10 +113,11 @@ NeXTDecode(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s)
|
|||||||
cc -= 4 + n;
|
cc -= 4 + n;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: {
|
default:
|
||||||
uint32 npixels = 0, grey;
|
{
|
||||||
|
uint32_t npixels = 0, grey;
|
||||||
tmsize_t op_offset = 0;
|
tmsize_t op_offset = 0;
|
||||||
uint32 imagewidth = tif->tif_dir.td_imagewidth;
|
uint32_t imagewidth = tif->tif_dir.td_imagewidth;
|
||||||
if (isTiled(tif))
|
if (isTiled(tif))
|
||||||
imagewidth = tif->tif_dir.td_tilewidth;
|
imagewidth = tif->tif_dir.td_tilewidth;
|
||||||
|
|
||||||
@ -114,21 +128,25 @@ NeXTDecode(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s)
|
|||||||
* <color><npixels> until we've filled the scanline.
|
* <color><npixels> until we've filled the scanline.
|
||||||
*/
|
*/
|
||||||
op = row;
|
op = row;
|
||||||
for (;;) {
|
for (;;)
|
||||||
grey = (uint32)((n>>6) & 0x3);
|
{
|
||||||
|
grey = (uint32_t)((n >> 6) & 0x3);
|
||||||
n &= 0x3f;
|
n &= 0x3f;
|
||||||
/*
|
/*
|
||||||
* Ensure the run does not exceed the scanline
|
* Ensure the run does not exceed the scanline
|
||||||
* bounds, potentially resulting in a security
|
* bounds, potentially resulting in a security
|
||||||
* issue.
|
* issue.
|
||||||
*/
|
*/
|
||||||
while (n-- > 0 && npixels < imagewidth && op_offset < scanline)
|
while (n-- > 0 && npixels < imagewidth &&
|
||||||
|
op_offset < scanline)
|
||||||
SETPIXEL(op, grey);
|
SETPIXEL(op, grey);
|
||||||
if (npixels >= imagewidth)
|
if (npixels >= imagewidth)
|
||||||
break;
|
break;
|
||||||
if (op_offset >= scanline ) {
|
if (op_offset >= scanline)
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "Invalid data for scanline %ld",
|
{
|
||||||
(long) tif->tif_row);
|
TIFFErrorExtR(tif, module,
|
||||||
|
"Invalid data for scanline %" PRIu32,
|
||||||
|
tif->tif_row);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
if (cc == 0)
|
if (cc == 0)
|
||||||
@ -140,17 +158,16 @@ NeXTDecode(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tif->tif_rawcp = (uint8*) bp;
|
tif->tif_rawcp = (uint8_t *)bp;
|
||||||
tif->tif_rawcc = cc;
|
tif->tif_rawcc = cc;
|
||||||
return (1);
|
return (1);
|
||||||
bad:
|
bad:
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "Not enough data for scanline %ld",
|
TIFFErrorExtR(tif, module, "Not enough data for scanline %" PRIu32,
|
||||||
(long) tif->tif_row);
|
tif->tif_row);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int NeXTPreDecode(TIFF *tif, uint16_t s)
|
||||||
NeXTPreDecode(TIFF* tif, uint16 s)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "NeXTPreDecode";
|
static const char module[] = "NeXTPreDecode";
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
TIFFDirectory *td = &tif->tif_dir;
|
||||||
@ -158,15 +175,14 @@ NeXTPreDecode(TIFF* tif, uint16 s)
|
|||||||
|
|
||||||
if (td->td_bitspersample != 2)
|
if (td->td_bitspersample != 2)
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "Unsupported BitsPerSample = %d",
|
TIFFErrorExtR(tif, module, "Unsupported BitsPerSample = %" PRIu16,
|
||||||
td->td_bitspersample);
|
td->td_bitspersample);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int TIFFInitNeXT(TIFF *tif, int scheme)
|
||||||
TIFFInitNeXT(TIFF* tif, int scheme)
|
|
||||||
{
|
{
|
||||||
(void)scheme;
|
(void)scheme;
|
||||||
tif->tif_predecode = NeXTPreDecode;
|
tif->tif_predecode = NeXTPreDecode;
|
||||||
@ -176,12 +192,3 @@ TIFFInitNeXT(TIFF* tif, int scheme)
|
|||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
#endif /* NEXT_SUPPORT */
|
#endif /* NEXT_SUPPORT */
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
1648
3rdparty/libtiff/tif_ojpeg.c
vendored
1648
3rdparty/libtiff/tif_ojpeg.c
vendored
File diff suppressed because it is too large
Load Diff
508
3rdparty/libtiff/tif_open.c
vendored
508
3rdparty/libtiff/tif_open.c
vendored
@ -26,29 +26,33 @@
|
|||||||
* TIFF Library.
|
* TIFF Library.
|
||||||
*/
|
*/
|
||||||
#include "tiffiop.h"
|
#include "tiffiop.h"
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Dummy functions to fill the omitted client procedures.
|
* Dummy functions to fill the omitted client procedures.
|
||||||
*/
|
*/
|
||||||
static int
|
static int _tiffDummyMapProc(thandle_t fd, void **pbase, toff_t *psize)
|
||||||
_tiffDummyMapProc(thandle_t fd, void** pbase, toff_t* psize)
|
|
||||||
{
|
{
|
||||||
(void) fd; (void) pbase; (void) psize;
|
(void)fd;
|
||||||
|
(void)pbase;
|
||||||
|
(void)psize;
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void _tiffDummyUnmapProc(thandle_t fd, void *base, toff_t size)
|
||||||
_tiffDummyUnmapProc(thandle_t fd, void* base, toff_t size)
|
|
||||||
{
|
{
|
||||||
(void) fd; (void) base; (void) size;
|
(void)fd;
|
||||||
|
(void)base;
|
||||||
|
(void)size;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int _TIFFgetMode(TIFFOpenOptions *opts, thandle_t clientdata, const char *mode,
|
||||||
_TIFFgetMode(const char* mode, const char* module)
|
const char *module)
|
||||||
{
|
{
|
||||||
int m = -1;
|
int m = -1;
|
||||||
|
|
||||||
switch (mode[0]) {
|
switch (mode[0])
|
||||||
|
{
|
||||||
case 'r':
|
case 'r':
|
||||||
m = O_RDONLY;
|
m = O_RDONLY;
|
||||||
if (mode[1] == '+')
|
if (mode[1] == '+')
|
||||||
@ -61,46 +65,146 @@ _TIFFgetMode(const char* mode, const char* module)
|
|||||||
m |= O_TRUNC;
|
m |= O_TRUNC;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
TIFFErrorExt(0, module, "\"%s\": Bad mode", mode);
|
_TIFFErrorEarly(opts, clientdata, module, "\"%s\": Bad mode", mode);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return (m);
|
return (m);
|
||||||
}
|
}
|
||||||
|
|
||||||
TIFF*
|
TIFFOpenOptions *TIFFOpenOptionsAlloc()
|
||||||
TIFFClientOpen(
|
|
||||||
const char* name, const char* mode,
|
|
||||||
thandle_t clientdata,
|
|
||||||
TIFFReadWriteProc readproc,
|
|
||||||
TIFFReadWriteProc writeproc,
|
|
||||||
TIFFSeekProc seekproc,
|
|
||||||
TIFFCloseProc closeproc,
|
|
||||||
TIFFSizeProc sizeproc,
|
|
||||||
TIFFMapFileProc mapproc,
|
|
||||||
TIFFUnmapFileProc unmapproc
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "TIFFClientOpen";
|
TIFFOpenOptions *opts =
|
||||||
|
(TIFFOpenOptions *)_TIFFcalloc(1, sizeof(TIFFOpenOptions));
|
||||||
|
return opts;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TIFFOpenOptionsFree(TIFFOpenOptions *opts) { _TIFFfree(opts); }
|
||||||
|
|
||||||
|
/** Define a limit in bytes for a single memory allocation done by libtiff.
|
||||||
|
* If max_single_mem_alloc is set to 0, no other limit that the underlying
|
||||||
|
* _TIFFmalloc() will be applied, which is the default.
|
||||||
|
*/
|
||||||
|
void TIFFOpenOptionsSetMaxSingleMemAlloc(TIFFOpenOptions *opts,
|
||||||
|
tmsize_t max_single_mem_alloc)
|
||||||
|
{
|
||||||
|
opts->max_single_mem_alloc = max_single_mem_alloc;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TIFFOpenOptionsSetErrorHandlerExtR(TIFFOpenOptions *opts,
|
||||||
|
TIFFErrorHandlerExtR handler,
|
||||||
|
void *errorhandler_user_data)
|
||||||
|
{
|
||||||
|
opts->errorhandler = handler;
|
||||||
|
opts->errorhandler_user_data = errorhandler_user_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TIFFOpenOptionsSetWarningHandlerExtR(TIFFOpenOptions *opts,
|
||||||
|
TIFFErrorHandlerExtR handler,
|
||||||
|
void *warnhandler_user_data)
|
||||||
|
{
|
||||||
|
opts->warnhandler = handler;
|
||||||
|
opts->warnhandler_user_data = warnhandler_user_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void _TIFFEmitErrorAboveMaxSingleMemAlloc(TIFF *tif,
|
||||||
|
const char *pszFunction,
|
||||||
|
tmsize_t s)
|
||||||
|
{
|
||||||
|
TIFFErrorExtR(tif, pszFunction,
|
||||||
|
"Memory allocation of %" PRIu64
|
||||||
|
" bytes is beyond the %" PRIu64
|
||||||
|
" byte limit defined in open options",
|
||||||
|
(uint64_t)s, (uint64_t)tif->tif_max_single_mem_alloc);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** malloc() version that takes into account memory-specific open options */
|
||||||
|
void *_TIFFmallocExt(TIFF *tif, tmsize_t s)
|
||||||
|
{
|
||||||
|
if (tif != NULL && tif->tif_max_single_mem_alloc > 0 &&
|
||||||
|
s > tif->tif_max_single_mem_alloc)
|
||||||
|
{
|
||||||
|
_TIFFEmitErrorAboveMaxSingleMemAlloc(tif, "_TIFFmallocExt", s);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return _TIFFmalloc(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** calloc() version that takes into account memory-specific open options */
|
||||||
|
void *_TIFFcallocExt(TIFF *tif, tmsize_t nmemb, tmsize_t siz)
|
||||||
|
{
|
||||||
|
if (tif != NULL && tif->tif_max_single_mem_alloc > 0)
|
||||||
|
{
|
||||||
|
if (nmemb <= 0 || siz <= 0 || nmemb > TIFF_TMSIZE_T_MAX / siz)
|
||||||
|
return NULL;
|
||||||
|
if (nmemb * siz > tif->tif_max_single_mem_alloc)
|
||||||
|
{
|
||||||
|
_TIFFEmitErrorAboveMaxSingleMemAlloc(tif, "_TIFFcallocExt",
|
||||||
|
nmemb * siz);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return _TIFFcalloc(nmemb, siz);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** realloc() version that takes into account memory-specific open options */
|
||||||
|
void *_TIFFreallocExt(TIFF *tif, void *p, tmsize_t s)
|
||||||
|
{
|
||||||
|
if (tif != NULL && tif->tif_max_single_mem_alloc > 0 &&
|
||||||
|
s > tif->tif_max_single_mem_alloc)
|
||||||
|
{
|
||||||
|
_TIFFEmitErrorAboveMaxSingleMemAlloc(tif, "_TIFFreallocExt", s);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return _TIFFrealloc(p, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** free() version that takes into account memory-specific open options */
|
||||||
|
void _TIFFfreeExt(TIFF *tif, void *p)
|
||||||
|
{
|
||||||
|
(void)tif;
|
||||||
|
_TIFFfree(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
TIFF *TIFFClientOpen(const char *name, const char *mode, thandle_t clientdata,
|
||||||
|
TIFFReadWriteProc readproc, TIFFReadWriteProc writeproc,
|
||||||
|
TIFFSeekProc seekproc, TIFFCloseProc closeproc,
|
||||||
|
TIFFSizeProc sizeproc, TIFFMapFileProc mapproc,
|
||||||
|
TIFFUnmapFileProc unmapproc)
|
||||||
|
{
|
||||||
|
return TIFFClientOpenExt(name, mode, clientdata, readproc, writeproc,
|
||||||
|
seekproc, closeproc, sizeproc, mapproc, unmapproc,
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
TIFF *TIFFClientOpenExt(const char *name, const char *mode,
|
||||||
|
thandle_t clientdata, TIFFReadWriteProc readproc,
|
||||||
|
TIFFReadWriteProc writeproc, TIFFSeekProc seekproc,
|
||||||
|
TIFFCloseProc closeproc, TIFFSizeProc sizeproc,
|
||||||
|
TIFFMapFileProc mapproc, TIFFUnmapFileProc unmapproc,
|
||||||
|
TIFFOpenOptions *opts)
|
||||||
|
{
|
||||||
|
static const char module[] = "TIFFClientOpenExt";
|
||||||
TIFF *tif;
|
TIFF *tif;
|
||||||
int m;
|
int m;
|
||||||
const char *cp;
|
const char *cp;
|
||||||
|
|
||||||
/* The following are configuration checks. They should be redundant, but should not
|
/* The following are configuration checks. They should be redundant, but
|
||||||
* compile to any actual code in an optimised release build anyway. If any of them
|
* should not compile to any actual code in an optimised release build
|
||||||
* fail, (makefile-based or other) configuration is not correct */
|
* anyway. If any of them fail, (makefile-based or other) configuration is
|
||||||
assert(sizeof(uint8)==1);
|
* not correct */
|
||||||
assert(sizeof(int8)==1);
|
assert(sizeof(uint8_t) == 1);
|
||||||
assert(sizeof(uint16)==2);
|
assert(sizeof(int8_t) == 1);
|
||||||
assert(sizeof(int16)==2);
|
assert(sizeof(uint16_t) == 2);
|
||||||
assert(sizeof(uint32)==4);
|
assert(sizeof(int16_t) == 2);
|
||||||
assert(sizeof(int32)==4);
|
assert(sizeof(uint32_t) == 4);
|
||||||
assert(sizeof(uint64)==8);
|
assert(sizeof(int32_t) == 4);
|
||||||
assert(sizeof(int64)==8);
|
assert(sizeof(uint64_t) == 8);
|
||||||
assert(sizeof(tmsize_t)==sizeof(void*));
|
assert(sizeof(int64_t) == 8);
|
||||||
{
|
{
|
||||||
union{
|
union
|
||||||
uint8 a8[2];
|
{
|
||||||
uint16 a16;
|
uint8_t a8[2];
|
||||||
|
uint16_t a16;
|
||||||
} n;
|
} n;
|
||||||
n.a8[0] = 1;
|
n.a8[0] = 1;
|
||||||
n.a8[1] = 0;
|
n.a8[1] = 0;
|
||||||
@ -112,42 +216,61 @@ TIFFClientOpen(
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
m = _TIFFgetMode(mode, module);
|
m = _TIFFgetMode(opts, clientdata, mode, module);
|
||||||
if (m == -1)
|
if (m == -1)
|
||||||
goto bad2;
|
goto bad2;
|
||||||
tif = (TIFF *)_TIFFmalloc((tmsize_t)(sizeof (TIFF) + strlen(name) + 1));
|
tmsize_t size_to_alloc = (tmsize_t)(sizeof(TIFF) + strlen(name) + 1);
|
||||||
if (tif == NULL) {
|
if (opts && opts->max_single_mem_alloc > 0 &&
|
||||||
TIFFErrorExt(clientdata, module, "%s: Out of memory (TIFF structure)", name);
|
size_to_alloc > opts->max_single_mem_alloc)
|
||||||
|
{
|
||||||
|
_TIFFErrorEarly(opts, clientdata, module,
|
||||||
|
"%s: Memory allocation of %" PRIu64
|
||||||
|
" bytes is beyond the %" PRIu64
|
||||||
|
" byte limit defined in open options",
|
||||||
|
name, (uint64_t)size_to_alloc,
|
||||||
|
(uint64_t)opts->max_single_mem_alloc);
|
||||||
|
goto bad2;
|
||||||
|
}
|
||||||
|
tif = (TIFF *)_TIFFmallocExt(NULL, size_to_alloc);
|
||||||
|
if (tif == NULL)
|
||||||
|
{
|
||||||
|
_TIFFErrorEarly(opts, clientdata, module,
|
||||||
|
"%s: Out of memory (TIFF structure)", name);
|
||||||
goto bad2;
|
goto bad2;
|
||||||
}
|
}
|
||||||
_TIFFmemset(tif, 0, sizeof(*tif));
|
_TIFFmemset(tif, 0, sizeof(*tif));
|
||||||
tif->tif_name = (char *)tif + sizeof(TIFF);
|
tif->tif_name = (char *)tif + sizeof(TIFF);
|
||||||
strcpy(tif->tif_name, name);
|
strcpy(tif->tif_name, name);
|
||||||
tif->tif_mode = m & ~(O_CREAT | O_TRUNC);
|
tif->tif_mode = m & ~(O_CREAT | O_TRUNC);
|
||||||
tif->tif_curdir = (uint16) -1; /* non-existent directory */
|
tif->tif_curdir = TIFF_NON_EXISTENT_DIR_NUMBER; /* non-existent directory */
|
||||||
tif->tif_curoff = 0;
|
tif->tif_curoff = 0;
|
||||||
tif->tif_curstrip = (uint32) -1; /* invalid strip */
|
tif->tif_curstrip = (uint32_t)-1; /* invalid strip */
|
||||||
tif->tif_row = (uint32) -1; /* read/write pre-increment */
|
tif->tif_row = (uint32_t)-1; /* read/write pre-increment */
|
||||||
tif->tif_clientdata = clientdata;
|
tif->tif_clientdata = clientdata;
|
||||||
if (!readproc || !writeproc || !seekproc || !closeproc || !sizeproc) {
|
|
||||||
TIFFErrorExt(clientdata, module,
|
|
||||||
"One of the client procedures is NULL pointer.");
|
|
||||||
_TIFFfree(tif);
|
|
||||||
goto bad2;
|
|
||||||
}
|
|
||||||
tif->tif_readproc = readproc;
|
tif->tif_readproc = readproc;
|
||||||
tif->tif_writeproc = writeproc;
|
tif->tif_writeproc = writeproc;
|
||||||
tif->tif_seekproc = seekproc;
|
tif->tif_seekproc = seekproc;
|
||||||
tif->tif_closeproc = closeproc;
|
tif->tif_closeproc = closeproc;
|
||||||
tif->tif_sizeproc = sizeproc;
|
tif->tif_sizeproc = sizeproc;
|
||||||
if (mapproc)
|
tif->tif_mapproc = mapproc ? mapproc : _tiffDummyMapProc;
|
||||||
tif->tif_mapproc = mapproc;
|
tif->tif_unmapproc = unmapproc ? unmapproc : _tiffDummyUnmapProc;
|
||||||
else
|
if (opts)
|
||||||
tif->tif_mapproc = _tiffDummyMapProc;
|
{
|
||||||
if (unmapproc)
|
tif->tif_errorhandler = opts->errorhandler;
|
||||||
tif->tif_unmapproc = unmapproc;
|
tif->tif_errorhandler_user_data = opts->errorhandler_user_data;
|
||||||
else
|
tif->tif_warnhandler = opts->warnhandler;
|
||||||
tif->tif_unmapproc = _tiffDummyUnmapProc;
|
tif->tif_warnhandler_user_data = opts->warnhandler_user_data;
|
||||||
|
tif->tif_max_single_mem_alloc = opts->max_single_mem_alloc;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!readproc || !writeproc || !seekproc || !closeproc || !sizeproc)
|
||||||
|
{
|
||||||
|
TIFFErrorExtR(tif, module,
|
||||||
|
"One of the client procedures is NULL pointer.");
|
||||||
|
_TIFFfreeExt(NULL, tif);
|
||||||
|
goto bad2;
|
||||||
|
}
|
||||||
|
|
||||||
_TIFFSetDefaultCompressionState(tif); /* setup default state */
|
_TIFFSetDefaultCompressionState(tif); /* setup default state */
|
||||||
/*
|
/*
|
||||||
* Default is to return data MSB2LSB and enable the
|
* Default is to return data MSB2LSB and enable the
|
||||||
@ -184,7 +307,8 @@ TIFFClientOpen(
|
|||||||
* '4' ClassicTIFF for creating a file (default)
|
* '4' ClassicTIFF for creating a file (default)
|
||||||
* '8' BigTIFF for creating a file
|
* '8' BigTIFF for creating a file
|
||||||
* 'D' enable use of deferred strip/tile offset/bytecount array loading.
|
* 'D' enable use of deferred strip/tile offset/bytecount array loading.
|
||||||
* 'O' on-demand loading of values instead of whole array loading (implies D)
|
* 'O' on-demand loading of values instead of whole array loading (implies
|
||||||
|
* D)
|
||||||
*
|
*
|
||||||
* The use of the 'l' and 'b' flags is strongly discouraged.
|
* The use of the 'l' and 'b' flags is strongly discouraged.
|
||||||
* These flags are provided solely because numerous vendors,
|
* These flags are provided solely because numerous vendors,
|
||||||
@ -218,7 +342,8 @@ TIFFClientOpen(
|
|||||||
* for example, to get the unadulterated TIFF tag information.
|
* for example, to get the unadulterated TIFF tag information.
|
||||||
*/
|
*/
|
||||||
for (cp = mode; *cp; cp++)
|
for (cp = mode; *cp; cp++)
|
||||||
switch (*cp) {
|
switch (*cp)
|
||||||
|
{
|
||||||
case 'b':
|
case 'b':
|
||||||
#ifndef WORDS_BIGENDIAN
|
#ifndef WORDS_BIGENDIAN
|
||||||
if (m & O_CREAT)
|
if (m & O_CREAT)
|
||||||
@ -232,16 +357,20 @@ TIFFClientOpen(
|
|||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
case 'B':
|
case 'B':
|
||||||
tif->tif_flags = (tif->tif_flags &~ TIFF_FILLORDER) |
|
tif->tif_flags =
|
||||||
FILLORDER_MSB2LSB;
|
(tif->tif_flags & ~TIFF_FILLORDER) | FILLORDER_MSB2LSB;
|
||||||
break;
|
break;
|
||||||
case 'L':
|
case 'L':
|
||||||
tif->tif_flags = (tif->tif_flags &~ TIFF_FILLORDER) |
|
tif->tif_flags =
|
||||||
FILLORDER_LSB2MSB;
|
(tif->tif_flags & ~TIFF_FILLORDER) | FILLORDER_LSB2MSB;
|
||||||
break;
|
break;
|
||||||
case 'H':
|
case 'H':
|
||||||
tif->tif_flags = (tif->tif_flags &~ TIFF_FILLORDER) |
|
TIFFWarningExtR(tif, name,
|
||||||
HOST_FILLORDER;
|
"H(ost) mode is deprecated. Since "
|
||||||
|
"libtiff 4.5.1, it is an alias of 'B' / "
|
||||||
|
"FILLORDER_MSB2LSB.");
|
||||||
|
tif->tif_flags =
|
||||||
|
(tif->tif_flags & ~TIFF_FILLORDER) | FILLORDER_MSB2LSB;
|
||||||
break;
|
break;
|
||||||
case 'M':
|
case 'M':
|
||||||
if (m == O_RDONLY)
|
if (m == O_RDONLY)
|
||||||
@ -271,7 +400,8 @@ TIFFClientOpen(
|
|||||||
break;
|
break;
|
||||||
case 'O':
|
case 'O':
|
||||||
if (m == O_RDONLY)
|
if (m == O_RDONLY)
|
||||||
tif->tif_flags |= (TIFF_LAZYSTRILELOAD | TIFF_DEFERSTRILELOAD);
|
tif->tif_flags |=
|
||||||
|
(TIFF_LAZYSTRILELOAD | TIFF_DEFERSTRILELOAD);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -286,21 +416,22 @@ TIFFClientOpen(
|
|||||||
* Read in TIFF header.
|
* Read in TIFF header.
|
||||||
*/
|
*/
|
||||||
if ((m & O_TRUNC) ||
|
if ((m & O_TRUNC) ||
|
||||||
!ReadOK(tif, &tif->tif_header, sizeof (TIFFHeaderClassic))) {
|
!ReadOK(tif, &tif->tif_header, sizeof(TIFFHeaderClassic)))
|
||||||
if (tif->tif_mode == O_RDONLY) {
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, name,
|
if (tif->tif_mode == O_RDONLY)
|
||||||
"Cannot read TIFF header");
|
{
|
||||||
|
TIFFErrorExtR(tif, name, "Cannot read TIFF header");
|
||||||
goto bad;
|
goto bad;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* Setup header and write.
|
* Setup header and write.
|
||||||
*/
|
*/
|
||||||
#ifdef WORDS_BIGENDIAN
|
#ifdef WORDS_BIGENDIAN
|
||||||
tif->tif_header.common.tiff_magic = (tif->tif_flags & TIFF_SWAB)
|
tif->tif_header.common.tiff_magic =
|
||||||
? TIFF_LITTLEENDIAN : TIFF_BIGENDIAN;
|
(tif->tif_flags & TIFF_SWAB) ? TIFF_LITTLEENDIAN : TIFF_BIGENDIAN;
|
||||||
#else
|
#else
|
||||||
tif->tif_header.common.tiff_magic = (tif->tif_flags & TIFF_SWAB)
|
tif->tif_header.common.tiff_magic =
|
||||||
? TIFF_BIGENDIAN : TIFF_LITTLEENDIAN;
|
(tif->tif_flags & TIFF_SWAB) ? TIFF_BIGENDIAN : TIFF_LITTLEENDIAN;
|
||||||
#endif
|
#endif
|
||||||
if (!(tif->tif_flags & TIFF_BIGTIFF))
|
if (!(tif->tif_flags & TIFF_BIGTIFF))
|
||||||
{
|
{
|
||||||
@ -331,19 +462,22 @@ TIFFClientOpen(
|
|||||||
* on Solaris.
|
* on Solaris.
|
||||||
*/
|
*/
|
||||||
TIFFSeekFile(tif, 0, SEEK_SET);
|
TIFFSeekFile(tif, 0, SEEK_SET);
|
||||||
if (!WriteOK(tif, &tif->tif_header, (tmsize_t)(tif->tif_header_size))) {
|
if (!WriteOK(tif, &tif->tif_header, (tmsize_t)(tif->tif_header_size)))
|
||||||
TIFFErrorExt(tif->tif_clientdata, name,
|
{
|
||||||
"Error writing TIFF header");
|
TIFFErrorExtR(tif, name, "Error writing TIFF header");
|
||||||
goto bad;
|
goto bad;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* Setup the byte order handling.
|
* Setup the byte order handling.
|
||||||
*/
|
*/
|
||||||
if (tif->tif_header.common.tiff_magic == TIFF_BIGENDIAN) {
|
if (tif->tif_header.common.tiff_magic == TIFF_BIGENDIAN)
|
||||||
|
{
|
||||||
#ifndef WORDS_BIGENDIAN
|
#ifndef WORDS_BIGENDIAN
|
||||||
tif->tif_flags |= TIFF_SWAB;
|
tif->tif_flags |= TIFF_SWAB;
|
||||||
#endif
|
#endif
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
#ifdef WORDS_BIGENDIAN
|
#ifdef WORDS_BIGENDIAN
|
||||||
tif->tif_flags |= TIFF_SWAB;
|
tif->tif_flags |= TIFF_SWAB;
|
||||||
#endif
|
#endif
|
||||||
@ -354,9 +488,8 @@ TIFFClientOpen(
|
|||||||
if (!TIFFDefaultDirectory(tif))
|
if (!TIFFDefaultDirectory(tif))
|
||||||
goto bad;
|
goto bad;
|
||||||
tif->tif_diroff = 0;
|
tif->tif_diroff = 0;
|
||||||
tif->tif_dirlist = NULL;
|
tif->tif_lastdiroff = 0;
|
||||||
tif->tif_dirlistsize = 0;
|
tif->tif_setdirectory_force_absolute = FALSE;
|
||||||
tif->tif_dirnumber = 0;
|
|
||||||
return (tif);
|
return (tif);
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
@ -371,23 +504,30 @@ TIFFClientOpen(
|
|||||||
#else
|
#else
|
||||||
tif->tif_header.common.tiff_magic != MDI_LITTLEENDIAN
|
tif->tif_header.common.tiff_magic != MDI_LITTLEENDIAN
|
||||||
#endif
|
#endif
|
||||||
) {
|
)
|
||||||
TIFFErrorExt(tif->tif_clientdata, name,
|
{
|
||||||
"Not a TIFF or MDI file, bad magic number %d (0x%x)",
|
TIFFErrorExtR(tif, name,
|
||||||
|
"Not a TIFF or MDI file, bad magic number %" PRIu16
|
||||||
|
" (0x%" PRIx16 ")",
|
||||||
#else
|
#else
|
||||||
) {
|
)
|
||||||
TIFFErrorExt(tif->tif_clientdata, name,
|
{
|
||||||
"Not a TIFF file, bad magic number %d (0x%x)",
|
TIFFErrorExtR(tif, name,
|
||||||
|
"Not a TIFF file, bad magic number %" PRIu16
|
||||||
|
" (0x%" PRIx16 ")",
|
||||||
#endif
|
#endif
|
||||||
tif->tif_header.common.tiff_magic,
|
tif->tif_header.common.tiff_magic,
|
||||||
tif->tif_header.common.tiff_magic);
|
tif->tif_header.common.tiff_magic);
|
||||||
goto bad;
|
goto bad;
|
||||||
}
|
}
|
||||||
if (tif->tif_header.common.tiff_magic == TIFF_BIGENDIAN) {
|
if (tif->tif_header.common.tiff_magic == TIFF_BIGENDIAN)
|
||||||
|
{
|
||||||
#ifndef WORDS_BIGENDIAN
|
#ifndef WORDS_BIGENDIAN
|
||||||
tif->tif_flags |= TIFF_SWAB;
|
tif->tif_flags |= TIFF_SWAB;
|
||||||
#endif
|
#endif
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
#ifdef WORDS_BIGENDIAN
|
#ifdef WORDS_BIGENDIAN
|
||||||
tif->tif_flags |= TIFF_SWAB;
|
tif->tif_flags |= TIFF_SWAB;
|
||||||
#endif
|
#endif
|
||||||
@ -395,9 +535,11 @@ TIFFClientOpen(
|
|||||||
if (tif->tif_flags & TIFF_SWAB)
|
if (tif->tif_flags & TIFF_SWAB)
|
||||||
TIFFSwabShort(&tif->tif_header.common.tiff_version);
|
TIFFSwabShort(&tif->tif_header.common.tiff_version);
|
||||||
if ((tif->tif_header.common.tiff_version != TIFF_VERSION_CLASSIC) &&
|
if ((tif->tif_header.common.tiff_version != TIFF_VERSION_CLASSIC) &&
|
||||||
(tif->tif_header.common.tiff_version != TIFF_VERSION_BIG)) {
|
(tif->tif_header.common.tiff_version != TIFF_VERSION_BIG))
|
||||||
TIFFErrorExt(tif->tif_clientdata, name,
|
{
|
||||||
"Not a TIFF file, bad version number %d (0x%x)",
|
TIFFErrorExtR(tif, name,
|
||||||
|
"Not a TIFF file, bad version number %" PRIu16
|
||||||
|
" (0x%" PRIx16 ")",
|
||||||
tif->tif_header.common.tiff_version,
|
tif->tif_header.common.tiff_version,
|
||||||
tif->tif_header.common.tiff_version);
|
tif->tif_header.common.tiff_version);
|
||||||
goto bad;
|
goto bad;
|
||||||
@ -410,10 +552,11 @@ TIFFClientOpen(
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!ReadOK(tif, ((uint8*)(&tif->tif_header) + sizeof(TIFFHeaderClassic)), (sizeof(TIFFHeaderBig)-sizeof(TIFFHeaderClassic))))
|
if (!ReadOK(tif,
|
||||||
|
((uint8_t *)(&tif->tif_header) + sizeof(TIFFHeaderClassic)),
|
||||||
|
(sizeof(TIFFHeaderBig) - sizeof(TIFFHeaderClassic))))
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, name,
|
TIFFErrorExtR(tif, name, "Cannot read TIFF header");
|
||||||
"Cannot read TIFF header");
|
|
||||||
goto bad;
|
goto bad;
|
||||||
}
|
}
|
||||||
if (tif->tif_flags & TIFF_SWAB)
|
if (tif->tif_flags & TIFF_SWAB)
|
||||||
@ -423,16 +566,18 @@ TIFFClientOpen(
|
|||||||
}
|
}
|
||||||
if (tif->tif_header.big.tiff_offsetsize != 8)
|
if (tif->tif_header.big.tiff_offsetsize != 8)
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, name,
|
TIFFErrorExtR(tif, name,
|
||||||
"Not a TIFF file, bad BigTIFF offsetsize %d (0x%x)",
|
"Not a TIFF file, bad BigTIFF offsetsize %" PRIu16
|
||||||
|
" (0x%" PRIx16 ")",
|
||||||
tif->tif_header.big.tiff_offsetsize,
|
tif->tif_header.big.tiff_offsetsize,
|
||||||
tif->tif_header.big.tiff_offsetsize);
|
tif->tif_header.big.tiff_offsetsize);
|
||||||
goto bad;
|
goto bad;
|
||||||
}
|
}
|
||||||
if (tif->tif_header.big.tiff_unused != 0)
|
if (tif->tif_header.big.tiff_unused != 0)
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, name,
|
TIFFErrorExtR(tif, name,
|
||||||
"Not a TIFF file, bad BigTIFF unused %d (0x%x)",
|
"Not a TIFF file, bad BigTIFF unused %" PRIu16
|
||||||
|
" (0x%" PRIx16 ")",
|
||||||
tif->tif_header.big.tiff_unused,
|
tif->tif_header.big.tiff_unused,
|
||||||
tif->tif_header.big.tiff_unused);
|
tif->tif_header.big.tiff_unused);
|
||||||
goto bad;
|
goto bad;
|
||||||
@ -446,7 +591,8 @@ TIFFClientOpen(
|
|||||||
tif->tif_rawdataoff = 0;
|
tif->tif_rawdataoff = 0;
|
||||||
tif->tif_rawdataloaded = 0;
|
tif->tif_rawdataloaded = 0;
|
||||||
|
|
||||||
switch (mode[0]) {
|
switch (mode[0])
|
||||||
|
{
|
||||||
case 'r':
|
case 'r':
|
||||||
if (!(tif->tif_flags & TIFF_BIGTIFF))
|
if (!(tif->tif_flags & TIFF_BIGTIFF))
|
||||||
tif->tif_nextdiroff = tif->tif_header.classic.tiff_diroff;
|
tif->tif_nextdiroff = tif->tif_header.classic.tiff_diroff;
|
||||||
@ -469,10 +615,10 @@ TIFFClientOpen(
|
|||||||
tif->tif_flags &= ~TIFF_MAPPED;
|
tif->tif_flags &= ~TIFF_MAPPED;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* Sometimes we do not want to read the first directory (for example,
|
* Sometimes we do not want to read the first directory (for
|
||||||
* it may be broken) and want to proceed to other directories. I this
|
* example, it may be broken) and want to proceed to other
|
||||||
* case we use the TIFF_HEADERONLY flag to open file and return
|
* directories. I this case we use the TIFF_HEADERONLY flag to open
|
||||||
* immediately after reading TIFF header.
|
* file and return immediately after reading TIFF header.
|
||||||
*/
|
*/
|
||||||
if (tif->tif_flags & TIFF_HEADERONLY)
|
if (tif->tif_flags & TIFF_HEADERONLY)
|
||||||
return (tif);
|
return (tif);
|
||||||
@ -480,9 +626,8 @@ TIFFClientOpen(
|
|||||||
/*
|
/*
|
||||||
* Setup initial directory.
|
* Setup initial directory.
|
||||||
*/
|
*/
|
||||||
if (TIFFReadDirectory(tif)) {
|
if (TIFFReadDirectory(tif))
|
||||||
tif->tif_rawcc = (tmsize_t)-1;
|
{
|
||||||
tif->tif_flags |= TIFF_BUFFERSETUP;
|
|
||||||
return (tif);
|
return (tif);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -510,17 +655,12 @@ bad2:
|
|||||||
/*
|
/*
|
||||||
* Return open file's name.
|
* Return open file's name.
|
||||||
*/
|
*/
|
||||||
const char *
|
const char *TIFFFileName(TIFF *tif) { return (tif->tif_name); }
|
||||||
TIFFFileName(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (tif->tif_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set the file name.
|
* Set the file name.
|
||||||
*/
|
*/
|
||||||
const char *
|
const char *TIFFSetFileName(TIFF *tif, const char *name)
|
||||||
TIFFSetFileName(TIFF* tif, const char *name)
|
|
||||||
{
|
{
|
||||||
const char *old_name = tif->tif_name;
|
const char *old_name = tif->tif_name;
|
||||||
tif->tif_name = (char *)name;
|
tif->tif_name = (char *)name;
|
||||||
@ -530,17 +670,12 @@ TIFFSetFileName(TIFF* tif, const char *name)
|
|||||||
/*
|
/*
|
||||||
* Return open file's I/O descriptor.
|
* Return open file's I/O descriptor.
|
||||||
*/
|
*/
|
||||||
int
|
int TIFFFileno(TIFF *tif) { return (tif->tif_fd); }
|
||||||
TIFFFileno(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (tif->tif_fd);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set open file's I/O descriptor, and return previous value.
|
* Set open file's I/O descriptor, and return previous value.
|
||||||
*/
|
*/
|
||||||
int
|
int TIFFSetFileno(TIFF *tif, int fd)
|
||||||
TIFFSetFileno(TIFF* tif, int fd)
|
|
||||||
{
|
{
|
||||||
int old_fd = tif->tif_fd;
|
int old_fd = tif->tif_fd;
|
||||||
tif->tif_fd = fd;
|
tif->tif_fd = fd;
|
||||||
@ -550,17 +685,12 @@ TIFFSetFileno(TIFF* tif, int fd)
|
|||||||
/*
|
/*
|
||||||
* Return open file's clientdata.
|
* Return open file's clientdata.
|
||||||
*/
|
*/
|
||||||
thandle_t
|
thandle_t TIFFClientdata(TIFF *tif) { return (tif->tif_clientdata); }
|
||||||
TIFFClientdata(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (tif->tif_clientdata);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set open file's clientdata, and return previous value.
|
* Set open file's clientdata, and return previous value.
|
||||||
*/
|
*/
|
||||||
thandle_t
|
thandle_t TIFFSetClientdata(TIFF *tif, thandle_t newvalue)
|
||||||
TIFFSetClientdata(TIFF* tif, thandle_t newvalue)
|
|
||||||
{
|
{
|
||||||
thandle_t m = tif->tif_clientdata;
|
thandle_t m = tif->tif_clientdata;
|
||||||
tif->tif_clientdata = newvalue;
|
tif->tif_clientdata = newvalue;
|
||||||
@ -570,17 +700,12 @@ TIFFSetClientdata(TIFF* tif, thandle_t newvalue)
|
|||||||
/*
|
/*
|
||||||
* Return read/write mode.
|
* Return read/write mode.
|
||||||
*/
|
*/
|
||||||
int
|
int TIFFGetMode(TIFF *tif) { return (tif->tif_mode); }
|
||||||
TIFFGetMode(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (tif->tif_mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return read/write mode.
|
* Return read/write mode.
|
||||||
*/
|
*/
|
||||||
int
|
int TIFFSetMode(TIFF *tif, int mode)
|
||||||
TIFFSetMode(TIFF* tif, int mode)
|
|
||||||
{
|
{
|
||||||
int old_mode = tif->tif_mode;
|
int old_mode = tif->tif_mode;
|
||||||
tif->tif_mode = mode;
|
tif->tif_mode = mode;
|
||||||
@ -591,152 +716,93 @@ TIFFSetMode(TIFF* tif, int mode)
|
|||||||
* Return nonzero if file is organized in
|
* Return nonzero if file is organized in
|
||||||
* tiles; zero if organized as strips.
|
* tiles; zero if organized as strips.
|
||||||
*/
|
*/
|
||||||
int
|
int TIFFIsTiled(TIFF *tif) { return (isTiled(tif)); }
|
||||||
TIFFIsTiled(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (isTiled(tif));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return current row being read/written.
|
* Return current row being read/written.
|
||||||
*/
|
*/
|
||||||
uint32
|
uint32_t TIFFCurrentRow(TIFF *tif) { return (tif->tif_row); }
|
||||||
TIFFCurrentRow(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (tif->tif_row);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return index of the current directory.
|
* Return index of the current directory.
|
||||||
*/
|
*/
|
||||||
uint16
|
tdir_t TIFFCurrentDirectory(TIFF *tif) { return (tif->tif_curdir); }
|
||||||
TIFFCurrentDirectory(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (tif->tif_curdir);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return current strip.
|
* Return current strip.
|
||||||
*/
|
*/
|
||||||
uint32
|
uint32_t TIFFCurrentStrip(TIFF *tif) { return (tif->tif_curstrip); }
|
||||||
TIFFCurrentStrip(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (tif->tif_curstrip);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return current tile.
|
* Return current tile.
|
||||||
*/
|
*/
|
||||||
uint32
|
uint32_t TIFFCurrentTile(TIFF *tif) { return (tif->tif_curtile); }
|
||||||
TIFFCurrentTile(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (tif->tif_curtile);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return nonzero if the file has byte-swapped data.
|
* Return nonzero if the file has byte-swapped data.
|
||||||
*/
|
*/
|
||||||
int
|
int TIFFIsByteSwapped(TIFF *tif) { return ((tif->tif_flags & TIFF_SWAB) != 0); }
|
||||||
TIFFIsByteSwapped(TIFF* tif)
|
|
||||||
{
|
|
||||||
return ((tif->tif_flags & TIFF_SWAB) != 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return nonzero if the data is returned up-sampled.
|
* Return nonzero if the data is returned up-sampled.
|
||||||
*/
|
*/
|
||||||
int
|
int TIFFIsUpSampled(TIFF *tif) { return (isUpSampled(tif)); }
|
||||||
TIFFIsUpSampled(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (isUpSampled(tif));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return nonzero if the data is returned in MSB-to-LSB bit order.
|
* Return nonzero if the data is returned in MSB-to-LSB bit order.
|
||||||
*/
|
*/
|
||||||
int
|
int TIFFIsMSB2LSB(TIFF *tif) { return (isFillOrder(tif, FILLORDER_MSB2LSB)); }
|
||||||
TIFFIsMSB2LSB(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (isFillOrder(tif, FILLORDER_MSB2LSB));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return nonzero if given file was written in big-endian order.
|
* Return nonzero if given file was written in big-endian order.
|
||||||
*/
|
*/
|
||||||
int
|
int TIFFIsBigEndian(TIFF *tif)
|
||||||
TIFFIsBigEndian(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
return (tif->tif_header.common.tiff_magic == TIFF_BIGENDIAN);
|
return (tif->tif_header.common.tiff_magic == TIFF_BIGENDIAN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return nonzero if given file is BigTIFF style.
|
||||||
|
*/
|
||||||
|
int TIFFIsBigTIFF(TIFF *tif)
|
||||||
|
{
|
||||||
|
return (tif->tif_header.common.tiff_version == TIFF_VERSION_BIG);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return pointer to file read method.
|
* Return pointer to file read method.
|
||||||
*/
|
*/
|
||||||
TIFFReadWriteProc
|
TIFFReadWriteProc TIFFGetReadProc(TIFF *tif) { return (tif->tif_readproc); }
|
||||||
TIFFGetReadProc(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (tif->tif_readproc);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return pointer to file write method.
|
* Return pointer to file write method.
|
||||||
*/
|
*/
|
||||||
TIFFReadWriteProc
|
TIFFReadWriteProc TIFFGetWriteProc(TIFF *tif) { return (tif->tif_writeproc); }
|
||||||
TIFFGetWriteProc(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (tif->tif_writeproc);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return pointer to file seek method.
|
* Return pointer to file seek method.
|
||||||
*/
|
*/
|
||||||
TIFFSeekProc
|
TIFFSeekProc TIFFGetSeekProc(TIFF *tif) { return (tif->tif_seekproc); }
|
||||||
TIFFGetSeekProc(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (tif->tif_seekproc);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return pointer to file close method.
|
* Return pointer to file close method.
|
||||||
*/
|
*/
|
||||||
TIFFCloseProc
|
TIFFCloseProc TIFFGetCloseProc(TIFF *tif) { return (tif->tif_closeproc); }
|
||||||
TIFFGetCloseProc(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (tif->tif_closeproc);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return pointer to file size requesting method.
|
* Return pointer to file size requesting method.
|
||||||
*/
|
*/
|
||||||
TIFFSizeProc
|
TIFFSizeProc TIFFGetSizeProc(TIFF *tif) { return (tif->tif_sizeproc); }
|
||||||
TIFFGetSizeProc(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (tif->tif_sizeproc);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return pointer to memory mapping method.
|
* Return pointer to memory mapping method.
|
||||||
*/
|
*/
|
||||||
TIFFMapFileProc
|
TIFFMapFileProc TIFFGetMapFileProc(TIFF *tif) { return (tif->tif_mapproc); }
|
||||||
TIFFGetMapFileProc(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (tif->tif_mapproc);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return pointer to memory unmapping method.
|
* Return pointer to memory unmapping method.
|
||||||
*/
|
*/
|
||||||
TIFFUnmapFileProc
|
TIFFUnmapFileProc TIFFGetUnmapFileProc(TIFF *tif)
|
||||||
TIFFGetUnmapFileProc(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
return (tif->tif_unmapproc);
|
return (tif->tif_unmapproc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
192
3rdparty/libtiff/tif_packbits.c
vendored
192
3rdparty/libtiff/tif_packbits.c
vendored
@ -31,12 +31,11 @@
|
|||||||
*/
|
*/
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
static int
|
static int PackBitsPreEncode(TIFF *tif, uint16_t s)
|
||||||
PackBitsPreEncode(TIFF* tif, uint16 s)
|
|
||||||
{
|
{
|
||||||
(void)s;
|
(void)s;
|
||||||
|
|
||||||
tif->tif_data = (uint8*)_TIFFmalloc(sizeof(tmsize_t));
|
tif->tif_data = (uint8_t *)_TIFFmallocExt(tif, sizeof(tmsize_t));
|
||||||
if (tif->tif_data == NULL)
|
if (tif->tif_data == NULL)
|
||||||
return (0);
|
return (0);
|
||||||
/*
|
/*
|
||||||
@ -49,34 +48,39 @@ PackBitsPreEncode(TIFF* tif, uint16 s)
|
|||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int PackBitsPostEncode(TIFF *tif)
|
||||||
PackBitsPostEncode(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
if (tif->tif_data)
|
if (tif->tif_data)
|
||||||
_TIFFfree(tif->tif_data);
|
_TIFFfreeExt(tif, tif->tif_data);
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Encode a run of pixels.
|
* Encode a run of pixels.
|
||||||
*/
|
*/
|
||||||
static int
|
static int PackBitsEncode(TIFF *tif, uint8_t *buf, tmsize_t cc, uint16_t s)
|
||||||
PackBitsEncode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
|
|
||||||
{
|
{
|
||||||
unsigned char *bp = (unsigned char *)buf;
|
unsigned char *bp = (unsigned char *)buf;
|
||||||
uint8* op;
|
uint8_t *op;
|
||||||
uint8* ep;
|
uint8_t *ep;
|
||||||
uint8* lastliteral;
|
uint8_t *lastliteral;
|
||||||
long n, slop;
|
long n, slop;
|
||||||
int b;
|
int b;
|
||||||
enum { BASE, LITERAL, RUN, LITERAL_RUN } state;
|
enum
|
||||||
|
{
|
||||||
|
BASE,
|
||||||
|
LITERAL,
|
||||||
|
RUN,
|
||||||
|
LITERAL_RUN
|
||||||
|
} state;
|
||||||
|
|
||||||
(void)s;
|
(void)s;
|
||||||
op = tif->tif_rawcp;
|
op = tif->tif_rawcp;
|
||||||
ep = tif->tif_rawdata + tif->tif_rawdatasize;
|
ep = tif->tif_rawdata + tif->tif_rawdatasize;
|
||||||
state = BASE;
|
state = BASE;
|
||||||
lastliteral = 0;
|
lastliteral = 0;
|
||||||
while (cc > 0) {
|
while (cc > 0)
|
||||||
|
{
|
||||||
/*
|
/*
|
||||||
* Find the longest string of identical bytes.
|
* Find the longest string of identical bytes.
|
||||||
*/
|
*/
|
||||||
@ -86,14 +90,16 @@ PackBitsEncode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
|
|||||||
for (; cc > 0 && b == *bp; cc--, bp++)
|
for (; cc > 0 && b == *bp; cc--, bp++)
|
||||||
n++;
|
n++;
|
||||||
again:
|
again:
|
||||||
if (op + 2 >= ep) { /* insure space for new data */
|
if (op + 2 >= ep)
|
||||||
|
{ /* insure space for new data */
|
||||||
/*
|
/*
|
||||||
* Be careful about writing the last
|
* Be careful about writing the last
|
||||||
* literal. Must write up to that point
|
* literal. Must write up to that point
|
||||||
* and then copy the remainder to the
|
* and then copy the remainder to the
|
||||||
* front of the buffer.
|
* front of the buffer.
|
||||||
*/
|
*/
|
||||||
if (state == LITERAL || state == LITERAL_RUN) {
|
if (state == LITERAL || state == LITERAL_RUN)
|
||||||
|
{
|
||||||
slop = (long)(op - lastliteral);
|
slop = (long)(op - lastliteral);
|
||||||
tif->tif_rawcc += (tmsize_t)(lastliteral - tif->tif_rawcp);
|
tif->tif_rawcc += (tmsize_t)(lastliteral - tif->tif_rawcp);
|
||||||
if (!TIFFFlushData1(tif))
|
if (!TIFFFlushData1(tif))
|
||||||
@ -102,63 +108,78 @@ PackBitsEncode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
|
|||||||
while (slop-- > 0)
|
while (slop-- > 0)
|
||||||
*op++ = *lastliteral++;
|
*op++ = *lastliteral++;
|
||||||
lastliteral = tif->tif_rawcp;
|
lastliteral = tif->tif_rawcp;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
tif->tif_rawcc += (tmsize_t)(op - tif->tif_rawcp);
|
tif->tif_rawcc += (tmsize_t)(op - tif->tif_rawcp);
|
||||||
if (!TIFFFlushData1(tif))
|
if (!TIFFFlushData1(tif))
|
||||||
return (0);
|
return (0);
|
||||||
op = tif->tif_rawcp;
|
op = tif->tif_rawcp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
switch (state) {
|
switch (state)
|
||||||
|
{
|
||||||
case BASE: /* initial state, set run/literal */
|
case BASE: /* initial state, set run/literal */
|
||||||
if (n > 1) {
|
if (n > 1)
|
||||||
|
{
|
||||||
state = RUN;
|
state = RUN;
|
||||||
if (n > 128) {
|
if (n > 128)
|
||||||
*op++ = (uint8) -127;
|
{
|
||||||
*op++ = (uint8) b;
|
*op++ = (uint8_t)-127;
|
||||||
|
*op++ = (uint8_t)b;
|
||||||
n -= 128;
|
n -= 128;
|
||||||
goto again;
|
goto again;
|
||||||
}
|
}
|
||||||
*op++ = (uint8)(-(n-1));
|
*op++ = (uint8_t)(-(n - 1));
|
||||||
*op++ = (uint8) b;
|
*op++ = (uint8_t)b;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
lastliteral = op;
|
lastliteral = op;
|
||||||
*op++ = 0;
|
*op++ = 0;
|
||||||
*op++ = (uint8) b;
|
*op++ = (uint8_t)b;
|
||||||
state = LITERAL;
|
state = LITERAL;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case LITERAL: /* last object was literal string */
|
case LITERAL: /* last object was literal string */
|
||||||
if (n > 1) {
|
if (n > 1)
|
||||||
|
{
|
||||||
state = LITERAL_RUN;
|
state = LITERAL_RUN;
|
||||||
if (n > 128) {
|
if (n > 128)
|
||||||
*op++ = (uint8) -127;
|
{
|
||||||
*op++ = (uint8) b;
|
*op++ = (uint8_t)-127;
|
||||||
|
*op++ = (uint8_t)b;
|
||||||
n -= 128;
|
n -= 128;
|
||||||
goto again;
|
goto again;
|
||||||
}
|
}
|
||||||
*op++ = (uint8)(-(n-1)); /* encode run */
|
*op++ = (uint8_t)(-(n - 1)); /* encode run */
|
||||||
*op++ = (uint8) b;
|
*op++ = (uint8_t)b;
|
||||||
} else { /* extend literal */
|
}
|
||||||
|
else
|
||||||
|
{ /* extend literal */
|
||||||
if (++(*lastliteral) == 127)
|
if (++(*lastliteral) == 127)
|
||||||
state = BASE;
|
state = BASE;
|
||||||
*op++ = (uint8) b;
|
*op++ = (uint8_t)b;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case RUN: /* last object was run */
|
case RUN: /* last object was run */
|
||||||
if (n > 1) {
|
if (n > 1)
|
||||||
if (n > 128) {
|
{
|
||||||
*op++ = (uint8) -127;
|
if (n > 128)
|
||||||
*op++ = (uint8) b;
|
{
|
||||||
|
*op++ = (uint8_t)-127;
|
||||||
|
*op++ = (uint8_t)b;
|
||||||
n -= 128;
|
n -= 128;
|
||||||
goto again;
|
goto again;
|
||||||
}
|
}
|
||||||
*op++ = (uint8)(-(n-1));
|
*op++ = (uint8_t)(-(n - 1));
|
||||||
*op++ = (uint8) b;
|
*op++ = (uint8_t)b;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
lastliteral = op;
|
lastliteral = op;
|
||||||
*op++ = 0;
|
*op++ = 0;
|
||||||
*op++ = (uint8) b;
|
*op++ = (uint8_t)b;
|
||||||
state = LITERAL;
|
state = LITERAL;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -169,12 +190,12 @@ PackBitsEncode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
|
|||||||
* case we convert literal-run-literal
|
* case we convert literal-run-literal
|
||||||
* to a single literal.
|
* to a single literal.
|
||||||
*/
|
*/
|
||||||
if (n == 1 && op[-2] == (uint8) -1 &&
|
if (n == 1 && op[-2] == (uint8_t)-1 && *lastliteral < 126)
|
||||||
*lastliteral < 126) {
|
{
|
||||||
state = (((*lastliteral) += 2) == 127 ?
|
state = (((*lastliteral) += 2) == 127 ? BASE : LITERAL);
|
||||||
BASE : LITERAL);
|
|
||||||
op[-2] = op[-1]; /* replicate */
|
op[-2] = op[-1]; /* replicate */
|
||||||
} else
|
}
|
||||||
|
else
|
||||||
state = RUN;
|
state = RUN;
|
||||||
goto again;
|
goto again;
|
||||||
}
|
}
|
||||||
@ -191,12 +212,12 @@ PackBitsEncode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s)
|
|||||||
* the decoder if data is read, for example, by scanlines
|
* the decoder if data is read, for example, by scanlines
|
||||||
* when it was encoded by strips.
|
* when it was encoded by strips.
|
||||||
*/
|
*/
|
||||||
static int
|
static int PackBitsEncodeChunk(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s)
|
||||||
PackBitsEncodeChunk(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
|
|
||||||
{
|
{
|
||||||
tmsize_t rowsize = *(tmsize_t *)tif->tif_data;
|
tmsize_t rowsize = *(tmsize_t *)tif->tif_data;
|
||||||
|
|
||||||
while (cc > 0) {
|
while (cc > 0)
|
||||||
|
{
|
||||||
tmsize_t chunk = rowsize;
|
tmsize_t chunk = rowsize;
|
||||||
|
|
||||||
if (cc < chunk)
|
if (cc < chunk)
|
||||||
@ -210,41 +231,38 @@ PackBitsEncodeChunk(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
|
|||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int PackBitsDecode(TIFF *tif, uint8_t *op, tmsize_t occ, uint16_t s)
|
||||||
PackBitsDecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "PackBitsDecode";
|
static const char module[] = "PackBitsDecode";
|
||||||
char *bp;
|
int8_t *bp;
|
||||||
tmsize_t cc;
|
tmsize_t cc;
|
||||||
long n;
|
long n;
|
||||||
int b;
|
int b;
|
||||||
|
|
||||||
(void)s;
|
(void)s;
|
||||||
bp = (char*) tif->tif_rawcp;
|
bp = (int8_t *)tif->tif_rawcp;
|
||||||
cc = tif->tif_rawcc;
|
cc = tif->tif_rawcc;
|
||||||
while (cc > 0 && occ > 0) {
|
while (cc > 0 && occ > 0)
|
||||||
|
{
|
||||||
n = (long)*bp++;
|
n = (long)*bp++;
|
||||||
cc--;
|
cc--;
|
||||||
/*
|
if (n < 0)
|
||||||
* Watch out for compilers that
|
{ /* replicate next byte -n+1 times */
|
||||||
* don't sign extend chars...
|
|
||||||
*/
|
|
||||||
if (n >= 128)
|
|
||||||
n -= 256;
|
|
||||||
if (n < 0) { /* replicate next byte -n+1 times */
|
|
||||||
if (n == -128) /* nop */
|
if (n == -128) /* nop */
|
||||||
continue;
|
continue;
|
||||||
n = -n + 1;
|
n = -n + 1;
|
||||||
if (occ < (tmsize_t)n)
|
if (occ < (tmsize_t)n)
|
||||||
{
|
{
|
||||||
TIFFWarningExt(tif->tif_clientdata, module,
|
TIFFWarningExtR(tif, module,
|
||||||
"Discarding %lu bytes to avoid buffer overrun",
|
"Discarding %" TIFF_SSIZE_FORMAT
|
||||||
(unsigned long) ((tmsize_t)n - occ));
|
" bytes to avoid buffer overrun",
|
||||||
|
(tmsize_t)n - occ);
|
||||||
n = (long)occ;
|
n = (long)occ;
|
||||||
}
|
}
|
||||||
if (cc == 0)
|
if (cc == 0)
|
||||||
{
|
{
|
||||||
TIFFWarningExt(tif->tif_clientdata, module,
|
TIFFWarningExtR(
|
||||||
|
tif, module,
|
||||||
"Terminating PackBitsDecode due to lack of data.");
|
"Terminating PackBitsDecode due to lack of data.");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -252,39 +270,44 @@ PackBitsDecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s)
|
|||||||
b = *bp++;
|
b = *bp++;
|
||||||
cc--;
|
cc--;
|
||||||
while (n-- > 0)
|
while (n-- > 0)
|
||||||
*op++ = (uint8) b;
|
*op++ = (uint8_t)b;
|
||||||
} else { /* copy next n+1 bytes literally */
|
}
|
||||||
|
else
|
||||||
|
{ /* copy next n+1 bytes literally */
|
||||||
if (occ < (tmsize_t)(n + 1))
|
if (occ < (tmsize_t)(n + 1))
|
||||||
{
|
{
|
||||||
TIFFWarningExt(tif->tif_clientdata, module,
|
TIFFWarningExtR(tif, module,
|
||||||
"Discarding %lu bytes to avoid buffer overrun",
|
"Discarding %" TIFF_SSIZE_FORMAT
|
||||||
(unsigned long) ((tmsize_t)n - occ + 1));
|
" bytes to avoid buffer overrun",
|
||||||
|
(tmsize_t)n - occ + 1);
|
||||||
n = (long)occ - 1;
|
n = (long)occ - 1;
|
||||||
}
|
}
|
||||||
if (cc < (tmsize_t)(n + 1))
|
if (cc < (tmsize_t)(n + 1))
|
||||||
{
|
{
|
||||||
TIFFWarningExt(tif->tif_clientdata, module,
|
TIFFWarningExtR(
|
||||||
|
tif, module,
|
||||||
"Terminating PackBitsDecode due to lack of data.");
|
"Terminating PackBitsDecode due to lack of data.");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
_TIFFmemcpy(op, bp, ++n);
|
_TIFFmemcpy(op, bp, ++n);
|
||||||
op += n; occ -= n;
|
op += n;
|
||||||
bp += n; cc -= n;
|
occ -= n;
|
||||||
|
bp += n;
|
||||||
|
cc -= n;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tif->tif_rawcp = (uint8*) bp;
|
tif->tif_rawcp = (uint8_t *)bp;
|
||||||
tif->tif_rawcc = cc;
|
tif->tif_rawcc = cc;
|
||||||
if (occ > 0) {
|
if (occ > 0)
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
"Not enough data for scanline %lu",
|
TIFFErrorExtR(tif, module, "Not enough data for scanline %" PRIu32,
|
||||||
(unsigned long) tif->tif_row);
|
tif->tif_row);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int TIFFInitPackBits(TIFF *tif, int scheme)
|
||||||
TIFFInitPackBits(TIFF* tif, int scheme)
|
|
||||||
{
|
{
|
||||||
(void)scheme;
|
(void)scheme;
|
||||||
tif->tif_decoderow = PackBitsDecode;
|
tif->tif_decoderow = PackBitsDecode;
|
||||||
@ -298,12 +321,3 @@ TIFFInitPackBits(TIFF* tif, int scheme)
|
|||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
#endif /* PACKBITS_SUPPORT */
|
#endif /* PACKBITS_SUPPORT */
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
920
3rdparty/libtiff/tif_pixarlog.c
vendored
920
3rdparty/libtiff/tif_pixarlog.c
vendored
File diff suppressed because it is too large
Load Diff
661
3rdparty/libtiff/tif_predict.c
vendored
661
3rdparty/libtiff/tif_predict.c
vendored
File diff suppressed because it is too large
Load Diff
17
3rdparty/libtiff/tif_predict.h
vendored
17
3rdparty/libtiff/tif_predict.h
vendored
@ -32,14 +32,15 @@
|
|||||||
* ``Library-private'' Support for the Predictor Tag
|
* ``Library-private'' Support for the Predictor Tag
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef int (*TIFFEncodeDecodeMethod)(TIFF* tif, uint8* buf, tmsize_t size);
|
typedef int (*TIFFEncodeDecodeMethod)(TIFF *tif, uint8_t *buf, tmsize_t size);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Codecs that want to support the Predictor tag must place
|
* Codecs that want to support the Predictor tag must place
|
||||||
* this structure first in their private state block so that
|
* this structure first in their private state block so that
|
||||||
* the predictor code can cast tif_data to find its state.
|
* the predictor code can cast tif_data to find its state.
|
||||||
*/
|
*/
|
||||||
typedef struct {
|
typedef struct
|
||||||
|
{
|
||||||
int predictor; /* predictor tag value */
|
int predictor; /* predictor tag value */
|
||||||
tmsize_t stride; /* sample stride over data */
|
tmsize_t stride; /* sample stride over data */
|
||||||
tmsize_t rowsize; /* tile/strip row size */
|
tmsize_t rowsize; /* tile/strip row size */
|
||||||
@ -62,7 +63,8 @@ typedef struct {
|
|||||||
} TIFFPredictorState;
|
} TIFFPredictorState;
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
extern "C" {
|
extern "C"
|
||||||
|
{
|
||||||
#endif
|
#endif
|
||||||
extern int TIFFPredictorInit(TIFF *);
|
extern int TIFFPredictorInit(TIFF *);
|
||||||
extern int TIFFPredictorCleanup(TIFF *);
|
extern int TIFFPredictorCleanup(TIFF *);
|
||||||
@ -70,12 +72,3 @@ extern int TIFFPredictorCleanup(TIFF*);
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif /* _TIFFPREDICT_ */
|
#endif /* _TIFFPREDICT_ */
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
547
3rdparty/libtiff/tif_print.c
vendored
547
3rdparty/libtiff/tif_print.c
vendored
@ -32,8 +32,7 @@
|
|||||||
|
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
|
||||||
static void
|
static void _TIFFprintAsciiBounded(FILE *fd, const char *cp, size_t max_chars);
|
||||||
_TIFFprintAsciiBounded(FILE* fd, const char* cp, size_t max_chars);
|
|
||||||
|
|
||||||
static const char *const photoNames[] = {
|
static const char *const photoNames[] = {
|
||||||
"min-is-white", /* PHOTOMETRIC_MINISWHITE */
|
"min-is-white", /* PHOTOMETRIC_MINISWHITE */
|
||||||
@ -63,69 +62,81 @@ static const char * const orientNames[] = {
|
|||||||
};
|
};
|
||||||
#define NORIENTNAMES (sizeof(orientNames) / sizeof(orientNames[0]))
|
#define NORIENTNAMES (sizeof(orientNames) / sizeof(orientNames[0]))
|
||||||
|
|
||||||
static void
|
static const struct tagname
|
||||||
_TIFFPrintField(FILE* fd, const TIFFField *fip,
|
|
||||||
uint32 value_count, void *raw_data)
|
|
||||||
{
|
{
|
||||||
uint32 j;
|
uint16_t tag;
|
||||||
|
const char *name;
|
||||||
|
} tagnames[] = {
|
||||||
|
{TIFFTAG_GDAL_METADATA, "GDAL Metadata"},
|
||||||
|
{TIFFTAG_GDAL_NODATA, "GDAL NoDataValue"},
|
||||||
|
};
|
||||||
|
#define NTAGS (sizeof(tagnames) / sizeof(tagnames[0]))
|
||||||
|
|
||||||
fprintf(fd, " %s: ", fip->field_name);
|
static void _TIFFPrintField(FILE *fd, const TIFFField *fip,
|
||||||
|
uint32_t value_count, void *raw_data)
|
||||||
|
{
|
||||||
|
uint32_t j;
|
||||||
|
|
||||||
for(j = 0; j < value_count; j++) {
|
/* Print a user-friendly name for tags of relatively common use, but */
|
||||||
|
/* which aren't registered by libtiff itself. */
|
||||||
|
const char *field_name = fip->field_name;
|
||||||
|
if (TIFFFieldIsAnonymous(fip))
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < NTAGS; ++i)
|
||||||
|
{
|
||||||
|
if (fip->field_tag == tagnames[i].tag)
|
||||||
|
{
|
||||||
|
field_name = tagnames[i].name;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fprintf(fd, " %s: ", field_name);
|
||||||
|
|
||||||
|
for (j = 0; j < value_count; j++)
|
||||||
|
{
|
||||||
if (fip->field_type == TIFF_BYTE)
|
if (fip->field_type == TIFF_BYTE)
|
||||||
fprintf(fd, "%u", ((uint8 *) raw_data)[j]);
|
fprintf(fd, "%" PRIu8, ((uint8_t *)raw_data)[j]);
|
||||||
else if (fip->field_type == TIFF_UNDEFINED)
|
else if (fip->field_type == TIFF_UNDEFINED)
|
||||||
fprintf(fd, "0x%x",
|
fprintf(fd, "0x%" PRIx8, ((uint8_t *)raw_data)[j]);
|
||||||
(unsigned int) ((unsigned char *) raw_data)[j]);
|
|
||||||
else if (fip->field_type == TIFF_SBYTE)
|
else if (fip->field_type == TIFF_SBYTE)
|
||||||
fprintf(fd, "%d", ((int8 *) raw_data)[j]);
|
fprintf(fd, "%" PRId8, ((int8_t *)raw_data)[j]);
|
||||||
else if (fip->field_type == TIFF_SHORT)
|
else if (fip->field_type == TIFF_SHORT)
|
||||||
fprintf(fd, "%u", ((uint16 *) raw_data)[j]);
|
fprintf(fd, "%" PRIu16, ((uint16_t *)raw_data)[j]);
|
||||||
else if (fip->field_type == TIFF_SSHORT)
|
else if (fip->field_type == TIFF_SSHORT)
|
||||||
fprintf(fd, "%d", ((int16 *) raw_data)[j]);
|
fprintf(fd, "%" PRId16, ((int16_t *)raw_data)[j]);
|
||||||
else if (fip->field_type == TIFF_LONG)
|
else if (fip->field_type == TIFF_LONG)
|
||||||
fprintf(fd, "%lu",
|
fprintf(fd, "%" PRIu32, ((uint32_t *)raw_data)[j]);
|
||||||
(unsigned long)((uint32 *) raw_data)[j]);
|
|
||||||
else if (fip->field_type == TIFF_SLONG)
|
else if (fip->field_type == TIFF_SLONG)
|
||||||
fprintf(fd, "%ld", (long)((int32 *) raw_data)[j]);
|
fprintf(fd, "%" PRId32, ((int32_t *)raw_data)[j]);
|
||||||
else if (fip->field_type == TIFF_IFD)
|
else if (fip->field_type == TIFF_IFD)
|
||||||
fprintf(fd, "0x%lx",
|
fprintf(fd, "0x%" PRIx32, ((uint32_t *)raw_data)[j]);
|
||||||
(unsigned long)((uint32 *) raw_data)[j]);
|
else if (fip->field_type == TIFF_RATIONAL ||
|
||||||
else if(fip->field_type == TIFF_RATIONAL
|
fip->field_type == TIFF_SRATIONAL)
|
||||||
|| fip->field_type == TIFF_SRATIONAL
|
{
|
||||||
|| fip->field_type == TIFF_FLOAT)
|
int tv_size = TIFFFieldSetGetSize(fip);
|
||||||
|
if (tv_size == 8)
|
||||||
|
fprintf(fd, "%lf", ((double *)raw_data)[j]);
|
||||||
|
else
|
||||||
fprintf(fd, "%f", ((float *)raw_data)[j]);
|
fprintf(fd, "%f", ((float *)raw_data)[j]);
|
||||||
else if(fip->field_type == TIFF_LONG8)
|
}
|
||||||
#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
|
|
||||||
fprintf(fd, "%I64u",
|
|
||||||
(unsigned __int64)((uint64 *) raw_data)[j]);
|
|
||||||
#else
|
|
||||||
fprintf(fd, "%llu",
|
|
||||||
(unsigned long long)((uint64 *) raw_data)[j]);
|
|
||||||
#endif
|
|
||||||
else if(fip->field_type == TIFF_SLONG8)
|
|
||||||
#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
|
|
||||||
fprintf(fd, "%I64d", (__int64)((int64 *) raw_data)[j]);
|
|
||||||
#else
|
|
||||||
fprintf(fd, "%lld", (long long)((int64 *) raw_data)[j]);
|
|
||||||
#endif
|
|
||||||
else if(fip->field_type == TIFF_IFD8)
|
|
||||||
#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
|
|
||||||
fprintf(fd, "0x%I64x",
|
|
||||||
(unsigned __int64)((uint64 *) raw_data)[j]);
|
|
||||||
#else
|
|
||||||
fprintf(fd, "0x%llx",
|
|
||||||
(unsigned long long)((uint64 *) raw_data)[j]);
|
|
||||||
#endif
|
|
||||||
else if (fip->field_type == TIFF_FLOAT)
|
else if (fip->field_type == TIFF_FLOAT)
|
||||||
fprintf(fd, "%f", ((float *)raw_data)[j]);
|
fprintf(fd, "%f", ((float *)raw_data)[j]);
|
||||||
|
else if (fip->field_type == TIFF_LONG8)
|
||||||
|
fprintf(fd, "%" PRIu64, ((uint64_t *)raw_data)[j]);
|
||||||
|
else if (fip->field_type == TIFF_SLONG8)
|
||||||
|
fprintf(fd, "%" PRId64, ((int64_t *)raw_data)[j]);
|
||||||
|
else if (fip->field_type == TIFF_IFD8)
|
||||||
|
fprintf(fd, "0x%" PRIx64, ((uint64_t *)raw_data)[j]);
|
||||||
else if (fip->field_type == TIFF_DOUBLE)
|
else if (fip->field_type == TIFF_DOUBLE)
|
||||||
fprintf(fd, "%f", ((double *) raw_data)[j]);
|
fprintf(fd, "%lf", ((double *)raw_data)[j]);
|
||||||
else if(fip->field_type == TIFF_ASCII) {
|
else if (fip->field_type == TIFF_ASCII)
|
||||||
|
{
|
||||||
fprintf(fd, "%s", (char *)raw_data);
|
fprintf(fd, "%s", (char *)raw_data);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
fprintf(fd, "<unsupported data type in TIFFPrint>");
|
fprintf(fd, "<unsupported data type in TIFFPrint>");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -137,30 +148,33 @@ _TIFFPrintField(FILE* fd, const TIFFField *fip,
|
|||||||
fprintf(fd, "\n");
|
fprintf(fd, "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int _TIFFPrettyPrintField(TIFF *tif, const TIFFField *fip, FILE *fd,
|
||||||
_TIFFPrettyPrintField(TIFF* tif, const TIFFField *fip, FILE* fd, uint32 tag,
|
uint32_t tag, uint32_t value_count,
|
||||||
uint32 value_count, void *raw_data)
|
void *raw_data)
|
||||||
{
|
{
|
||||||
(void)tif;
|
(void)tif;
|
||||||
|
|
||||||
/* do not try to pretty print auto-defined fields */
|
/* do not try to pretty print auto-defined fields */
|
||||||
if (strncmp(fip->field_name,"Tag ", 4) == 0) {
|
if (TIFFFieldIsAnonymous(fip))
|
||||||
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (tag)
|
switch (tag)
|
||||||
{
|
{
|
||||||
case TIFFTAG_INKSET:
|
case TIFFTAG_INKSET:
|
||||||
if (value_count == 2 && fip->field_type == TIFF_SHORT) {
|
if (value_count == 2 && fip->field_type == TIFF_SHORT)
|
||||||
|
{
|
||||||
fprintf(fd, " Ink Set: ");
|
fprintf(fd, " Ink Set: ");
|
||||||
switch (*((uint16*)raw_data)) {
|
switch (*((uint16_t *)raw_data))
|
||||||
|
{
|
||||||
case INKSET_CMYK:
|
case INKSET_CMYK:
|
||||||
fprintf(fd, "CMYK\n");
|
fprintf(fd, "CMYK\n");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
fprintf(fd, "%u (0x%x)\n",
|
fprintf(fd, "%" PRIu16 " (0x%" PRIx16 ")\n",
|
||||||
*((uint16*)raw_data),
|
*((uint16_t *)raw_data),
|
||||||
*((uint16*)raw_data));
|
*((uint16_t *)raw_data));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
@ -168,24 +182,26 @@ _TIFFPrettyPrintField(TIFF* tif, const TIFFField *fip, FILE* fd, uint32 tag,
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case TIFFTAG_DOTRANGE:
|
case TIFFTAG_DOTRANGE:
|
||||||
if (value_count == 2 && fip->field_type == TIFF_SHORT) {
|
if (value_count == 2 && fip->field_type == TIFF_SHORT)
|
||||||
fprintf(fd, " Dot Range: %u-%u\n",
|
{
|
||||||
((uint16*)raw_data)[0], ((uint16*)raw_data)[1]);
|
fprintf(fd, " Dot Range: %" PRIu16 "-%" PRIu16 "\n",
|
||||||
|
((uint16_t *)raw_data)[0], ((uint16_t *)raw_data)[1]);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case TIFFTAG_WHITEPOINT:
|
case TIFFTAG_WHITEPOINT:
|
||||||
if (value_count == 2 && fip->field_type == TIFF_RATIONAL) {
|
if (value_count == 2 && fip->field_type == TIFF_RATIONAL)
|
||||||
fprintf(fd, " White Point: %g-%g\n",
|
{
|
||||||
((float *)raw_data)[0], ((float *)raw_data)[1]);
|
fprintf(fd, " White Point: %g-%g\n", ((float *)raw_data)[0],
|
||||||
|
((float *)raw_data)[1]);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case TIFFTAG_XMLPACKET:
|
case TIFFTAG_XMLPACKET:
|
||||||
{
|
{
|
||||||
uint32 i;
|
uint32_t i;
|
||||||
|
|
||||||
fprintf(fd, " XMLPacket (XMP Metadata):\n");
|
fprintf(fd, " XMLPacket (XMP Metadata):\n");
|
||||||
for (i = 0; i < value_count; i++)
|
for (i = 0; i < value_count; i++)
|
||||||
@ -194,29 +210,24 @@ _TIFFPrettyPrintField(TIFF* tif, const TIFFField *fip, FILE* fd, uint32 tag,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
case TIFFTAG_RICHTIFFIPTC:
|
case TIFFTAG_RICHTIFFIPTC:
|
||||||
/*
|
fprintf(fd, " RichTIFFIPTC Data: <present>, %" PRIu32 " bytes\n",
|
||||||
* XXX: for some weird reason RichTIFFIPTC tag
|
value_count);
|
||||||
* defined as array of LONG values.
|
|
||||||
*/
|
|
||||||
fprintf(fd,
|
|
||||||
" RichTIFFIPTC Data: <present>, %lu bytes\n",
|
|
||||||
(unsigned long) value_count * 4);
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
case TIFFTAG_PHOTOSHOP:
|
case TIFFTAG_PHOTOSHOP:
|
||||||
fprintf(fd, " Photoshop Data: <present>, %lu bytes\n",
|
fprintf(fd, " Photoshop Data: <present>, %" PRIu32 " bytes\n",
|
||||||
(unsigned long) value_count);
|
value_count);
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
case TIFFTAG_ICCPROFILE:
|
case TIFFTAG_ICCPROFILE:
|
||||||
fprintf(fd, " ICC Profile: <present>, %lu bytes\n",
|
fprintf(fd, " ICC Profile: <present>, %" PRIu32 " bytes\n",
|
||||||
(unsigned long) value_count);
|
value_count);
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
case TIFFTAG_STONITS:
|
case TIFFTAG_STONITS:
|
||||||
if (value_count == 1 && fip->field_type == TIFF_DOUBLE) {
|
if (value_count == 1 && fip->field_type == TIFF_DOUBLE)
|
||||||
fprintf(fd,
|
{
|
||||||
" Sample to Nits conversion factor: %.4e\n",
|
fprintf(fd, " Sample to Nits conversion factor: %.4e\n",
|
||||||
*((double *)raw_data));
|
*((double *)raw_data));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -230,59 +241,57 @@ _TIFFPrettyPrintField(TIFF* tif, const TIFFField *fip, FILE* fd, uint32 tag,
|
|||||||
* Print the contents of the current directory
|
* Print the contents of the current directory
|
||||||
* to the specified stdio file stream.
|
* to the specified stdio file stream.
|
||||||
*/
|
*/
|
||||||
void
|
void TIFFPrintDirectory(TIFF *tif, FILE *fd, long flags)
|
||||||
TIFFPrintDirectory(TIFF* tif, FILE* fd, long flags)
|
|
||||||
{
|
{
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
TIFFDirectory *td = &tif->tif_dir;
|
||||||
char *sep;
|
char *sep;
|
||||||
long l, n;
|
long l, n;
|
||||||
|
|
||||||
#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
|
fprintf(fd, "TIFF Directory at offset 0x%" PRIx64 " (%" PRIu64 ")\n",
|
||||||
fprintf(fd, "TIFF Directory at offset 0x%I64x (%I64u)\n",
|
tif->tif_diroff, tif->tif_diroff);
|
||||||
(unsigned __int64) tif->tif_diroff,
|
if (TIFFFieldSet(tif, FIELD_SUBFILETYPE))
|
||||||
(unsigned __int64) tif->tif_diroff);
|
{
|
||||||
#else
|
|
||||||
fprintf(fd, "TIFF Directory at offset 0x%llx (%llu)\n",
|
|
||||||
(unsigned long long) tif->tif_diroff,
|
|
||||||
(unsigned long long) tif->tif_diroff);
|
|
||||||
#endif
|
|
||||||
if (TIFFFieldSet(tif,FIELD_SUBFILETYPE)) {
|
|
||||||
fprintf(fd, " Subfile Type:");
|
fprintf(fd, " Subfile Type:");
|
||||||
sep = " ";
|
sep = " ";
|
||||||
if (td->td_subfiletype & FILETYPE_REDUCEDIMAGE) {
|
if (td->td_subfiletype & FILETYPE_REDUCEDIMAGE)
|
||||||
|
{
|
||||||
fprintf(fd, "%sreduced-resolution image", sep);
|
fprintf(fd, "%sreduced-resolution image", sep);
|
||||||
sep = "/";
|
sep = "/";
|
||||||
}
|
}
|
||||||
if (td->td_subfiletype & FILETYPE_PAGE) {
|
if (td->td_subfiletype & FILETYPE_PAGE)
|
||||||
|
{
|
||||||
fprintf(fd, "%smulti-page document", sep);
|
fprintf(fd, "%smulti-page document", sep);
|
||||||
sep = "/";
|
sep = "/";
|
||||||
}
|
}
|
||||||
if (td->td_subfiletype & FILETYPE_MASK)
|
if (td->td_subfiletype & FILETYPE_MASK)
|
||||||
fprintf(fd, "%stransparency mask", sep);
|
fprintf(fd, "%stransparency mask", sep);
|
||||||
fprintf(fd, " (%lu = 0x%lx)\n",
|
fprintf(fd, " (%" PRIu32 " = 0x%" PRIx32 ")\n", td->td_subfiletype,
|
||||||
(unsigned long) td->td_subfiletype, (long) td->td_subfiletype);
|
td->td_subfiletype);
|
||||||
}
|
}
|
||||||
if (TIFFFieldSet(tif,FIELD_IMAGEDIMENSIONS)) {
|
if (TIFFFieldSet(tif, FIELD_IMAGEDIMENSIONS))
|
||||||
fprintf(fd, " Image Width: %lu Image Length: %lu",
|
{
|
||||||
(unsigned long) td->td_imagewidth, (unsigned long) td->td_imagelength);
|
fprintf(fd, " Image Width: %" PRIu32 " Image Length: %" PRIu32,
|
||||||
|
td->td_imagewidth, td->td_imagelength);
|
||||||
if (TIFFFieldSet(tif, FIELD_IMAGEDEPTH))
|
if (TIFFFieldSet(tif, FIELD_IMAGEDEPTH))
|
||||||
fprintf(fd, " Image Depth: %lu",
|
fprintf(fd, " Image Depth: %" PRIu32, td->td_imagedepth);
|
||||||
(unsigned long) td->td_imagedepth);
|
|
||||||
fprintf(fd, "\n");
|
fprintf(fd, "\n");
|
||||||
}
|
}
|
||||||
if (TIFFFieldSet(tif,FIELD_TILEDIMENSIONS)) {
|
if (TIFFFieldSet(tif, FIELD_TILEDIMENSIONS))
|
||||||
fprintf(fd, " Tile Width: %lu Tile Length: %lu",
|
{
|
||||||
(unsigned long) td->td_tilewidth, (unsigned long) td->td_tilelength);
|
fprintf(fd, " Tile Width: %" PRIu32 " Tile Length: %" PRIu32,
|
||||||
|
td->td_tilewidth, td->td_tilelength);
|
||||||
if (TIFFFieldSet(tif, FIELD_TILEDEPTH))
|
if (TIFFFieldSet(tif, FIELD_TILEDEPTH))
|
||||||
fprintf(fd, " Tile Depth: %lu",
|
fprintf(fd, " Tile Depth: %" PRIu32, td->td_tiledepth);
|
||||||
(unsigned long) td->td_tiledepth);
|
|
||||||
fprintf(fd, "\n");
|
fprintf(fd, "\n");
|
||||||
}
|
}
|
||||||
if (TIFFFieldSet(tif,FIELD_RESOLUTION)) {
|
if (TIFFFieldSet(tif, FIELD_RESOLUTION))
|
||||||
fprintf(fd, " Resolution: %g, %g",
|
{
|
||||||
td->td_xresolution, td->td_yresolution);
|
fprintf(fd, " Resolution: %g, %g", td->td_xresolution,
|
||||||
if (TIFFFieldSet(tif,FIELD_RESOLUTIONUNIT)) {
|
td->td_yresolution);
|
||||||
switch (td->td_resolutionunit) {
|
if (TIFFFieldSet(tif, FIELD_RESOLUTIONUNIT))
|
||||||
|
{
|
||||||
|
switch (td->td_resolutionunit)
|
||||||
|
{
|
||||||
case RESUNIT_NONE:
|
case RESUNIT_NONE:
|
||||||
fprintf(fd, " (unitless)");
|
fprintf(fd, " (unitless)");
|
||||||
break;
|
break;
|
||||||
@ -293,22 +302,22 @@ TIFFPrintDirectory(TIFF* tif, FILE* fd, long flags)
|
|||||||
fprintf(fd, " pixels/cm");
|
fprintf(fd, " pixels/cm");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
fprintf(fd, " (unit %u = 0x%x)",
|
fprintf(fd, " (unit %" PRIu16 " = 0x%" PRIx16 ")",
|
||||||
td->td_resolutionunit,
|
td->td_resolutionunit, td->td_resolutionunit);
|
||||||
td->td_resolutionunit);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fprintf(fd, "\n");
|
fprintf(fd, "\n");
|
||||||
}
|
}
|
||||||
if (TIFFFieldSet(tif, FIELD_POSITION))
|
if (TIFFFieldSet(tif, FIELD_POSITION))
|
||||||
fprintf(fd, " Position: %g, %g\n",
|
fprintf(fd, " Position: %g, %g\n", td->td_xposition, td->td_yposition);
|
||||||
td->td_xposition, td->td_yposition);
|
|
||||||
if (TIFFFieldSet(tif, FIELD_BITSPERSAMPLE))
|
if (TIFFFieldSet(tif, FIELD_BITSPERSAMPLE))
|
||||||
fprintf(fd, " Bits/Sample: %u\n", td->td_bitspersample);
|
fprintf(fd, " Bits/Sample: %" PRIu16 "\n", td->td_bitspersample);
|
||||||
if (TIFFFieldSet(tif,FIELD_SAMPLEFORMAT)) {
|
if (TIFFFieldSet(tif, FIELD_SAMPLEFORMAT))
|
||||||
|
{
|
||||||
fprintf(fd, " Sample Format: ");
|
fprintf(fd, " Sample Format: ");
|
||||||
switch (td->td_sampleformat) {
|
switch (td->td_sampleformat)
|
||||||
|
{
|
||||||
case SAMPLEFORMAT_VOID:
|
case SAMPLEFORMAT_VOID:
|
||||||
fprintf(fd, "void\n");
|
fprintf(fd, "void\n");
|
||||||
break;
|
break;
|
||||||
@ -328,26 +337,30 @@ TIFFPrintDirectory(TIFF* tif, FILE* fd, long flags)
|
|||||||
fprintf(fd, "complex IEEE floating point\n");
|
fprintf(fd, "complex IEEE floating point\n");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
fprintf(fd, "%u (0x%x)\n",
|
fprintf(fd, "%" PRIu16 " (0x%" PRIx16 ")\n",
|
||||||
td->td_sampleformat, td->td_sampleformat);
|
td->td_sampleformat, td->td_sampleformat);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (TIFFFieldSet(tif,FIELD_COMPRESSION)) {
|
if (TIFFFieldSet(tif, FIELD_COMPRESSION))
|
||||||
|
{
|
||||||
const TIFFCodec *c = TIFFFindCODEC(td->td_compression);
|
const TIFFCodec *c = TIFFFindCODEC(td->td_compression);
|
||||||
fprintf(fd, " Compression Scheme: ");
|
fprintf(fd, " Compression Scheme: ");
|
||||||
if (c)
|
if (c)
|
||||||
fprintf(fd, "%s\n", c->name);
|
fprintf(fd, "%s\n", c->name);
|
||||||
else
|
else
|
||||||
fprintf(fd, "%u (0x%x)\n",
|
fprintf(fd, "%" PRIu16 " (0x%" PRIx16 ")\n", td->td_compression,
|
||||||
td->td_compression, td->td_compression);
|
td->td_compression);
|
||||||
}
|
}
|
||||||
if (TIFFFieldSet(tif,FIELD_PHOTOMETRIC)) {
|
if (TIFFFieldSet(tif, FIELD_PHOTOMETRIC))
|
||||||
|
{
|
||||||
fprintf(fd, " Photometric Interpretation: ");
|
fprintf(fd, " Photometric Interpretation: ");
|
||||||
if (td->td_photometric < NPHOTONAMES)
|
if (td->td_photometric < NPHOTONAMES)
|
||||||
fprintf(fd, "%s\n", photoNames[td->td_photometric]);
|
fprintf(fd, "%s\n", photoNames[td->td_photometric]);
|
||||||
else {
|
else
|
||||||
switch (td->td_photometric) {
|
{
|
||||||
|
switch (td->td_photometric)
|
||||||
|
{
|
||||||
case PHOTOMETRIC_LOGL:
|
case PHOTOMETRIC_LOGL:
|
||||||
fprintf(fd, "CIE Log2(L)\n");
|
fprintf(fd, "CIE Log2(L)\n");
|
||||||
break;
|
break;
|
||||||
@ -355,18 +368,21 @@ TIFFPrintDirectory(TIFF* tif, FILE* fd, long flags)
|
|||||||
fprintf(fd, "CIE Log2(L) (u',v')\n");
|
fprintf(fd, "CIE Log2(L) (u',v')\n");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
fprintf(fd, "%u (0x%x)\n",
|
fprintf(fd, "%" PRIu16 " (0x%" PRIx16 ")\n",
|
||||||
td->td_photometric, td->td_photometric);
|
td->td_photometric, td->td_photometric);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (TIFFFieldSet(tif,FIELD_EXTRASAMPLES) && td->td_extrasamples) {
|
if (TIFFFieldSet(tif, FIELD_EXTRASAMPLES) && td->td_extrasamples)
|
||||||
uint16 i;
|
{
|
||||||
fprintf(fd, " Extra Samples: %u<", td->td_extrasamples);
|
uint16_t i;
|
||||||
|
fprintf(fd, " Extra Samples: %" PRIu16 "<", td->td_extrasamples);
|
||||||
sep = "";
|
sep = "";
|
||||||
for (i = 0; i < td->td_extrasamples; i++) {
|
for (i = 0; i < td->td_extrasamples; i++)
|
||||||
switch (td->td_sampleinfo[i]) {
|
{
|
||||||
|
switch (td->td_sampleinfo[i])
|
||||||
|
{
|
||||||
case EXTRASAMPLE_UNSPECIFIED:
|
case EXTRASAMPLE_UNSPECIFIED:
|
||||||
fprintf(fd, "%sunspecified", sep);
|
fprintf(fd, "%sunspecified", sep);
|
||||||
break;
|
break;
|
||||||
@ -377,7 +393,7 @@ TIFFPrintDirectory(TIFF* tif, FILE* fd, long flags)
|
|||||||
fprintf(fd, "%sunassoc-alpha", sep);
|
fprintf(fd, "%sunassoc-alpha", sep);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
fprintf(fd, "%s%u (0x%x)", sep,
|
fprintf(fd, "%s%" PRIu16 " (0x%" PRIx16 ")", sep,
|
||||||
td->td_sampleinfo[i], td->td_sampleinfo[i]);
|
td->td_sampleinfo[i], td->td_sampleinfo[i]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -385,26 +401,33 @@ TIFFPrintDirectory(TIFF* tif, FILE* fd, long flags)
|
|||||||
}
|
}
|
||||||
fprintf(fd, ">\n");
|
fprintf(fd, ">\n");
|
||||||
}
|
}
|
||||||
if (TIFFFieldSet(tif,FIELD_INKNAMES)) {
|
if (TIFFFieldSet(tif, FIELD_INKNAMES))
|
||||||
|
{
|
||||||
char *cp;
|
char *cp;
|
||||||
uint16 i;
|
uint16_t i;
|
||||||
fprintf(fd, " Ink Names: ");
|
fprintf(fd, " Ink Names: ");
|
||||||
i = td->td_samplesperpixel;
|
i = td->td_samplesperpixel;
|
||||||
sep = "";
|
sep = "";
|
||||||
for (cp = td->td_inknames;
|
for (cp = td->td_inknames;
|
||||||
i > 0 && cp < td->td_inknames + td->td_inknameslen;
|
i > 0 && cp < td->td_inknames + td->td_inknameslen;
|
||||||
cp = strchr(cp,'\0')+1, i--) {
|
cp = strchr(cp, '\0') + 1, i--)
|
||||||
size_t max_chars =
|
{
|
||||||
td->td_inknameslen - (cp - td->td_inknames);
|
size_t max_chars = td->td_inknameslen - (cp - td->td_inknames);
|
||||||
fputs(sep, fd);
|
fputs(sep, fd);
|
||||||
_TIFFprintAsciiBounded(fd, cp, max_chars);
|
_TIFFprintAsciiBounded(fd, cp, max_chars);
|
||||||
sep = ", ";
|
sep = ", ";
|
||||||
}
|
}
|
||||||
fputs("\n", fd);
|
fputs("\n", fd);
|
||||||
}
|
}
|
||||||
if (TIFFFieldSet(tif,FIELD_THRESHHOLDING)) {
|
if (TIFFFieldSet(tif, FIELD_NUMBEROFINKS))
|
||||||
|
{
|
||||||
|
fprintf(fd, " NumberOfInks: %d\n", td->td_numberofinks);
|
||||||
|
}
|
||||||
|
if (TIFFFieldSet(tif, FIELD_THRESHHOLDING))
|
||||||
|
{
|
||||||
fprintf(fd, " Thresholding: ");
|
fprintf(fd, " Thresholding: ");
|
||||||
switch (td->td_threshholding) {
|
switch (td->td_threshholding)
|
||||||
|
{
|
||||||
case THRESHHOLD_BILEVEL:
|
case THRESHHOLD_BILEVEL:
|
||||||
fprintf(fd, "bilevel art scan\n");
|
fprintf(fd, "bilevel art scan\n");
|
||||||
break;
|
break;
|
||||||
@ -415,14 +438,16 @@ TIFFPrintDirectory(TIFF* tif, FILE* fd, long flags)
|
|||||||
fprintf(fd, "error diffused\n");
|
fprintf(fd, "error diffused\n");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
fprintf(fd, "%u (0x%x)\n",
|
fprintf(fd, "%" PRIu16 " (0x%" PRIx16 ")\n",
|
||||||
td->td_threshholding, td->td_threshholding);
|
td->td_threshholding, td->td_threshholding);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (TIFFFieldSet(tif,FIELD_FILLORDER)) {
|
if (TIFFFieldSet(tif, FIELD_FILLORDER))
|
||||||
|
{
|
||||||
fprintf(fd, " FillOrder: ");
|
fprintf(fd, " FillOrder: ");
|
||||||
switch (td->td_fillorder) {
|
switch (td->td_fillorder)
|
||||||
|
{
|
||||||
case FILLORDER_MSB2LSB:
|
case FILLORDER_MSB2LSB:
|
||||||
fprintf(fd, "msb-to-lsb\n");
|
fprintf(fd, "msb-to-lsb\n");
|
||||||
break;
|
break;
|
||||||
@ -430,19 +455,21 @@ TIFFPrintDirectory(TIFF* tif, FILE* fd, long flags)
|
|||||||
fprintf(fd, "lsb-to-msb\n");
|
fprintf(fd, "lsb-to-msb\n");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
fprintf(fd, "%u (0x%x)\n",
|
fprintf(fd, "%" PRIu16 " (0x%" PRIx16 ")\n", td->td_fillorder,
|
||||||
td->td_fillorder, td->td_fillorder);
|
td->td_fillorder);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (TIFFFieldSet(tif, FIELD_YCBCRSUBSAMPLING))
|
if (TIFFFieldSet(tif, FIELD_YCBCRSUBSAMPLING))
|
||||||
{
|
{
|
||||||
fprintf(fd, " YCbCr Subsampling: %u, %u\n",
|
fprintf(fd, " YCbCr Subsampling: %" PRIu16 ", %" PRIu16 "\n",
|
||||||
td->td_ycbcrsubsampling[0], td->td_ycbcrsubsampling[1]);
|
td->td_ycbcrsubsampling[0], td->td_ycbcrsubsampling[1]);
|
||||||
}
|
}
|
||||||
if (TIFFFieldSet(tif,FIELD_YCBCRPOSITIONING)) {
|
if (TIFFFieldSet(tif, FIELD_YCBCRPOSITIONING))
|
||||||
|
{
|
||||||
fprintf(fd, " YCbCr Positioning: ");
|
fprintf(fd, " YCbCr Positioning: ");
|
||||||
switch (td->td_ycbcrpositioning) {
|
switch (td->td_ycbcrpositioning)
|
||||||
|
{
|
||||||
case YCBCRPOSITION_CENTERED:
|
case YCBCRPOSITION_CENTERED:
|
||||||
fprintf(fd, "centered\n");
|
fprintf(fd, "centered\n");
|
||||||
break;
|
break;
|
||||||
@ -450,54 +477,62 @@ TIFFPrintDirectory(TIFF* tif, FILE* fd, long flags)
|
|||||||
fprintf(fd, "cosited\n");
|
fprintf(fd, "cosited\n");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
fprintf(fd, "%u (0x%x)\n",
|
fprintf(fd, "%" PRIu16 " (0x%" PRIx16 ")\n",
|
||||||
td->td_ycbcrpositioning, td->td_ycbcrpositioning);
|
td->td_ycbcrpositioning, td->td_ycbcrpositioning);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (TIFFFieldSet(tif, FIELD_HALFTONEHINTS))
|
if (TIFFFieldSet(tif, FIELD_HALFTONEHINTS))
|
||||||
fprintf(fd, " Halftone Hints: light %u dark %u\n",
|
fprintf(fd, " Halftone Hints: light %" PRIu16 " dark %" PRIu16 "\n",
|
||||||
td->td_halftonehints[0], td->td_halftonehints[1]);
|
td->td_halftonehints[0], td->td_halftonehints[1]);
|
||||||
if (TIFFFieldSet(tif,FIELD_ORIENTATION)) {
|
if (TIFFFieldSet(tif, FIELD_ORIENTATION))
|
||||||
|
{
|
||||||
fprintf(fd, " Orientation: ");
|
fprintf(fd, " Orientation: ");
|
||||||
if (td->td_orientation < NORIENTNAMES)
|
if (td->td_orientation < NORIENTNAMES)
|
||||||
fprintf(fd, "%s\n", orientNames[td->td_orientation]);
|
fprintf(fd, "%s\n", orientNames[td->td_orientation]);
|
||||||
else
|
else
|
||||||
fprintf(fd, "%u (0x%x)\n",
|
fprintf(fd, "%" PRIu16 " (0x%" PRIx16 ")\n", td->td_orientation,
|
||||||
td->td_orientation, td->td_orientation);
|
td->td_orientation);
|
||||||
}
|
}
|
||||||
if (TIFFFieldSet(tif, FIELD_SAMPLESPERPIXEL))
|
if (TIFFFieldSet(tif, FIELD_SAMPLESPERPIXEL))
|
||||||
fprintf(fd, " Samples/Pixel: %u\n", td->td_samplesperpixel);
|
fprintf(fd, " Samples/Pixel: %" PRIx16 "\n", td->td_samplesperpixel);
|
||||||
if (TIFFFieldSet(tif,FIELD_ROWSPERSTRIP)) {
|
if (TIFFFieldSet(tif, FIELD_ROWSPERSTRIP))
|
||||||
|
{
|
||||||
fprintf(fd, " Rows/Strip: ");
|
fprintf(fd, " Rows/Strip: ");
|
||||||
if (td->td_rowsperstrip == (uint32) -1)
|
if (td->td_rowsperstrip == (uint32_t)-1)
|
||||||
fprintf(fd, "(infinite)\n");
|
fprintf(fd, "(infinite)\n");
|
||||||
else
|
else
|
||||||
fprintf(fd, "%lu\n", (unsigned long) td->td_rowsperstrip);
|
fprintf(fd, "%" PRIu32 "\n", td->td_rowsperstrip);
|
||||||
}
|
}
|
||||||
if (TIFFFieldSet(tif, FIELD_MINSAMPLEVALUE))
|
if (TIFFFieldSet(tif, FIELD_MINSAMPLEVALUE))
|
||||||
fprintf(fd, " Min Sample Value: %u\n", td->td_minsamplevalue);
|
fprintf(fd, " Min Sample Value: %" PRIu16 "\n", td->td_minsamplevalue);
|
||||||
if (TIFFFieldSet(tif, FIELD_MAXSAMPLEVALUE))
|
if (TIFFFieldSet(tif, FIELD_MAXSAMPLEVALUE))
|
||||||
fprintf(fd, " Max Sample Value: %u\n", td->td_maxsamplevalue);
|
fprintf(fd, " Max Sample Value: %" PRIu16 "\n", td->td_maxsamplevalue);
|
||||||
if (TIFFFieldSet(tif,FIELD_SMINSAMPLEVALUE)) {
|
if (TIFFFieldSet(tif, FIELD_SMINSAMPLEVALUE))
|
||||||
|
{
|
||||||
int i;
|
int i;
|
||||||
int count = (tif->tif_flags & TIFF_PERSAMPLE) ? td->td_samplesperpixel : 1;
|
int count =
|
||||||
|
(tif->tif_flags & TIFF_PERSAMPLE) ? td->td_samplesperpixel : 1;
|
||||||
fprintf(fd, " SMin Sample Value:");
|
fprintf(fd, " SMin Sample Value:");
|
||||||
for (i = 0; i < count; ++i)
|
for (i = 0; i < count; ++i)
|
||||||
fprintf(fd, " %g", td->td_sminsamplevalue[i]);
|
fprintf(fd, " %g", td->td_sminsamplevalue[i]);
|
||||||
fprintf(fd, "\n");
|
fprintf(fd, "\n");
|
||||||
}
|
}
|
||||||
if (TIFFFieldSet(tif,FIELD_SMAXSAMPLEVALUE)) {
|
if (TIFFFieldSet(tif, FIELD_SMAXSAMPLEVALUE))
|
||||||
|
{
|
||||||
int i;
|
int i;
|
||||||
int count = (tif->tif_flags & TIFF_PERSAMPLE) ? td->td_samplesperpixel : 1;
|
int count =
|
||||||
|
(tif->tif_flags & TIFF_PERSAMPLE) ? td->td_samplesperpixel : 1;
|
||||||
fprintf(fd, " SMax Sample Value:");
|
fprintf(fd, " SMax Sample Value:");
|
||||||
for (i = 0; i < count; ++i)
|
for (i = 0; i < count; ++i)
|
||||||
fprintf(fd, " %g", td->td_smaxsamplevalue[i]);
|
fprintf(fd, " %g", td->td_smaxsamplevalue[i]);
|
||||||
fprintf(fd, "\n");
|
fprintf(fd, "\n");
|
||||||
}
|
}
|
||||||
if (TIFFFieldSet(tif,FIELD_PLANARCONFIG)) {
|
if (TIFFFieldSet(tif, FIELD_PLANARCONFIG))
|
||||||
|
{
|
||||||
fprintf(fd, " Planar Configuration: ");
|
fprintf(fd, " Planar Configuration: ");
|
||||||
switch (td->td_planarconfig) {
|
switch (td->td_planarconfig)
|
||||||
|
{
|
||||||
case PLANARCONFIG_CONTIG:
|
case PLANARCONFIG_CONTIG:
|
||||||
fprintf(fd, "single image plane\n");
|
fprintf(fd, "single image plane\n");
|
||||||
break;
|
break;
|
||||||
@ -505,29 +540,31 @@ TIFFPrintDirectory(TIFF* tif, FILE* fd, long flags)
|
|||||||
fprintf(fd, "separate image planes\n");
|
fprintf(fd, "separate image planes\n");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
fprintf(fd, "%u (0x%x)\n",
|
fprintf(fd, "%" PRIu16 " (0x%" PRIx16 ")\n",
|
||||||
td->td_planarconfig, td->td_planarconfig);
|
td->td_planarconfig, td->td_planarconfig);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (TIFFFieldSet(tif, FIELD_PAGENUMBER))
|
if (TIFFFieldSet(tif, FIELD_PAGENUMBER))
|
||||||
fprintf(fd, " Page Number: %u-%u\n",
|
fprintf(fd, " Page Number: %" PRIu16 "-%" PRIu16 "\n",
|
||||||
td->td_pagenumber[0], td->td_pagenumber[1]);
|
td->td_pagenumber[0], td->td_pagenumber[1]);
|
||||||
if (TIFFFieldSet(tif,FIELD_COLORMAP)) {
|
if (TIFFFieldSet(tif, FIELD_COLORMAP))
|
||||||
|
{
|
||||||
fprintf(fd, " Color Map: ");
|
fprintf(fd, " Color Map: ");
|
||||||
if (flags & TIFFPRINT_COLORMAP) {
|
if (flags & TIFFPRINT_COLORMAP)
|
||||||
|
{
|
||||||
fprintf(fd, "\n");
|
fprintf(fd, "\n");
|
||||||
n = 1L << td->td_bitspersample;
|
n = 1L << td->td_bitspersample;
|
||||||
for (l = 0; l < n; l++)
|
for (l = 0; l < n; l++)
|
||||||
fprintf(fd, " %5ld: %5u %5u %5u\n",
|
fprintf(fd, " %5ld: %5" PRIu16 " %5" PRIu16 " %5" PRIu16 "\n",
|
||||||
l,
|
l, td->td_colormap[0][l], td->td_colormap[1][l],
|
||||||
td->td_colormap[0][l],
|
|
||||||
td->td_colormap[1][l],
|
|
||||||
td->td_colormap[2][l]);
|
td->td_colormap[2][l]);
|
||||||
} else
|
}
|
||||||
|
else
|
||||||
fprintf(fd, "(present)\n");
|
fprintf(fd, "(present)\n");
|
||||||
}
|
}
|
||||||
if (TIFFFieldSet(tif,FIELD_REFBLACKWHITE)) {
|
if (TIFFFieldSet(tif, FIELD_REFBLACKWHITE))
|
||||||
|
{
|
||||||
int i;
|
int i;
|
||||||
fprintf(fd, " Reference Black/White:\n");
|
fprintf(fd, " Reference Black/White:\n");
|
||||||
for (i = 0; i < 3; i++)
|
for (i = 0; i < 3; i++)
|
||||||
@ -535,34 +572,34 @@ TIFFPrintDirectory(TIFF* tif, FILE* fd, long flags)
|
|||||||
td->td_refblackwhite[2 * i + 0],
|
td->td_refblackwhite[2 * i + 0],
|
||||||
td->td_refblackwhite[2 * i + 1]);
|
td->td_refblackwhite[2 * i + 1]);
|
||||||
}
|
}
|
||||||
if (TIFFFieldSet(tif,FIELD_TRANSFERFUNCTION)) {
|
if (TIFFFieldSet(tif, FIELD_TRANSFERFUNCTION))
|
||||||
|
{
|
||||||
fprintf(fd, " Transfer Function: ");
|
fprintf(fd, " Transfer Function: ");
|
||||||
if (flags & TIFFPRINT_CURVES) {
|
if (flags & TIFFPRINT_CURVES)
|
||||||
|
{
|
||||||
fprintf(fd, "\n");
|
fprintf(fd, "\n");
|
||||||
n = 1L << td->td_bitspersample;
|
n = 1L << td->td_bitspersample;
|
||||||
for (l = 0; l < n; l++) {
|
for (l = 0; l < n; l++)
|
||||||
uint16 i;
|
{
|
||||||
fprintf(fd, " %2ld: %5u",
|
uint16_t i;
|
||||||
l, td->td_transferfunction[0][l]);
|
fprintf(fd, " %2ld: %5" PRIu16, l,
|
||||||
for (i = 1; i < td->td_samplesperpixel - td->td_extrasamples && i < 3; i++)
|
td->td_transferfunction[0][l]);
|
||||||
fprintf(fd, " %5u",
|
for (i = 1;
|
||||||
td->td_transferfunction[i][l]);
|
i < td->td_samplesperpixel - td->td_extrasamples && i < 3;
|
||||||
|
i++)
|
||||||
|
fprintf(fd, " %5" PRIu16, td->td_transferfunction[i][l]);
|
||||||
fputc('\n', fd);
|
fputc('\n', fd);
|
||||||
}
|
}
|
||||||
} else
|
}
|
||||||
|
else
|
||||||
fprintf(fd, "(present)\n");
|
fprintf(fd, "(present)\n");
|
||||||
}
|
}
|
||||||
if (TIFFFieldSet(tif, FIELD_SUBIFD) && (td->td_subifd)) {
|
if (TIFFFieldSet(tif, FIELD_SUBIFD) && (td->td_subifd))
|
||||||
uint16 i;
|
{
|
||||||
|
uint16_t i;
|
||||||
fprintf(fd, " SubIFD Offsets:");
|
fprintf(fd, " SubIFD Offsets:");
|
||||||
for (i = 0; i < td->td_nsubifd; i++)
|
for (i = 0; i < td->td_nsubifd; i++)
|
||||||
#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
|
fprintf(fd, " %5" PRIu64, td->td_subifd[i]);
|
||||||
fprintf(fd, " %5I64u",
|
|
||||||
(unsigned __int64) td->td_subifd[i]);
|
|
||||||
#else
|
|
||||||
fprintf(fd, " %5llu",
|
|
||||||
(unsigned long long) td->td_subifd[i]);
|
|
||||||
#endif
|
|
||||||
fputc('\n', fd);
|
fputc('\n', fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -574,62 +611,79 @@ TIFFPrintDirectory(TIFF* tif, FILE* fd, long flags)
|
|||||||
short count;
|
short count;
|
||||||
|
|
||||||
count = (short)TIFFGetTagListCount(tif);
|
count = (short)TIFFGetTagListCount(tif);
|
||||||
for(i = 0; i < count; i++) {
|
for (i = 0; i < count; i++)
|
||||||
uint32 tag = TIFFGetTagListEntry(tif, i);
|
{
|
||||||
|
uint32_t tag = TIFFGetTagListEntry(tif, i);
|
||||||
const TIFFField *fip;
|
const TIFFField *fip;
|
||||||
uint32 value_count;
|
uint32_t value_count;
|
||||||
int mem_alloc = 0;
|
int mem_alloc = 0;
|
||||||
void *raw_data;
|
void *raw_data = NULL;
|
||||||
|
uint16_t dotrange[2]; /* must be kept in that scope and not moved in
|
||||||
|
the below TIFFTAG_DOTRANGE specific case */
|
||||||
|
|
||||||
fip = TIFFFieldWithTag(tif, tag);
|
fip = TIFFFieldWithTag(tif, tag);
|
||||||
if (fip == NULL)
|
if (fip == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if(fip->field_passcount) {
|
if (fip->field_passcount)
|
||||||
if (fip->field_readcount == TIFF_VARIABLE2 ) {
|
{
|
||||||
|
if (fip->field_readcount == TIFF_VARIABLE2)
|
||||||
|
{
|
||||||
if (TIFFGetField(tif, tag, &value_count, &raw_data) != 1)
|
if (TIFFGetField(tif, tag, &value_count, &raw_data) != 1)
|
||||||
continue;
|
continue;
|
||||||
} else if (fip->field_readcount == TIFF_VARIABLE ) {
|
}
|
||||||
uint16 small_value_count;
|
else if (fip->field_readcount == TIFF_VARIABLE)
|
||||||
if(TIFFGetField(tif, tag, &small_value_count, &raw_data) != 1)
|
{
|
||||||
|
uint16_t small_value_count;
|
||||||
|
if (TIFFGetField(tif, tag, &small_value_count, &raw_data) !=
|
||||||
|
1)
|
||||||
continue;
|
continue;
|
||||||
value_count = small_value_count;
|
value_count = small_value_count;
|
||||||
} else {
|
}
|
||||||
assert (fip->field_readcount == TIFF_VARIABLE
|
else
|
||||||
|| fip->field_readcount == TIFF_VARIABLE2);
|
{
|
||||||
|
assert(fip->field_readcount == TIFF_VARIABLE ||
|
||||||
|
fip->field_readcount == TIFF_VARIABLE2);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
if (fip->field_readcount == TIFF_VARIABLE
|
else
|
||||||
|| fip->field_readcount == TIFF_VARIABLE2)
|
{
|
||||||
|
if (fip->field_readcount == TIFF_VARIABLE ||
|
||||||
|
fip->field_readcount == TIFF_VARIABLE2)
|
||||||
value_count = 1;
|
value_count = 1;
|
||||||
else if (fip->field_readcount == TIFF_SPP)
|
else if (fip->field_readcount == TIFF_SPP)
|
||||||
value_count = td->td_samplesperpixel;
|
value_count = td->td_samplesperpixel;
|
||||||
else
|
else
|
||||||
value_count = fip->field_readcount;
|
value_count = fip->field_readcount;
|
||||||
if (fip->field_tag == TIFFTAG_DOTRANGE
|
if (fip->field_tag == TIFFTAG_DOTRANGE &&
|
||||||
&& strcmp(fip->field_name,"DotRange") == 0) {
|
strcmp(fip->field_name, "DotRange") == 0)
|
||||||
|
{
|
||||||
/* TODO: This is an evil exception and should not have been
|
/* TODO: This is an evil exception and should not have been
|
||||||
handled this way ... likely best if we move it into
|
handled this way ... likely best if we move it into
|
||||||
the directory structure with an explicit field in
|
the directory structure with an explicit field in
|
||||||
libtiff 4.1 and assign it a FIELD_ value */
|
libtiff 4.1 and assign it a FIELD_ value */
|
||||||
static uint16 dotrange[2];
|
|
||||||
raw_data = dotrange;
|
raw_data = dotrange;
|
||||||
TIFFGetField(tif, tag, dotrange + 0, dotrange + 1);
|
TIFFGetField(tif, tag, dotrange + 0, dotrange + 1);
|
||||||
} else if (fip->field_type == TIFF_ASCII
|
}
|
||||||
|| fip->field_readcount == TIFF_VARIABLE
|
else if (fip->field_type == TIFF_ASCII ||
|
||||||
|| fip->field_readcount == TIFF_VARIABLE2
|
fip->field_readcount == TIFF_VARIABLE ||
|
||||||
|| fip->field_readcount == TIFF_SPP
|
fip->field_readcount == TIFF_VARIABLE2 ||
|
||||||
|| value_count > 1) {
|
fip->field_readcount == TIFF_SPP || value_count > 1)
|
||||||
|
{
|
||||||
if (TIFFGetField(tif, tag, &raw_data) != 1)
|
if (TIFFGetField(tif, tag, &raw_data) != 1)
|
||||||
continue;
|
continue;
|
||||||
} else {
|
}
|
||||||
raw_data = _TIFFmalloc(
|
else
|
||||||
_TIFFDataSize(fip->field_type)
|
{
|
||||||
* value_count);
|
/*--: Rational2Double: For Rationals evaluate
|
||||||
|
* "set_field_type" to determine internal storage size. */
|
||||||
|
int tv_size = TIFFFieldSetGetSize(fip);
|
||||||
|
raw_data = _TIFFmallocExt(tif, tv_size * value_count);
|
||||||
mem_alloc = 1;
|
mem_alloc = 1;
|
||||||
if(TIFFGetField(tif, tag, raw_data) != 1) {
|
if (TIFFGetField(tif, tag, raw_data) != 1)
|
||||||
_TIFFfree(raw_data);
|
{
|
||||||
|
_TIFFfreeExt(tif, raw_data);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -641,52 +695,45 @@ TIFFPrintDirectory(TIFF* tif, FILE* fd, long flags)
|
|||||||
* _TIFFPrettyPrintField() fall down and print it as
|
* _TIFFPrettyPrintField() fall down and print it as
|
||||||
* any other tag.
|
* any other tag.
|
||||||
*/
|
*/
|
||||||
if (!_TIFFPrettyPrintField(tif, fip, fd, tag, value_count, raw_data))
|
if (raw_data != NULL &&
|
||||||
|
!_TIFFPrettyPrintField(tif, fip, fd, tag, value_count,
|
||||||
|
raw_data))
|
||||||
_TIFFPrintField(fd, fip, value_count, raw_data);
|
_TIFFPrintField(fd, fip, value_count, raw_data);
|
||||||
|
|
||||||
if (mem_alloc)
|
if (mem_alloc)
|
||||||
_TIFFfree(raw_data);
|
_TIFFfreeExt(tif, raw_data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tif->tif_tagmethods.printdir)
|
if (tif->tif_tagmethods.printdir)
|
||||||
(*tif->tif_tagmethods.printdir)(tif, fd, flags);
|
(*tif->tif_tagmethods.printdir)(tif, fd, flags);
|
||||||
|
|
||||||
if ((flags & TIFFPRINT_STRIPS) &&
|
if ((flags & TIFFPRINT_STRIPS) && TIFFFieldSet(tif, FIELD_STRIPOFFSETS))
|
||||||
TIFFFieldSet(tif,FIELD_STRIPOFFSETS)) {
|
{
|
||||||
uint32 s;
|
uint32_t s;
|
||||||
|
|
||||||
fprintf(fd, " %lu %s:\n",
|
fprintf(fd, " %" PRIu32 " %s:\n", td->td_nstrips,
|
||||||
(unsigned long) td->td_nstrips,
|
|
||||||
isTiled(tif) ? "Tiles" : "Strips");
|
isTiled(tif) ? "Tiles" : "Strips");
|
||||||
for (s = 0; s < td->td_nstrips; s++)
|
for (s = 0; s < td->td_nstrips; s++)
|
||||||
#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
|
fprintf(fd, " %3" PRIu32 ": [%8" PRIu64 ", %8" PRIu64 "]\n", s,
|
||||||
fprintf(fd, " %3lu: [%8I64u, %8I64u]\n",
|
TIFFGetStrileOffset(tif, s),
|
||||||
(unsigned long) s,
|
TIFFGetStrileByteCount(tif, s));
|
||||||
(unsigned __int64) TIFFGetStrileOffset(tif, s),
|
|
||||||
(unsigned __int64) TIFFGetStrileByteCount(tif, s));
|
|
||||||
#else
|
|
||||||
fprintf(fd, " %3lu: [%8llu, %8llu]\n",
|
|
||||||
(unsigned long) s,
|
|
||||||
(unsigned long long) TIFFGetStrileOffset(tif, s),
|
|
||||||
(unsigned long long) TIFFGetStrileByteCount(tif, s));
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void _TIFFprintAscii(FILE *fd, const char *cp)
|
||||||
_TIFFprintAscii(FILE* fd, const char* cp)
|
|
||||||
{
|
{
|
||||||
_TIFFprintAsciiBounded(fd, cp, strlen(cp));
|
_TIFFprintAsciiBounded(fd, cp, strlen(cp));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void _TIFFprintAsciiBounded(FILE *fd, const char *cp, size_t max_chars)
|
||||||
_TIFFprintAsciiBounded(FILE* fd, const char* cp, size_t max_chars)
|
{
|
||||||
|
for (; max_chars > 0 && *cp != '\0'; cp++, max_chars--)
|
||||||
{
|
{
|
||||||
for (; max_chars > 0 && *cp != '\0'; cp++, max_chars--) {
|
|
||||||
const char *tp;
|
const char *tp;
|
||||||
|
|
||||||
if (isprint((int)*cp)) {
|
if (isprint((int)*cp))
|
||||||
|
{
|
||||||
fputc(*cp, fd);
|
fputc(*cp, fd);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -700,19 +747,9 @@ _TIFFprintAsciiBounded(FILE* fd, const char* cp, size_t max_chars)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void _TIFFprintAsciiTag(FILE *fd, const char *name, const char *value)
|
||||||
_TIFFprintAsciiTag(FILE* fd, const char* name, const char* value)
|
|
||||||
{
|
{
|
||||||
fprintf(fd, " %s: \"", name);
|
fprintf(fd, " %s: \"", name);
|
||||||
_TIFFprintAscii(fd, value);
|
_TIFFprintAscii(fd, value);
|
||||||
fprintf(fd, "\"\n");
|
fprintf(fd, "\"\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
1063
3rdparty/libtiff/tif_read.c
vendored
1063
3rdparty/libtiff/tif_read.c
vendored
File diff suppressed because it is too large
Load Diff
186
3rdparty/libtiff/tif_stream.cxx
vendored
186
3rdparty/libtiff/tif_stream.cxx
vendored
@ -28,9 +28,7 @@
|
|||||||
#include "tiffiop.h"
|
#include "tiffiop.h"
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#ifndef __VMS
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
ISO C++ uses a 'std::streamsize' type to define counts. This makes
|
ISO C++ uses a 'std::streamsize' type to define counts. This makes
|
||||||
@ -76,16 +74,17 @@ using namespace std;
|
|||||||
struct tiffis_data;
|
struct tiffis_data;
|
||||||
struct tiffos_data;
|
struct tiffos_data;
|
||||||
|
|
||||||
extern "C" {
|
extern "C"
|
||||||
|
{
|
||||||
|
|
||||||
static tmsize_t _tiffosReadProc(thandle_t, void *, tmsize_t);
|
static tmsize_t _tiffosReadProc(thandle_t, void *, tmsize_t);
|
||||||
static tmsize_t _tiffisReadProc(thandle_t fd, void *buf, tmsize_t size);
|
static tmsize_t _tiffisReadProc(thandle_t fd, void *buf, tmsize_t size);
|
||||||
static tmsize_t _tiffosWriteProc(thandle_t fd, void *buf, tmsize_t size);
|
static tmsize_t _tiffosWriteProc(thandle_t fd, void *buf, tmsize_t size);
|
||||||
static tmsize_t _tiffisWriteProc(thandle_t, void *, tmsize_t);
|
static tmsize_t _tiffisWriteProc(thandle_t, void *, tmsize_t);
|
||||||
static uint64 _tiffosSeekProc(thandle_t fd, uint64 off, int whence);
|
static uint64_t _tiffosSeekProc(thandle_t fd, uint64_t off, int whence);
|
||||||
static uint64 _tiffisSeekProc(thandle_t fd, uint64 off, int whence);
|
static uint64_t _tiffisSeekProc(thandle_t fd, uint64_t off, int whence);
|
||||||
static uint64 _tiffosSizeProc(thandle_t fd);
|
static uint64_t _tiffosSizeProc(thandle_t fd);
|
||||||
static uint64 _tiffisSizeProc(thandle_t fd);
|
static uint64_t _tiffisSizeProc(thandle_t fd);
|
||||||
static int _tiffosCloseProc(thandle_t fd);
|
static int _tiffosCloseProc(thandle_t fd);
|
||||||
static int _tiffisCloseProc(thandle_t fd);
|
static int _tiffisCloseProc(thandle_t fd);
|
||||||
static int _tiffDummyMapProc(thandle_t, void **base, toff_t *size);
|
static int _tiffDummyMapProc(thandle_t, void **base, toff_t *size);
|
||||||
@ -104,14 +103,9 @@ struct tiffos_data
|
|||||||
ios::pos_type start_pos;
|
ios::pos_type start_pos;
|
||||||
};
|
};
|
||||||
|
|
||||||
static tmsize_t
|
static tmsize_t _tiffosReadProc(thandle_t, void *, tmsize_t) { return 0; }
|
||||||
_tiffosReadProc(thandle_t, void*, tmsize_t)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static tmsize_t
|
static tmsize_t _tiffisReadProc(thandle_t fd, void *buf, tmsize_t size)
|
||||||
_tiffisReadProc(thandle_t fd, void* buf, tmsize_t size)
|
|
||||||
{
|
{
|
||||||
tiffis_data *data = reinterpret_cast<tiffis_data *>(fd);
|
tiffis_data *data = reinterpret_cast<tiffis_data *>(fd);
|
||||||
|
|
||||||
@ -125,8 +119,7 @@ _tiffisReadProc(thandle_t fd, void* buf, tmsize_t size)
|
|||||||
return static_cast<tmsize_t>(data->stream->gcount());
|
return static_cast<tmsize_t>(data->stream->gcount());
|
||||||
}
|
}
|
||||||
|
|
||||||
static tmsize_t
|
static tmsize_t _tiffosWriteProc(thandle_t fd, void *buf, tmsize_t size)
|
||||||
_tiffosWriteProc(thandle_t fd, void* buf, tmsize_t size)
|
|
||||||
{
|
{
|
||||||
tiffos_data *data = reinterpret_cast<tiffos_data *>(fd);
|
tiffos_data *data = reinterpret_cast<tiffos_data *>(fd);
|
||||||
ostream *os = data->stream;
|
ostream *os = data->stream;
|
||||||
@ -142,32 +135,29 @@ _tiffosWriteProc(thandle_t fd, void* buf, tmsize_t size)
|
|||||||
return static_cast<tmsize_t>(os->tellp() - pos);
|
return static_cast<tmsize_t>(os->tellp() - pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
static tmsize_t
|
static tmsize_t _tiffisWriteProc(thandle_t, void *, tmsize_t) { return 0; }
|
||||||
_tiffisWriteProc(thandle_t, void*, tmsize_t)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint64
|
static uint64_t _tiffosSeekProc(thandle_t fd, uint64_t off, int whence)
|
||||||
_tiffosSeekProc(thandle_t fd, uint64 off, int whence)
|
|
||||||
{
|
{
|
||||||
tiffos_data *data = reinterpret_cast<tiffos_data *>(fd);
|
tiffos_data *data = reinterpret_cast<tiffos_data *>(fd);
|
||||||
ostream *os = data->stream;
|
ostream *os = data->stream;
|
||||||
|
|
||||||
// if the stream has already failed, don't do anything
|
// if the stream has already failed, don't do anything
|
||||||
if (os->fail())
|
if (os->fail())
|
||||||
return static_cast<uint64>(-1);
|
return static_cast<uint64_t>(-1);
|
||||||
|
|
||||||
switch(whence) {
|
switch (whence)
|
||||||
|
{
|
||||||
case SEEK_SET:
|
case SEEK_SET:
|
||||||
{
|
{
|
||||||
// Compute 64-bit offset
|
// Compute 64-bit offset
|
||||||
uint64 new_offset = static_cast<uint64>(data->start_pos) + off;
|
uint64_t new_offset =
|
||||||
|
static_cast<uint64_t>(data->start_pos) + off;
|
||||||
|
|
||||||
// Verify that value does not overflow
|
// Verify that value does not overflow
|
||||||
ios::off_type offset = static_cast<ios::off_type>(new_offset);
|
ios::off_type offset = static_cast<ios::off_type>(new_offset);
|
||||||
if (static_cast<uint64>(offset) != new_offset)
|
if (static_cast<uint64_t>(offset) != new_offset)
|
||||||
return static_cast<uint64>(-1);
|
return static_cast<uint64_t>(-1);
|
||||||
|
|
||||||
os->seekp(offset, ios::beg);
|
os->seekp(offset, ios::beg);
|
||||||
break;
|
break;
|
||||||
@ -176,8 +166,8 @@ _tiffosSeekProc(thandle_t fd, uint64 off, int whence)
|
|||||||
{
|
{
|
||||||
// Verify that value does not overflow
|
// Verify that value does not overflow
|
||||||
ios::off_type offset = static_cast<ios::off_type>(off);
|
ios::off_type offset = static_cast<ios::off_type>(off);
|
||||||
if (static_cast<uint64>(offset) != off)
|
if (static_cast<uint64_t>(offset) != off)
|
||||||
return static_cast<uint64>(-1);
|
return static_cast<uint64_t>(-1);
|
||||||
|
|
||||||
os->seekp(offset, ios::cur);
|
os->seekp(offset, ios::cur);
|
||||||
break;
|
break;
|
||||||
@ -186,8 +176,8 @@ _tiffosSeekProc(thandle_t fd, uint64 off, int whence)
|
|||||||
{
|
{
|
||||||
// Verify that value does not overflow
|
// Verify that value does not overflow
|
||||||
ios::off_type offset = static_cast<ios::off_type>(off);
|
ios::off_type offset = static_cast<ios::off_type>(off);
|
||||||
if (static_cast<uint64>(offset) != off)
|
if (static_cast<uint64_t>(offset) != off)
|
||||||
return static_cast<uint64>(-1);
|
return static_cast<uint64_t>(-1);
|
||||||
|
|
||||||
os->seekp(offset, ios::end);
|
os->seekp(offset, ios::end);
|
||||||
break;
|
break;
|
||||||
@ -198,18 +188,16 @@ _tiffosSeekProc(thandle_t fd, uint64 off, int whence)
|
|||||||
// stream. ofstream doesn't have a problem with this but
|
// stream. ofstream doesn't have a problem with this but
|
||||||
// ostrstream/ostringstream does. In that situation, add intermediate
|
// ostrstream/ostringstream does. In that situation, add intermediate
|
||||||
// '\0' characters.
|
// '\0' characters.
|
||||||
if( os->fail() ) {
|
if (os->fail())
|
||||||
#ifdef __VMS
|
{
|
||||||
int old_state;
|
|
||||||
#else
|
|
||||||
ios::iostate old_state;
|
ios::iostate old_state;
|
||||||
#endif
|
|
||||||
ios::pos_type origin;
|
ios::pos_type origin;
|
||||||
|
|
||||||
old_state = os->rdstate();
|
old_state = os->rdstate();
|
||||||
// reset the fail bit or else tellp() won't work below
|
// reset the fail bit or else tellp() won't work below
|
||||||
os->clear(os->rdstate() & ~ios::failbit);
|
os->clear(os->rdstate() & ~ios::failbit);
|
||||||
switch( whence ) {
|
switch (whence)
|
||||||
|
{
|
||||||
case SEEK_SET:
|
case SEEK_SET:
|
||||||
default:
|
default:
|
||||||
origin = data->start_pos;
|
origin = data->start_pos;
|
||||||
@ -226,41 +214,46 @@ _tiffosSeekProc(thandle_t fd, uint64 off, int whence)
|
|||||||
os->clear(old_state);
|
os->clear(old_state);
|
||||||
|
|
||||||
// only do something if desired seek position is valid
|
// only do something if desired seek position is valid
|
||||||
if( (static_cast<uint64>(origin) + off) > static_cast<uint64>(data->start_pos) ) {
|
if ((static_cast<uint64_t>(origin) + off) >
|
||||||
uint64 num_fill;
|
static_cast<uint64_t>(data->start_pos))
|
||||||
|
{
|
||||||
|
uint64_t num_fill;
|
||||||
|
|
||||||
// clear the fail bit
|
// clear the fail bit
|
||||||
os->clear(os->rdstate() & ~ios::failbit);
|
os->clear(os->rdstate() & ~ios::failbit);
|
||||||
|
|
||||||
// extend the stream to the expected size
|
// extend the stream to the expected size
|
||||||
os->seekp(0, ios::end);
|
os->seekp(0, ios::end);
|
||||||
num_fill = (static_cast<uint64>(origin)) + off - os->tellp();
|
num_fill = (static_cast<uint64_t>(origin)) + off - os->tellp();
|
||||||
for( uint64 i = 0; i < num_fill; i++ )
|
for (uint64_t i = 0; i < num_fill; i++)
|
||||||
os->put('\0');
|
os->put('\0');
|
||||||
|
|
||||||
// retry the seek
|
// retry the seek
|
||||||
os->seekp(static_cast<ios::off_type>(static_cast<uint64>(origin) + off), ios::beg);
|
os->seekp(static_cast<ios::off_type>(
|
||||||
|
static_cast<uint64_t>(origin) + off),
|
||||||
|
ios::beg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return static_cast<uint64>(os->tellp());
|
return static_cast<uint64_t>(os->tellp());
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint64
|
static uint64_t _tiffisSeekProc(thandle_t fd, uint64_t off, int whence)
|
||||||
_tiffisSeekProc(thandle_t fd, uint64 off, int whence)
|
|
||||||
{
|
{
|
||||||
tiffis_data *data = reinterpret_cast<tiffis_data *>(fd);
|
tiffis_data *data = reinterpret_cast<tiffis_data *>(fd);
|
||||||
|
|
||||||
switch(whence) {
|
switch (whence)
|
||||||
|
{
|
||||||
case SEEK_SET:
|
case SEEK_SET:
|
||||||
{
|
{
|
||||||
// Compute 64-bit offset
|
// Compute 64-bit offset
|
||||||
uint64 new_offset = static_cast<uint64>(data->start_pos) + off;
|
uint64_t new_offset =
|
||||||
|
static_cast<uint64_t>(data->start_pos) + off;
|
||||||
|
|
||||||
// Verify that value does not overflow
|
// Verify that value does not overflow
|
||||||
ios::off_type offset = static_cast<ios::off_type>(new_offset);
|
ios::off_type offset = static_cast<ios::off_type>(new_offset);
|
||||||
if (static_cast<uint64>(offset) != new_offset)
|
if (static_cast<uint64_t>(offset) != new_offset)
|
||||||
return static_cast<uint64>(-1);
|
return static_cast<uint64_t>(-1);
|
||||||
|
|
||||||
data->stream->seekg(offset, ios::beg);
|
data->stream->seekg(offset, ios::beg);
|
||||||
break;
|
break;
|
||||||
@ -269,8 +262,8 @@ _tiffisSeekProc(thandle_t fd, uint64 off, int whence)
|
|||||||
{
|
{
|
||||||
// Verify that value does not overflow
|
// Verify that value does not overflow
|
||||||
ios::off_type offset = static_cast<ios::off_type>(off);
|
ios::off_type offset = static_cast<ios::off_type>(off);
|
||||||
if (static_cast<uint64>(offset) != off)
|
if (static_cast<uint64_t>(offset) != off)
|
||||||
return static_cast<uint64>(-1);
|
return static_cast<uint64_t>(-1);
|
||||||
|
|
||||||
data->stream->seekg(offset, ios::cur);
|
data->stream->seekg(offset, ios::cur);
|
||||||
break;
|
break;
|
||||||
@ -279,19 +272,18 @@ _tiffisSeekProc(thandle_t fd, uint64 off, int whence)
|
|||||||
{
|
{
|
||||||
// Verify that value does not overflow
|
// Verify that value does not overflow
|
||||||
ios::off_type offset = static_cast<ios::off_type>(off);
|
ios::off_type offset = static_cast<ios::off_type>(off);
|
||||||
if (static_cast<uint64>(offset) != off)
|
if (static_cast<uint64_t>(offset) != off)
|
||||||
return static_cast<uint64>(-1);
|
return static_cast<uint64_t>(-1);
|
||||||
|
|
||||||
data->stream->seekg(offset, ios::end);
|
data->stream->seekg(offset, ios::end);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return (uint64) (data->stream->tellg() - data->start_pos);
|
return (uint64_t)(data->stream->tellg() - data->start_pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint64
|
static uint64_t _tiffosSizeProc(thandle_t fd)
|
||||||
_tiffosSizeProc(thandle_t fd)
|
|
||||||
{
|
{
|
||||||
tiffos_data *data = reinterpret_cast<tiffos_data *>(fd);
|
tiffos_data *data = reinterpret_cast<tiffos_data *>(fd);
|
||||||
ostream *os = data->stream;
|
ostream *os = data->stream;
|
||||||
@ -302,11 +294,10 @@ _tiffosSizeProc(thandle_t fd)
|
|||||||
len = os->tellp();
|
len = os->tellp();
|
||||||
os->seekp(pos);
|
os->seekp(pos);
|
||||||
|
|
||||||
return (uint64) len;
|
return (uint64_t)len;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint64
|
static uint64_t _tiffisSizeProc(thandle_t fd)
|
||||||
_tiffisSizeProc(thandle_t fd)
|
|
||||||
{
|
{
|
||||||
tiffis_data *data = reinterpret_cast<tiffis_data *>(fd);
|
tiffis_data *data = reinterpret_cast<tiffis_data *>(fd);
|
||||||
ios::pos_type pos = data->stream->tellg();
|
ios::pos_type pos = data->stream->tellg();
|
||||||
@ -316,35 +307,31 @@ _tiffisSizeProc(thandle_t fd)
|
|||||||
len = data->stream->tellg();
|
len = data->stream->tellg();
|
||||||
data->stream->seekg(pos);
|
data->stream->seekg(pos);
|
||||||
|
|
||||||
return (uint64) len;
|
return (uint64_t)len;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int _tiffosCloseProc(thandle_t fd)
|
||||||
_tiffosCloseProc(thandle_t fd)
|
|
||||||
{
|
{
|
||||||
// Our stream was not allocated by us, so it shouldn't be closed by us.
|
// Our stream was not allocated by us, so it shouldn't be closed by us.
|
||||||
delete reinterpret_cast<tiffos_data *>(fd);
|
delete reinterpret_cast<tiffos_data *>(fd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int _tiffisCloseProc(thandle_t fd)
|
||||||
_tiffisCloseProc(thandle_t fd)
|
|
||||||
{
|
{
|
||||||
// Our stream was not allocated by us, so it shouldn't be closed by us.
|
// Our stream was not allocated by us, so it shouldn't be closed by us.
|
||||||
delete reinterpret_cast<tiffis_data *>(fd);
|
delete reinterpret_cast<tiffis_data *>(fd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int _tiffDummyMapProc(thandle_t, void **base, toff_t *size)
|
||||||
_tiffDummyMapProc(thandle_t , void** base, toff_t* size )
|
|
||||||
{
|
{
|
||||||
(void)base;
|
(void)base;
|
||||||
(void)size;
|
(void)size;
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void _tiffDummyUnmapProc(thandle_t, void *base, toff_t size)
|
||||||
_tiffDummyUnmapProc(thandle_t , void* base, toff_t size )
|
|
||||||
{
|
{
|
||||||
(void)base;
|
(void)base;
|
||||||
(void)size;
|
(void)size;
|
||||||
@ -353,44 +340,38 @@ _tiffDummyUnmapProc(thandle_t , void* base, toff_t size )
|
|||||||
/*
|
/*
|
||||||
* Open a TIFF file descriptor for read/writing.
|
* Open a TIFF file descriptor for read/writing.
|
||||||
*/
|
*/
|
||||||
static TIFF*
|
static TIFF *_tiffStreamOpen(const char *name, const char *mode, void *fd)
|
||||||
_tiffStreamOpen(const char* name, const char* mode, void *fd)
|
|
||||||
{
|
{
|
||||||
TIFF *tif;
|
TIFF *tif;
|
||||||
|
|
||||||
if( strchr(mode, 'w') ) {
|
if (strchr(mode, 'w'))
|
||||||
|
{
|
||||||
tiffos_data *data = new tiffos_data;
|
tiffos_data *data = new tiffos_data;
|
||||||
data->stream = reinterpret_cast<ostream *>(fd);
|
data->stream = reinterpret_cast<ostream *>(fd);
|
||||||
data->start_pos = data->stream->tellp();
|
data->start_pos = data->stream->tellp();
|
||||||
|
|
||||||
// Open for writing.
|
// Open for writing.
|
||||||
tif = TIFFClientOpen(name, mode,
|
tif = TIFFClientOpen(
|
||||||
reinterpret_cast<thandle_t>(data),
|
name, mode, reinterpret_cast<thandle_t>(data), _tiffosReadProc,
|
||||||
_tiffosReadProc,
|
_tiffosWriteProc, _tiffosSeekProc, _tiffosCloseProc,
|
||||||
_tiffosWriteProc,
|
_tiffosSizeProc, _tiffDummyMapProc, _tiffDummyUnmapProc);
|
||||||
_tiffosSeekProc,
|
if (!tif)
|
||||||
_tiffosCloseProc,
|
{
|
||||||
_tiffosSizeProc,
|
|
||||||
_tiffDummyMapProc,
|
|
||||||
_tiffDummyUnmapProc);
|
|
||||||
if (!tif) {
|
|
||||||
delete data;
|
delete data;
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
tiffis_data *data = new tiffis_data;
|
tiffis_data *data = new tiffis_data;
|
||||||
data->stream = reinterpret_cast<istream *>(fd);
|
data->stream = reinterpret_cast<istream *>(fd);
|
||||||
data->start_pos = data->stream->tellg();
|
data->start_pos = data->stream->tellg();
|
||||||
// Open for reading.
|
// Open for reading.
|
||||||
tif = TIFFClientOpen(name, mode,
|
tif = TIFFClientOpen(
|
||||||
reinterpret_cast<thandle_t>(data),
|
name, mode, reinterpret_cast<thandle_t>(data), _tiffisReadProc,
|
||||||
_tiffisReadProc,
|
_tiffisWriteProc, _tiffisSeekProc, _tiffisCloseProc,
|
||||||
_tiffisWriteProc,
|
_tiffisSizeProc, _tiffDummyMapProc, _tiffDummyUnmapProc);
|
||||||
_tiffisSeekProc,
|
if (!tif)
|
||||||
_tiffisCloseProc,
|
{
|
||||||
_tiffisSizeProc,
|
|
||||||
_tiffDummyMapProc,
|
|
||||||
_tiffDummyUnmapProc);
|
|
||||||
if (!tif) {
|
|
||||||
delete data;
|
delete data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -400,14 +381,14 @@ _tiffStreamOpen(const char* name, const char* mode, void *fd)
|
|||||||
|
|
||||||
} /* extern "C" */
|
} /* extern "C" */
|
||||||
|
|
||||||
TIFF*
|
TIFF *TIFFStreamOpen(const char *name, ostream *os)
|
||||||
TIFFStreamOpen(const char* name, ostream *os)
|
|
||||||
{
|
{
|
||||||
// If os is either a ostrstream or ostringstream, and has no data
|
// If os is either a ostrstream or ostringstream, and has no data
|
||||||
// written to it yet, then tellp() will return -1 which will break us.
|
// written to it yet, then tellp() will return -1 which will break us.
|
||||||
// We workaround this by writing out a dummy character and
|
// We workaround this by writing out a dummy character and
|
||||||
// then seek back to the beginning.
|
// then seek back to the beginning.
|
||||||
if( !os->fail() && static_cast<int>(os->tellp()) < 0 ) {
|
if (!os->fail() && static_cast<int>(os->tellp()) < 0)
|
||||||
|
{
|
||||||
*os << '\0';
|
*os << '\0';
|
||||||
os->seekp(0);
|
os->seekp(0);
|
||||||
}
|
}
|
||||||
@ -416,19 +397,8 @@ TIFFStreamOpen(const char* name, ostream *os)
|
|||||||
return _tiffStreamOpen(name, "wm", os);
|
return _tiffStreamOpen(name, "wm", os);
|
||||||
}
|
}
|
||||||
|
|
||||||
TIFF*
|
TIFF *TIFFStreamOpen(const char *name, istream *is)
|
||||||
TIFFStreamOpen(const char* name, istream *is)
|
|
||||||
{
|
{
|
||||||
// NB: We don't support mapped files with streams so add 'm'
|
// NB: We don't support mapped files with streams so add 'm'
|
||||||
return _tiffStreamOpen(name, "rm", is);
|
return _tiffStreamOpen(name, "rm", is);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
247
3rdparty/libtiff/tif_strip.c
vendored
247
3rdparty/libtiff/tif_strip.c
vendored
@ -32,22 +32,23 @@
|
|||||||
/*
|
/*
|
||||||
* Compute which strip a (row,sample) value is in.
|
* Compute which strip a (row,sample) value is in.
|
||||||
*/
|
*/
|
||||||
uint32
|
uint32_t TIFFComputeStrip(TIFF *tif, uint32_t row, uint16_t sample)
|
||||||
TIFFComputeStrip(TIFF* tif, uint32 row, uint16 sample)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "TIFFComputeStrip";
|
static const char module[] = "TIFFComputeStrip";
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
TIFFDirectory *td = &tif->tif_dir;
|
||||||
uint32 strip;
|
uint32_t strip;
|
||||||
|
|
||||||
strip = row / td->td_rowsperstrip;
|
strip = row / td->td_rowsperstrip;
|
||||||
if (td->td_planarconfig == PLANARCONFIG_SEPARATE) {
|
if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
|
||||||
if (sample >= td->td_samplesperpixel) {
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
if (sample >= td->td_samplesperpixel)
|
||||||
"%lu: Sample out of range, max %lu",
|
{
|
||||||
(unsigned long) sample, (unsigned long) td->td_samplesperpixel);
|
TIFFErrorExtR(tif, module, "%lu: Sample out of range, max %lu",
|
||||||
|
(unsigned long)sample,
|
||||||
|
(unsigned long)td->td_samplesperpixel);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
strip += (uint32)sample*td->td_stripsperimage;
|
strip += (uint32_t)sample * td->td_stripsperimage;
|
||||||
}
|
}
|
||||||
return (strip);
|
return (strip);
|
||||||
}
|
}
|
||||||
@ -55,16 +56,17 @@ TIFFComputeStrip(TIFF* tif, uint32 row, uint16 sample)
|
|||||||
/*
|
/*
|
||||||
* Compute how many strips are in an image.
|
* Compute how many strips are in an image.
|
||||||
*/
|
*/
|
||||||
uint32
|
uint32_t TIFFNumberOfStrips(TIFF *tif)
|
||||||
TIFFNumberOfStrips(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
TIFFDirectory *td = &tif->tif_dir;
|
||||||
uint32 nstrips;
|
uint32_t nstrips;
|
||||||
|
|
||||||
nstrips = (td->td_rowsperstrip == (uint32) -1 ? 1 :
|
nstrips = (td->td_rowsperstrip == (uint32_t)-1
|
||||||
TIFFhowmany_32(td->td_imagelength, td->td_rowsperstrip));
|
? 1
|
||||||
|
: TIFFhowmany_32(td->td_imagelength, td->td_rowsperstrip));
|
||||||
if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
|
if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
|
||||||
nstrips = _TIFFMultiply32(tif, nstrips, (uint32)td->td_samplesperpixel,
|
nstrips =
|
||||||
|
_TIFFMultiply32(tif, nstrips, (uint32_t)td->td_samplesperpixel,
|
||||||
"TIFFNumberOfStrips");
|
"TIFFNumberOfStrips");
|
||||||
return (nstrips);
|
return (nstrips);
|
||||||
}
|
}
|
||||||
@ -72,16 +74,14 @@ TIFFNumberOfStrips(TIFF* tif)
|
|||||||
/*
|
/*
|
||||||
* Compute the # bytes in a variable height, row-aligned strip.
|
* Compute the # bytes in a variable height, row-aligned strip.
|
||||||
*/
|
*/
|
||||||
uint64
|
uint64_t TIFFVStripSize64(TIFF *tif, uint32_t nrows)
|
||||||
TIFFVStripSize64(TIFF* tif, uint32 nrows)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "TIFFVStripSize64";
|
static const char module[] = "TIFFVStripSize64";
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
TIFFDirectory *td = &tif->tif_dir;
|
||||||
if (nrows==(uint32)(-1))
|
if (nrows == (uint32_t)(-1))
|
||||||
nrows = td->td_imagelength;
|
nrows = td->td_imagelength;
|
||||||
if ((td->td_planarconfig == PLANARCONFIG_CONTIG) &&
|
if ((td->td_planarconfig == PLANARCONFIG_CONTIG) &&
|
||||||
(td->td_photometric == PHOTOMETRIC_YCBCR)&&
|
(td->td_photometric == PHOTOMETRIC_YCBCR) && (!isUpSampled(tif)))
|
||||||
(!isUpSampled(tif)))
|
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Packed YCbCr data contain one Cb+Cr for every
|
* Packed YCbCr data contain one Cb+Cr for every
|
||||||
@ -91,44 +91,46 @@ TIFFVStripSize64(TIFF* tif, uint32 nrows)
|
|||||||
* horizontal/vertical subsampling area include
|
* horizontal/vertical subsampling area include
|
||||||
* YCbCr data for the extended image.
|
* YCbCr data for the extended image.
|
||||||
*/
|
*/
|
||||||
uint16 ycbcrsubsampling[2];
|
uint16_t ycbcrsubsampling[2];
|
||||||
uint16 samplingblock_samples;
|
uint16_t samplingblock_samples;
|
||||||
uint32 samplingblocks_hor;
|
uint32_t samplingblocks_hor;
|
||||||
uint32 samplingblocks_ver;
|
uint32_t samplingblocks_ver;
|
||||||
uint64 samplingrow_samples;
|
uint64_t samplingrow_samples;
|
||||||
uint64 samplingrow_size;
|
uint64_t samplingrow_size;
|
||||||
if (td->td_samplesperpixel != 3)
|
if (td->td_samplesperpixel != 3)
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata,module,
|
TIFFErrorExtR(tif, module, "Invalid td_samplesperpixel value");
|
||||||
"Invalid td_samplesperpixel value");
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
TIFFGetFieldDefaulted(tif,TIFFTAG_YCBCRSUBSAMPLING,ycbcrsubsampling+0,
|
TIFFGetFieldDefaulted(tif, TIFFTAG_YCBCRSUBSAMPLING,
|
||||||
ycbcrsubsampling+1);
|
ycbcrsubsampling + 0, ycbcrsubsampling + 1);
|
||||||
if ((ycbcrsubsampling[0] != 1 && ycbcrsubsampling[0] != 2 && ycbcrsubsampling[0] != 4)
|
if ((ycbcrsubsampling[0] != 1 && ycbcrsubsampling[0] != 2 &&
|
||||||
||(ycbcrsubsampling[1] != 1 && ycbcrsubsampling[1] != 2 && ycbcrsubsampling[1] != 4))
|
ycbcrsubsampling[0] != 4) ||
|
||||||
|
(ycbcrsubsampling[1] != 1 && ycbcrsubsampling[1] != 2 &&
|
||||||
|
ycbcrsubsampling[1] != 4))
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata,module,
|
TIFFErrorExtR(tif, module, "Invalid YCbCr subsampling (%dx%d)",
|
||||||
"Invalid YCbCr subsampling (%dx%d)",
|
ycbcrsubsampling[0], ycbcrsubsampling[1]);
|
||||||
ycbcrsubsampling[0],
|
|
||||||
ycbcrsubsampling[1] );
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
samplingblock_samples = ycbcrsubsampling[0] * ycbcrsubsampling[1] + 2;
|
samplingblock_samples = ycbcrsubsampling[0] * ycbcrsubsampling[1] + 2;
|
||||||
samplingblocks_hor=TIFFhowmany_32(td->td_imagewidth,ycbcrsubsampling[0]);
|
samplingblocks_hor =
|
||||||
|
TIFFhowmany_32(td->td_imagewidth, ycbcrsubsampling[0]);
|
||||||
samplingblocks_ver = TIFFhowmany_32(nrows, ycbcrsubsampling[1]);
|
samplingblocks_ver = TIFFhowmany_32(nrows, ycbcrsubsampling[1]);
|
||||||
samplingrow_samples=_TIFFMultiply64(tif,samplingblocks_hor,samplingblock_samples,module);
|
samplingrow_samples = _TIFFMultiply64(tif, samplingblocks_hor,
|
||||||
samplingrow_size=TIFFhowmany8_64(_TIFFMultiply64(tif,samplingrow_samples,td->td_bitspersample,module));
|
samplingblock_samples, module);
|
||||||
return(_TIFFMultiply64(tif,samplingrow_size,samplingblocks_ver,module));
|
samplingrow_size = TIFFhowmany8_64(_TIFFMultiply64(
|
||||||
|
tif, samplingrow_samples, td->td_bitspersample, module));
|
||||||
|
return (
|
||||||
|
_TIFFMultiply64(tif, samplingrow_size, samplingblocks_ver, module));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return (_TIFFMultiply64(tif, nrows, TIFFScanlineSize64(tif), module));
|
return (_TIFFMultiply64(tif, nrows, TIFFScanlineSize64(tif), module));
|
||||||
}
|
}
|
||||||
tmsize_t
|
tmsize_t TIFFVStripSize(TIFF *tif, uint32_t nrows)
|
||||||
TIFFVStripSize(TIFF* tif, uint32 nrows)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "TIFFVStripSize";
|
static const char module[] = "TIFFVStripSize";
|
||||||
uint64 m;
|
uint64_t m;
|
||||||
m = TIFFVStripSize64(tif, nrows);
|
m = TIFFVStripSize64(tif, nrows);
|
||||||
return _TIFFCastUInt64ToSSize(tif, m, module);
|
return _TIFFCastUInt64ToSSize(tif, m, module);
|
||||||
}
|
}
|
||||||
@ -136,45 +138,35 @@ TIFFVStripSize(TIFF* tif, uint32 nrows)
|
|||||||
/*
|
/*
|
||||||
* Compute the # bytes in a raw strip.
|
* Compute the # bytes in a raw strip.
|
||||||
*/
|
*/
|
||||||
uint64
|
uint64_t TIFFRawStripSize64(TIFF *tif, uint32_t strip)
|
||||||
TIFFRawStripSize64(TIFF* tif, uint32 strip)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "TIFFRawStripSize64";
|
static const char module[] = "TIFFRawStripSize64";
|
||||||
uint64 bytecount = TIFFGetStrileByteCount(tif, strip);
|
uint64_t bytecount = TIFFGetStrileByteCount(tif, strip);
|
||||||
|
|
||||||
if (bytecount == 0)
|
if (bytecount == 0)
|
||||||
{
|
{
|
||||||
#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
|
TIFFErrorExtR(tif, module,
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
"%" PRIu64 ": Invalid strip byte count, strip %lu",
|
||||||
"%I64u: Invalid strip byte count, strip %lu",
|
(uint64_t)bytecount, (unsigned long)strip);
|
||||||
(unsigned __int64) bytecount,
|
bytecount = (uint64_t)-1;
|
||||||
(unsigned long) strip);
|
|
||||||
#else
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
|
||||||
"%llu: Invalid strip byte count, strip %lu",
|
|
||||||
(unsigned long long) bytecount,
|
|
||||||
(unsigned long) strip);
|
|
||||||
#endif
|
|
||||||
bytecount = (uint64) -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return bytecount;
|
return bytecount;
|
||||||
}
|
}
|
||||||
tmsize_t
|
tmsize_t TIFFRawStripSize(TIFF *tif, uint32_t strip)
|
||||||
TIFFRawStripSize(TIFF* tif, uint32 strip)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "TIFFRawStripSize";
|
static const char module[] = "TIFFRawStripSize";
|
||||||
uint64 m;
|
uint64_t m;
|
||||||
tmsize_t n;
|
tmsize_t n;
|
||||||
m = TIFFRawStripSize64(tif, strip);
|
m = TIFFRawStripSize64(tif, strip);
|
||||||
if (m==(uint64)(-1))
|
if (m == (uint64_t)(-1))
|
||||||
n = (tmsize_t)(-1);
|
n = (tmsize_t)(-1);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
n = (tmsize_t)m;
|
n = (tmsize_t)m;
|
||||||
if ((uint64)n!=m)
|
if ((uint64_t)n != m)
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata,module,"Integer overflow");
|
TIFFErrorExtR(tif, module, "Integer overflow");
|
||||||
n = 0;
|
n = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -189,20 +181,18 @@ TIFFRawStripSize(TIFF* tif, uint32 strip)
|
|||||||
* truncated to reflect the actual space required
|
* truncated to reflect the actual space required
|
||||||
* to hold the strip.
|
* to hold the strip.
|
||||||
*/
|
*/
|
||||||
uint64
|
uint64_t TIFFStripSize64(TIFF *tif)
|
||||||
TIFFStripSize64(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
TIFFDirectory *td = &tif->tif_dir;
|
||||||
uint32 rps = td->td_rowsperstrip;
|
uint32_t rps = td->td_rowsperstrip;
|
||||||
if (rps > td->td_imagelength)
|
if (rps > td->td_imagelength)
|
||||||
rps = td->td_imagelength;
|
rps = td->td_imagelength;
|
||||||
return (TIFFVStripSize64(tif, rps));
|
return (TIFFVStripSize64(tif, rps));
|
||||||
}
|
}
|
||||||
tmsize_t
|
tmsize_t TIFFStripSize(TIFF *tif)
|
||||||
TIFFStripSize(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "TIFFStripSize";
|
static const char module[] = "TIFFStripSize";
|
||||||
uint64 m;
|
uint64_t m;
|
||||||
m = TIFFStripSize64(tif);
|
m = TIFFStripSize64(tif);
|
||||||
return _TIFFCastUInt64ToSSize(tif, m, module);
|
return _TIFFCastUInt64ToSSize(tif, m, module);
|
||||||
}
|
}
|
||||||
@ -213,32 +203,31 @@ TIFFStripSize(TIFF* tif)
|
|||||||
* request is <1 then we choose a strip size according
|
* request is <1 then we choose a strip size according
|
||||||
* to certain heuristics.
|
* to certain heuristics.
|
||||||
*/
|
*/
|
||||||
uint32
|
uint32_t TIFFDefaultStripSize(TIFF *tif, uint32_t request)
|
||||||
TIFFDefaultStripSize(TIFF* tif, uint32 request)
|
|
||||||
{
|
{
|
||||||
return (*tif->tif_defstripsize)(tif, request);
|
return (*tif->tif_defstripsize)(tif, request);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32
|
uint32_t _TIFFDefaultStripSize(TIFF *tif, uint32_t s)
|
||||||
_TIFFDefaultStripSize(TIFF* tif, uint32 s)
|
{
|
||||||
|
if ((int32_t)s < 1)
|
||||||
{
|
{
|
||||||
if ((int32) s < 1) {
|
|
||||||
/*
|
/*
|
||||||
* If RowsPerStrip is unspecified, try to break the
|
* If RowsPerStrip is unspecified, try to break the
|
||||||
* image up into strips that are approximately
|
* image up into strips that are approximately
|
||||||
* STRIP_SIZE_DEFAULT bytes long.
|
* STRIP_SIZE_DEFAULT bytes long.
|
||||||
*/
|
*/
|
||||||
uint64 scanlinesize;
|
uint64_t scanlinesize;
|
||||||
uint64 rows;
|
uint64_t rows;
|
||||||
scanlinesize = TIFFScanlineSize64(tif);
|
scanlinesize = TIFFScanlineSize64(tif);
|
||||||
if (scanlinesize == 0)
|
if (scanlinesize == 0)
|
||||||
scanlinesize = 1;
|
scanlinesize = 1;
|
||||||
rows=(uint64)STRIP_SIZE_DEFAULT/scanlinesize;
|
rows = (uint64_t)STRIP_SIZE_DEFAULT / scanlinesize;
|
||||||
if (rows == 0)
|
if (rows == 0)
|
||||||
rows = 1;
|
rows = 1;
|
||||||
else if (rows > 0xFFFFFFFF)
|
else if (rows > 0xFFFFFFFF)
|
||||||
rows = 0xFFFFFFFF;
|
rows = 0xFFFFFFFF;
|
||||||
s=(uint32)rows;
|
s = (uint32_t)rows;
|
||||||
}
|
}
|
||||||
return (s);
|
return (s);
|
||||||
}
|
}
|
||||||
@ -253,68 +242,77 @@ _TIFFDefaultStripSize(TIFF* tif, uint32 s)
|
|||||||
* subsampling lines divided by vertical subsampling. It should thus make
|
* subsampling lines divided by vertical subsampling. It should thus make
|
||||||
* sense when multiplied by a multiple of vertical subsampling.
|
* sense when multiplied by a multiple of vertical subsampling.
|
||||||
*/
|
*/
|
||||||
uint64
|
uint64_t TIFFScanlineSize64(TIFF *tif)
|
||||||
TIFFScanlineSize64(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "TIFFScanlineSize64";
|
static const char module[] = "TIFFScanlineSize64";
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
TIFFDirectory *td = &tif->tif_dir;
|
||||||
uint64 scanline_size;
|
uint64_t scanline_size;
|
||||||
if (td->td_planarconfig == PLANARCONFIG_CONTIG)
|
if (td->td_planarconfig == PLANARCONFIG_CONTIG)
|
||||||
{
|
{
|
||||||
if ((td->td_photometric == PHOTOMETRIC_YCBCR) &&
|
if ((td->td_photometric == PHOTOMETRIC_YCBCR) &&
|
||||||
(td->td_samplesperpixel==3)&&
|
(td->td_samplesperpixel == 3) && (!isUpSampled(tif)))
|
||||||
(!isUpSampled(tif)))
|
|
||||||
{
|
{
|
||||||
uint16 ycbcrsubsampling[2];
|
uint16_t ycbcrsubsampling[2];
|
||||||
uint16 samplingblock_samples;
|
uint16_t samplingblock_samples;
|
||||||
uint32 samplingblocks_hor;
|
uint32_t samplingblocks_hor;
|
||||||
uint64 samplingrow_samples;
|
uint64_t samplingrow_samples;
|
||||||
uint64 samplingrow_size;
|
uint64_t samplingrow_size;
|
||||||
if (td->td_samplesperpixel != 3)
|
if (td->td_samplesperpixel != 3)
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata,module,
|
TIFFErrorExtR(tif, module, "Invalid td_samplesperpixel value");
|
||||||
"Invalid td_samplesperpixel value");
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
TIFFGetFieldDefaulted(tif, TIFFTAG_YCBCRSUBSAMPLING,
|
TIFFGetFieldDefaulted(tif, TIFFTAG_YCBCRSUBSAMPLING,
|
||||||
ycbcrsubsampling+0,
|
ycbcrsubsampling + 0, ycbcrsubsampling + 1);
|
||||||
ycbcrsubsampling+1);
|
if (((ycbcrsubsampling[0] != 1) && (ycbcrsubsampling[0] != 2) &&
|
||||||
if (((ycbcrsubsampling[0]!=1)&&(ycbcrsubsampling[0]!=2)&&(ycbcrsubsampling[0]!=4)) ||
|
(ycbcrsubsampling[0] != 4)) ||
|
||||||
((ycbcrsubsampling[1]!=1)&&(ycbcrsubsampling[1]!=2)&&(ycbcrsubsampling[1]!=4)))
|
((ycbcrsubsampling[1] != 1) && (ycbcrsubsampling[1] != 2) &&
|
||||||
|
(ycbcrsubsampling[1] != 4)))
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata,module,
|
TIFFErrorExtR(tif, module, "Invalid YCbCr subsampling");
|
||||||
"Invalid YCbCr subsampling");
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
samplingblock_samples = ycbcrsubsampling[0]*ycbcrsubsampling[1]+2;
|
samplingblock_samples =
|
||||||
samplingblocks_hor = TIFFhowmany_32(td->td_imagewidth,ycbcrsubsampling[0]);
|
ycbcrsubsampling[0] * ycbcrsubsampling[1] + 2;
|
||||||
samplingrow_samples = _TIFFMultiply64(tif,samplingblocks_hor,samplingblock_samples,module);
|
samplingblocks_hor =
|
||||||
samplingrow_size = TIFFhowmany_64(_TIFFMultiply64(tif,samplingrow_samples,td->td_bitspersample,module),8);
|
TIFFhowmany_32(td->td_imagewidth, ycbcrsubsampling[0]);
|
||||||
|
samplingrow_samples = _TIFFMultiply64(
|
||||||
|
tif, samplingblocks_hor, samplingblock_samples, module);
|
||||||
|
samplingrow_size =
|
||||||
|
TIFFhowmany_64(_TIFFMultiply64(tif, samplingrow_samples,
|
||||||
|
td->td_bitspersample, module),
|
||||||
|
8);
|
||||||
scanline_size = (samplingrow_size / ycbcrsubsampling[1]);
|
scanline_size = (samplingrow_size / ycbcrsubsampling[1]);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
uint64 scanline_samples;
|
uint64_t scanline_samples;
|
||||||
scanline_samples=_TIFFMultiply64(tif,td->td_imagewidth,td->td_samplesperpixel,module);
|
scanline_samples = _TIFFMultiply64(tif, td->td_imagewidth,
|
||||||
scanline_size=TIFFhowmany_64(_TIFFMultiply64(tif,scanline_samples,td->td_bitspersample,module),8);
|
td->td_samplesperpixel, module);
|
||||||
|
scanline_size =
|
||||||
|
TIFFhowmany_64(_TIFFMultiply64(tif, scanline_samples,
|
||||||
|
td->td_bitspersample, module),
|
||||||
|
8);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
scanline_size=TIFFhowmany_64(_TIFFMultiply64(tif,td->td_imagewidth,td->td_bitspersample,module),8);
|
scanline_size =
|
||||||
|
TIFFhowmany_64(_TIFFMultiply64(tif, td->td_imagewidth,
|
||||||
|
td->td_bitspersample, module),
|
||||||
|
8);
|
||||||
}
|
}
|
||||||
if (scanline_size == 0)
|
if (scanline_size == 0)
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata,module,"Computed scanline size is zero");
|
TIFFErrorExtR(tif, module, "Computed scanline size is zero");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return (scanline_size);
|
return (scanline_size);
|
||||||
}
|
}
|
||||||
tmsize_t
|
tmsize_t TIFFScanlineSize(TIFF *tif)
|
||||||
TIFFScanlineSize(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "TIFFScanlineSize";
|
static const char module[] = "TIFFScanlineSize";
|
||||||
uint64 m;
|
uint64_t m;
|
||||||
m = TIFFScanlineSize64(tif);
|
m = TIFFScanlineSize64(tif);
|
||||||
return _TIFFCastUInt64ToSSize(tif, m, module);
|
return _TIFFCastUInt64ToSSize(tif, m, module);
|
||||||
}
|
}
|
||||||
@ -325,35 +323,28 @@ TIFFScanlineSize(TIFF* tif)
|
|||||||
* I/O size returned by TIFFScanlineSize which may be less
|
* I/O size returned by TIFFScanlineSize which may be less
|
||||||
* if data is store as separate planes).
|
* if data is store as separate planes).
|
||||||
*/
|
*/
|
||||||
uint64
|
uint64_t TIFFRasterScanlineSize64(TIFF *tif)
|
||||||
TIFFRasterScanlineSize64(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "TIFFRasterScanlineSize64";
|
static const char module[] = "TIFFRasterScanlineSize64";
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
TIFFDirectory *td = &tif->tif_dir;
|
||||||
uint64 scanline;
|
uint64_t scanline;
|
||||||
|
|
||||||
scanline = _TIFFMultiply64(tif, td->td_bitspersample, td->td_imagewidth, module);
|
scanline =
|
||||||
if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
|
_TIFFMultiply64(tif, td->td_bitspersample, td->td_imagewidth, module);
|
||||||
scanline = _TIFFMultiply64(tif, scanline, td->td_samplesperpixel, module);
|
if (td->td_planarconfig == PLANARCONFIG_CONTIG)
|
||||||
|
{
|
||||||
|
scanline =
|
||||||
|
_TIFFMultiply64(tif, scanline, td->td_samplesperpixel, module);
|
||||||
return (TIFFhowmany8_64(scanline));
|
return (TIFFhowmany8_64(scanline));
|
||||||
} else
|
}
|
||||||
|
else
|
||||||
return (_TIFFMultiply64(tif, TIFFhowmany8_64(scanline),
|
return (_TIFFMultiply64(tif, TIFFhowmany8_64(scanline),
|
||||||
td->td_samplesperpixel, module));
|
td->td_samplesperpixel, module));
|
||||||
}
|
}
|
||||||
tmsize_t
|
tmsize_t TIFFRasterScanlineSize(TIFF *tif)
|
||||||
TIFFRasterScanlineSize(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "TIFFRasterScanlineSize";
|
static const char module[] = "TIFFRasterScanlineSize";
|
||||||
uint64 m;
|
uint64_t m;
|
||||||
m = TIFFRasterScanlineSize64(tif);
|
m = TIFFRasterScanlineSize64(tif);
|
||||||
return _TIFFCastUInt64ToSSize(tif, m, module);
|
return _TIFFCastUInt64ToSSize(tif, m, module);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
301
3rdparty/libtiff/tif_swab.c
vendored
301
3rdparty/libtiff/tif_swab.c
vendored
@ -30,167 +30,216 @@
|
|||||||
#include "tiffiop.h"
|
#include "tiffiop.h"
|
||||||
|
|
||||||
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabShort)
|
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabShort)
|
||||||
void
|
void TIFFSwabShort(uint16_t *wp)
|
||||||
TIFFSwabShort(uint16* wp)
|
|
||||||
{
|
{
|
||||||
register unsigned char *cp = (unsigned char *)wp;
|
register unsigned char *cp = (unsigned char *)wp;
|
||||||
unsigned char t;
|
unsigned char t;
|
||||||
assert(sizeof(uint16)==2);
|
assert(sizeof(uint16_t) == 2);
|
||||||
t = cp[1]; cp[1] = cp[0]; cp[0] = t;
|
t = cp[1];
|
||||||
|
cp[1] = cp[0];
|
||||||
|
cp[0] = t;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabLong)
|
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabLong)
|
||||||
void
|
void TIFFSwabLong(uint32_t *lp)
|
||||||
TIFFSwabLong(uint32* lp)
|
|
||||||
{
|
{
|
||||||
register unsigned char *cp = (unsigned char *)lp;
|
register unsigned char *cp = (unsigned char *)lp;
|
||||||
unsigned char t;
|
unsigned char t;
|
||||||
assert(sizeof(uint32)==4);
|
assert(sizeof(uint32_t) == 4);
|
||||||
t = cp[3]; cp[3] = cp[0]; cp[0] = t;
|
t = cp[3];
|
||||||
t = cp[2]; cp[2] = cp[1]; cp[1] = t;
|
cp[3] = cp[0];
|
||||||
|
cp[0] = t;
|
||||||
|
t = cp[2];
|
||||||
|
cp[2] = cp[1];
|
||||||
|
cp[1] = t;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabLong8)
|
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabLong8)
|
||||||
void
|
void TIFFSwabLong8(uint64_t *lp)
|
||||||
TIFFSwabLong8(uint64* lp)
|
|
||||||
{
|
{
|
||||||
register unsigned char *cp = (unsigned char *)lp;
|
register unsigned char *cp = (unsigned char *)lp;
|
||||||
unsigned char t;
|
unsigned char t;
|
||||||
assert(sizeof(uint64)==8);
|
assert(sizeof(uint64_t) == 8);
|
||||||
t = cp[7]; cp[7] = cp[0]; cp[0] = t;
|
t = cp[7];
|
||||||
t = cp[6]; cp[6] = cp[1]; cp[1] = t;
|
cp[7] = cp[0];
|
||||||
t = cp[5]; cp[5] = cp[2]; cp[2] = t;
|
cp[0] = t;
|
||||||
t = cp[4]; cp[4] = cp[3]; cp[3] = t;
|
t = cp[6];
|
||||||
|
cp[6] = cp[1];
|
||||||
|
cp[1] = t;
|
||||||
|
t = cp[5];
|
||||||
|
cp[5] = cp[2];
|
||||||
|
cp[2] = t;
|
||||||
|
t = cp[4];
|
||||||
|
cp[4] = cp[3];
|
||||||
|
cp[3] = t;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabArrayOfShort)
|
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabArrayOfShort)
|
||||||
void
|
void TIFFSwabArrayOfShort(register uint16_t *wp, tmsize_t n)
|
||||||
TIFFSwabArrayOfShort(register uint16* wp, tmsize_t n)
|
|
||||||
{
|
{
|
||||||
register unsigned char *cp;
|
register unsigned char *cp;
|
||||||
register unsigned char t;
|
register unsigned char t;
|
||||||
assert(sizeof(uint16)==2);
|
assert(sizeof(uint16_t) == 2);
|
||||||
/* XXX unroll loop some */
|
/* XXX unroll loop some */
|
||||||
while (n-- > 0) {
|
while (n-- > 0)
|
||||||
|
{
|
||||||
cp = (unsigned char *)wp;
|
cp = (unsigned char *)wp;
|
||||||
t = cp[1]; cp[1] = cp[0]; cp[0] = t;
|
t = cp[1];
|
||||||
|
cp[1] = cp[0];
|
||||||
|
cp[0] = t;
|
||||||
wp++;
|
wp++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabArrayOfTriples)
|
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabArrayOfTriples)
|
||||||
void
|
void TIFFSwabArrayOfTriples(register uint8_t *tp, tmsize_t n)
|
||||||
TIFFSwabArrayOfTriples(register uint8* tp, tmsize_t n)
|
|
||||||
{
|
{
|
||||||
unsigned char *cp;
|
unsigned char *cp;
|
||||||
unsigned char t;
|
unsigned char t;
|
||||||
|
|
||||||
/* XXX unroll loop some */
|
/* XXX unroll loop some */
|
||||||
while (n-- > 0) {
|
while (n-- > 0)
|
||||||
|
{
|
||||||
cp = (unsigned char *)tp;
|
cp = (unsigned char *)tp;
|
||||||
t = cp[2]; cp[2] = cp[0]; cp[0] = t;
|
t = cp[2];
|
||||||
|
cp[2] = cp[0];
|
||||||
|
cp[0] = t;
|
||||||
tp += 3;
|
tp += 3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabArrayOfLong)
|
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabArrayOfLong)
|
||||||
void
|
void TIFFSwabArrayOfLong(register uint32_t *lp, tmsize_t n)
|
||||||
TIFFSwabArrayOfLong(register uint32* lp, tmsize_t n)
|
|
||||||
{
|
{
|
||||||
register unsigned char *cp;
|
register unsigned char *cp;
|
||||||
register unsigned char t;
|
register unsigned char t;
|
||||||
assert(sizeof(uint32)==4);
|
assert(sizeof(uint32_t) == 4);
|
||||||
/* XXX unroll loop some */
|
/* XXX unroll loop some */
|
||||||
while (n-- > 0) {
|
while (n-- > 0)
|
||||||
|
{
|
||||||
cp = (unsigned char *)lp;
|
cp = (unsigned char *)lp;
|
||||||
t = cp[3]; cp[3] = cp[0]; cp[0] = t;
|
t = cp[3];
|
||||||
t = cp[2]; cp[2] = cp[1]; cp[1] = t;
|
cp[3] = cp[0];
|
||||||
|
cp[0] = t;
|
||||||
|
t = cp[2];
|
||||||
|
cp[2] = cp[1];
|
||||||
|
cp[1] = t;
|
||||||
lp++;
|
lp++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabArrayOfLong8)
|
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabArrayOfLong8)
|
||||||
void
|
void TIFFSwabArrayOfLong8(register uint64_t *lp, tmsize_t n)
|
||||||
TIFFSwabArrayOfLong8(register uint64* lp, tmsize_t n)
|
|
||||||
{
|
{
|
||||||
register unsigned char *cp;
|
register unsigned char *cp;
|
||||||
register unsigned char t;
|
register unsigned char t;
|
||||||
assert(sizeof(uint64)==8);
|
assert(sizeof(uint64_t) == 8);
|
||||||
/* XXX unroll loop some */
|
/* XXX unroll loop some */
|
||||||
while (n-- > 0) {
|
while (n-- > 0)
|
||||||
|
{
|
||||||
cp = (unsigned char *)lp;
|
cp = (unsigned char *)lp;
|
||||||
t = cp[7]; cp[7] = cp[0]; cp[0] = t;
|
t = cp[7];
|
||||||
t = cp[6]; cp[6] = cp[1]; cp[1] = t;
|
cp[7] = cp[0];
|
||||||
t = cp[5]; cp[5] = cp[2]; cp[2] = t;
|
cp[0] = t;
|
||||||
t = cp[4]; cp[4] = cp[3]; cp[3] = t;
|
t = cp[6];
|
||||||
|
cp[6] = cp[1];
|
||||||
|
cp[1] = t;
|
||||||
|
t = cp[5];
|
||||||
|
cp[5] = cp[2];
|
||||||
|
cp[2] = t;
|
||||||
|
t = cp[4];
|
||||||
|
cp[4] = cp[3];
|
||||||
|
cp[3] = t;
|
||||||
lp++;
|
lp++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabFloat)
|
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabFloat)
|
||||||
void
|
void TIFFSwabFloat(float *fp)
|
||||||
TIFFSwabFloat(float* fp)
|
|
||||||
{
|
{
|
||||||
register unsigned char *cp = (unsigned char *)fp;
|
register unsigned char *cp = (unsigned char *)fp;
|
||||||
unsigned char t;
|
unsigned char t;
|
||||||
assert(sizeof(float) == 4);
|
assert(sizeof(float) == 4);
|
||||||
t = cp[3]; cp[3] = cp[0]; cp[0] = t;
|
t = cp[3];
|
||||||
t = cp[2]; cp[2] = cp[1]; cp[1] = t;
|
cp[3] = cp[0];
|
||||||
|
cp[0] = t;
|
||||||
|
t = cp[2];
|
||||||
|
cp[2] = cp[1];
|
||||||
|
cp[1] = t;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabArrayOfFloat)
|
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabArrayOfFloat)
|
||||||
void
|
void TIFFSwabArrayOfFloat(register float *fp, tmsize_t n)
|
||||||
TIFFSwabArrayOfFloat(register float* fp, tmsize_t n)
|
|
||||||
{
|
{
|
||||||
register unsigned char *cp;
|
register unsigned char *cp;
|
||||||
register unsigned char t;
|
register unsigned char t;
|
||||||
assert(sizeof(float) == 4);
|
assert(sizeof(float) == 4);
|
||||||
/* XXX unroll loop some */
|
/* XXX unroll loop some */
|
||||||
while (n-- > 0) {
|
while (n-- > 0)
|
||||||
|
{
|
||||||
cp = (unsigned char *)fp;
|
cp = (unsigned char *)fp;
|
||||||
t = cp[3]; cp[3] = cp[0]; cp[0] = t;
|
t = cp[3];
|
||||||
t = cp[2]; cp[2] = cp[1]; cp[1] = t;
|
cp[3] = cp[0];
|
||||||
|
cp[0] = t;
|
||||||
|
t = cp[2];
|
||||||
|
cp[2] = cp[1];
|
||||||
|
cp[1] = t;
|
||||||
fp++;
|
fp++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabDouble)
|
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabDouble)
|
||||||
void
|
void TIFFSwabDouble(double *dp)
|
||||||
TIFFSwabDouble(double *dp)
|
|
||||||
{
|
{
|
||||||
register unsigned char *cp = (unsigned char *)dp;
|
register unsigned char *cp = (unsigned char *)dp;
|
||||||
unsigned char t;
|
unsigned char t;
|
||||||
assert(sizeof(double) == 8);
|
assert(sizeof(double) == 8);
|
||||||
t = cp[7]; cp[7] = cp[0]; cp[0] = t;
|
t = cp[7];
|
||||||
t = cp[6]; cp[6] = cp[1]; cp[1] = t;
|
cp[7] = cp[0];
|
||||||
t = cp[5]; cp[5] = cp[2]; cp[2] = t;
|
cp[0] = t;
|
||||||
t = cp[4]; cp[4] = cp[3]; cp[3] = t;
|
t = cp[6];
|
||||||
|
cp[6] = cp[1];
|
||||||
|
cp[1] = t;
|
||||||
|
t = cp[5];
|
||||||
|
cp[5] = cp[2];
|
||||||
|
cp[2] = t;
|
||||||
|
t = cp[4];
|
||||||
|
cp[4] = cp[3];
|
||||||
|
cp[3] = t;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabArrayOfDouble)
|
#if defined(DISABLE_CHECK_TIFFSWABMACROS) || !defined(TIFFSwabArrayOfDouble)
|
||||||
void
|
void TIFFSwabArrayOfDouble(double *dp, tmsize_t n)
|
||||||
TIFFSwabArrayOfDouble(double* dp, tmsize_t n)
|
|
||||||
{
|
{
|
||||||
register unsigned char *cp;
|
register unsigned char *cp;
|
||||||
register unsigned char t;
|
register unsigned char t;
|
||||||
assert(sizeof(double) == 8);
|
assert(sizeof(double) == 8);
|
||||||
/* XXX unroll loop some */
|
/* XXX unroll loop some */
|
||||||
while (n-- > 0) {
|
while (n-- > 0)
|
||||||
|
{
|
||||||
cp = (unsigned char *)dp;
|
cp = (unsigned char *)dp;
|
||||||
t = cp[7]; cp[7] = cp[0]; cp[0] = t;
|
t = cp[7];
|
||||||
t = cp[6]; cp[6] = cp[1]; cp[1] = t;
|
cp[7] = cp[0];
|
||||||
t = cp[5]; cp[5] = cp[2]; cp[2] = t;
|
cp[0] = t;
|
||||||
t = cp[4]; cp[4] = cp[3]; cp[3] = t;
|
t = cp[6];
|
||||||
|
cp[6] = cp[1];
|
||||||
|
cp[1] = t;
|
||||||
|
t = cp[5];
|
||||||
|
cp[5] = cp[2];
|
||||||
|
cp[2] = t;
|
||||||
|
t = cp[4];
|
||||||
|
cp[4] = cp[3];
|
||||||
|
cp[3] = t;
|
||||||
dp++;
|
dp++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -206,84 +255,62 @@ TIFFSwabArrayOfDouble(double* dp, tmsize_t n)
|
|||||||
* do not reverse bit values.
|
* do not reverse bit values.
|
||||||
*/
|
*/
|
||||||
static const unsigned char TIFFBitRevTable[256] = {
|
static const unsigned char TIFFBitRevTable[256] = {
|
||||||
0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
|
0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, 0x10, 0x90, 0x50, 0xd0,
|
||||||
0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
|
0x30, 0xb0, 0x70, 0xf0, 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
|
||||||
0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
|
0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, 0x04, 0x84, 0x44, 0xc4,
|
||||||
0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
|
0x24, 0xa4, 0x64, 0xe4, 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
|
||||||
0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
|
0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, 0x1c, 0x9c, 0x5c, 0xdc,
|
||||||
0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
|
0x3c, 0xbc, 0x7c, 0xfc, 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
|
||||||
0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
|
0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, 0x0a, 0x8a, 0x4a, 0xca,
|
||||||
0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
|
0x2a, 0xaa, 0x6a, 0xea, 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
|
||||||
0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
|
0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, 0x16, 0x96, 0x56, 0xd6,
|
||||||
0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
|
0x36, 0xb6, 0x76, 0xf6, 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
|
||||||
0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
|
0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, 0x01, 0x81, 0x41, 0xc1,
|
||||||
0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
|
0x21, 0xa1, 0x61, 0xe1, 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
|
||||||
0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
|
0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, 0x19, 0x99, 0x59, 0xd9,
|
||||||
0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
|
0x39, 0xb9, 0x79, 0xf9, 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
|
||||||
0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
|
0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, 0x0d, 0x8d, 0x4d, 0xcd,
|
||||||
0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
|
0x2d, 0xad, 0x6d, 0xed, 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
|
||||||
0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
|
0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, 0x13, 0x93, 0x53, 0xd3,
|
||||||
0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
|
0x33, 0xb3, 0x73, 0xf3, 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
|
||||||
0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
|
0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, 0x07, 0x87, 0x47, 0xc7,
|
||||||
0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
|
0x27, 0xa7, 0x67, 0xe7, 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
|
||||||
0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
|
0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, 0x1f, 0x9f, 0x5f, 0xdf,
|
||||||
0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
|
0x3f, 0xbf, 0x7f, 0xff};
|
||||||
0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
|
|
||||||
0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
|
|
||||||
0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
|
|
||||||
0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
|
|
||||||
0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
|
|
||||||
0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
|
|
||||||
0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
|
|
||||||
0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
|
|
||||||
0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
|
|
||||||
0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
|
|
||||||
};
|
|
||||||
static const unsigned char TIFFNoBitRevTable[256] = {
|
static const unsigned char TIFFNoBitRevTable[256] = {
|
||||||
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
|
||||||
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
|
0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
|
||||||
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
|
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
|
||||||
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
|
0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
|
||||||
0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
|
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
|
||||||
0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
|
0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
|
||||||
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
|
0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53,
|
||||||
0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
|
0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
|
||||||
0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
|
0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
|
||||||
0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
|
0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
|
||||||
0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
|
0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83,
|
||||||
0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
|
0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
|
||||||
0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
|
0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
|
||||||
0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
|
0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
|
||||||
0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
|
0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3,
|
||||||
0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
|
0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
|
||||||
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
|
0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb,
|
||||||
0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
|
0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
|
||||||
0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
|
0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3,
|
||||||
0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
|
0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
|
||||||
0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
|
0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb,
|
||||||
0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
|
0xfc, 0xfd, 0xfe, 0xff,
|
||||||
0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
|
|
||||||
0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
|
|
||||||
0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
|
|
||||||
0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
|
|
||||||
0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
|
|
||||||
0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
|
|
||||||
0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
|
|
||||||
0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
|
|
||||||
0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
|
|
||||||
0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const unsigned char*
|
const unsigned char *TIFFGetBitRevTable(int reversed)
|
||||||
TIFFGetBitRevTable(int reversed)
|
|
||||||
{
|
{
|
||||||
return (reversed ? TIFFBitRevTable : TIFFNoBitRevTable);
|
return (reversed ? TIFFBitRevTable : TIFFNoBitRevTable);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void TIFFReverseBits(uint8_t *cp, tmsize_t n)
|
||||||
TIFFReverseBits(uint8* cp, tmsize_t n)
|
{
|
||||||
|
for (; n > 8; n -= 8)
|
||||||
{
|
{
|
||||||
for (; n > 8; n -= 8) {
|
|
||||||
cp[0] = TIFFBitRevTable[cp[0]];
|
cp[0] = TIFFBitRevTable[cp[0]];
|
||||||
cp[1] = TIFFBitRevTable[cp[1]];
|
cp[1] = TIFFBitRevTable[cp[1]];
|
||||||
cp[2] = TIFFBitRevTable[cp[2]];
|
cp[2] = TIFFBitRevTable[cp[2]];
|
||||||
@ -294,17 +321,9 @@ TIFFReverseBits(uint8* cp, tmsize_t n)
|
|||||||
cp[7] = TIFFBitRevTable[cp[7]];
|
cp[7] = TIFFBitRevTable[cp[7]];
|
||||||
cp += 8;
|
cp += 8;
|
||||||
}
|
}
|
||||||
while (n-- > 0) {
|
while (n-- > 0)
|
||||||
|
{
|
||||||
*cp = TIFFBitRevTable[*cp];
|
*cp = TIFFBitRevTable[*cp];
|
||||||
cp++;
|
cp++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
98
3rdparty/libtiff/tif_thunder.c
vendored
98
3rdparty/libtiff/tif_thunder.c
vendored
@ -54,36 +54,35 @@
|
|||||||
static const int twobitdeltas[4] = {0, 1, 0, -1};
|
static const int twobitdeltas[4] = {0, 1, 0, -1};
|
||||||
static const int threebitdeltas[8] = {0, 1, 2, 3, 0, -3, -2, -1};
|
static const int threebitdeltas[8] = {0, 1, 2, 3, 0, -3, -2, -1};
|
||||||
|
|
||||||
#define SETPIXEL(op, v) { \
|
#define SETPIXEL(op, v) \
|
||||||
|
{ \
|
||||||
lastpixel = (v)&0xf; \
|
lastpixel = (v)&0xf; \
|
||||||
if (npixels < maxpixels) \
|
if (npixels < maxpixels) \
|
||||||
{ \
|
{ \
|
||||||
if (npixels++ & 1) \
|
if (npixels++ & 1) \
|
||||||
*op++ |= lastpixel; \
|
*op++ |= lastpixel; \
|
||||||
else \
|
else \
|
||||||
op[0] = (uint8) (lastpixel << 4); \
|
op[0] = (uint8_t)(lastpixel << 4); \
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int ThunderSetupDecode(TIFF *tif)
|
||||||
ThunderSetupDecode(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "ThunderSetupDecode";
|
static const char module[] = "ThunderSetupDecode";
|
||||||
|
|
||||||
if (tif->tif_dir.td_bitspersample != 4)
|
if (tif->tif_dir.td_bitspersample != 4)
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
TIFFErrorExtR(tif, module,
|
||||||
"Wrong bitspersample value (%d), Thunder decoder only supports 4bits per sample.",
|
"Wrong bitspersample value (%d), Thunder decoder only "
|
||||||
|
"supports 4bits per sample.",
|
||||||
(int)tif->tif_dir.td_bitspersample);
|
(int)tif->tif_dir.td_bitspersample);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int ThunderDecode(TIFF *tif, uint8_t *op, tmsize_t maxpixels)
|
||||||
ThunderDecode(TIFF* tif, uint8* op, tmsize_t maxpixels)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "ThunderDecode";
|
static const char module[] = "ThunderDecode";
|
||||||
register unsigned char *bp;
|
register unsigned char *bp;
|
||||||
@ -95,26 +94,33 @@ ThunderDecode(TIFF* tif, uint8* op, tmsize_t maxpixels)
|
|||||||
cc = tif->tif_rawcc;
|
cc = tif->tif_rawcc;
|
||||||
lastpixel = 0;
|
lastpixel = 0;
|
||||||
npixels = 0;
|
npixels = 0;
|
||||||
while (cc > 0 && npixels < maxpixels) {
|
while (cc > 0 && npixels < maxpixels)
|
||||||
|
{
|
||||||
int n, delta;
|
int n, delta;
|
||||||
|
|
||||||
n = *bp++;
|
n = *bp++;
|
||||||
cc--;
|
cc--;
|
||||||
switch (n & THUNDER_CODE) {
|
switch (n & THUNDER_CODE)
|
||||||
|
{
|
||||||
case THUNDER_RUN: /* pixel run */
|
case THUNDER_RUN: /* pixel run */
|
||||||
/*
|
/*
|
||||||
* Replicate the last pixel n times,
|
* Replicate the last pixel n times,
|
||||||
* where n is the lower-order 6 bits.
|
* where n is the lower-order 6 bits.
|
||||||
*/
|
*/
|
||||||
if (npixels & 1) {
|
if (npixels & 1)
|
||||||
|
{
|
||||||
op[0] |= lastpixel;
|
op[0] |= lastpixel;
|
||||||
lastpixel = *op++; npixels++; n--;
|
lastpixel = *op++;
|
||||||
} else
|
npixels++;
|
||||||
|
n--;
|
||||||
|
}
|
||||||
|
else
|
||||||
lastpixel |= lastpixel << 4;
|
lastpixel |= lastpixel << 4;
|
||||||
npixels += n;
|
npixels += n;
|
||||||
if (npixels < maxpixels) {
|
if (npixels < maxpixels)
|
||||||
|
{
|
||||||
for (; n > 0; n -= 2)
|
for (; n > 0; n -= 2)
|
||||||
*op++ = (uint8) lastpixel;
|
*op++ = (uint8_t)lastpixel;
|
||||||
}
|
}
|
||||||
if (n == -1)
|
if (n == -1)
|
||||||
*--op &= 0xf0;
|
*--op &= 0xf0;
|
||||||
@ -122,60 +128,56 @@ ThunderDecode(TIFF* tif, uint8* op, tmsize_t maxpixels)
|
|||||||
break;
|
break;
|
||||||
case THUNDER_2BITDELTAS: /* 2-bit deltas */
|
case THUNDER_2BITDELTAS: /* 2-bit deltas */
|
||||||
if ((delta = ((n >> 4) & 3)) != DELTA2_SKIP)
|
if ((delta = ((n >> 4) & 3)) != DELTA2_SKIP)
|
||||||
SETPIXEL(op, (unsigned)((int)lastpixel + twobitdeltas[delta]));
|
SETPIXEL(op,
|
||||||
|
(unsigned)((int)lastpixel + twobitdeltas[delta]));
|
||||||
if ((delta = ((n >> 2) & 3)) != DELTA2_SKIP)
|
if ((delta = ((n >> 2) & 3)) != DELTA2_SKIP)
|
||||||
SETPIXEL(op, (unsigned)((int)lastpixel + twobitdeltas[delta]));
|
SETPIXEL(op,
|
||||||
|
(unsigned)((int)lastpixel + twobitdeltas[delta]));
|
||||||
if ((delta = (n & 3)) != DELTA2_SKIP)
|
if ((delta = (n & 3)) != DELTA2_SKIP)
|
||||||
SETPIXEL(op, (unsigned)((int)lastpixel + twobitdeltas[delta]));
|
SETPIXEL(op,
|
||||||
|
(unsigned)((int)lastpixel + twobitdeltas[delta]));
|
||||||
break;
|
break;
|
||||||
case THUNDER_3BITDELTAS: /* 3-bit deltas */
|
case THUNDER_3BITDELTAS: /* 3-bit deltas */
|
||||||
if ((delta = ((n >> 3) & 7)) != DELTA3_SKIP)
|
if ((delta = ((n >> 3) & 7)) != DELTA3_SKIP)
|
||||||
SETPIXEL(op, (unsigned)((int)lastpixel + threebitdeltas[delta]));
|
SETPIXEL(
|
||||||
|
op, (unsigned)((int)lastpixel + threebitdeltas[delta]));
|
||||||
if ((delta = (n & 7)) != DELTA3_SKIP)
|
if ((delta = (n & 7)) != DELTA3_SKIP)
|
||||||
SETPIXEL(op, (unsigned)((int)lastpixel + threebitdeltas[delta]));
|
SETPIXEL(
|
||||||
|
op, (unsigned)((int)lastpixel + threebitdeltas[delta]));
|
||||||
break;
|
break;
|
||||||
case THUNDER_RAW: /* raw data */
|
case THUNDER_RAW: /* raw data */
|
||||||
SETPIXEL(op, n);
|
SETPIXEL(op, n);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tif->tif_rawcp = (uint8*) bp;
|
tif->tif_rawcp = (uint8_t *)bp;
|
||||||
tif->tif_rawcc = cc;
|
tif->tif_rawcc = cc;
|
||||||
if (npixels != maxpixels) {
|
if (npixels != maxpixels)
|
||||||
#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
TIFFErrorExtR(tif, module,
|
||||||
"%s data at scanline %lu (%I64u != %I64u)",
|
"%s data at scanline %lu (%" PRIu64 " != %" PRIu64 ")",
|
||||||
npixels < maxpixels ? "Not enough" : "Too much",
|
npixels < maxpixels ? "Not enough" : "Too much",
|
||||||
(unsigned long) tif->tif_row,
|
(unsigned long)tif->tif_row, (uint64_t)npixels,
|
||||||
(unsigned __int64) npixels,
|
(uint64_t)maxpixels);
|
||||||
(unsigned __int64) maxpixels);
|
|
||||||
#else
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
|
||||||
"%s data at scanline %lu (%llu != %llu)",
|
|
||||||
npixels < maxpixels ? "Not enough" : "Too much",
|
|
||||||
(unsigned long) tif->tif_row,
|
|
||||||
(unsigned long long) npixels,
|
|
||||||
(unsigned long long) maxpixels);
|
|
||||||
#endif
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int ThunderDecodeRow(TIFF *tif, uint8_t *buf, tmsize_t occ, uint16_t s)
|
||||||
ThunderDecodeRow(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "ThunderDecodeRow";
|
static const char module[] = "ThunderDecodeRow";
|
||||||
uint8* row = buf;
|
uint8_t *row = buf;
|
||||||
|
|
||||||
(void)s;
|
(void)s;
|
||||||
if (occ % tif->tif_scanlinesize)
|
if (occ % tif->tif_scanlinesize)
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "Fractional scanlines cannot be read");
|
TIFFErrorExtR(tif, module, "Fractional scanlines cannot be read");
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
while (occ > 0) {
|
while (occ > 0)
|
||||||
|
{
|
||||||
if (!ThunderDecode(tif, row, tif->tif_dir.td_imagewidth))
|
if (!ThunderDecode(tif, row, tif->tif_dir.td_imagewidth))
|
||||||
return (0);
|
return (0);
|
||||||
occ -= tif->tif_scanlinesize;
|
occ -= tif->tif_scanlinesize;
|
||||||
@ -184,8 +186,7 @@ ThunderDecodeRow(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s)
|
|||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int TIFFInitThunderScan(TIFF *tif, int scheme)
|
||||||
TIFFInitThunderScan(TIFF* tif, int scheme)
|
|
||||||
{
|
{
|
||||||
(void)scheme;
|
(void)scheme;
|
||||||
|
|
||||||
@ -195,12 +196,3 @@ TIFFInitThunderScan(TIFF* tif, int scheme)
|
|||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
#endif /* THUNDER_SUPPORT */
|
#endif /* THUNDER_SUPPORT */
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
189
3rdparty/libtiff/tif_tile.c
vendored
189
3rdparty/libtiff/tif_tile.c
vendored
@ -32,33 +32,32 @@
|
|||||||
/*
|
/*
|
||||||
* Compute which tile an (x,y,z,s) value is in.
|
* Compute which tile an (x,y,z,s) value is in.
|
||||||
*/
|
*/
|
||||||
uint32
|
uint32_t TIFFComputeTile(TIFF *tif, uint32_t x, uint32_t y, uint32_t z,
|
||||||
TIFFComputeTile(TIFF* tif, uint32 x, uint32 y, uint32 z, uint16 s)
|
uint16_t s)
|
||||||
{
|
{
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
TIFFDirectory *td = &tif->tif_dir;
|
||||||
uint32 dx = td->td_tilewidth;
|
uint32_t dx = td->td_tilewidth;
|
||||||
uint32 dy = td->td_tilelength;
|
uint32_t dy = td->td_tilelength;
|
||||||
uint32 dz = td->td_tiledepth;
|
uint32_t dz = td->td_tiledepth;
|
||||||
uint32 tile = 1;
|
uint32_t tile = 1;
|
||||||
|
|
||||||
if (td->td_imagedepth == 1)
|
if (td->td_imagedepth == 1)
|
||||||
z = 0;
|
z = 0;
|
||||||
if (dx == (uint32) -1)
|
if (dx == (uint32_t)-1)
|
||||||
dx = td->td_imagewidth;
|
dx = td->td_imagewidth;
|
||||||
if (dy == (uint32) -1)
|
if (dy == (uint32_t)-1)
|
||||||
dy = td->td_imagelength;
|
dy = td->td_imagelength;
|
||||||
if (dz == (uint32) -1)
|
if (dz == (uint32_t)-1)
|
||||||
dz = td->td_imagedepth;
|
dz = td->td_imagedepth;
|
||||||
if (dx != 0 && dy != 0 && dz != 0) {
|
if (dx != 0 && dy != 0 && dz != 0)
|
||||||
uint32 xpt = TIFFhowmany_32(td->td_imagewidth, dx);
|
{
|
||||||
uint32 ypt = TIFFhowmany_32(td->td_imagelength, dy);
|
uint32_t xpt = TIFFhowmany_32(td->td_imagewidth, dx);
|
||||||
uint32 zpt = TIFFhowmany_32(td->td_imagedepth, dz);
|
uint32_t ypt = TIFFhowmany_32(td->td_imagelength, dy);
|
||||||
|
uint32_t zpt = TIFFhowmany_32(td->td_imagedepth, dz);
|
||||||
|
|
||||||
if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
|
if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
|
||||||
tile = (xpt*ypt*zpt)*s +
|
tile = (xpt * ypt * zpt) * s + (xpt * ypt) * (z / dz) +
|
||||||
(xpt*ypt)*(z/dz) +
|
xpt * (y / dy) + x / dx;
|
||||||
xpt*(y/dy) +
|
|
||||||
x/dx;
|
|
||||||
else
|
else
|
||||||
tile = (xpt * ypt) * (z / dz) + xpt * (y / dy) + x / dx;
|
tile = (xpt * ypt) * (z / dz) + xpt * (y / dy) + x / dx;
|
||||||
}
|
}
|
||||||
@ -69,36 +68,33 @@ TIFFComputeTile(TIFF* tif, uint32 x, uint32 y, uint32 z, uint16 s)
|
|||||||
* Check an (x,y,z,s) coordinate
|
* Check an (x,y,z,s) coordinate
|
||||||
* against the image bounds.
|
* against the image bounds.
|
||||||
*/
|
*/
|
||||||
int
|
int TIFFCheckTile(TIFF *tif, uint32_t x, uint32_t y, uint32_t z, uint16_t s)
|
||||||
TIFFCheckTile(TIFF* tif, uint32 x, uint32 y, uint32 z, uint16 s)
|
|
||||||
{
|
{
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
TIFFDirectory *td = &tif->tif_dir;
|
||||||
|
|
||||||
if (x >= td->td_imagewidth) {
|
if (x >= td->td_imagewidth)
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
{
|
||||||
"%lu: Col out of range, max %lu",
|
TIFFErrorExtR(tif, tif->tif_name, "%lu: Col out of range, max %lu",
|
||||||
(unsigned long) x,
|
(unsigned long)x, (unsigned long)(td->td_imagewidth - 1));
|
||||||
(unsigned long) (td->td_imagewidth - 1));
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
if (y >= td->td_imagelength) {
|
if (y >= td->td_imagelength)
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
{
|
||||||
"%lu: Row out of range, max %lu",
|
TIFFErrorExtR(tif, tif->tif_name, "%lu: Row out of range, max %lu",
|
||||||
(unsigned long)y,
|
(unsigned long)y,
|
||||||
(unsigned long)(td->td_imagelength - 1));
|
(unsigned long)(td->td_imagelength - 1));
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
if (z >= td->td_imagedepth) {
|
if (z >= td->td_imagedepth)
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
{
|
||||||
"%lu: Depth out of range, max %lu",
|
TIFFErrorExtR(tif, tif->tif_name, "%lu: Depth out of range, max %lu",
|
||||||
(unsigned long) z,
|
(unsigned long)z, (unsigned long)(td->td_imagedepth - 1));
|
||||||
(unsigned long) (td->td_imagedepth - 1));
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
if (td->td_planarconfig == PLANARCONFIG_SEPARATE &&
|
if (td->td_planarconfig == PLANARCONFIG_SEPARATE &&
|
||||||
s >= td->td_samplesperpixel) {
|
s >= td->td_samplesperpixel)
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
{
|
||||||
"%lu: Sample out of range, max %lu",
|
TIFFErrorExtR(tif, tif->tif_name, "%lu: Sample out of range, max %lu",
|
||||||
(unsigned long)s,
|
(unsigned long)s,
|
||||||
(unsigned long)(td->td_samplesperpixel - 1));
|
(unsigned long)(td->td_samplesperpixel - 1));
|
||||||
return (0);
|
return (0);
|
||||||
@ -109,23 +105,26 @@ TIFFCheckTile(TIFF* tif, uint32 x, uint32 y, uint32 z, uint16 s)
|
|||||||
/*
|
/*
|
||||||
* Compute how many tiles are in an image.
|
* Compute how many tiles are in an image.
|
||||||
*/
|
*/
|
||||||
uint32
|
uint32_t TIFFNumberOfTiles(TIFF *tif)
|
||||||
TIFFNumberOfTiles(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
TIFFDirectory *td = &tif->tif_dir;
|
||||||
uint32 dx = td->td_tilewidth;
|
uint32_t dx = td->td_tilewidth;
|
||||||
uint32 dy = td->td_tilelength;
|
uint32_t dy = td->td_tilelength;
|
||||||
uint32 dz = td->td_tiledepth;
|
uint32_t dz = td->td_tiledepth;
|
||||||
uint32 ntiles;
|
uint32_t ntiles;
|
||||||
|
|
||||||
if (dx == (uint32) -1)
|
if (dx == (uint32_t)-1)
|
||||||
dx = td->td_imagewidth;
|
dx = td->td_imagewidth;
|
||||||
if (dy == (uint32) -1)
|
if (dy == (uint32_t)-1)
|
||||||
dy = td->td_imagelength;
|
dy = td->td_imagelength;
|
||||||
if (dz == (uint32) -1)
|
if (dz == (uint32_t)-1)
|
||||||
dz = td->td_imagedepth;
|
dz = td->td_imagedepth;
|
||||||
ntiles = (dx == 0 || dy == 0 || dz == 0) ? 0 :
|
ntiles =
|
||||||
_TIFFMultiply32(tif, _TIFFMultiply32(tif, TIFFhowmany_32(td->td_imagewidth, dx),
|
(dx == 0 || dy == 0 || dz == 0)
|
||||||
|
? 0
|
||||||
|
: _TIFFMultiply32(
|
||||||
|
tif,
|
||||||
|
_TIFFMultiply32(tif, TIFFhowmany_32(td->td_imagewidth, dx),
|
||||||
TIFFhowmany_32(td->td_imagelength, dy),
|
TIFFhowmany_32(td->td_imagelength, dy),
|
||||||
"TIFFNumberOfTiles"),
|
"TIFFNumberOfTiles"),
|
||||||
TIFFhowmany_32(td->td_imagedepth, dz), "TIFFNumberOfTiles");
|
TIFFhowmany_32(td->td_imagedepth, dz), "TIFFNumberOfTiles");
|
||||||
@ -138,22 +137,21 @@ TIFFNumberOfTiles(TIFF* tif)
|
|||||||
/*
|
/*
|
||||||
* Compute the # bytes in each row of a tile.
|
* Compute the # bytes in each row of a tile.
|
||||||
*/
|
*/
|
||||||
uint64
|
uint64_t TIFFTileRowSize64(TIFF *tif)
|
||||||
TIFFTileRowSize64(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "TIFFTileRowSize64";
|
static const char module[] = "TIFFTileRowSize64";
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
TIFFDirectory *td = &tif->tif_dir;
|
||||||
uint64 rowsize;
|
uint64_t rowsize;
|
||||||
uint64 tilerowsize;
|
uint64_t tilerowsize;
|
||||||
|
|
||||||
if (td->td_tilelength == 0)
|
if (td->td_tilelength == 0)
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata,module,"Tile length is zero");
|
TIFFErrorExtR(tif, module, "Tile length is zero");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (td->td_tilewidth == 0)
|
if (td->td_tilewidth == 0)
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata,module,"Tile width is zero");
|
TIFFErrorExtR(tif, module, "Tile width is zero");
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
rowsize = _TIFFMultiply64(tif, td->td_bitspersample, td->td_tilewidth,
|
rowsize = _TIFFMultiply64(tif, td->td_bitspersample, td->td_tilewidth,
|
||||||
@ -162,7 +160,7 @@ TIFFTileRowSize64(TIFF* tif)
|
|||||||
{
|
{
|
||||||
if (td->td_samplesperpixel == 0)
|
if (td->td_samplesperpixel == 0)
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata,module,"Samples per pixel is zero");
|
TIFFErrorExtR(tif, module, "Samples per pixel is zero");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
rowsize = _TIFFMultiply64(tif, rowsize, td->td_samplesperpixel,
|
rowsize = _TIFFMultiply64(tif, rowsize, td->td_samplesperpixel,
|
||||||
@ -171,16 +169,15 @@ TIFFTileRowSize64(TIFF* tif)
|
|||||||
tilerowsize = TIFFhowmany8_64(rowsize);
|
tilerowsize = TIFFhowmany8_64(rowsize);
|
||||||
if (tilerowsize == 0)
|
if (tilerowsize == 0)
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata,module,"Computed tile row size is zero");
|
TIFFErrorExtR(tif, module, "Computed tile row size is zero");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return (tilerowsize);
|
return (tilerowsize);
|
||||||
}
|
}
|
||||||
tmsize_t
|
tmsize_t TIFFTileRowSize(TIFF *tif)
|
||||||
TIFFTileRowSize(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "TIFFTileRowSize";
|
static const char module[] = "TIFFTileRowSize";
|
||||||
uint64 m;
|
uint64_t m;
|
||||||
m = TIFFTileRowSize64(tif);
|
m = TIFFTileRowSize64(tif);
|
||||||
return _TIFFCastUInt64ToSSize(tif, m, module);
|
return _TIFFCastUInt64ToSSize(tif, m, module);
|
||||||
}
|
}
|
||||||
@ -188,8 +185,7 @@ TIFFTileRowSize(TIFF* tif)
|
|||||||
/*
|
/*
|
||||||
* Compute the # bytes in a variable length, row-aligned tile.
|
* Compute the # bytes in a variable length, row-aligned tile.
|
||||||
*/
|
*/
|
||||||
uint64
|
uint64_t TIFFVTileSize64(TIFF *tif, uint32_t nrows)
|
||||||
TIFFVTileSize64(TIFF* tif, uint32 nrows)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "TIFFVTileSize64";
|
static const char module[] = "TIFFVTileSize64";
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
TIFFDirectory *td = &tif->tif_dir;
|
||||||
@ -198,8 +194,7 @@ TIFFVTileSize64(TIFF* tif, uint32 nrows)
|
|||||||
return (0);
|
return (0);
|
||||||
if ((td->td_planarconfig == PLANARCONFIG_CONTIG) &&
|
if ((td->td_planarconfig == PLANARCONFIG_CONTIG) &&
|
||||||
(td->td_photometric == PHOTOMETRIC_YCBCR) &&
|
(td->td_photometric == PHOTOMETRIC_YCBCR) &&
|
||||||
(td->td_samplesperpixel==3)&&
|
(td->td_samplesperpixel == 3) && (!isUpSampled(tif)))
|
||||||
(!isUpSampled(tif)))
|
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Packed YCbCr data contain one Cb+Cr for every
|
* Packed YCbCr data contain one Cb+Cr for every
|
||||||
@ -209,38 +204,41 @@ TIFFVTileSize64(TIFF* tif, uint32 nrows)
|
|||||||
* horizontal/vertical subsampling area include
|
* horizontal/vertical subsampling area include
|
||||||
* YCbCr data for the extended image.
|
* YCbCr data for the extended image.
|
||||||
*/
|
*/
|
||||||
uint16 ycbcrsubsampling[2];
|
uint16_t ycbcrsubsampling[2];
|
||||||
uint16 samplingblock_samples;
|
uint16_t samplingblock_samples;
|
||||||
uint32 samplingblocks_hor;
|
uint32_t samplingblocks_hor;
|
||||||
uint32 samplingblocks_ver;
|
uint32_t samplingblocks_ver;
|
||||||
uint64 samplingrow_samples;
|
uint64_t samplingrow_samples;
|
||||||
uint64 samplingrow_size;
|
uint64_t samplingrow_size;
|
||||||
TIFFGetFieldDefaulted(tif,TIFFTAG_YCBCRSUBSAMPLING,ycbcrsubsampling+0,
|
TIFFGetFieldDefaulted(tif, TIFFTAG_YCBCRSUBSAMPLING,
|
||||||
ycbcrsubsampling+1);
|
ycbcrsubsampling + 0, ycbcrsubsampling + 1);
|
||||||
if ((ycbcrsubsampling[0] != 1 && ycbcrsubsampling[0] != 2 && ycbcrsubsampling[0] != 4)
|
if ((ycbcrsubsampling[0] != 1 && ycbcrsubsampling[0] != 2 &&
|
||||||
||(ycbcrsubsampling[1] != 1 && ycbcrsubsampling[1] != 2 && ycbcrsubsampling[1] != 4))
|
ycbcrsubsampling[0] != 4) ||
|
||||||
|
(ycbcrsubsampling[1] != 1 && ycbcrsubsampling[1] != 2 &&
|
||||||
|
ycbcrsubsampling[1] != 4))
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata,module,
|
TIFFErrorExtR(tif, module, "Invalid YCbCr subsampling (%dx%d)",
|
||||||
"Invalid YCbCr subsampling (%dx%d)",
|
ycbcrsubsampling[0], ycbcrsubsampling[1]);
|
||||||
ycbcrsubsampling[0],
|
|
||||||
ycbcrsubsampling[1] );
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
samplingblock_samples = ycbcrsubsampling[0] * ycbcrsubsampling[1] + 2;
|
samplingblock_samples = ycbcrsubsampling[0] * ycbcrsubsampling[1] + 2;
|
||||||
samplingblocks_hor=TIFFhowmany_32(td->td_tilewidth,ycbcrsubsampling[0]);
|
samplingblocks_hor =
|
||||||
|
TIFFhowmany_32(td->td_tilewidth, ycbcrsubsampling[0]);
|
||||||
samplingblocks_ver = TIFFhowmany_32(nrows, ycbcrsubsampling[1]);
|
samplingblocks_ver = TIFFhowmany_32(nrows, ycbcrsubsampling[1]);
|
||||||
samplingrow_samples=_TIFFMultiply64(tif,samplingblocks_hor,samplingblock_samples,module);
|
samplingrow_samples = _TIFFMultiply64(tif, samplingblocks_hor,
|
||||||
samplingrow_size=TIFFhowmany8_64(_TIFFMultiply64(tif,samplingrow_samples,td->td_bitspersample,module));
|
samplingblock_samples, module);
|
||||||
return(_TIFFMultiply64(tif,samplingrow_size,samplingblocks_ver,module));
|
samplingrow_size = TIFFhowmany8_64(_TIFFMultiply64(
|
||||||
|
tif, samplingrow_samples, td->td_bitspersample, module));
|
||||||
|
return (
|
||||||
|
_TIFFMultiply64(tif, samplingrow_size, samplingblocks_ver, module));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return (_TIFFMultiply64(tif, nrows, TIFFTileRowSize64(tif), module));
|
return (_TIFFMultiply64(tif, nrows, TIFFTileRowSize64(tif), module));
|
||||||
}
|
}
|
||||||
tmsize_t
|
tmsize_t TIFFVTileSize(TIFF *tif, uint32_t nrows)
|
||||||
TIFFVTileSize(TIFF* tif, uint32 nrows)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "TIFFVTileSize";
|
static const char module[] = "TIFFVTileSize";
|
||||||
uint64 m;
|
uint64_t m;
|
||||||
m = TIFFVTileSize64(tif, nrows);
|
m = TIFFVTileSize64(tif, nrows);
|
||||||
return _TIFFCastUInt64ToSSize(tif, m, module);
|
return _TIFFCastUInt64ToSSize(tif, m, module);
|
||||||
}
|
}
|
||||||
@ -248,16 +246,14 @@ TIFFVTileSize(TIFF* tif, uint32 nrows)
|
|||||||
/*
|
/*
|
||||||
* Compute the # bytes in a row-aligned tile.
|
* Compute the # bytes in a row-aligned tile.
|
||||||
*/
|
*/
|
||||||
uint64
|
uint64_t TIFFTileSize64(TIFF *tif)
|
||||||
TIFFTileSize64(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
return (TIFFVTileSize64(tif, tif->tif_dir.td_tilelength));
|
return (TIFFVTileSize64(tif, tif->tif_dir.td_tilelength));
|
||||||
}
|
}
|
||||||
tmsize_t
|
tmsize_t TIFFTileSize(TIFF *tif)
|
||||||
TIFFTileSize(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "TIFFTileSize";
|
static const char module[] = "TIFFTileSize";
|
||||||
uint64 m;
|
uint64_t m;
|
||||||
m = TIFFTileSize64(tif);
|
m = TIFFTileSize64(tif);
|
||||||
return _TIFFCastUInt64ToSSize(tif, m, module);
|
return _TIFFCastUInt64ToSSize(tif, m, module);
|
||||||
}
|
}
|
||||||
@ -268,19 +264,17 @@ TIFFTileSize(TIFF* tif)
|
|||||||
* request is <1 then we choose a size according
|
* request is <1 then we choose a size according
|
||||||
* to certain heuristics.
|
* to certain heuristics.
|
||||||
*/
|
*/
|
||||||
void
|
void TIFFDefaultTileSize(TIFF *tif, uint32_t *tw, uint32_t *th)
|
||||||
TIFFDefaultTileSize(TIFF* tif, uint32* tw, uint32* th)
|
|
||||||
{
|
{
|
||||||
(*tif->tif_deftilesize)(tif, tw, th);
|
(*tif->tif_deftilesize)(tif, tw, th);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void _TIFFDefaultTileSize(TIFF *tif, uint32_t *tw, uint32_t *th)
|
||||||
_TIFFDefaultTileSize(TIFF* tif, uint32* tw, uint32* th)
|
|
||||||
{
|
{
|
||||||
(void)tif;
|
(void)tif;
|
||||||
if (*(int32*) tw < 1)
|
if (*(int32_t *)tw < 1)
|
||||||
*tw = 256;
|
*tw = 256;
|
||||||
if (*(int32*) th < 1)
|
if (*(int32_t *)th < 1)
|
||||||
*th = 256;
|
*th = 256;
|
||||||
/* roundup to a multiple of 16 per the spec */
|
/* roundup to a multiple of 16 per the spec */
|
||||||
if (*tw & 0xf)
|
if (*tw & 0xf)
|
||||||
@ -288,12 +282,3 @@ _TIFFDefaultTileSize(TIFF* tif, uint32* tw, uint32* th)
|
|||||||
if (*th & 0xf)
|
if (*th & 0xf)
|
||||||
*th = TIFFroundup_32(*th, 16);
|
*th = TIFFroundup_32(*th, 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
172
3rdparty/libtiff/tif_unix.c
vendored
172
3rdparty/libtiff/tif_unix.c
vendored
@ -53,18 +53,15 @@
|
|||||||
|
|
||||||
#include "tiffiop.h"
|
#include "tiffiop.h"
|
||||||
|
|
||||||
|
|
||||||
#define TIFF_IO_MAX 2147483647U
|
#define TIFF_IO_MAX 2147483647U
|
||||||
|
|
||||||
|
|
||||||
typedef union fd_as_handle_union
|
typedef union fd_as_handle_union
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
thandle_t h;
|
thandle_t h;
|
||||||
} fd_as_handle_union_t;
|
} fd_as_handle_union_t;
|
||||||
|
|
||||||
static tmsize_t
|
static tmsize_t _tiffReadProc(thandle_t fd, void *buf, tmsize_t size)
|
||||||
_tiffReadProc(thandle_t fd, void* buf, tmsize_t size)
|
|
||||||
{
|
{
|
||||||
fd_as_handle_union_t fdh;
|
fd_as_handle_union_t fdh;
|
||||||
const size_t bytes_total = (size_t)size;
|
const size_t bytes_total = (size_t)size;
|
||||||
@ -91,8 +88,7 @@ _tiffReadProc(thandle_t fd, void* buf, tmsize_t size)
|
|||||||
return (tmsize_t)bytes_read;
|
return (tmsize_t)bytes_read;
|
||||||
}
|
}
|
||||||
|
|
||||||
static tmsize_t
|
static tmsize_t _tiffWriteProc(thandle_t fd, void *buf, tmsize_t size)
|
||||||
_tiffWriteProc(thandle_t fd, void* buf, tmsize_t size)
|
|
||||||
{
|
{
|
||||||
fd_as_handle_union_t fdh;
|
fd_as_handle_union_t fdh;
|
||||||
const size_t bytes_total = (size_t)size;
|
const size_t bytes_total = (size_t)size;
|
||||||
@ -120,30 +116,27 @@ _tiffWriteProc(thandle_t fd, void* buf, tmsize_t size)
|
|||||||
/* return ((tmsize_t) write(fdh.fd, buf, bytes_total)); */
|
/* return ((tmsize_t) write(fdh.fd, buf, bytes_total)); */
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint64
|
static uint64_t _tiffSeekProc(thandle_t fd, uint64_t off, int whence)
|
||||||
_tiffSeekProc(thandle_t fd, uint64 off, int whence)
|
|
||||||
{
|
{
|
||||||
fd_as_handle_union_t fdh;
|
fd_as_handle_union_t fdh;
|
||||||
_TIFF_off_t off_io = (_TIFF_off_t)off;
|
_TIFF_off_t off_io = (_TIFF_off_t)off;
|
||||||
if ((uint64) off_io != off)
|
if ((uint64_t)off_io != off)
|
||||||
{
|
{
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return (uint64) -1; /* this is really gross */
|
return (uint64_t)-1; /* this is really gross */
|
||||||
}
|
}
|
||||||
fdh.h = fd;
|
fdh.h = fd;
|
||||||
return((uint64)_TIFF_lseek_f(fdh.fd,off_io,whence));
|
return ((uint64_t)_TIFF_lseek_f(fdh.fd, off_io, whence));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int _tiffCloseProc(thandle_t fd)
|
||||||
_tiffCloseProc(thandle_t fd)
|
|
||||||
{
|
{
|
||||||
fd_as_handle_union_t fdh;
|
fd_as_handle_union_t fdh;
|
||||||
fdh.h = fd;
|
fdh.h = fd;
|
||||||
return (close(fdh.fd));
|
return (close(fdh.fd));
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint64
|
static uint64_t _tiffSizeProc(thandle_t fd)
|
||||||
_tiffSizeProc(thandle_t fd)
|
|
||||||
{
|
{
|
||||||
_TIFF_stat_s sb;
|
_TIFF_stat_s sb;
|
||||||
fd_as_handle_union_t fdh;
|
fd_as_handle_union_t fdh;
|
||||||
@ -151,23 +144,24 @@ _tiffSizeProc(thandle_t fd)
|
|||||||
if (_TIFF_fstat_f(fdh.fd, &sb) < 0)
|
if (_TIFF_fstat_f(fdh.fd, &sb) < 0)
|
||||||
return (0);
|
return (0);
|
||||||
else
|
else
|
||||||
return((uint64)sb.st_size);
|
return ((uint64_t)sb.st_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_MMAP
|
#ifdef HAVE_MMAP
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
|
|
||||||
static int
|
static int _tiffMapProc(thandle_t fd, void **pbase, toff_t *psize)
|
||||||
_tiffMapProc(thandle_t fd, void** pbase, toff_t* psize)
|
|
||||||
{
|
{
|
||||||
uint64 size64 = _tiffSizeProc(fd);
|
uint64_t size64 = _tiffSizeProc(fd);
|
||||||
tmsize_t sizem = (tmsize_t)size64;
|
tmsize_t sizem = (tmsize_t)size64;
|
||||||
if (size64 && (uint64)sizem==size64) {
|
if (size64 && (uint64_t)sizem == size64)
|
||||||
|
{
|
||||||
fd_as_handle_union_t fdh;
|
fd_as_handle_union_t fdh;
|
||||||
fdh.h = fd;
|
fdh.h = fd;
|
||||||
*pbase = (void*)
|
*pbase =
|
||||||
mmap(0, (size_t)sizem, PROT_READ, MAP_SHARED, fdh.fd, 0);
|
(void *)mmap(0, (size_t)sizem, PROT_READ, MAP_SHARED, fdh.fd, 0);
|
||||||
if (*pbase != (void*) -1) {
|
if (*pbase != (void *)-1)
|
||||||
|
{
|
||||||
*psize = (tmsize_t)sizem;
|
*psize = (tmsize_t)sizem;
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
@ -175,42 +169,46 @@ _tiffMapProc(thandle_t fd, void** pbase, toff_t* psize)
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void _tiffUnmapProc(thandle_t fd, void *base, toff_t size)
|
||||||
_tiffUnmapProc(thandle_t fd, void* base, toff_t size)
|
|
||||||
{
|
{
|
||||||
(void)fd;
|
(void)fd;
|
||||||
(void)munmap(base, (off_t)size);
|
(void)munmap(base, (off_t)size);
|
||||||
}
|
}
|
||||||
#else /* !HAVE_MMAP */
|
#else /* !HAVE_MMAP */
|
||||||
static int
|
static int _tiffMapProc(thandle_t fd, void **pbase, toff_t *psize)
|
||||||
_tiffMapProc(thandle_t fd, void** pbase, toff_t* psize)
|
|
||||||
{
|
{
|
||||||
(void) fd; (void) pbase; (void) psize;
|
(void)fd;
|
||||||
|
(void)pbase;
|
||||||
|
(void)psize;
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void _tiffUnmapProc(thandle_t fd, void *base, toff_t size)
|
||||||
_tiffUnmapProc(thandle_t fd, void* base, toff_t size)
|
|
||||||
{
|
{
|
||||||
(void) fd; (void) base; (void) size;
|
(void)fd;
|
||||||
|
(void)base;
|
||||||
|
(void)size;
|
||||||
}
|
}
|
||||||
#endif /* !HAVE_MMAP */
|
#endif /* !HAVE_MMAP */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Open a TIFF file descriptor for read/writing.
|
* Open a TIFF file descriptor for read/writing.
|
||||||
*/
|
*/
|
||||||
TIFF*
|
TIFF *TIFFFdOpen(int fd, const char *name, const char *mode)
|
||||||
TIFFFdOpen(int fd, const char* name, const char* mode)
|
{
|
||||||
|
return TIFFFdOpenExt(fd, name, mode, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
TIFF *TIFFFdOpenExt(int fd, const char *name, const char *mode,
|
||||||
|
TIFFOpenOptions *opts)
|
||||||
{
|
{
|
||||||
TIFF *tif;
|
TIFF *tif;
|
||||||
|
|
||||||
fd_as_handle_union_t fdh;
|
fd_as_handle_union_t fdh;
|
||||||
fdh.fd = fd;
|
fdh.fd = fd;
|
||||||
tif = TIFFClientOpen(name, mode,
|
tif = TIFFClientOpenExt(name, mode, fdh.h, _tiffReadProc, _tiffWriteProc,
|
||||||
fdh.h,
|
|
||||||
_tiffReadProc, _tiffWriteProc,
|
|
||||||
_tiffSeekProc, _tiffCloseProc, _tiffSizeProc,
|
_tiffSeekProc, _tiffCloseProc, _tiffSizeProc,
|
||||||
_tiffMapProc, _tiffUnmapProc);
|
_tiffMapProc, _tiffUnmapProc, opts);
|
||||||
if (tif)
|
if (tif)
|
||||||
tif->tif_fd = fd;
|
tif->tif_fd = fd;
|
||||||
return (tif);
|
return (tif);
|
||||||
@ -219,14 +217,18 @@ TIFFFdOpen(int fd, const char* name, const char* mode)
|
|||||||
/*
|
/*
|
||||||
* Open a TIFF file for read/writing.
|
* Open a TIFF file for read/writing.
|
||||||
*/
|
*/
|
||||||
TIFF*
|
TIFF *TIFFOpen(const char *name, const char *mode)
|
||||||
TIFFOpen(const char* name, const char* mode)
|
{
|
||||||
|
return TIFFOpenExt(name, mode, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
TIFF *TIFFOpenExt(const char *name, const char *mode, TIFFOpenOptions *opts)
|
||||||
{
|
{
|
||||||
static const char module[] = "TIFFOpen";
|
static const char module[] = "TIFFOpen";
|
||||||
int m, fd;
|
int m, fd;
|
||||||
TIFF *tif;
|
TIFF *tif;
|
||||||
|
|
||||||
m = _TIFFgetMode(mode, module);
|
m = _TIFFgetMode(opts, NULL, mode, module);
|
||||||
if (m == -1)
|
if (m == -1)
|
||||||
return ((TIFF *)0);
|
return ((TIFF *)0);
|
||||||
|
|
||||||
@ -236,16 +238,21 @@ TIFFOpen(const char* name, const char* mode)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
fd = open(name, m, 0666);
|
fd = open(name, m, 0666);
|
||||||
if (fd < 0) {
|
if (fd < 0)
|
||||||
if (errno > 0 && strerror(errno) != NULL ) {
|
{
|
||||||
TIFFErrorExt(0, module, "%s: %s", name, strerror(errno) );
|
if (errno > 0 && strerror(errno) != NULL)
|
||||||
} else {
|
{
|
||||||
TIFFErrorExt(0, module, "%s: Cannot open", name);
|
_TIFFErrorEarly(opts, NULL, module, "%s: %s", name,
|
||||||
|
strerror(errno));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_TIFFErrorEarly(opts, NULL, module, "%s: Cannot open", name);
|
||||||
}
|
}
|
||||||
return ((TIFF *)0);
|
return ((TIFF *)0);
|
||||||
}
|
}
|
||||||
|
|
||||||
tif = TIFFFdOpen((int)fd, name, mode);
|
tif = TIFFFdOpenExt((int)fd, name, mode, opts);
|
||||||
if (!tif)
|
if (!tif)
|
||||||
close(fd);
|
close(fd);
|
||||||
return tif;
|
return tif;
|
||||||
@ -256,8 +263,11 @@ TIFFOpen(const char* name, const char* mode)
|
|||||||
/*
|
/*
|
||||||
* Open a TIFF file with a Unicode filename, for read/writing.
|
* Open a TIFF file with a Unicode filename, for read/writing.
|
||||||
*/
|
*/
|
||||||
TIFF*
|
TIFF *TIFFOpenW(const wchar_t *name, const char *mode)
|
||||||
TIFFOpenW(const wchar_t* name, const char* mode)
|
{
|
||||||
|
return TIFFOpenWExt(name, mode, NULL);
|
||||||
|
}
|
||||||
|
TIFF *TIFFOpenWExt(const wchar_t *name, const char *mode, TIFFOpenOptions *opts)
|
||||||
{
|
{
|
||||||
static const char module[] = "TIFFOpenW";
|
static const char module[] = "TIFFOpenW";
|
||||||
int m, fd;
|
int m, fd;
|
||||||
@ -265,7 +275,7 @@ TIFFOpenW(const wchar_t* name, const char* mode)
|
|||||||
char *mbname;
|
char *mbname;
|
||||||
TIFF *tif;
|
TIFF *tif;
|
||||||
|
|
||||||
m = _TIFFgetMode(mode, module);
|
m = _TIFFgetMode(opts, NULL, mode, module);
|
||||||
if (m == -1)
|
if (m == -1)
|
||||||
return ((TIFF *)0);
|
return ((TIFF *)0);
|
||||||
|
|
||||||
@ -275,27 +285,30 @@ TIFFOpenW(const wchar_t* name, const char* mode)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
fd = _wopen(name, m, 0666);
|
fd = _wopen(name, m, 0666);
|
||||||
if (fd < 0) {
|
if (fd < 0)
|
||||||
TIFFErrorExt(0, module, "%ls: Cannot open", name);
|
{
|
||||||
|
_TIFFErrorEarly(opts, NULL, module, "%ls: Cannot open", name);
|
||||||
return ((TIFF *)0);
|
return ((TIFF *)0);
|
||||||
}
|
}
|
||||||
|
|
||||||
mbname = NULL;
|
mbname = NULL;
|
||||||
mbsize = WideCharToMultiByte(CP_ACP, 0, name, -1, NULL, 0, NULL, NULL);
|
mbsize = WideCharToMultiByte(CP_ACP, 0, name, -1, NULL, 0, NULL, NULL);
|
||||||
if (mbsize > 0) {
|
if (mbsize > 0)
|
||||||
|
{
|
||||||
mbname = _TIFFmalloc(mbsize);
|
mbname = _TIFFmalloc(mbsize);
|
||||||
if (!mbname) {
|
if (!mbname)
|
||||||
TIFFErrorExt(0, module,
|
{
|
||||||
|
_TIFFErrorEarly(
|
||||||
|
opts, NULL, module,
|
||||||
"Can't allocate space for filename conversion buffer");
|
"Can't allocate space for filename conversion buffer");
|
||||||
return ((TIFF *)0);
|
return ((TIFF *)0);
|
||||||
}
|
}
|
||||||
|
|
||||||
WideCharToMultiByte(CP_ACP, 0, name, -1, mbname, mbsize,
|
WideCharToMultiByte(CP_ACP, 0, name, -1, mbname, mbsize, NULL, NULL);
|
||||||
NULL, NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
tif = TIFFFdOpen((int)fd, (mbname != NULL) ? mbname : "<unknown>",
|
tif = TIFFFdOpenExt((int)fd, (mbname != NULL) ? mbname : "<unknown>", mode,
|
||||||
mode);
|
opts);
|
||||||
|
|
||||||
_TIFFfree(mbname);
|
_TIFFfree(mbname);
|
||||||
|
|
||||||
@ -305,8 +318,7 @@ TIFFOpenW(const wchar_t* name, const char* mode)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void*
|
void *_TIFFmalloc(tmsize_t s)
|
||||||
_TIFFmalloc(tmsize_t s)
|
|
||||||
{
|
{
|
||||||
if (s == 0)
|
if (s == 0)
|
||||||
return ((void *)NULL);
|
return ((void *)NULL);
|
||||||
@ -322,38 +334,23 @@ void* _TIFFcalloc(tmsize_t nmemb, tmsize_t siz)
|
|||||||
return calloc((size_t)nmemb, (size_t)siz);
|
return calloc((size_t)nmemb, (size_t)siz);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void _TIFFfree(void *p) { free(p); }
|
||||||
_TIFFfree(void* p)
|
|
||||||
{
|
|
||||||
free(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
void*
|
void *_TIFFrealloc(void *p, tmsize_t s) { return (realloc(p, (size_t)s)); }
|
||||||
_TIFFrealloc(void* p, tmsize_t s)
|
|
||||||
{
|
|
||||||
return (realloc(p, (size_t) s));
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void _TIFFmemset(void *p, int v, tmsize_t c) { memset(p, v, (size_t)c); }
|
||||||
_TIFFmemset(void* p, int v, tmsize_t c)
|
|
||||||
{
|
|
||||||
memset(p, v, (size_t) c);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void _TIFFmemcpy(void *d, const void *s, tmsize_t c)
|
||||||
_TIFFmemcpy(void* d, const void* s, tmsize_t c)
|
|
||||||
{
|
{
|
||||||
memcpy(d, s, (size_t)c);
|
memcpy(d, s, (size_t)c);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int _TIFFmemcmp(const void *p1, const void *p2, tmsize_t c)
|
||||||
_TIFFmemcmp(const void* p1, const void* p2, tmsize_t c)
|
|
||||||
{
|
{
|
||||||
return (memcmp(p1, p2, (size_t)c));
|
return (memcmp(p1, p2, (size_t)c));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void unixWarningHandler(const char *module, const char *fmt, va_list ap)
|
||||||
unixWarningHandler(const char* module, const char* fmt, va_list ap)
|
|
||||||
{
|
{
|
||||||
if (module != NULL)
|
if (module != NULL)
|
||||||
fprintf(stderr, "%s: ", module);
|
fprintf(stderr, "%s: ", module);
|
||||||
@ -363,8 +360,7 @@ unixWarningHandler(const char* module, const char* fmt, va_list ap)
|
|||||||
}
|
}
|
||||||
TIFFErrorHandler _TIFFwarningHandler = unixWarningHandler;
|
TIFFErrorHandler _TIFFwarningHandler = unixWarningHandler;
|
||||||
|
|
||||||
static void
|
static void unixErrorHandler(const char *module, const char *fmt, va_list ap)
|
||||||
unixErrorHandler(const char* module, const char* fmt, va_list ap)
|
|
||||||
{
|
{
|
||||||
if (module != NULL)
|
if (module != NULL)
|
||||||
fprintf(stderr, "%s: ", module);
|
fprintf(stderr, "%s: ", module);
|
||||||
@ -372,13 +368,3 @@ unixErrorHandler(const char* module, const char* fmt, va_list ap)
|
|||||||
fprintf(stderr, ".\n");
|
fprintf(stderr, ".\n");
|
||||||
}
|
}
|
||||||
TIFFErrorHandler _TIFFerrorHandler = unixErrorHandler;
|
TIFFErrorHandler _TIFFerrorHandler = unixErrorHandler;
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
13
3rdparty/libtiff/tif_version.c
vendored
13
3rdparty/libtiff/tif_version.c
vendored
@ -25,15 +25,4 @@
|
|||||||
|
|
||||||
static const char TIFFVersion[] = TIFFLIB_VERSION_STR;
|
static const char TIFFVersion[] = TIFFLIB_VERSION_STR;
|
||||||
|
|
||||||
const char*
|
const char *TIFFGetVersion(void) { return (TIFFVersion); }
|
||||||
TIFFGetVersion(void)
|
|
||||||
{
|
|
||||||
return (TIFFVersion);
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
58
3rdparty/libtiff/tif_warning.c
vendored
58
3rdparty/libtiff/tif_warning.c
vendored
@ -29,59 +29,77 @@
|
|||||||
|
|
||||||
TIFFErrorHandlerExt _TIFFwarningHandlerExt = NULL;
|
TIFFErrorHandlerExt _TIFFwarningHandlerExt = NULL;
|
||||||
|
|
||||||
TIFFErrorHandler
|
TIFFErrorHandler TIFFSetWarningHandler(TIFFErrorHandler handler)
|
||||||
TIFFSetWarningHandler(TIFFErrorHandler handler)
|
|
||||||
{
|
{
|
||||||
TIFFErrorHandler prev = _TIFFwarningHandler;
|
TIFFErrorHandler prev = _TIFFwarningHandler;
|
||||||
_TIFFwarningHandler = handler;
|
_TIFFwarningHandler = handler;
|
||||||
return (prev);
|
return (prev);
|
||||||
}
|
}
|
||||||
|
|
||||||
TIFFErrorHandlerExt
|
TIFFErrorHandlerExt TIFFSetWarningHandlerExt(TIFFErrorHandlerExt handler)
|
||||||
TIFFSetWarningHandlerExt(TIFFErrorHandlerExt handler)
|
|
||||||
{
|
{
|
||||||
TIFFErrorHandlerExt prev = _TIFFwarningHandlerExt;
|
TIFFErrorHandlerExt prev = _TIFFwarningHandlerExt;
|
||||||
_TIFFwarningHandlerExt = handler;
|
_TIFFwarningHandlerExt = handler;
|
||||||
return (prev);
|
return (prev);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void TIFFWarning(const char *module, const char *fmt, ...)
|
||||||
TIFFWarning(const char* module, const char* fmt, ...)
|
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
if (_TIFFwarningHandler) {
|
if (_TIFFwarningHandler)
|
||||||
|
{
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
(*_TIFFwarningHandler)(module, fmt, ap);
|
(*_TIFFwarningHandler)(module, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
}
|
}
|
||||||
if (_TIFFwarningHandlerExt) {
|
if (_TIFFwarningHandlerExt)
|
||||||
|
{
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
(*_TIFFwarningHandlerExt)(0, module, fmt, ap);
|
(*_TIFFwarningHandlerExt)(0, module, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void TIFFWarningExt(thandle_t fd, const char *module, const char *fmt, ...)
|
||||||
TIFFWarningExt(thandle_t fd, const char* module, const char* fmt, ...)
|
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
if (_TIFFwarningHandler) {
|
if (_TIFFwarningHandler)
|
||||||
|
{
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
(*_TIFFwarningHandler)(module, fmt, ap);
|
(*_TIFFwarningHandler)(module, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
}
|
}
|
||||||
if (_TIFFwarningHandlerExt) {
|
if (_TIFFwarningHandlerExt)
|
||||||
|
{
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
(*_TIFFwarningHandlerExt)(fd, module, fmt, ap);
|
(*_TIFFwarningHandlerExt)(fd, module, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TIFFWarningExtR(TIFF *tif, const char *module, const char *fmt, ...)
|
||||||
/*
|
{
|
||||||
* Local Variables:
|
va_list ap;
|
||||||
* mode: c
|
if (tif && tif->tif_warnhandler)
|
||||||
* c-basic-offset: 8
|
{
|
||||||
* fill-column: 78
|
va_start(ap, fmt);
|
||||||
* End:
|
int stop = (*tif->tif_warnhandler)(tif, tif->tif_warnhandler_user_data,
|
||||||
*/
|
module, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
if (stop)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (_TIFFwarningHandler)
|
||||||
|
{
|
||||||
|
va_start(ap, fmt);
|
||||||
|
(*_TIFFwarningHandler)(module, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
}
|
||||||
|
if (_TIFFwarningHandlerExt)
|
||||||
|
{
|
||||||
|
va_start(ap, fmt);
|
||||||
|
(*_TIFFwarningHandlerExt)(tif ? tif->tif_clientdata : 0, module, fmt,
|
||||||
|
ap);
|
||||||
|
va_end(ap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
531
3rdparty/libtiff/tif_webp.c
vendored
531
3rdparty/libtiff/tif_webp.c
vendored
@ -34,6 +34,7 @@
|
|||||||
#include "webp/decode.h"
|
#include "webp/decode.h"
|
||||||
#include "webp/encode.h"
|
#include "webp/encode.h"
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#define LSTATE_INIT_DECODE 0x01
|
#define LSTATE_INIT_DECODE 0x01
|
||||||
@ -42,14 +43,17 @@
|
|||||||
* State block for each open TIFF
|
* State block for each open TIFF
|
||||||
* file using WEBP compression/decompression.
|
* file using WEBP compression/decompression.
|
||||||
*/
|
*/
|
||||||
typedef struct {
|
typedef struct
|
||||||
uint16 nSamples; /* number of samples per pixel */
|
{
|
||||||
|
uint16_t nSamples; /* number of samples per pixel */
|
||||||
|
|
||||||
int lossless; /* lossy/lossless compression */
|
int lossless; /* lossy/lossless compression */
|
||||||
|
int lossless_exact; /* lossless exact mode. If TRUE, R,G,B values in areas
|
||||||
|
with alpha = 0 will be preserved */
|
||||||
int quality_level; /* compression level */
|
int quality_level; /* compression level */
|
||||||
WebPPicture sPicture; /* WebP Picture */
|
WebPPicture sPicture; /* WebP Picture */
|
||||||
WebPConfig sEncoderConfig; /* WebP encoder config */
|
WebPConfig sEncoderConfig; /* WebP encoder config */
|
||||||
uint8* pBuffer; /* buffer to hold raw data on encoding */
|
uint8_t *pBuffer; /* buffer to hold raw data on encoding */
|
||||||
unsigned int buffer_offset; /* current offset into the buffer */
|
unsigned int buffer_offset; /* current offset into the buffer */
|
||||||
unsigned int buffer_size;
|
unsigned int buffer_size;
|
||||||
|
|
||||||
@ -67,22 +71,24 @@ typedef struct {
|
|||||||
#define DecoderState(tif) LState(tif)
|
#define DecoderState(tif) LState(tif)
|
||||||
#define EncoderState(tif) LState(tif)
|
#define EncoderState(tif) LState(tif)
|
||||||
|
|
||||||
static int TWebPEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s);
|
static int TWebPEncode(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s);
|
||||||
static int TWebPDecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s);
|
static int TWebPDecode(TIFF *tif, uint8_t *op, tmsize_t occ, uint16_t s);
|
||||||
|
|
||||||
static
|
static int TWebPDatasetWriter(const uint8_t *data, size_t data_size,
|
||||||
int TWebPDatasetWriter(const uint8_t* data, size_t data_size,
|
|
||||||
const WebPPicture *const picture)
|
const WebPPicture *const picture)
|
||||||
{
|
{
|
||||||
static const char module[] = "TWebPDatasetWriter";
|
static const char module[] = "TWebPDatasetWriter";
|
||||||
TIFF *tif = (TIFF *)(picture->custom_ptr);
|
TIFF *tif = (TIFF *)(picture->custom_ptr);
|
||||||
|
|
||||||
if ( (tif->tif_rawcc + (tmsize_t)data_size) > tif->tif_rawdatasize ) {
|
if ((tif->tif_rawcc + (tmsize_t)data_size) > tif->tif_rawdatasize)
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
"Buffer too small by " TIFF_SIZE_FORMAT " bytes.",
|
TIFFErrorExtR(
|
||||||
|
tif, module, "Buffer too small by %" TIFF_SIZE_FORMAT " bytes.",
|
||||||
(size_t)(tif->tif_rawcc + data_size - tif->tif_rawdatasize));
|
(size_t)(tif->tif_rawcc + data_size - tif->tif_rawdatasize));
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
_TIFFmemcpy(tif->tif_rawcp, data, data_size);
|
_TIFFmemcpy(tif->tif_rawcp, data, data_size);
|
||||||
tif->tif_rawcc += data_size;
|
tif->tif_rawcc += data_size;
|
||||||
tif->tif_rawcp += data_size;
|
tif->tif_rawcp += data_size;
|
||||||
@ -93,8 +99,7 @@ int TWebPDatasetWriter(const uint8_t* data, size_t data_size,
|
|||||||
/*
|
/*
|
||||||
* Encode a chunk of pixels.
|
* Encode a chunk of pixels.
|
||||||
*/
|
*/
|
||||||
static int
|
static int TWebPEncode(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s)
|
||||||
TWebPEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "TWebPEncode";
|
static const char module[] = "TWebPEncode";
|
||||||
WebPState *sp = EncoderState(tif);
|
WebPState *sp = EncoderState(tif);
|
||||||
@ -103,55 +108,186 @@ TWebPEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
|
|||||||
assert(sp != NULL);
|
assert(sp != NULL);
|
||||||
assert(sp->state == LSTATE_INIT_ENCODE);
|
assert(sp->state == LSTATE_INIT_ENCODE);
|
||||||
|
|
||||||
if( (uint64)sp->buffer_offset +
|
if ((uint64_t)sp->buffer_offset + (uint64_t)cc > sp->buffer_size)
|
||||||
(uint64)cc > sp->buffer_size )
|
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
TIFFErrorExtR(tif, module, "Too many bytes to be written");
|
||||||
"Too many bytes to be written");
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(sp->pBuffer + sp->buffer_offset,
|
memcpy(sp->pBuffer + sp->buffer_offset, bp, cc);
|
||||||
bp, cc);
|
|
||||||
sp->buffer_offset += (unsigned)cc;
|
sp->buffer_offset += (unsigned)cc;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int TWebPDecode(TIFF *tif, uint8_t *op, tmsize_t occ, uint16_t s)
|
||||||
TWebPDecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "WebPDecode";
|
static const char module[] = "WebPDecode";
|
||||||
VP8StatusCode status = VP8_STATUS_OK;
|
VP8StatusCode status = VP8_STATUS_OK;
|
||||||
WebPState *sp = DecoderState(tif);
|
WebPState *sp = DecoderState(tif);
|
||||||
|
uint32_t segment_width, segment_height;
|
||||||
|
bool decode_whole_strile = false;
|
||||||
|
|
||||||
(void)s;
|
(void)s;
|
||||||
|
|
||||||
assert(sp != NULL);
|
assert(sp != NULL);
|
||||||
assert(sp->state == LSTATE_INIT_DECODE);
|
assert(sp->state == LSTATE_INIT_DECODE);
|
||||||
|
|
||||||
|
if (sp->psDecoder == NULL)
|
||||||
|
{
|
||||||
|
TIFFDirectory *td = &tif->tif_dir;
|
||||||
|
uint32_t buffer_size;
|
||||||
|
|
||||||
|
if (isTiled(tif))
|
||||||
|
{
|
||||||
|
segment_width = td->td_tilewidth;
|
||||||
|
segment_height = td->td_tilelength;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
segment_width = td->td_imagewidth;
|
||||||
|
segment_height = td->td_imagelength - tif->tif_row;
|
||||||
|
if (segment_height > td->td_rowsperstrip)
|
||||||
|
segment_height = td->td_rowsperstrip;
|
||||||
|
}
|
||||||
|
|
||||||
|
int webp_width, webp_height;
|
||||||
|
if (!WebPGetInfo(tif->tif_rawcp,
|
||||||
|
(uint64_t)tif->tif_rawcc > UINT32_MAX
|
||||||
|
? UINT32_MAX
|
||||||
|
: (uint32_t)tif->tif_rawcc,
|
||||||
|
&webp_width, &webp_height))
|
||||||
|
{
|
||||||
|
TIFFErrorExtR(tif, module, "WebPGetInfo() failed");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if ((uint32_t)webp_width != segment_width ||
|
||||||
|
(uint32_t)webp_height != segment_height)
|
||||||
|
{
|
||||||
|
TIFFErrorExtR(
|
||||||
|
tif, module, "WebP blob dimension is %dx%d. Expected %ux%u",
|
||||||
|
webp_width, webp_height, segment_width, segment_height);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if WEBP_DECODER_ABI_VERSION >= 0x0002
|
||||||
|
WebPDecoderConfig config;
|
||||||
|
if (!WebPInitDecoderConfig(&config))
|
||||||
|
{
|
||||||
|
TIFFErrorExtR(tif, module, "WebPInitDecoderConfig() failed");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const bool bWebPGetFeaturesOK =
|
||||||
|
WebPGetFeatures(tif->tif_rawcp,
|
||||||
|
(uint64_t)tif->tif_rawcc > UINT32_MAX
|
||||||
|
? UINT32_MAX
|
||||||
|
: (uint32_t)tif->tif_rawcc,
|
||||||
|
&config.input) == VP8_STATUS_OK;
|
||||||
|
|
||||||
|
WebPFreeDecBuffer(&config.output);
|
||||||
|
|
||||||
|
if (!bWebPGetFeaturesOK)
|
||||||
|
{
|
||||||
|
TIFFErrorExtR(tif, module, "WebPInitDecoderConfig() failed");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const int webp_bands = config.input.has_alpha ? 4 : 3;
|
||||||
|
if (webp_bands != sp->nSamples &&
|
||||||
|
/* We accept the situation where the WebP blob has only 3 bands,
|
||||||
|
* whereas the raster is 4 bands. This can happen when the alpha
|
||||||
|
* channel is fully opaque, and WebP decoding works fine in that
|
||||||
|
* situation.
|
||||||
|
*/
|
||||||
|
!(webp_bands == 3 && sp->nSamples == 4))
|
||||||
|
{
|
||||||
|
TIFFErrorExtR(tif, module,
|
||||||
|
"WebP blob band count is %d. Expected %d", webp_bands,
|
||||||
|
sp->nSamples);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
buffer_size = segment_width * segment_height * sp->nSamples;
|
||||||
|
if (occ == (tmsize_t)buffer_size)
|
||||||
|
{
|
||||||
|
/* If decoding the whole strip/tile, we can directly use the */
|
||||||
|
/* output buffer */
|
||||||
|
decode_whole_strile = true;
|
||||||
|
}
|
||||||
|
else if (sp->pBuffer == NULL || buffer_size > sp->buffer_size)
|
||||||
|
{
|
||||||
|
if (sp->pBuffer != NULL)
|
||||||
|
{
|
||||||
|
_TIFFfreeExt(tif, sp->pBuffer);
|
||||||
|
sp->pBuffer = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
sp->pBuffer = _TIFFmallocExt(tif, buffer_size);
|
||||||
|
if (!sp->pBuffer)
|
||||||
|
{
|
||||||
|
TIFFErrorExtR(tif, module, "Cannot allocate buffer");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
sp->buffer_size = buffer_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
sp->last_y = 0;
|
||||||
|
|
||||||
|
WebPInitDecBuffer(&sp->sDecBuffer);
|
||||||
|
|
||||||
|
sp->sDecBuffer.is_external_memory = 1;
|
||||||
|
sp->sDecBuffer.width = segment_width;
|
||||||
|
sp->sDecBuffer.height = segment_height;
|
||||||
|
sp->sDecBuffer.u.RGBA.rgba = decode_whole_strile ? op : sp->pBuffer;
|
||||||
|
sp->sDecBuffer.u.RGBA.stride = segment_width * sp->nSamples;
|
||||||
|
sp->sDecBuffer.u.RGBA.size = buffer_size;
|
||||||
|
|
||||||
|
if (sp->nSamples > 3)
|
||||||
|
{
|
||||||
|
sp->sDecBuffer.colorspace = MODE_RGBA;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sp->sDecBuffer.colorspace = MODE_RGB;
|
||||||
|
}
|
||||||
|
|
||||||
|
sp->psDecoder = WebPINewDecoder(&sp->sDecBuffer);
|
||||||
|
|
||||||
|
if (sp->psDecoder == NULL)
|
||||||
|
{
|
||||||
|
TIFFErrorExtR(tif, module, "Unable to allocate WebP decoder.");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (occ % sp->sDecBuffer.u.RGBA.stride)
|
if (occ % sp->sDecBuffer.u.RGBA.stride)
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
TIFFErrorExtR(tif, module, "Fractional scanlines cannot be read");
|
||||||
"Fractional scanlines cannot be read");
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
status = WebPIAppend(sp->psDecoder, tif->tif_rawcp, tif->tif_rawcc);
|
status = WebPIAppend(sp->psDecoder, tif->tif_rawcp, tif->tif_rawcc);
|
||||||
|
|
||||||
if (status != VP8_STATUS_OK && status != VP8_STATUS_SUSPENDED) {
|
if (status != VP8_STATUS_OK && status != VP8_STATUS_SUSPENDED)
|
||||||
if (status == VP8_STATUS_INVALID_PARAM) {
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
if (status == VP8_STATUS_INVALID_PARAM)
|
||||||
"Invalid parameter used.");
|
{
|
||||||
} else if (status == VP8_STATUS_OUT_OF_MEMORY) {
|
TIFFErrorExtR(tif, module, "Invalid parameter used.");
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
}
|
||||||
"Out of memory.");
|
else if (status == VP8_STATUS_OUT_OF_MEMORY)
|
||||||
} else {
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
TIFFErrorExtR(tif, module, "Out of memory.");
|
||||||
"Unrecognized error.");
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TIFFErrorExtR(tif, module, "Unrecognized error.");
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
int current_y, stride;
|
int current_y, stride;
|
||||||
uint8_t *buf;
|
uint8_t *buf;
|
||||||
|
|
||||||
@ -159,30 +295,58 @@ TWebPDecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s)
|
|||||||
buf = WebPIDecGetRGB(sp->psDecoder, ¤t_y, NULL, NULL, &stride);
|
buf = WebPIDecGetRGB(sp->psDecoder, ¤t_y, NULL, NULL, &stride);
|
||||||
|
|
||||||
if ((buf != NULL) &&
|
if ((buf != NULL) &&
|
||||||
(occ <= stride * (current_y - sp->last_y))) {
|
(occ <= (tmsize_t)stride * (current_y - sp->last_y)))
|
||||||
memcpy(op,
|
{
|
||||||
buf + (sp->last_y * stride),
|
const int numberOfExpectedLines =
|
||||||
occ);
|
(int)(occ / sp->sDecBuffer.u.RGBA.stride);
|
||||||
|
if (decode_whole_strile)
|
||||||
|
{
|
||||||
|
if (current_y != numberOfExpectedLines)
|
||||||
|
{
|
||||||
|
TIFFErrorExtR(tif, module,
|
||||||
|
"Unable to decode WebP data: less lines than "
|
||||||
|
"expected.");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
memcpy(op, buf + (sp->last_y * stride), occ);
|
||||||
|
}
|
||||||
|
|
||||||
tif->tif_rawcp += tif->tif_rawcc;
|
tif->tif_rawcp += tif->tif_rawcc;
|
||||||
tif->tif_rawcc = 0;
|
tif->tif_rawcc = 0;
|
||||||
sp->last_y += occ / sp->sDecBuffer.u.RGBA.stride;
|
sp->last_y += numberOfExpectedLines;
|
||||||
|
|
||||||
|
if (decode_whole_strile)
|
||||||
|
{
|
||||||
|
/* We can now free the decoder as we're completely done */
|
||||||
|
if (sp->psDecoder != NULL)
|
||||||
|
{
|
||||||
|
WebPIDelete(sp->psDecoder);
|
||||||
|
WebPFreeDecBuffer(&sp->sDecBuffer);
|
||||||
|
sp->psDecoder = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
return 1;
|
return 1;
|
||||||
} else {
|
}
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "Unable to decode WebP data.");
|
else
|
||||||
|
{
|
||||||
|
TIFFErrorExtR(tif, module, "Unable to decode WebP data.");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int TWebPFixupTags(TIFF *tif)
|
||||||
TWebPFixupTags(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
(void)tif;
|
(void)tif;
|
||||||
if (tif->tif_dir.td_planarconfig != PLANARCONFIG_CONTIG) {
|
if (tif->tif_dir.td_planarconfig != PLANARCONFIG_CONTIG)
|
||||||
|
{
|
||||||
static const char module[] = "TWebPFixupTags";
|
static const char module[] = "TWebPFixupTags";
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
TIFFErrorExtR(tif, module,
|
||||||
"TIFF WEBP requires data to be stored contiguously in RGB e.g. RGBRGBRGB "
|
"TIFF WEBP requires data to be stored contiguously in "
|
||||||
|
"RGB e.g. RGBRGBRGB "
|
||||||
#if WEBP_ENCODER_ABI_VERSION >= 0x0100
|
#if WEBP_ENCODER_ABI_VERSION >= 0x0100
|
||||||
"or RGBARGBARGBA"
|
"or RGBARGBARGBA"
|
||||||
#endif
|
#endif
|
||||||
@ -192,12 +356,11 @@ TWebPFixupTags(TIFF* tif)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int TWebPSetupDecode(TIFF *tif)
|
||||||
TWebPSetupDecode(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "WebPSetupDecode";
|
static const char module[] = "WebPSetupDecode";
|
||||||
uint16 nBitsPerSample = tif->tif_dir.td_bitspersample;
|
uint16_t nBitsPerSample = tif->tif_dir.td_bitspersample;
|
||||||
uint16 sampleFormat = tif->tif_dir.td_sampleformat;
|
uint16_t sampleFormat = tif->tif_dir.td_sampleformat;
|
||||||
|
|
||||||
WebPState *sp = DecoderState(tif);
|
WebPState *sp = DecoderState(tif);
|
||||||
assert(sp != NULL);
|
assert(sp != NULL);
|
||||||
@ -211,7 +374,7 @@ TWebPSetupDecode(TIFF* tif)
|
|||||||
#endif
|
#endif
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
TIFFErrorExtR(tif, module,
|
||||||
"WEBP driver doesn't support %d bands. Must be 3 (RGB) "
|
"WEBP driver doesn't support %d bands. Must be 3 (RGB) "
|
||||||
#if WEBP_ENCODER_ABI_VERSION >= 0x0100
|
#if WEBP_ENCODER_ABI_VERSION >= 0x0100
|
||||||
"or 4 (RGBA) "
|
"or 4 (RGBA) "
|
||||||
@ -222,17 +385,19 @@ TWebPSetupDecode(TIFF* tif)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* check bits per sample and data type */
|
/* check bits per sample and data type */
|
||||||
if ((nBitsPerSample != 8) && (sampleFormat != 1)) {
|
if ((nBitsPerSample != 8) && (sampleFormat != 1))
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
"WEBP driver requires 8 bit unsigned data");
|
TIFFErrorExtR(tif, module, "WEBP driver requires 8 bit unsigned data");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if we were last encoding, terminate this mode */
|
/* if we were last encoding, terminate this mode */
|
||||||
if (sp->state & LSTATE_INIT_ENCODE) {
|
if (sp->state & LSTATE_INIT_ENCODE)
|
||||||
|
{
|
||||||
WebPPictureFree(&sp->sPicture);
|
WebPPictureFree(&sp->sPicture);
|
||||||
if (sp->pBuffer != NULL) {
|
if (sp->pBuffer != NULL)
|
||||||
_TIFFfree(sp->pBuffer);
|
{
|
||||||
|
_TIFFfreeExt(tif, sp->pBuffer);
|
||||||
sp->pBuffer = NULL;
|
sp->pBuffer = NULL;
|
||||||
}
|
}
|
||||||
sp->buffer_offset = 0;
|
sp->buffer_offset = 0;
|
||||||
@ -247,28 +412,31 @@ TWebPSetupDecode(TIFF* tif)
|
|||||||
/*
|
/*
|
||||||
* Setup state for decoding a strip.
|
* Setup state for decoding a strip.
|
||||||
*/
|
*/
|
||||||
static int
|
static int TWebPPreDecode(TIFF *tif, uint16_t s)
|
||||||
TWebPPreDecode(TIFF* tif, uint16 s)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "TWebPPreDecode";
|
static const char module[] = "TWebPPreDecode";
|
||||||
uint32 segment_width, segment_height;
|
uint32_t segment_width, segment_height;
|
||||||
WebPState *sp = DecoderState(tif);
|
WebPState *sp = DecoderState(tif);
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
TIFFDirectory *td = &tif->tif_dir;
|
||||||
(void)s;
|
(void)s;
|
||||||
assert(sp != NULL);
|
assert(sp != NULL);
|
||||||
|
|
||||||
if (isTiled(tif)) {
|
if (isTiled(tif))
|
||||||
|
{
|
||||||
segment_width = td->td_tilewidth;
|
segment_width = td->td_tilewidth;
|
||||||
segment_height = td->td_tilelength;
|
segment_height = td->td_tilelength;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
segment_width = td->td_imagewidth;
|
segment_width = td->td_imagewidth;
|
||||||
segment_height = td->td_imagelength - tif->tif_row;
|
segment_height = td->td_imagelength - tif->tif_row;
|
||||||
if (segment_height > td->td_rowsperstrip)
|
if (segment_height > td->td_rowsperstrip)
|
||||||
segment_height = td->td_rowsperstrip;
|
segment_height = td->td_rowsperstrip;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( segment_width > 16383 || segment_height > 16383 ) {
|
if (segment_width > 16383 || segment_height > 16383)
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
|
TIFFErrorExtR(tif, module,
|
||||||
"WEBP maximum image dimensions are 16383 x 16383.");
|
"WEBP maximum image dimensions are 16383 x 16383.");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -276,45 +444,21 @@ TWebPPreDecode(TIFF* tif, uint16 s)
|
|||||||
if ((sp->state & LSTATE_INIT_DECODE) == 0)
|
if ((sp->state & LSTATE_INIT_DECODE) == 0)
|
||||||
tif->tif_setupdecode(tif);
|
tif->tif_setupdecode(tif);
|
||||||
|
|
||||||
if (sp->psDecoder != NULL) {
|
if (sp->psDecoder != NULL)
|
||||||
|
{
|
||||||
WebPIDelete(sp->psDecoder);
|
WebPIDelete(sp->psDecoder);
|
||||||
WebPFreeDecBuffer(&sp->sDecBuffer);
|
WebPFreeDecBuffer(&sp->sDecBuffer);
|
||||||
sp->psDecoder = NULL;
|
sp->psDecoder = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
sp->last_y = 0;
|
|
||||||
|
|
||||||
WebPInitDecBuffer(&sp->sDecBuffer);
|
|
||||||
|
|
||||||
sp->sDecBuffer.is_external_memory = 0;
|
|
||||||
sp->sDecBuffer.width = segment_width;
|
|
||||||
sp->sDecBuffer.height = segment_height;
|
|
||||||
sp->sDecBuffer.u.RGBA.stride = segment_width * sp->nSamples;
|
|
||||||
sp->sDecBuffer.u.RGBA.size = segment_width * sp->nSamples * segment_height;
|
|
||||||
|
|
||||||
if (sp->nSamples > 3) {
|
|
||||||
sp->sDecBuffer.colorspace = MODE_RGBA;
|
|
||||||
} else {
|
|
||||||
sp->sDecBuffer.colorspace = MODE_RGB;
|
|
||||||
}
|
|
||||||
|
|
||||||
sp->psDecoder = WebPINewDecoder(&sp->sDecBuffer);
|
|
||||||
|
|
||||||
if (sp->psDecoder == NULL) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
|
||||||
"Unable to allocate WebP decoder.");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int TWebPSetupEncode(TIFF *tif)
|
||||||
TWebPSetupEncode(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "WebPSetupEncode";
|
static const char module[] = "WebPSetupEncode";
|
||||||
uint16 nBitsPerSample = tif->tif_dir.td_bitspersample;
|
uint16_t nBitsPerSample = tif->tif_dir.td_bitspersample;
|
||||||
uint16 sampleFormat = tif->tif_dir.td_sampleformat;
|
uint16_t sampleFormat = tif->tif_dir.td_sampleformat;
|
||||||
|
|
||||||
WebPState *sp = EncoderState(tif);
|
WebPState *sp = EncoderState(tif);
|
||||||
assert(sp != NULL);
|
assert(sp != NULL);
|
||||||
@ -328,7 +472,7 @@ TWebPSetupEncode(TIFF* tif)
|
|||||||
#endif
|
#endif
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
TIFFErrorExtR(tif, module,
|
||||||
"WEBP driver doesn't support %d bands. Must be 3 (RGB) "
|
"WEBP driver doesn't support %d bands. Must be 3 (RGB) "
|
||||||
#if WEBP_ENCODER_ABI_VERSION >= 0x0100
|
#if WEBP_ENCODER_ABI_VERSION >= 0x0100
|
||||||
"or 4 (RGBA) "
|
"or 4 (RGBA) "
|
||||||
@ -339,13 +483,14 @@ TWebPSetupEncode(TIFF* tif)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* check bits per sample and data type */
|
/* check bits per sample and data type */
|
||||||
if ((nBitsPerSample != 8) || (sampleFormat != SAMPLEFORMAT_UINT)) {
|
if ((nBitsPerSample != 8) || (sampleFormat != SAMPLEFORMAT_UINT))
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
"WEBP driver requires 8 bit unsigned data");
|
TIFFErrorExtR(tif, module, "WEBP driver requires 8 bit unsigned data");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sp->state & LSTATE_INIT_DECODE) {
|
if (sp->state & LSTATE_INIT_DECODE)
|
||||||
|
{
|
||||||
WebPIDelete(sp->psDecoder);
|
WebPIDelete(sp->psDecoder);
|
||||||
WebPFreeDecBuffer(&sp->sDecBuffer);
|
WebPFreeDecBuffer(&sp->sDecBuffer);
|
||||||
sp->psDecoder = NULL;
|
sp->psDecoder = NULL;
|
||||||
@ -355,16 +500,17 @@ TWebPSetupEncode(TIFF* tif)
|
|||||||
|
|
||||||
sp->state |= LSTATE_INIT_ENCODE;
|
sp->state |= LSTATE_INIT_ENCODE;
|
||||||
|
|
||||||
if (!WebPPictureInit(&sp->sPicture)) {
|
if (!WebPPictureInit(&sp->sPicture))
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
"Error initializing WebP picture.");
|
TIFFErrorExtR(tif, module, "Error initializing WebP picture.");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!WebPConfigInitInternal(&sp->sEncoderConfig, WEBP_PRESET_DEFAULT,
|
if (!WebPConfigInitInternal(&sp->sEncoderConfig, WEBP_PRESET_DEFAULT,
|
||||||
(float)sp->quality_level,
|
(float)sp->quality_level,
|
||||||
WEBP_ENCODER_ABI_VERSION)) {
|
WEBP_ENCODER_ABI_VERSION))
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
|
TIFFErrorExtR(tif, module,
|
||||||
"Error creating WebP encoder configuration.");
|
"Error creating WebP encoder configuration.");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -372,14 +518,18 @@ TWebPSetupEncode(TIFF* tif)
|
|||||||
// WebPConfigInitInternal above sets lossless to false
|
// WebPConfigInitInternal above sets lossless to false
|
||||||
#if WEBP_ENCODER_ABI_VERSION >= 0x0100
|
#if WEBP_ENCODER_ABI_VERSION >= 0x0100
|
||||||
sp->sEncoderConfig.lossless = sp->lossless;
|
sp->sEncoderConfig.lossless = sp->lossless;
|
||||||
if (sp->lossless) {
|
if (sp->lossless)
|
||||||
|
{
|
||||||
sp->sPicture.use_argb = 1;
|
sp->sPicture.use_argb = 1;
|
||||||
|
#if WEBP_ENCODER_ABI_VERSION >= 0x0209
|
||||||
|
sp->sEncoderConfig.exact = sp->lossless_exact;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!WebPValidateConfig(&sp->sEncoderConfig)) {
|
if (!WebPValidateConfig(&sp->sEncoderConfig))
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
"Error with WebP encoder configuration.");
|
TIFFErrorExtR(tif, module, "Error with WebP encoder configuration.");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -389,11 +539,10 @@ TWebPSetupEncode(TIFF* tif)
|
|||||||
/*
|
/*
|
||||||
* Reset encoding state at the start of a strip.
|
* Reset encoding state at the start of a strip.
|
||||||
*/
|
*/
|
||||||
static int
|
static int TWebPPreEncode(TIFF *tif, uint16_t s)
|
||||||
TWebPPreEncode(TIFF* tif, uint16 s)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "TWebPPreEncode";
|
static const char module[] = "TWebPPreEncode";
|
||||||
uint32 segment_width, segment_height;
|
uint32_t segment_width, segment_height;
|
||||||
WebPState *sp = EncoderState(tif);
|
WebPState *sp = EncoderState(tif);
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
TIFFDirectory *td = &tif->tif_dir;
|
||||||
|
|
||||||
@ -406,18 +555,22 @@ TWebPPreEncode(TIFF* tif, uint16 s)
|
|||||||
/*
|
/*
|
||||||
* Set encoding parameters for this strip/tile.
|
* Set encoding parameters for this strip/tile.
|
||||||
*/
|
*/
|
||||||
if (isTiled(tif)) {
|
if (isTiled(tif))
|
||||||
|
{
|
||||||
segment_width = td->td_tilewidth;
|
segment_width = td->td_tilewidth;
|
||||||
segment_height = td->td_tilelength;
|
segment_height = td->td_tilelength;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
segment_width = td->td_imagewidth;
|
segment_width = td->td_imagewidth;
|
||||||
segment_height = td->td_imagelength - tif->tif_row;
|
segment_height = td->td_imagelength - tif->tif_row;
|
||||||
if (segment_height > td->td_rowsperstrip)
|
if (segment_height > td->td_rowsperstrip)
|
||||||
segment_height = td->td_rowsperstrip;
|
segment_height = td->td_rowsperstrip;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( segment_width > 16383 || segment_height > 16383 ) {
|
if (segment_width > 16383 || segment_height > 16383)
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
|
TIFFErrorExtR(tif, module,
|
||||||
"WEBP maximum image dimensions are 16383 x 16383.");
|
"WEBP maximum image dimensions are 16383 x 16383.");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -426,14 +579,16 @@ TWebPPreEncode(TIFF* tif, uint16 s)
|
|||||||
/* given above check and that nSamples <= 4, buffer_size is <= 1 GB */
|
/* given above check and that nSamples <= 4, buffer_size is <= 1 GB */
|
||||||
sp->buffer_size = segment_width * segment_height * sp->nSamples;
|
sp->buffer_size = segment_width * segment_height * sp->nSamples;
|
||||||
|
|
||||||
if (sp->pBuffer != NULL) {
|
if (sp->pBuffer != NULL)
|
||||||
_TIFFfree(sp->pBuffer);
|
{
|
||||||
|
_TIFFfreeExt(tif, sp->pBuffer);
|
||||||
sp->pBuffer = NULL;
|
sp->pBuffer = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
sp->pBuffer = _TIFFmalloc(sp->buffer_size);
|
sp->pBuffer = _TIFFmallocExt(tif, sp->buffer_size);
|
||||||
if( !sp->pBuffer) {
|
if (!sp->pBuffer)
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "Cannot allocate buffer");
|
{
|
||||||
|
TIFFErrorExtR(tif, module, "Cannot allocate buffer");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
sp->buffer_offset = 0;
|
sp->buffer_offset = 0;
|
||||||
@ -449,8 +604,7 @@ TWebPPreEncode(TIFF* tif, uint16 s)
|
|||||||
/*
|
/*
|
||||||
* Finish off an encoded strip by flushing it.
|
* Finish off an encoded strip by flushing it.
|
||||||
*/
|
*/
|
||||||
static int
|
static int TWebPPostEncode(TIFF *tif)
|
||||||
TWebPPostEncode(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "WebPPostEncode";
|
static const char module[] = "WebPPostEncode";
|
||||||
int64_t stride;
|
int64_t stride;
|
||||||
@ -462,36 +616,44 @@ TWebPPostEncode(TIFF* tif)
|
|||||||
stride = (int64_t)sp->sPicture.width * sp->nSamples;
|
stride = (int64_t)sp->sPicture.width * sp->nSamples;
|
||||||
|
|
||||||
#if WEBP_ENCODER_ABI_VERSION >= 0x0100
|
#if WEBP_ENCODER_ABI_VERSION >= 0x0100
|
||||||
if (sp->nSamples == 4) {
|
if (sp->nSamples == 4)
|
||||||
if (!WebPPictureImportRGBA(&sp->sPicture, sp->pBuffer, (int)stride)) {
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
if (!WebPPictureImportRGBA(&sp->sPicture, sp->pBuffer, (int)stride))
|
||||||
"WebPPictureImportRGBA() failed" );
|
{
|
||||||
|
TIFFErrorExtR(tif, module, "WebPPictureImportRGBA() failed");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
if (!WebPPictureImportRGB(&sp->sPicture, sp->pBuffer, (int)stride)) {
|
if (!WebPPictureImportRGB(&sp->sPicture, sp->pBuffer, (int)stride))
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
"WebPPictureImportRGB() failed");
|
TIFFErrorExtR(tif, module, "WebPPictureImportRGB() failed");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!WebPEncode(&sp->sEncoderConfig, &sp->sPicture)) {
|
if (!WebPEncode(&sp->sEncoderConfig, &sp->sPicture))
|
||||||
|
{
|
||||||
|
|
||||||
#if WEBP_ENCODER_ABI_VERSION >= 0x0100
|
#if WEBP_ENCODER_ABI_VERSION >= 0x0100
|
||||||
const char *pszErrorMsg = NULL;
|
const char *pszErrorMsg = NULL;
|
||||||
switch(sp->sPicture.error_code) {
|
switch (sp->sPicture.error_code)
|
||||||
|
{
|
||||||
case VP8_ENC_ERROR_OUT_OF_MEMORY:
|
case VP8_ENC_ERROR_OUT_OF_MEMORY:
|
||||||
pszErrorMsg = "Out of memory"; break;
|
pszErrorMsg = "Out of memory";
|
||||||
|
break;
|
||||||
case VP8_ENC_ERROR_BITSTREAM_OUT_OF_MEMORY:
|
case VP8_ENC_ERROR_BITSTREAM_OUT_OF_MEMORY:
|
||||||
pszErrorMsg = "Out of memory while flushing bits"; break;
|
pszErrorMsg = "Out of memory while flushing bits";
|
||||||
|
break;
|
||||||
case VP8_ENC_ERROR_NULL_PARAMETER:
|
case VP8_ENC_ERROR_NULL_PARAMETER:
|
||||||
pszErrorMsg = "A pointer parameter is NULL"; break;
|
pszErrorMsg = "A pointer parameter is NULL";
|
||||||
|
break;
|
||||||
case VP8_ENC_ERROR_INVALID_CONFIGURATION:
|
case VP8_ENC_ERROR_INVALID_CONFIGURATION:
|
||||||
pszErrorMsg = "Configuration is invalid"; break;
|
pszErrorMsg = "Configuration is invalid";
|
||||||
|
break;
|
||||||
case VP8_ENC_ERROR_BAD_DIMENSION:
|
case VP8_ENC_ERROR_BAD_DIMENSION:
|
||||||
pszErrorMsg = "Picture has invalid width/height"; break;
|
pszErrorMsg = "Picture has invalid width/height";
|
||||||
|
break;
|
||||||
case VP8_ENC_ERROR_PARTITION0_OVERFLOW:
|
case VP8_ENC_ERROR_PARTITION0_OVERFLOW:
|
||||||
pszErrorMsg = "Partition is bigger than 512k. Try using less "
|
pszErrorMsg = "Partition is bigger than 512k. Try using less "
|
||||||
"SEGMENTS, or increase PARTITION_LIMIT value";
|
"SEGMENTS, or increase PARTITION_LIMIT value";
|
||||||
@ -500,24 +662,24 @@ TWebPPostEncode(TIFF* tif)
|
|||||||
pszErrorMsg = "Partition is bigger than 16M";
|
pszErrorMsg = "Partition is bigger than 16M";
|
||||||
break;
|
break;
|
||||||
case VP8_ENC_ERROR_BAD_WRITE:
|
case VP8_ENC_ERROR_BAD_WRITE:
|
||||||
pszErrorMsg = "Error while fludshing bytes"; break;
|
pszErrorMsg = "Error while fludshing bytes";
|
||||||
|
break;
|
||||||
case VP8_ENC_ERROR_FILE_TOO_BIG:
|
case VP8_ENC_ERROR_FILE_TOO_BIG:
|
||||||
pszErrorMsg = "File is bigger than 4G"; break;
|
pszErrorMsg = "File is bigger than 4G";
|
||||||
|
break;
|
||||||
case VP8_ENC_ERROR_USER_ABORT:
|
case VP8_ENC_ERROR_USER_ABORT:
|
||||||
pszErrorMsg = "User interrupted";
|
pszErrorMsg = "User interrupted";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
TIFFErrorExtR(tif, module,
|
||||||
"WebPEncode returned an unknown error code: %d",
|
"WebPEncode returned an unknown error code: %d",
|
||||||
sp->sPicture.error_code);
|
sp->sPicture.error_code);
|
||||||
pszErrorMsg = "Unknown WebP error type.";
|
pszErrorMsg = "Unknown WebP error type.";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
TIFFErrorExtR(tif, module, "WebPEncode() failed : %s", pszErrorMsg);
|
||||||
"WebPEncode() failed : %s", pszErrorMsg);
|
|
||||||
#else
|
#else
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
TIFFErrorExtR(tif, module, "Error in WebPEncode()");
|
||||||
"Error in WebPEncode()");
|
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -526,16 +688,14 @@ TWebPPostEncode(TIFF* tif)
|
|||||||
|
|
||||||
if (!TIFFFlushData1(tif))
|
if (!TIFFFlushData1(tif))
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
TIFFErrorExtR(tif, module, "Error flushing TIFF WebP encoder.");
|
||||||
"Error flushing TIFF WebP encoder.");
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void TWebPCleanup(TIFF *tif)
|
||||||
TWebPCleanup(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
WebPState *sp = LState(tif);
|
WebPState *sp = LState(tif);
|
||||||
|
|
||||||
@ -544,52 +704,68 @@ TWebPCleanup(TIFF* tif)
|
|||||||
tif->tif_tagmethods.vgetfield = sp->vgetparent;
|
tif->tif_tagmethods.vgetfield = sp->vgetparent;
|
||||||
tif->tif_tagmethods.vsetfield = sp->vsetparent;
|
tif->tif_tagmethods.vsetfield = sp->vsetparent;
|
||||||
|
|
||||||
if (sp->state & LSTATE_INIT_ENCODE) {
|
if (sp->state & LSTATE_INIT_ENCODE)
|
||||||
|
{
|
||||||
WebPPictureFree(&sp->sPicture);
|
WebPPictureFree(&sp->sPicture);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sp->psDecoder != NULL) {
|
if (sp->psDecoder != NULL)
|
||||||
|
{
|
||||||
WebPIDelete(sp->psDecoder);
|
WebPIDelete(sp->psDecoder);
|
||||||
WebPFreeDecBuffer(&sp->sDecBuffer);
|
WebPFreeDecBuffer(&sp->sDecBuffer);
|
||||||
sp->psDecoder = NULL;
|
sp->psDecoder = NULL;
|
||||||
sp->last_y = 0;
|
sp->last_y = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sp->pBuffer != NULL) {
|
if (sp->pBuffer != NULL)
|
||||||
_TIFFfree(sp->pBuffer);
|
{
|
||||||
|
_TIFFfreeExt(tif, sp->pBuffer);
|
||||||
sp->pBuffer = NULL;
|
sp->pBuffer = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
_TIFFfree(tif->tif_data);
|
_TIFFfreeExt(tif, tif->tif_data);
|
||||||
tif->tif_data = NULL;
|
tif->tif_data = NULL;
|
||||||
|
|
||||||
_TIFFSetDefaultCompressionState(tif);
|
_TIFFSetDefaultCompressionState(tif);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int TWebPVSetField(TIFF *tif, uint32_t tag, va_list ap)
|
||||||
TWebPVSetField(TIFF* tif, uint32 tag, va_list ap)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "WebPVSetField";
|
static const char module[] = "WebPVSetField";
|
||||||
WebPState *sp = LState(tif);
|
WebPState *sp = LState(tif);
|
||||||
|
|
||||||
switch (tag) {
|
switch (tag)
|
||||||
|
{
|
||||||
case TIFFTAG_WEBP_LEVEL:
|
case TIFFTAG_WEBP_LEVEL:
|
||||||
sp->quality_level = (int)va_arg(ap, int);
|
sp->quality_level = (int)va_arg(ap, int);
|
||||||
if( sp->quality_level <= 0 ||
|
if (sp->quality_level <= 0 || sp->quality_level > 100.0f)
|
||||||
sp->quality_level > 100.0f ) {
|
{
|
||||||
TIFFWarningExt(tif->tif_clientdata, module,
|
TIFFWarningExtR(tif, module,
|
||||||
"WEBP_LEVEL should be between 1 and 100");
|
"WEBP_LEVEL should be between 1 and 100");
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
case TIFFTAG_WEBP_LOSSLESS:
|
case TIFFTAG_WEBP_LOSSLESS:
|
||||||
#if WEBP_ENCODER_ABI_VERSION >= 0x0100
|
#if WEBP_ENCODER_ABI_VERSION >= 0x0100
|
||||||
sp->lossless = va_arg(ap, int);
|
sp->lossless = va_arg(ap, int);
|
||||||
if (sp->lossless){
|
if (sp->lossless)
|
||||||
|
{
|
||||||
sp->quality_level = 100;
|
sp->quality_level = 100;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
#else
|
#else
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
TIFFErrorExtR(
|
||||||
|
tif, module,
|
||||||
|
"Need to upgrade WEBP driver, this version doesn't support "
|
||||||
|
"lossless compression.");
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
case TIFFTAG_WEBP_LOSSLESS_EXACT:
|
||||||
|
#if WEBP_ENCODER_ABI_VERSION >= 0x0209
|
||||||
|
sp->lossless_exact = va_arg(ap, int);
|
||||||
|
return 1;
|
||||||
|
#else
|
||||||
|
TIFFErrorExtR(
|
||||||
|
tif, module,
|
||||||
"Need to upgrade WEBP driver, this version doesn't support "
|
"Need to upgrade WEBP driver, this version doesn't support "
|
||||||
"lossless compression.");
|
"lossless compression.");
|
||||||
return 0;
|
return 0;
|
||||||
@ -600,18 +776,21 @@ TWebPVSetField(TIFF* tif, uint32 tag, va_list ap)
|
|||||||
/*NOTREACHED*/
|
/*NOTREACHED*/
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int TWebPVGetField(TIFF *tif, uint32_t tag, va_list ap)
|
||||||
TWebPVGetField(TIFF* tif, uint32 tag, va_list ap)
|
|
||||||
{
|
{
|
||||||
WebPState *sp = LState(tif);
|
WebPState *sp = LState(tif);
|
||||||
|
|
||||||
switch (tag) {
|
switch (tag)
|
||||||
|
{
|
||||||
case TIFFTAG_WEBP_LEVEL:
|
case TIFFTAG_WEBP_LEVEL:
|
||||||
*va_arg(ap, int *) = sp->quality_level;
|
*va_arg(ap, int *) = sp->quality_level;
|
||||||
break;
|
break;
|
||||||
case TIFFTAG_WEBP_LOSSLESS:
|
case TIFFTAG_WEBP_LOSSLESS:
|
||||||
*va_arg(ap, int *) = sp->lossless;
|
*va_arg(ap, int *) = sp->lossless;
|
||||||
break;
|
break;
|
||||||
|
case TIFFTAG_WEBP_LOSSLESS_EXACT:
|
||||||
|
*va_arg(ap, int *) = sp->lossless_exact;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return (*sp->vgetparent)(tif, tag, ap);
|
return (*sp->vgetparent)(tif, tag, ap);
|
||||||
}
|
}
|
||||||
@ -620,16 +799,16 @@ TWebPVGetField(TIFF* tif, uint32 tag, va_list ap)
|
|||||||
|
|
||||||
static const TIFFField TWebPFields[] = {
|
static const TIFFField TWebPFields[] = {
|
||||||
{TIFFTAG_WEBP_LEVEL, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT,
|
{TIFFTAG_WEBP_LEVEL, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT,
|
||||||
TIFF_SETGET_UNDEFINED,
|
TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "WEBP quality", NULL},
|
||||||
FIELD_PSEUDO, TRUE, FALSE, "WEBP quality", NULL },
|
|
||||||
{TIFFTAG_WEBP_LOSSLESS, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT,
|
{TIFFTAG_WEBP_LOSSLESS, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT,
|
||||||
TIFF_SETGET_UNDEFINED,
|
TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "WEBP lossless/lossy",
|
||||||
FIELD_PSEUDO, TRUE, FALSE, "WEBP lossless/lossy", NULL
|
NULL},
|
||||||
},
|
{TIFFTAG_WEBP_LOSSLESS_EXACT, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT,
|
||||||
|
TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "WEBP exact lossless",
|
||||||
|
NULL},
|
||||||
};
|
};
|
||||||
|
|
||||||
int
|
int TIFFInitWebP(TIFF *tif, int scheme)
|
||||||
TIFFInitWebP(TIFF* tif, int scheme)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "TIFFInitWebP";
|
static const char module[] = "TIFFInitWebP";
|
||||||
WebPState *sp;
|
WebPState *sp;
|
||||||
@ -640,16 +819,16 @@ TIFFInitWebP(TIFF* tif, int scheme)
|
|||||||
/*
|
/*
|
||||||
* Merge codec-specific tag information.
|
* Merge codec-specific tag information.
|
||||||
*/
|
*/
|
||||||
if ( !_TIFFMergeFields(tif, TWebPFields, TIFFArrayCount(TWebPFields)) ) {
|
if (!_TIFFMergeFields(tif, TWebPFields, TIFFArrayCount(TWebPFields)))
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
"Merging WebP codec-specific tags failed");
|
TIFFErrorExtR(tif, module, "Merging WebP codec-specific tags failed");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Allocate state block so tag methods have storage to record values.
|
* Allocate state block so tag methods have storage to record values.
|
||||||
*/
|
*/
|
||||||
tif->tif_data = (uint8*) _TIFFmalloc(sizeof(WebPState));
|
tif->tif_data = (uint8_t *)_TIFFmallocExt(tif, sizeof(WebPState));
|
||||||
if (tif->tif_data == NULL)
|
if (tif->tif_data == NULL)
|
||||||
goto bad;
|
goto bad;
|
||||||
sp = LState(tif);
|
sp = LState(tif);
|
||||||
@ -665,6 +844,7 @@ TIFFInitWebP(TIFF* tif, int scheme)
|
|||||||
/* Default values for codec-specific fields */
|
/* Default values for codec-specific fields */
|
||||||
sp->quality_level = 75; /* default comp. level */
|
sp->quality_level = 75; /* default comp. level */
|
||||||
sp->lossless = 0; /* default to false */
|
sp->lossless = 0; /* default to false */
|
||||||
|
sp->lossless_exact = 1; /* exact lossless mode (if lossless enabled) */
|
||||||
sp->state = 0;
|
sp->state = 0;
|
||||||
sp->nSamples = 0;
|
sp->nSamples = 0;
|
||||||
sp->psDecoder = NULL;
|
sp->psDecoder = NULL;
|
||||||
@ -694,8 +874,7 @@ TIFFInitWebP(TIFF* tif, int scheme)
|
|||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
bad:
|
bad:
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
TIFFErrorExtR(tif, module, "No space for WebP state block");
|
||||||
"No space for WebP state block");
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
243
3rdparty/libtiff/tif_win32.c
vendored
243
3rdparty/libtiff/tif_win32.c
vendored
@ -28,6 +28,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "tiffiop.h"
|
#include "tiffiop.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
@ -54,29 +55,25 @@ static inline thandle_t thandle_from_int(int ifd)
|
|||||||
return (thandle_t)(intptr_t)ifd;
|
return (thandle_t)(intptr_t)ifd;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int thandle_to_int(thandle_t fd)
|
static inline int thandle_to_int(thandle_t fd) { return (int)(intptr_t)fd; }
|
||||||
{
|
|
||||||
return (int)(intptr_t)fd;
|
|
||||||
}
|
|
||||||
|
|
||||||
static tmsize_t
|
static tmsize_t _tiffReadProc(thandle_t fd, void *buf, tmsize_t size)
|
||||||
_tiffReadProc(thandle_t fd, void* buf, tmsize_t size)
|
|
||||||
{
|
{
|
||||||
/* tmsize_t is 64bit on 64bit systems, but the WinAPI ReadFile takes
|
/* tmsize_t is 64bit on 64bit systems, but the WinAPI ReadFile takes
|
||||||
* 32bit sizes, so we loop through the data in suitable 32bit sized
|
* 32bit sizes, so we loop through the data in suitable 32bit sized
|
||||||
* chunks */
|
* chunks */
|
||||||
uint8* ma;
|
uint8_t *ma;
|
||||||
uint64 mb;
|
uint64_t mb;
|
||||||
DWORD n;
|
DWORD n;
|
||||||
DWORD o;
|
DWORD o;
|
||||||
tmsize_t p;
|
tmsize_t p;
|
||||||
ma=(uint8*)buf;
|
ma = (uint8_t *)buf;
|
||||||
mb = size;
|
mb = size;
|
||||||
p = 0;
|
p = 0;
|
||||||
while (mb > 0)
|
while (mb > 0)
|
||||||
{
|
{
|
||||||
n = 0x80000000UL;
|
n = 0x80000000UL;
|
||||||
if ((uint64)n>mb)
|
if ((uint64_t)n > mb)
|
||||||
n = (DWORD)mb;
|
n = (DWORD)mb;
|
||||||
if (!ReadFile(fd, (LPVOID)ma, n, &o, NULL))
|
if (!ReadFile(fd, (LPVOID)ma, n, &o, NULL))
|
||||||
return (0);
|
return (0);
|
||||||
@ -89,24 +86,23 @@ _tiffReadProc(thandle_t fd, void* buf, tmsize_t size)
|
|||||||
return (p);
|
return (p);
|
||||||
}
|
}
|
||||||
|
|
||||||
static tmsize_t
|
static tmsize_t _tiffWriteProc(thandle_t fd, void *buf, tmsize_t size)
|
||||||
_tiffWriteProc(thandle_t fd, void* buf, tmsize_t size)
|
|
||||||
{
|
{
|
||||||
/* tmsize_t is 64bit on 64bit systems, but the WinAPI WriteFile takes
|
/* tmsize_t is 64bit on 64bit systems, but the WinAPI WriteFile takes
|
||||||
* 32bit sizes, so we loop through the data in suitable 32bit sized
|
* 32bit sizes, so we loop through the data in suitable 32bit sized
|
||||||
* chunks */
|
* chunks */
|
||||||
uint8* ma;
|
uint8_t *ma;
|
||||||
uint64 mb;
|
uint64_t mb;
|
||||||
DWORD n;
|
DWORD n;
|
||||||
DWORD o;
|
DWORD o;
|
||||||
tmsize_t p;
|
tmsize_t p;
|
||||||
ma=(uint8*)buf;
|
ma = (uint8_t *)buf;
|
||||||
mb = size;
|
mb = size;
|
||||||
p = 0;
|
p = 0;
|
||||||
while (mb > 0)
|
while (mb > 0)
|
||||||
{
|
{
|
||||||
n = 0x80000000UL;
|
n = 0x80000000UL;
|
||||||
if ((uint64)n>mb)
|
if ((uint64_t)n > mb)
|
||||||
n = (DWORD)mb;
|
n = (DWORD)mb;
|
||||||
if (!WriteFile(fd, (LPVOID)ma, n, &o, NULL))
|
if (!WriteFile(fd, (LPVOID)ma, n, &o, NULL))
|
||||||
return (0);
|
return (0);
|
||||||
@ -119,8 +115,7 @@ _tiffWriteProc(thandle_t fd, void* buf, tmsize_t size)
|
|||||||
return (p);
|
return (p);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint64
|
static uint64_t _tiffSeekProc(thandle_t fd, uint64_t off, int whence)
|
||||||
_tiffSeekProc(thandle_t fd, uint64 off, int whence)
|
|
||||||
{
|
{
|
||||||
LARGE_INTEGER offli;
|
LARGE_INTEGER offli;
|
||||||
DWORD dwMoveMethod;
|
DWORD dwMoveMethod;
|
||||||
@ -140,20 +135,17 @@ _tiffSeekProc(thandle_t fd, uint64 off, int whence)
|
|||||||
dwMoveMethod = FILE_BEGIN;
|
dwMoveMethod = FILE_BEGIN;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
offli.LowPart=SetFilePointer(fd,offli.LowPart,&offli.HighPart,dwMoveMethod);
|
offli.LowPart =
|
||||||
if ((offli.LowPart==INVALID_SET_FILE_POINTER)&&(GetLastError()!=NO_ERROR))
|
SetFilePointer(fd, offli.LowPart, &offli.HighPart, dwMoveMethod);
|
||||||
|
if ((offli.LowPart == INVALID_SET_FILE_POINTER) &&
|
||||||
|
(GetLastError() != NO_ERROR))
|
||||||
offli.QuadPart = 0;
|
offli.QuadPart = 0;
|
||||||
return (offli.QuadPart);
|
return (offli.QuadPart);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int _tiffCloseProc(thandle_t fd) { return (CloseHandle(fd) ? 0 : -1); }
|
||||||
_tiffCloseProc(thandle_t fd)
|
|
||||||
{
|
|
||||||
return (CloseHandle(fd) ? 0 : -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint64
|
static uint64_t _tiffSizeProc(thandle_t fd)
|
||||||
_tiffSizeProc(thandle_t fd)
|
|
||||||
{
|
{
|
||||||
LARGE_INTEGER m;
|
LARGE_INTEGER m;
|
||||||
if (GetFileSizeEx(fd, &m))
|
if (GetFileSizeEx(fd, &m))
|
||||||
@ -162,8 +154,7 @@ _tiffSizeProc(thandle_t fd)
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int _tiffDummyMapProc(thandle_t fd, void **pbase, toff_t *psize)
|
||||||
_tiffDummyMapProc(thandle_t fd, void** pbase, toff_t* psize)
|
|
||||||
{
|
{
|
||||||
(void)fd;
|
(void)fd;
|
||||||
(void)pbase;
|
(void)pbase;
|
||||||
@ -182,16 +173,15 @@ _tiffDummyMapProc(thandle_t fd, void** pbase, toff_t* psize)
|
|||||||
* This removes a nasty OS dependency and cures a problem
|
* This removes a nasty OS dependency and cures a problem
|
||||||
* with Visual C++ 5.0
|
* with Visual C++ 5.0
|
||||||
*/
|
*/
|
||||||
static int
|
static int _tiffMapProc(thandle_t fd, void **pbase, toff_t *psize)
|
||||||
_tiffMapProc(thandle_t fd, void** pbase, toff_t* psize)
|
|
||||||
{
|
{
|
||||||
uint64 size;
|
uint64_t size;
|
||||||
tmsize_t sizem;
|
tmsize_t sizem;
|
||||||
HANDLE hMapFile;
|
HANDLE hMapFile;
|
||||||
|
|
||||||
size = _tiffSizeProc(fd);
|
size = _tiffSizeProc(fd);
|
||||||
sizem = (tmsize_t)size;
|
sizem = (tmsize_t)size;
|
||||||
if (!size || (uint64)sizem!=size)
|
if (!size || (uint64_t)sizem != size)
|
||||||
return (0);
|
return (0);
|
||||||
|
|
||||||
/* By passing in 0 for the maximum file size, it specifies that we
|
/* By passing in 0 for the maximum file size, it specifies that we
|
||||||
@ -207,16 +197,14 @@ _tiffMapProc(thandle_t fd, void** pbase, toff_t* psize)
|
|||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void _tiffDummyUnmapProc(thandle_t fd, void *base, toff_t size)
|
||||||
_tiffDummyUnmapProc(thandle_t fd, void* base, toff_t size)
|
|
||||||
{
|
{
|
||||||
(void)fd;
|
(void)fd;
|
||||||
(void)base;
|
(void)base;
|
||||||
(void)size;
|
(void)size;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void _tiffUnmapProc(thandle_t fd, void *base, toff_t size)
|
||||||
_tiffUnmapProc(thandle_t fd, void* base, toff_t size)
|
|
||||||
{
|
{
|
||||||
(void)fd;
|
(void)fd;
|
||||||
(void)size;
|
(void)size;
|
||||||
@ -228,12 +216,18 @@ _tiffUnmapProc(thandle_t fd, void* base, toff_t size)
|
|||||||
* Note that TIFFFdOpen and TIFFOpen recognise the character 'u' in the mode
|
* Note that TIFFFdOpen and TIFFOpen recognise the character 'u' in the mode
|
||||||
* string, which forces the file to be opened unmapped.
|
* string, which forces the file to be opened unmapped.
|
||||||
*/
|
*/
|
||||||
TIFF*
|
TIFF *TIFFFdOpen(int ifd, const char *name, const char *mode)
|
||||||
TIFFFdOpen(int ifd, const char* name, const char* mode)
|
{
|
||||||
|
return TIFFFdOpenExt(ifd, name, mode, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
TIFF *TIFFFdOpenExt(int ifd, const char *name, const char *mode,
|
||||||
|
TIFFOpenOptions *opts)
|
||||||
{
|
{
|
||||||
TIFF *tif;
|
TIFF *tif;
|
||||||
int fSuppressMap;
|
int fSuppressMap;
|
||||||
int m;
|
int m;
|
||||||
|
|
||||||
fSuppressMap = 0;
|
fSuppressMap = 0;
|
||||||
for (m = 0; mode[m] != 0; m++)
|
for (m = 0; mode[m] != 0; m++)
|
||||||
{
|
{
|
||||||
@ -243,11 +237,12 @@ TIFFFdOpen(int ifd, const char* name, const char* mode)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tif = TIFFClientOpen(name, mode, thandle_from_int(ifd),
|
|
||||||
_tiffReadProc, _tiffWriteProc,
|
tif = TIFFClientOpenExt(
|
||||||
|
name, mode, thandle_from_int(ifd), _tiffReadProc, _tiffWriteProc,
|
||||||
_tiffSeekProc, _tiffCloseProc, _tiffSizeProc,
|
_tiffSeekProc, _tiffCloseProc, _tiffSizeProc,
|
||||||
fSuppressMap ? _tiffDummyMapProc : _tiffMapProc,
|
fSuppressMap ? _tiffDummyMapProc : _tiffMapProc,
|
||||||
fSuppressMap ? _tiffDummyUnmapProc : _tiffUnmapProc);
|
fSuppressMap ? _tiffDummyUnmapProc : _tiffUnmapProc, opts);
|
||||||
if (tif)
|
if (tif)
|
||||||
tif->tif_fd = ifd;
|
tif->tif_fd = ifd;
|
||||||
return (tif);
|
return (tif);
|
||||||
@ -258,8 +253,12 @@ TIFFFdOpen(int ifd, const char* name, const char* mode)
|
|||||||
/*
|
/*
|
||||||
* Open a TIFF file for read/writing.
|
* Open a TIFF file for read/writing.
|
||||||
*/
|
*/
|
||||||
TIFF*
|
TIFF *TIFFOpen(const char *name, const char *mode)
|
||||||
TIFFOpen(const char* name, const char* mode)
|
{
|
||||||
|
return TIFFOpenExt(name, mode, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
TIFF *TIFFOpenExt(const char *name, const char *mode, TIFFOpenOptions *opts)
|
||||||
{
|
{
|
||||||
static const char module[] = "TIFFOpen";
|
static const char module[] = "TIFFOpen";
|
||||||
thandle_t fd;
|
thandle_t fd;
|
||||||
@ -267,28 +266,41 @@ TIFFOpen(const char* name, const char* mode)
|
|||||||
DWORD dwMode;
|
DWORD dwMode;
|
||||||
TIFF *tif;
|
TIFF *tif;
|
||||||
|
|
||||||
m = _TIFFgetMode(mode, module);
|
m = _TIFFgetMode(opts, NULL, mode, module);
|
||||||
|
|
||||||
switch(m) {
|
switch (m)
|
||||||
case O_RDONLY: dwMode = OPEN_EXISTING; break;
|
{
|
||||||
case O_RDWR: dwMode = OPEN_ALWAYS; break;
|
case O_RDONLY:
|
||||||
case O_RDWR|O_CREAT: dwMode = OPEN_ALWAYS; break;
|
dwMode = OPEN_EXISTING;
|
||||||
case O_RDWR|O_TRUNC: dwMode = CREATE_ALWAYS; break;
|
break;
|
||||||
case O_RDWR|O_CREAT|O_TRUNC: dwMode = CREATE_ALWAYS; break;
|
case O_RDWR:
|
||||||
default: return ((TIFF*)0);
|
dwMode = OPEN_EXISTING;
|
||||||
}
|
break;
|
||||||
|
case O_RDWR | O_CREAT:
|
||||||
fd = (thandle_t)CreateFileA(name,
|
dwMode = OPEN_ALWAYS;
|
||||||
(m == O_RDONLY)?GENERIC_READ:(GENERIC_READ | GENERIC_WRITE),
|
break;
|
||||||
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, dwMode,
|
case O_RDWR | O_TRUNC:
|
||||||
(m == O_RDONLY)?FILE_ATTRIBUTE_READONLY:FILE_ATTRIBUTE_NORMAL,
|
dwMode = CREATE_ALWAYS;
|
||||||
NULL);
|
break;
|
||||||
if (fd == INVALID_HANDLE_VALUE) {
|
case O_RDWR | O_CREAT | O_TRUNC:
|
||||||
TIFFErrorExt(0, module, "%s: Cannot open", name);
|
dwMode = CREATE_ALWAYS;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
return ((TIFF *)0);
|
return ((TIFF *)0);
|
||||||
}
|
}
|
||||||
|
|
||||||
tif = TIFFFdOpen(thandle_to_int(fd), name, mode);
|
fd = (thandle_t)CreateFileA(
|
||||||
|
name, (m == O_RDONLY) ? GENERIC_READ : (GENERIC_READ | GENERIC_WRITE),
|
||||||
|
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, dwMode,
|
||||||
|
(m == O_RDONLY) ? FILE_ATTRIBUTE_READONLY : FILE_ATTRIBUTE_NORMAL,
|
||||||
|
NULL);
|
||||||
|
if (fd == INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
_TIFFErrorEarly(opts, NULL, module, "%s: Cannot open", name);
|
||||||
|
return ((TIFF *)0);
|
||||||
|
}
|
||||||
|
|
||||||
|
tif = TIFFFdOpenExt(thandle_to_int(fd), name, mode, opts);
|
||||||
if (!tif)
|
if (!tif)
|
||||||
CloseHandle(fd);
|
CloseHandle(fd);
|
||||||
return tif;
|
return tif;
|
||||||
@ -297,8 +309,12 @@ TIFFOpen(const char* name, const char* mode)
|
|||||||
/*
|
/*
|
||||||
* Open a TIFF file with a Unicode filename, for read/writing.
|
* Open a TIFF file with a Unicode filename, for read/writing.
|
||||||
*/
|
*/
|
||||||
TIFF*
|
TIFF *TIFFOpenW(const wchar_t *name, const char *mode)
|
||||||
TIFFOpenW(const wchar_t* name, const char* mode)
|
{
|
||||||
|
return TIFFOpenWExt(name, mode, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
TIFF *TIFFOpenWExt(const wchar_t *name, const char *mode, TIFFOpenOptions *opts)
|
||||||
{
|
{
|
||||||
static const char module[] = "TIFFOpenW";
|
static const char module[] = "TIFFOpenW";
|
||||||
thandle_t fd;
|
thandle_t fd;
|
||||||
@ -308,43 +324,58 @@ TIFFOpenW(const wchar_t* name, const char* mode)
|
|||||||
char *mbname;
|
char *mbname;
|
||||||
TIFF *tif;
|
TIFF *tif;
|
||||||
|
|
||||||
m = _TIFFgetMode(mode, module);
|
m = _TIFFgetMode(opts, NULL, mode, module);
|
||||||
|
|
||||||
switch(m) {
|
switch (m)
|
||||||
case O_RDONLY: dwMode = OPEN_EXISTING; break;
|
{
|
||||||
case O_RDWR: dwMode = OPEN_ALWAYS; break;
|
case O_RDONLY:
|
||||||
case O_RDWR|O_CREAT: dwMode = OPEN_ALWAYS; break;
|
dwMode = OPEN_EXISTING;
|
||||||
case O_RDWR|O_TRUNC: dwMode = CREATE_ALWAYS; break;
|
break;
|
||||||
case O_RDWR|O_CREAT|O_TRUNC: dwMode = CREATE_ALWAYS; break;
|
case O_RDWR:
|
||||||
default: return ((TIFF*)0);
|
dwMode = OPEN_EXISTING;
|
||||||
|
break;
|
||||||
|
case O_RDWR | O_CREAT:
|
||||||
|
dwMode = OPEN_ALWAYS;
|
||||||
|
break;
|
||||||
|
case O_RDWR | O_TRUNC:
|
||||||
|
dwMode = CREATE_ALWAYS;
|
||||||
|
break;
|
||||||
|
case O_RDWR | O_CREAT | O_TRUNC:
|
||||||
|
dwMode = CREATE_ALWAYS;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return ((TIFF *)0);
|
||||||
}
|
}
|
||||||
|
|
||||||
fd = (thandle_t)CreateFileW(name,
|
fd = (thandle_t)CreateFileW(
|
||||||
(m == O_RDONLY)?GENERIC_READ:(GENERIC_READ|GENERIC_WRITE),
|
name, (m == O_RDONLY) ? GENERIC_READ : (GENERIC_READ | GENERIC_WRITE),
|
||||||
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, dwMode,
|
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, dwMode,
|
||||||
(m == O_RDONLY) ? FILE_ATTRIBUTE_READONLY : FILE_ATTRIBUTE_NORMAL,
|
(m == O_RDONLY) ? FILE_ATTRIBUTE_READONLY : FILE_ATTRIBUTE_NORMAL,
|
||||||
NULL);
|
NULL);
|
||||||
if (fd == INVALID_HANDLE_VALUE) {
|
if (fd == INVALID_HANDLE_VALUE)
|
||||||
TIFFErrorExt(0, module, "%S: Cannot open", name);
|
{
|
||||||
|
_TIFFErrorEarly(opts, NULL, module, "%S: Cannot open", name);
|
||||||
return ((TIFF *)0);
|
return ((TIFF *)0);
|
||||||
}
|
}
|
||||||
|
|
||||||
mbname = NULL;
|
mbname = NULL;
|
||||||
mbsize = WideCharToMultiByte(CP_ACP, 0, name, -1, NULL, 0, NULL, NULL);
|
mbsize = WideCharToMultiByte(CP_ACP, 0, name, -1, NULL, 0, NULL, NULL);
|
||||||
if (mbsize > 0) {
|
if (mbsize > 0)
|
||||||
|
{
|
||||||
mbname = (char *)_TIFFmalloc(mbsize);
|
mbname = (char *)_TIFFmalloc(mbsize);
|
||||||
if (!mbname) {
|
if (!mbname)
|
||||||
TIFFErrorExt(0, module,
|
{
|
||||||
|
_TIFFErrorEarly(
|
||||||
|
opts, NULL, module,
|
||||||
"Can't allocate space for filename conversion buffer");
|
"Can't allocate space for filename conversion buffer");
|
||||||
return ((TIFF *)0);
|
return ((TIFF *)0);
|
||||||
}
|
}
|
||||||
|
|
||||||
WideCharToMultiByte(CP_ACP, 0, name, -1, mbname, mbsize,
|
WideCharToMultiByte(CP_ACP, 0, name, -1, mbname, mbsize, NULL, NULL);
|
||||||
NULL, NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
tif = TIFFFdOpen(thandle_to_int(fd),
|
tif = TIFFFdOpenExt(thandle_to_int(fd),
|
||||||
(mbname != NULL) ? mbname : "<unknown>", mode);
|
(mbname != NULL) ? mbname : "<unknown>", mode, opts);
|
||||||
if (!tif)
|
if (!tif)
|
||||||
CloseHandle(fd);
|
CloseHandle(fd);
|
||||||
|
|
||||||
@ -355,8 +386,7 @@ TIFFOpenW(const wchar_t* name, const char* mode)
|
|||||||
|
|
||||||
#endif /* ndef _WIN32_WCE */
|
#endif /* ndef _WIN32_WCE */
|
||||||
|
|
||||||
void*
|
void *_TIFFmalloc(tmsize_t s)
|
||||||
_TIFFmalloc(tmsize_t s)
|
|
||||||
{
|
{
|
||||||
if (s == 0)
|
if (s == 0)
|
||||||
return ((void *)NULL);
|
return ((void *)NULL);
|
||||||
@ -372,44 +402,25 @@ void* _TIFFcalloc(tmsize_t nmemb, tmsize_t siz)
|
|||||||
return calloc((size_t)nmemb, (size_t)siz);
|
return calloc((size_t)nmemb, (size_t)siz);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void _TIFFfree(void *p) { free(p); }
|
||||||
_TIFFfree(void* p)
|
|
||||||
{
|
|
||||||
free(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
void*
|
void *_TIFFrealloc(void *p, tmsize_t s) { return (realloc(p, (size_t)s)); }
|
||||||
_TIFFrealloc(void* p, tmsize_t s)
|
|
||||||
{
|
|
||||||
return (realloc(p, (size_t) s));
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void _TIFFmemset(void *p, int v, tmsize_t c) { memset(p, v, (size_t)c); }
|
||||||
_TIFFmemset(void* p, int v, tmsize_t c)
|
|
||||||
{
|
|
||||||
memset(p, v, (size_t) c);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void _TIFFmemcpy(void *d, const void *s, tmsize_t c)
|
||||||
_TIFFmemcpy(void* d, const void* s, tmsize_t c)
|
|
||||||
{
|
{
|
||||||
memcpy(d, s, (size_t)c);
|
memcpy(d, s, (size_t)c);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int _TIFFmemcmp(const void *p1, const void *p2, tmsize_t c)
|
||||||
_TIFFmemcmp(const void* p1, const void* p2, tmsize_t c)
|
|
||||||
{
|
{
|
||||||
return (memcmp(p1, p2, (size_t)c));
|
return (memcmp(p1, p2, (size_t)c));
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef _WIN32_WCE
|
#ifndef _WIN32_WCE
|
||||||
|
|
||||||
#if (_MSC_VER < 1500)
|
static void Win32WarningHandler(const char *module, const char *fmt, va_list ap)
|
||||||
# define vsnprintf _vsnprintf
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void
|
|
||||||
Win32WarningHandler(const char* module, const char* fmt, va_list ap)
|
|
||||||
{
|
{
|
||||||
if (module != NULL)
|
if (module != NULL)
|
||||||
fprintf(stderr, "%s: ", module);
|
fprintf(stderr, "%s: ", module);
|
||||||
@ -419,8 +430,7 @@ Win32WarningHandler(const char* module, const char* fmt, va_list ap)
|
|||||||
}
|
}
|
||||||
TIFFErrorHandler _TIFFwarningHandler = Win32WarningHandler;
|
TIFFErrorHandler _TIFFwarningHandler = Win32WarningHandler;
|
||||||
|
|
||||||
static void
|
static void Win32ErrorHandler(const char *module, const char *fmt, va_list ap)
|
||||||
Win32ErrorHandler(const char* module, const char* fmt, va_list ap)
|
|
||||||
{
|
{
|
||||||
if (module != NULL)
|
if (module != NULL)
|
||||||
fprintf(stderr, "%s: ", module);
|
fprintf(stderr, "%s: ", module);
|
||||||
@ -430,12 +440,3 @@ Win32ErrorHandler(const char* module, const char* fmt, va_list ap)
|
|||||||
TIFFErrorHandler _TIFFerrorHandler = Win32ErrorHandler;
|
TIFFErrorHandler _TIFFerrorHandler = Win32ErrorHandler;
|
||||||
|
|
||||||
#endif /* ndef _WIN32_WCE */
|
#endif /* ndef _WIN32_WCE */
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
527
3rdparty/libtiff/tif_write.c
vendored
527
3rdparty/libtiff/tif_write.c
vendored
@ -40,16 +40,16 @@
|
|||||||
((((tif)->tif_flags & TIFF_BUFFERSETUP) && tif->tif_rawdata) || \
|
((((tif)->tif_flags & TIFF_BUFFERSETUP) && tif->tif_rawdata) || \
|
||||||
TIFFWriteBufferSetup((tif), NULL, (tmsize_t)-1))
|
TIFFWriteBufferSetup((tif), NULL, (tmsize_t)-1))
|
||||||
|
|
||||||
static int TIFFGrowStrips(TIFF* tif, uint32 delta, const char* module);
|
static int TIFFGrowStrips(TIFF *tif, uint32_t delta, const char *module);
|
||||||
static int TIFFAppendToStrip(TIFF* tif, uint32 strip, uint8* data, tmsize_t cc);
|
static int TIFFAppendToStrip(TIFF *tif, uint32_t strip, uint8_t *data,
|
||||||
|
tmsize_t cc);
|
||||||
|
|
||||||
int
|
int TIFFWriteScanline(TIFF *tif, void *buf, uint32_t row, uint16_t sample)
|
||||||
TIFFWriteScanline(TIFF* tif, void* buf, uint32 row, uint16 sample)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "TIFFWriteScanline";
|
static const char module[] = "TIFFWriteScanline";
|
||||||
register TIFFDirectory *td;
|
register TIFFDirectory *td;
|
||||||
int status, imagegrew = 0;
|
int status, imagegrew = 0;
|
||||||
uint32 strip;
|
uint32_t strip;
|
||||||
|
|
||||||
if (!WRITECHECKSTRIPS(tif, module))
|
if (!WRITECHECKSTRIPS(tif, module))
|
||||||
return (-1);
|
return (-1);
|
||||||
@ -67,9 +67,12 @@ TIFFWriteScanline(TIFF* tif, void* buf, uint32 row, uint16 sample)
|
|||||||
* Extend image length if needed
|
* Extend image length if needed
|
||||||
* (but only for PlanarConfig=1).
|
* (but only for PlanarConfig=1).
|
||||||
*/
|
*/
|
||||||
if (row >= td->td_imagelength) { /* extend image */
|
if (row >= td->td_imagelength)
|
||||||
if (td->td_planarconfig == PLANARCONFIG_SEPARATE) {
|
{ /* extend image */
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
|
||||||
|
{
|
||||||
|
TIFFErrorExtR(
|
||||||
|
tif, module,
|
||||||
"Can not change \"ImageLength\" when using separate planes");
|
"Can not change \"ImageLength\" when using separate planes");
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
@ -79,15 +82,18 @@ TIFFWriteScanline(TIFF* tif, void* buf, uint32 row, uint16 sample)
|
|||||||
/*
|
/*
|
||||||
* Calculate strip and check for crossings.
|
* Calculate strip and check for crossings.
|
||||||
*/
|
*/
|
||||||
if (td->td_planarconfig == PLANARCONFIG_SEPARATE) {
|
if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
|
||||||
if (sample >= td->td_samplesperpixel) {
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
if (sample >= td->td_samplesperpixel)
|
||||||
"%lu: Sample out of range, max %lu",
|
{
|
||||||
(unsigned long) sample, (unsigned long) td->td_samplesperpixel);
|
TIFFErrorExtR(tif, module, "%lu: Sample out of range, max %lu",
|
||||||
|
(unsigned long)sample,
|
||||||
|
(unsigned long)td->td_samplesperpixel);
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
strip = sample * td->td_stripsperimage + row / td->td_rowsperstrip;
|
strip = sample * td->td_stripsperimage + row / td->td_rowsperstrip;
|
||||||
} else
|
}
|
||||||
|
else
|
||||||
strip = row / td->td_rowsperstrip;
|
strip = row / td->td_rowsperstrip;
|
||||||
/*
|
/*
|
||||||
* Check strip array to make sure there's space. We don't support
|
* Check strip array to make sure there's space. We don't support
|
||||||
@ -98,7 +104,8 @@ TIFFWriteScanline(TIFF* tif, void* buf, uint32 row, uint16 sample)
|
|||||||
*/
|
*/
|
||||||
if (strip >= td->td_nstrips && !TIFFGrowStrips(tif, 1, module))
|
if (strip >= td->td_nstrips && !TIFFGrowStrips(tif, 1, module))
|
||||||
return (-1);
|
return (-1);
|
||||||
if (strip != tif->tif_curstrip) {
|
if (strip != tif->tif_curstrip)
|
||||||
|
{
|
||||||
/*
|
/*
|
||||||
* Changing strips -- flush any data present.
|
* Changing strips -- flush any data present.
|
||||||
*/
|
*/
|
||||||
@ -113,13 +120,14 @@ TIFFWriteScanline(TIFF* tif, void* buf, uint32 row, uint16 sample)
|
|||||||
if (strip >= td->td_stripsperimage && imagegrew)
|
if (strip >= td->td_stripsperimage && imagegrew)
|
||||||
td->td_stripsperimage =
|
td->td_stripsperimage =
|
||||||
TIFFhowmany_32(td->td_imagelength, td->td_rowsperstrip);
|
TIFFhowmany_32(td->td_imagelength, td->td_rowsperstrip);
|
||||||
if (td->td_stripsperimage == 0) {
|
if (td->td_stripsperimage == 0)
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "Zero strips per image");
|
{
|
||||||
|
TIFFErrorExtR(tif, module, "Zero strips per image");
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
tif->tif_row =
|
tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip;
|
||||||
(strip % td->td_stripsperimage) * td->td_rowsperstrip;
|
if ((tif->tif_flags & TIFF_CODERSETUP) == 0)
|
||||||
if ((tif->tif_flags & TIFF_CODERSETUP) == 0) {
|
{
|
||||||
if (!(*tif->tif_setupencode)(tif))
|
if (!(*tif->tif_setupencode)(tif))
|
||||||
return (-1);
|
return (-1);
|
||||||
tif->tif_flags |= TIFF_CODERSETUP;
|
tif->tif_flags |= TIFF_CODERSETUP;
|
||||||
@ -128,14 +136,8 @@ TIFFWriteScanline(TIFF* tif, void* buf, uint32 row, uint16 sample)
|
|||||||
tif->tif_rawcc = 0;
|
tif->tif_rawcc = 0;
|
||||||
tif->tif_rawcp = tif->tif_rawdata;
|
tif->tif_rawcp = tif->tif_rawdata;
|
||||||
|
|
||||||
if( td->td_stripbytecount_p[strip] > 0 )
|
/* this informs TIFFAppendToStrip() we have changed strip */
|
||||||
{
|
|
||||||
/* if we are writing over existing tiles, zero length */
|
|
||||||
td->td_stripbytecount_p[strip] = 0;
|
|
||||||
|
|
||||||
/* this forces TIFFAppendToStrip() to do a seek */
|
|
||||||
tif->tif_curoff = 0;
|
tif->tif_curoff = 0;
|
||||||
}
|
|
||||||
|
|
||||||
if (!(*tif->tif_preencode)(tif, sample))
|
if (!(*tif->tif_preencode)(tif, sample))
|
||||||
return (-1);
|
return (-1);
|
||||||
@ -146,15 +148,17 @@ TIFFWriteScanline(TIFF* tif, void* buf, uint32 row, uint16 sample)
|
|||||||
* beginning of a strip (or that we can randomly
|
* beginning of a strip (or that we can randomly
|
||||||
* access the data -- i.e. no encoding).
|
* access the data -- i.e. no encoding).
|
||||||
*/
|
*/
|
||||||
if (row != tif->tif_row) {
|
if (row != tif->tif_row)
|
||||||
if (row < tif->tif_row) {
|
{
|
||||||
|
if (row < tif->tif_row)
|
||||||
|
{
|
||||||
/*
|
/*
|
||||||
* Moving backwards within the same strip:
|
* Moving backwards within the same strip:
|
||||||
* backup to the start and then decode
|
* backup to the start and then decode
|
||||||
* forward (below).
|
* forward (below).
|
||||||
*/
|
*/
|
||||||
tif->tif_row = (strip % td->td_stripsperimage) *
|
tif->tif_row =
|
||||||
td->td_rowsperstrip;
|
(strip % td->td_stripsperimage) * td->td_rowsperstrip;
|
||||||
tif->tif_rawcp = tif->tif_rawdata;
|
tif->tif_rawcp = tif->tif_rawdata;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
@ -166,38 +170,38 @@ TIFFWriteScanline(TIFF* tif, void* buf, uint32 row, uint16 sample)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* swab if needed - note that source buffer will be altered */
|
/* swab if needed - note that source buffer will be altered */
|
||||||
tif->tif_postdecode( tif, (uint8*) buf, tif->tif_scanlinesize );
|
tif->tif_postdecode(tif, (uint8_t *)buf, tif->tif_scanlinesize);
|
||||||
|
|
||||||
status = (*tif->tif_encoderow)(tif, (uint8*) buf,
|
status = (*tif->tif_encoderow)(tif, (uint8_t *)buf, tif->tif_scanlinesize,
|
||||||
tif->tif_scanlinesize, sample);
|
sample);
|
||||||
|
|
||||||
/* we are now poised at the beginning of the next row */
|
/* we are now poised at the beginning of the next row */
|
||||||
tif->tif_row = row + 1;
|
tif->tif_row = row + 1;
|
||||||
return (status);
|
return (status);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Make sure that at the first attempt of rewriting a tile/strip, we will have */
|
/* Make sure that at the first attempt of rewriting a tile/strip, we will have
|
||||||
|
*/
|
||||||
/* more bytes available in the output buffer than the previous byte count, */
|
/* more bytes available in the output buffer than the previous byte count, */
|
||||||
/* so that TIFFAppendToStrip() will detect the overflow when it is called the first */
|
/* so that TIFFAppendToStrip() will detect the overflow when it is called the
|
||||||
|
* first */
|
||||||
/* time if the new compressed tile is bigger than the older one. (GDAL #4771) */
|
/* time if the new compressed tile is bigger than the older one. (GDAL #4771) */
|
||||||
static int _TIFFReserveLargeEnoughWriteBuffer(TIFF* tif, uint32 strip_or_tile)
|
static int _TIFFReserveLargeEnoughWriteBuffer(TIFF *tif, uint32_t strip_or_tile)
|
||||||
{
|
{
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
TIFFDirectory *td = &tif->tif_dir;
|
||||||
if (td->td_stripbytecount_p[strip_or_tile] > 0)
|
if (td->td_stripbytecount_p[strip_or_tile] > 0)
|
||||||
{
|
{
|
||||||
/* The +1 is to ensure at least one extra bytes */
|
/* The +1 is to ensure at least one extra bytes */
|
||||||
/* The +4 is because the LZW encoder flushes 4 bytes before the limit */
|
/* The +4 is because the LZW encoder flushes 4 bytes before the limit */
|
||||||
uint64 safe_buffer_size = (uint64)(td->td_stripbytecount_p[strip_or_tile] + 1 + 4);
|
uint64_t safe_buffer_size =
|
||||||
|
(uint64_t)(td->td_stripbytecount_p[strip_or_tile] + 1 + 4);
|
||||||
if (tif->tif_rawdatasize <= (tmsize_t)safe_buffer_size)
|
if (tif->tif_rawdatasize <= (tmsize_t)safe_buffer_size)
|
||||||
{
|
{
|
||||||
if( !(TIFFWriteBufferSetup(tif, NULL,
|
if (!(TIFFWriteBufferSetup(
|
||||||
|
tif, NULL,
|
||||||
(tmsize_t)TIFFroundup_64(safe_buffer_size, 1024))))
|
(tmsize_t)TIFFroundup_64(safe_buffer_size, 1024))))
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Force TIFFAppendToStrip() to consider placing data at end
|
|
||||||
of file. */
|
|
||||||
tif->tif_curoff = 0;
|
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -208,12 +212,12 @@ static int _TIFFReserveLargeEnoughWriteBuffer(TIFF* tif, uint32 strip_or_tile)
|
|||||||
*
|
*
|
||||||
* NB: Image length must be setup before writing.
|
* NB: Image length must be setup before writing.
|
||||||
*/
|
*/
|
||||||
tmsize_t
|
tmsize_t TIFFWriteEncodedStrip(TIFF *tif, uint32_t strip, void *data,
|
||||||
TIFFWriteEncodedStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc)
|
tmsize_t cc)
|
||||||
{
|
{
|
||||||
static const char module[] = "TIFFWriteEncodedStrip";
|
static const char module[] = "TIFFWriteEncodedStrip";
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
TIFFDirectory *td = &tif->tif_dir;
|
||||||
uint16 sample;
|
uint16_t sample;
|
||||||
|
|
||||||
if (!WRITECHECKSTRIPS(tif, module))
|
if (!WRITECHECKSTRIPS(tif, module))
|
||||||
return ((tmsize_t)-1);
|
return ((tmsize_t)-1);
|
||||||
@ -226,9 +230,12 @@ TIFFWriteEncodedStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc)
|
|||||||
* write (so that the strips array will be fully
|
* write (so that the strips array will be fully
|
||||||
* allocated above).
|
* allocated above).
|
||||||
*/
|
*/
|
||||||
if (strip >= td->td_nstrips) {
|
if (strip >= td->td_nstrips)
|
||||||
if (td->td_planarconfig == PLANARCONFIG_SEPARATE) {
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
|
||||||
|
{
|
||||||
|
TIFFErrorExtR(
|
||||||
|
tif, module,
|
||||||
"Can not grow image by strips when using separate planes");
|
"Can not grow image by strips when using separate planes");
|
||||||
return ((tmsize_t)-1);
|
return ((tmsize_t)-1);
|
||||||
}
|
}
|
||||||
@ -246,22 +253,29 @@ TIFFWriteEncodedStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc)
|
|||||||
return ((tmsize_t)-1);
|
return ((tmsize_t)-1);
|
||||||
|
|
||||||
tif->tif_flags |= TIFF_BUF4WRITE;
|
tif->tif_flags |= TIFF_BUF4WRITE;
|
||||||
|
|
||||||
tif->tif_curstrip = strip;
|
tif->tif_curstrip = strip;
|
||||||
|
|
||||||
if( !_TIFFReserveLargeEnoughWriteBuffer(tif, strip) ) {
|
/* this informs TIFFAppendToStrip() we have changed or reset strip */
|
||||||
|
tif->tif_curoff = 0;
|
||||||
|
|
||||||
|
if (!_TIFFReserveLargeEnoughWriteBuffer(tif, strip))
|
||||||
|
{
|
||||||
return ((tmsize_t)(-1));
|
return ((tmsize_t)(-1));
|
||||||
}
|
}
|
||||||
|
|
||||||
tif->tif_rawcc = 0;
|
tif->tif_rawcc = 0;
|
||||||
tif->tif_rawcp = tif->tif_rawdata;
|
tif->tif_rawcp = tif->tif_rawdata;
|
||||||
|
|
||||||
if (td->td_stripsperimage == 0) {
|
if (td->td_stripsperimage == 0)
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "Zero strips per image");
|
{
|
||||||
|
TIFFErrorExtR(tif, module, "Zero strips per image");
|
||||||
return ((tmsize_t)-1);
|
return ((tmsize_t)-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip;
|
tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip;
|
||||||
if ((tif->tif_flags & TIFF_CODERSETUP) == 0) {
|
if ((tif->tif_flags & TIFF_CODERSETUP) == 0)
|
||||||
|
{
|
||||||
if (!(*tif->tif_setupencode)(tif))
|
if (!(*tif->tif_setupencode)(tif))
|
||||||
return ((tmsize_t)-1);
|
return ((tmsize_t)-1);
|
||||||
tif->tif_flags |= TIFF_CODERSETUP;
|
tif->tif_flags |= TIFF_CODERSETUP;
|
||||||
@ -273,26 +287,25 @@ TIFFWriteEncodedStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc)
|
|||||||
if (td->td_compression == COMPRESSION_NONE)
|
if (td->td_compression == COMPRESSION_NONE)
|
||||||
{
|
{
|
||||||
/* swab if needed - note that source buffer will be altered */
|
/* swab if needed - note that source buffer will be altered */
|
||||||
tif->tif_postdecode( tif, (uint8*) data, cc );
|
tif->tif_postdecode(tif, (uint8_t *)data, cc);
|
||||||
|
|
||||||
if (!isFillOrder(tif, td->td_fillorder) &&
|
if (!isFillOrder(tif, td->td_fillorder) &&
|
||||||
(tif->tif_flags & TIFF_NOBITREV) == 0)
|
(tif->tif_flags & TIFF_NOBITREV) == 0)
|
||||||
TIFFReverseBits((uint8*) data, cc);
|
TIFFReverseBits((uint8_t *)data, cc);
|
||||||
|
|
||||||
if (cc > 0 &&
|
if (cc > 0 && !TIFFAppendToStrip(tif, strip, (uint8_t *)data, cc))
|
||||||
!TIFFAppendToStrip(tif, strip, (uint8*) data, cc))
|
|
||||||
return ((tmsize_t)-1);
|
return ((tmsize_t)-1);
|
||||||
return (cc);
|
return (cc);
|
||||||
}
|
}
|
||||||
|
|
||||||
sample = (uint16)(strip / td->td_stripsperimage);
|
sample = (uint16_t)(strip / td->td_stripsperimage);
|
||||||
if (!(*tif->tif_preencode)(tif, sample))
|
if (!(*tif->tif_preencode)(tif, sample))
|
||||||
return ((tmsize_t)-1);
|
return ((tmsize_t)-1);
|
||||||
|
|
||||||
/* swab if needed - note that source buffer will be altered */
|
/* swab if needed - note that source buffer will be altered */
|
||||||
tif->tif_postdecode( tif, (uint8*) data, cc );
|
tif->tif_postdecode(tif, (uint8_t *)data, cc);
|
||||||
|
|
||||||
if (!(*tif->tif_encodestrip)(tif, (uint8*) data, cc, sample))
|
if (!(*tif->tif_encodestrip)(tif, (uint8_t *)data, cc, sample))
|
||||||
return ((tmsize_t)-1);
|
return ((tmsize_t)-1);
|
||||||
if (!(*tif->tif_postencode)(tif))
|
if (!(*tif->tif_postencode)(tif))
|
||||||
return ((tmsize_t)-1);
|
return ((tmsize_t)-1);
|
||||||
@ -312,8 +325,7 @@ TIFFWriteEncodedStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc)
|
|||||||
*
|
*
|
||||||
* NB: Image length must be setup before writing.
|
* NB: Image length must be setup before writing.
|
||||||
*/
|
*/
|
||||||
tmsize_t
|
tmsize_t TIFFWriteRawStrip(TIFF *tif, uint32_t strip, void *data, tmsize_t cc)
|
||||||
TIFFWriteRawStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "TIFFWriteRawStrip";
|
static const char module[] = "TIFFWriteRawStrip";
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
TIFFDirectory *td = &tif->tif_dir;
|
||||||
@ -329,9 +341,12 @@ TIFFWriteRawStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc)
|
|||||||
* write (so that the strips array will be fully
|
* write (so that the strips array will be fully
|
||||||
* allocated above).
|
* allocated above).
|
||||||
*/
|
*/
|
||||||
if (strip >= td->td_nstrips) {
|
if (strip >= td->td_nstrips)
|
||||||
if (td->td_planarconfig == PLANARCONFIG_SEPARATE) {
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
|
||||||
|
{
|
||||||
|
TIFFErrorExtR(
|
||||||
|
tif, module,
|
||||||
"Can not grow image by strips when using separate planes");
|
"Can not grow image by strips when using separate planes");
|
||||||
return ((tmsize_t)-1);
|
return ((tmsize_t)-1);
|
||||||
}
|
}
|
||||||
@ -346,22 +361,31 @@ TIFFWriteRawStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc)
|
|||||||
if (!TIFFGrowStrips(tif, 1, module))
|
if (!TIFFGrowStrips(tif, 1, module))
|
||||||
return ((tmsize_t)-1);
|
return ((tmsize_t)-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tif->tif_curstrip != strip)
|
||||||
|
{
|
||||||
tif->tif_curstrip = strip;
|
tif->tif_curstrip = strip;
|
||||||
if (td->td_stripsperimage == 0) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,"Zero strips per image");
|
/* this informs TIFFAppendToStrip() we have changed or reset strip */
|
||||||
|
tif->tif_curoff = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (td->td_stripsperimage == 0)
|
||||||
|
{
|
||||||
|
TIFFErrorExtR(tif, module, "Zero strips per image");
|
||||||
return ((tmsize_t)-1);
|
return ((tmsize_t)-1);
|
||||||
}
|
}
|
||||||
tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip;
|
tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip;
|
||||||
return (TIFFAppendToStrip(tif, strip, (uint8*) data, cc) ?
|
return (TIFFAppendToStrip(tif, strip, (uint8_t *)data, cc) ? cc
|
||||||
cc : (tmsize_t) -1);
|
: (tmsize_t)-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Write and compress a tile of data. The
|
* Write and compress a tile of data. The
|
||||||
* tile is selected by the (x,y,z,s) coordinates.
|
* tile is selected by the (x,y,z,s) coordinates.
|
||||||
*/
|
*/
|
||||||
tmsize_t
|
tmsize_t TIFFWriteTile(TIFF *tif, void *buf, uint32_t x, uint32_t y, uint32_t z,
|
||||||
TIFFWriteTile(TIFF* tif, void* buf, uint32 x, uint32 y, uint32 z, uint16 s)
|
uint16_t s)
|
||||||
{
|
{
|
||||||
if (!TIFFCheckTile(tif, x, y, z, s))
|
if (!TIFFCheckTile(tif, x, y, z, s))
|
||||||
return ((tmsize_t)(-1));
|
return ((tmsize_t)(-1));
|
||||||
@ -371,8 +395,8 @@ TIFFWriteTile(TIFF* tif, void* buf, uint32 x, uint32 y, uint32 z, uint16 s)
|
|||||||
* This is done because the tile size may not be defined until
|
* This is done because the tile size may not be defined until
|
||||||
* after the output buffer is setup in TIFFWriteBufferSetup.
|
* after the output buffer is setup in TIFFWriteBufferSetup.
|
||||||
*/
|
*/
|
||||||
return (TIFFWriteEncodedTile(tif,
|
return (TIFFWriteEncodedTile(tif, TIFFComputeTile(tif, x, y, z, s), buf,
|
||||||
TIFFComputeTile(tif, x, y, z, s), buf, (tmsize_t)(-1)));
|
(tmsize_t)(-1)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -387,19 +411,19 @@ TIFFWriteTile(TIFF* tif, void* buf, uint32 x, uint32 y, uint32 z, uint16 s)
|
|||||||
* interface does not support automatically growing
|
* interface does not support automatically growing
|
||||||
* the image on each write (as TIFFWriteScanline does).
|
* the image on each write (as TIFFWriteScanline does).
|
||||||
*/
|
*/
|
||||||
tmsize_t
|
tmsize_t TIFFWriteEncodedTile(TIFF *tif, uint32_t tile, void *data, tmsize_t cc)
|
||||||
TIFFWriteEncodedTile(TIFF* tif, uint32 tile, void* data, tmsize_t cc)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "TIFFWriteEncodedTile";
|
static const char module[] = "TIFFWriteEncodedTile";
|
||||||
TIFFDirectory *td;
|
TIFFDirectory *td;
|
||||||
uint16 sample;
|
uint16_t sample;
|
||||||
uint32 howmany32;
|
uint32_t howmany32;
|
||||||
|
|
||||||
if (!WRITECHECKTILES(tif, module))
|
if (!WRITECHECKTILES(tif, module))
|
||||||
return ((tmsize_t)(-1));
|
return ((tmsize_t)(-1));
|
||||||
td = &tif->tif_dir;
|
td = &tif->tif_dir;
|
||||||
if (tile >= td->td_nstrips) {
|
if (tile >= td->td_nstrips)
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "Tile %lu out of range, max %lu",
|
{
|
||||||
|
TIFFErrorExtR(tif, module, "Tile %lu out of range, max %lu",
|
||||||
(unsigned long)tile, (unsigned long)td->td_nstrips);
|
(unsigned long)tile, (unsigned long)td->td_nstrips);
|
||||||
return ((tmsize_t)(-1));
|
return ((tmsize_t)(-1));
|
||||||
}
|
}
|
||||||
@ -412,9 +436,14 @@ TIFFWriteEncodedTile(TIFF* tif, uint32 tile, void* data, tmsize_t cc)
|
|||||||
return ((tmsize_t)(-1));
|
return ((tmsize_t)(-1));
|
||||||
|
|
||||||
tif->tif_flags |= TIFF_BUF4WRITE;
|
tif->tif_flags |= TIFF_BUF4WRITE;
|
||||||
|
|
||||||
tif->tif_curtile = tile;
|
tif->tif_curtile = tile;
|
||||||
|
|
||||||
if( !_TIFFReserveLargeEnoughWriteBuffer(tif, tile) ) {
|
/* this informs TIFFAppendToStrip() we have changed or reset tile */
|
||||||
|
tif->tif_curoff = 0;
|
||||||
|
|
||||||
|
if (!_TIFFReserveLargeEnoughWriteBuffer(tif, tile))
|
||||||
|
{
|
||||||
return ((tmsize_t)(-1));
|
return ((tmsize_t)(-1));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -426,19 +455,22 @@ TIFFWriteEncodedTile(TIFF* tif, uint32 tile, void* data, tmsize_t cc)
|
|||||||
* current row and column
|
* current row and column
|
||||||
*/
|
*/
|
||||||
howmany32 = TIFFhowmany_32(td->td_imagelength, td->td_tilelength);
|
howmany32 = TIFFhowmany_32(td->td_imagelength, td->td_tilelength);
|
||||||
if (howmany32 == 0) {
|
if (howmany32 == 0)
|
||||||
TIFFErrorExt(tif->tif_clientdata,module,"Zero tiles");
|
{
|
||||||
|
TIFFErrorExtR(tif, module, "Zero tiles");
|
||||||
return ((tmsize_t)(-1));
|
return ((tmsize_t)(-1));
|
||||||
}
|
}
|
||||||
tif->tif_row = (tile % howmany32) * td->td_tilelength;
|
tif->tif_row = (tile % howmany32) * td->td_tilelength;
|
||||||
howmany32 = TIFFhowmany_32(td->td_imagewidth, td->td_tilewidth);
|
howmany32 = TIFFhowmany_32(td->td_imagewidth, td->td_tilewidth);
|
||||||
if (howmany32 == 0) {
|
if (howmany32 == 0)
|
||||||
TIFFErrorExt(tif->tif_clientdata,module,"Zero tiles");
|
{
|
||||||
|
TIFFErrorExtR(tif, module, "Zero tiles");
|
||||||
return ((tmsize_t)(-1));
|
return ((tmsize_t)(-1));
|
||||||
}
|
}
|
||||||
tif->tif_col = (tile % howmany32) * td->td_tilewidth;
|
tif->tif_col = (tile % howmany32) * td->td_tilewidth;
|
||||||
|
|
||||||
if ((tif->tif_flags & TIFF_CODERSETUP) == 0) {
|
if ((tif->tif_flags & TIFF_CODERSETUP) == 0)
|
||||||
|
{
|
||||||
if (!(*tif->tif_setupencode)(tif))
|
if (!(*tif->tif_setupencode)(tif))
|
||||||
return ((tmsize_t)(-1));
|
return ((tmsize_t)(-1));
|
||||||
tif->tif_flags |= TIFF_CODERSETUP;
|
tif->tif_flags |= TIFF_CODERSETUP;
|
||||||
@ -457,33 +489,32 @@ TIFFWriteEncodedTile(TIFF* tif, uint32 tile, void* data, tmsize_t cc)
|
|||||||
if (td->td_compression == COMPRESSION_NONE)
|
if (td->td_compression == COMPRESSION_NONE)
|
||||||
{
|
{
|
||||||
/* swab if needed - note that source buffer will be altered */
|
/* swab if needed - note that source buffer will be altered */
|
||||||
tif->tif_postdecode( tif, (uint8*) data, cc );
|
tif->tif_postdecode(tif, (uint8_t *)data, cc);
|
||||||
|
|
||||||
if (!isFillOrder(tif, td->td_fillorder) &&
|
if (!isFillOrder(tif, td->td_fillorder) &&
|
||||||
(tif->tif_flags & TIFF_NOBITREV) == 0)
|
(tif->tif_flags & TIFF_NOBITREV) == 0)
|
||||||
TIFFReverseBits((uint8*) data, cc);
|
TIFFReverseBits((uint8_t *)data, cc);
|
||||||
|
|
||||||
if (cc > 0 &&
|
if (cc > 0 && !TIFFAppendToStrip(tif, tile, (uint8_t *)data, cc))
|
||||||
!TIFFAppendToStrip(tif, tile, (uint8*) data, cc))
|
|
||||||
return ((tmsize_t)-1);
|
return ((tmsize_t)-1);
|
||||||
return (cc);
|
return (cc);
|
||||||
}
|
}
|
||||||
|
|
||||||
sample = (uint16)(tile/td->td_stripsperimage);
|
sample = (uint16_t)(tile / td->td_stripsperimage);
|
||||||
if (!(*tif->tif_preencode)(tif, sample))
|
if (!(*tif->tif_preencode)(tif, sample))
|
||||||
return ((tmsize_t)(-1));
|
return ((tmsize_t)(-1));
|
||||||
/* swab if needed - note that source buffer will be altered */
|
/* swab if needed - note that source buffer will be altered */
|
||||||
tif->tif_postdecode( tif, (uint8*) data, cc );
|
tif->tif_postdecode(tif, (uint8_t *)data, cc);
|
||||||
|
|
||||||
if (!(*tif->tif_encodetile)(tif, (uint8*) data, cc, sample))
|
if (!(*tif->tif_encodetile)(tif, (uint8_t *)data, cc, sample))
|
||||||
return ((tmsize_t)-1);
|
return ((tmsize_t)-1);
|
||||||
if (!(*tif->tif_postencode)(tif))
|
if (!(*tif->tif_postencode)(tif))
|
||||||
return ((tmsize_t)(-1));
|
return ((tmsize_t)(-1));
|
||||||
if (!isFillOrder(tif, td->td_fillorder) &&
|
if (!isFillOrder(tif, td->td_fillorder) &&
|
||||||
(tif->tif_flags & TIFF_NOBITREV) == 0)
|
(tif->tif_flags & TIFF_NOBITREV) == 0)
|
||||||
TIFFReverseBits((uint8*)tif->tif_rawdata, tif->tif_rawcc);
|
TIFFReverseBits((uint8_t *)tif->tif_rawdata, tif->tif_rawcc);
|
||||||
if (tif->tif_rawcc > 0 && !TIFFAppendToStrip(tif, tile,
|
if (tif->tif_rawcc > 0 &&
|
||||||
tif->tif_rawdata, tif->tif_rawcc))
|
!TIFFAppendToStrip(tif, tile, tif->tif_rawdata, tif->tif_rawcc))
|
||||||
return ((tmsize_t)(-1));
|
return ((tmsize_t)(-1));
|
||||||
tif->tif_rawcc = 0;
|
tif->tif_rawcc = 0;
|
||||||
tif->tif_rawcp = tif->tif_rawdata;
|
tif->tif_rawcp = tif->tif_rawdata;
|
||||||
@ -499,63 +530,61 @@ TIFFWriteEncodedTile(TIFF* tif, uint32 tile, void* data, tmsize_t cc)
|
|||||||
* interface does not support automatically growing
|
* interface does not support automatically growing
|
||||||
* the image on each write (as TIFFWriteScanline does).
|
* the image on each write (as TIFFWriteScanline does).
|
||||||
*/
|
*/
|
||||||
tmsize_t
|
tmsize_t TIFFWriteRawTile(TIFF *tif, uint32_t tile, void *data, tmsize_t cc)
|
||||||
TIFFWriteRawTile(TIFF* tif, uint32 tile, void* data, tmsize_t cc)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "TIFFWriteRawTile";
|
static const char module[] = "TIFFWriteRawTile";
|
||||||
|
|
||||||
if (!WRITECHECKTILES(tif, module))
|
if (!WRITECHECKTILES(tif, module))
|
||||||
return ((tmsize_t)(-1));
|
return ((tmsize_t)(-1));
|
||||||
if (tile >= tif->tif_dir.td_nstrips) {
|
if (tile >= tif->tif_dir.td_nstrips)
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "Tile %lu out of range, max %lu",
|
{
|
||||||
|
TIFFErrorExtR(tif, module, "Tile %lu out of range, max %lu",
|
||||||
(unsigned long)tile,
|
(unsigned long)tile,
|
||||||
(unsigned long)tif->tif_dir.td_nstrips);
|
(unsigned long)tif->tif_dir.td_nstrips);
|
||||||
return ((tmsize_t)(-1));
|
return ((tmsize_t)(-1));
|
||||||
}
|
}
|
||||||
return (TIFFAppendToStrip(tif, tile, (uint8*) data, cc) ?
|
return (TIFFAppendToStrip(tif, tile, (uint8_t *)data, cc) ? cc
|
||||||
cc : (tmsize_t)(-1));
|
: (tmsize_t)(-1));
|
||||||
}
|
}
|
||||||
|
|
||||||
#define isUnspecified(tif, f) \
|
#define isUnspecified(tif, f) \
|
||||||
(TIFFFieldSet(tif, f) && (tif)->tif_dir.td_imagelength == 0)
|
(TIFFFieldSet(tif, f) && (tif)->tif_dir.td_imagelength == 0)
|
||||||
|
|
||||||
int
|
int TIFFSetupStrips(TIFF *tif)
|
||||||
TIFFSetupStrips(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
TIFFDirectory *td = &tif->tif_dir;
|
||||||
|
|
||||||
if (isTiled(tif))
|
if (isTiled(tif))
|
||||||
td->td_stripsperimage =
|
td->td_stripsperimage = isUnspecified(tif, FIELD_TILEDIMENSIONS)
|
||||||
isUnspecified(tif, FIELD_TILEDIMENSIONS) ?
|
? td->td_samplesperpixel
|
||||||
td->td_samplesperpixel : TIFFNumberOfTiles(tif);
|
: TIFFNumberOfTiles(tif);
|
||||||
else
|
else
|
||||||
td->td_stripsperimage =
|
td->td_stripsperimage = isUnspecified(tif, FIELD_ROWSPERSTRIP)
|
||||||
isUnspecified(tif, FIELD_ROWSPERSTRIP) ?
|
? td->td_samplesperpixel
|
||||||
td->td_samplesperpixel : TIFFNumberOfStrips(tif);
|
: TIFFNumberOfStrips(tif);
|
||||||
td->td_nstrips = td->td_stripsperimage;
|
td->td_nstrips = td->td_stripsperimage;
|
||||||
/* TIFFWriteDirectoryTagData has a limitation to 0x80000000U bytes */
|
/* TIFFWriteDirectoryTagData has a limitation to 0x80000000U bytes */
|
||||||
if( td->td_nstrips >= 0x80000000U / ((tif->tif_flags&TIFF_BIGTIFF)?0x8U:0x4U) )
|
if (td->td_nstrips >=
|
||||||
|
0x80000000U / ((tif->tif_flags & TIFF_BIGTIFF) ? 0x8U : 0x4U))
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, "TIFFSetupStrips",
|
TIFFErrorExtR(tif, "TIFFSetupStrips",
|
||||||
"Too large Strip/Tile Offsets/ByteCounts arrays");
|
"Too large Strip/Tile Offsets/ByteCounts arrays");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
|
if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
|
||||||
td->td_stripsperimage /= td->td_samplesperpixel;
|
td->td_stripsperimage /= td->td_samplesperpixel;
|
||||||
td->td_stripoffset_p = (uint64 *)
|
td->td_stripoffset_p = (uint64_t *)_TIFFCheckMalloc(
|
||||||
_TIFFCheckMalloc(tif, td->td_nstrips, sizeof (uint64),
|
tif, td->td_nstrips, sizeof(uint64_t), "for \"StripOffsets\" array");
|
||||||
"for \"StripOffsets\" array");
|
td->td_stripbytecount_p = (uint64_t *)_TIFFCheckMalloc(
|
||||||
td->td_stripbytecount_p = (uint64 *)
|
tif, td->td_nstrips, sizeof(uint64_t), "for \"StripByteCounts\" array");
|
||||||
_TIFFCheckMalloc(tif, td->td_nstrips, sizeof (uint64),
|
|
||||||
"for \"StripByteCounts\" array");
|
|
||||||
if (td->td_stripoffset_p == NULL || td->td_stripbytecount_p == NULL)
|
if (td->td_stripoffset_p == NULL || td->td_stripbytecount_p == NULL)
|
||||||
return (0);
|
return (0);
|
||||||
/*
|
/*
|
||||||
* Place data at the end-of-file
|
* Place data at the end-of-file
|
||||||
* (by setting offsets to zero).
|
* (by setting offsets to zero).
|
||||||
*/
|
*/
|
||||||
_TIFFmemset(td->td_stripoffset_p, 0, td->td_nstrips*sizeof (uint64));
|
_TIFFmemset(td->td_stripoffset_p, 0, td->td_nstrips * sizeof(uint64_t));
|
||||||
_TIFFmemset(td->td_stripbytecount_p, 0, td->td_nstrips*sizeof (uint64));
|
_TIFFmemset(td->td_stripbytecount_p, 0, td->td_nstrips * sizeof(uint64_t));
|
||||||
TIFFSetFieldBit(tif, FIELD_STRIPOFFSETS);
|
TIFFSetFieldBit(tif, FIELD_STRIPOFFSETS);
|
||||||
TIFFSetFieldBit(tif, FIELD_STRIPBYTECOUNTS);
|
TIFFSetFieldBit(tif, FIELD_STRIPBYTECOUNTS);
|
||||||
return (1);
|
return (1);
|
||||||
@ -568,17 +597,18 @@ TIFFSetupStrips(TIFF* tif)
|
|||||||
* we also "freeze" the state of the directory so
|
* we also "freeze" the state of the directory so
|
||||||
* that important information is not changed.
|
* that important information is not changed.
|
||||||
*/
|
*/
|
||||||
int
|
int TIFFWriteCheck(TIFF *tif, int tiles, const char *module)
|
||||||
TIFFWriteCheck(TIFF* tif, int tiles, const char* module)
|
|
||||||
{
|
{
|
||||||
if (tif->tif_mode == O_RDONLY) {
|
if (tif->tif_mode == O_RDONLY)
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "File not open for writing");
|
{
|
||||||
|
TIFFErrorExtR(tif, module, "File not open for writing");
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
if (tiles ^ isTiled(tif)) {
|
if (tiles ^ isTiled(tif))
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, tiles ?
|
{
|
||||||
"Can not write tiles to a striped image" :
|
TIFFErrorExtR(tif, module,
|
||||||
"Can not write scanlines to a tiled image");
|
tiles ? "Can not write tiles to a striped image"
|
||||||
|
: "Can not write scanlines to a tiled image");
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -594,30 +624,16 @@ TIFFWriteCheck(TIFF* tif, int tiles, const char* module)
|
|||||||
* TIFF_BEENWRITING is set, TIFFSetField will only allow
|
* TIFF_BEENWRITING is set, TIFFSetField will only allow
|
||||||
* the image's length to be changed).
|
* the image's length to be changed).
|
||||||
*/
|
*/
|
||||||
if (!TIFFFieldSet(tif, FIELD_IMAGEDIMENSIONS)) {
|
if (!TIFFFieldSet(tif, FIELD_IMAGEDIMENSIONS))
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
|
TIFFErrorExtR(tif, module,
|
||||||
"Must set \"ImageWidth\" before writing data");
|
"Must set \"ImageWidth\" before writing data");
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
if (tif->tif_dir.td_samplesperpixel == 1) {
|
if (tif->tif_dir.td_stripoffset_p == NULL && !TIFFSetupStrips(tif))
|
||||||
/*
|
{
|
||||||
* Planarconfiguration is irrelevant in case of single band
|
|
||||||
* images and need not be included. We will set it anyway,
|
|
||||||
* because this field is used in other parts of library even
|
|
||||||
* in the single band case.
|
|
||||||
*/
|
|
||||||
if (!TIFFFieldSet(tif, FIELD_PLANARCONFIG))
|
|
||||||
tif->tif_dir.td_planarconfig = PLANARCONFIG_CONTIG;
|
|
||||||
} else {
|
|
||||||
if (!TIFFFieldSet(tif, FIELD_PLANARCONFIG)) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
|
||||||
"Must set \"PlanarConfiguration\" before writing data");
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (tif->tif_dir.td_stripoffset_p == NULL && !TIFFSetupStrips(tif)) {
|
|
||||||
tif->tif_dir.td_nstrips = 0;
|
tif->tif_dir.td_nstrips = 0;
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "No space for %s arrays",
|
TIFFErrorExtR(tif, module, "No space for %s arrays",
|
||||||
isTiled(tif) ? "tile" : "strip");
|
isTiled(tif) ? "tile" : "strip");
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
@ -653,21 +669,22 @@ TIFFWriteCheck(TIFF* tif, int tiles, const char* module)
|
|||||||
/*
|
/*
|
||||||
* Setup the raw data buffer used for encoding.
|
* Setup the raw data buffer used for encoding.
|
||||||
*/
|
*/
|
||||||
int
|
int TIFFWriteBufferSetup(TIFF *tif, void *bp, tmsize_t size)
|
||||||
TIFFWriteBufferSetup(TIFF* tif, void* bp, tmsize_t size)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "TIFFWriteBufferSetup";
|
static const char module[] = "TIFFWriteBufferSetup";
|
||||||
|
|
||||||
if (tif->tif_rawdata) {
|
if (tif->tif_rawdata)
|
||||||
if (tif->tif_flags & TIFF_MYBUFFER) {
|
{
|
||||||
_TIFFfree(tif->tif_rawdata);
|
if (tif->tif_flags & TIFF_MYBUFFER)
|
||||||
|
{
|
||||||
|
_TIFFfreeExt(tif, tif->tif_rawdata);
|
||||||
tif->tif_flags &= ~TIFF_MYBUFFER;
|
tif->tif_flags &= ~TIFF_MYBUFFER;
|
||||||
}
|
}
|
||||||
tif->tif_rawdata = NULL;
|
tif->tif_rawdata = NULL;
|
||||||
}
|
}
|
||||||
if (size == (tmsize_t)(-1)) {
|
if (size == (tmsize_t)(-1))
|
||||||
size = (isTiled(tif) ?
|
{
|
||||||
tif->tif_tilesize : TIFFStripSize(tif));
|
size = (isTiled(tif) ? tif->tif_tilesize : TIFFStripSize(tif));
|
||||||
|
|
||||||
/* Adds 10% margin for cases where compression would expand a bit */
|
/* Adds 10% margin for cases where compression would expand a bit */
|
||||||
if (size < TIFF_TMSIZE_T_MAX - size / 10)
|
if (size < TIFF_TMSIZE_T_MAX - size / 10)
|
||||||
@ -679,16 +696,19 @@ TIFFWriteBufferSetup(TIFF* tif, void* bp, tmsize_t size)
|
|||||||
size = 8 * 1024;
|
size = 8 * 1024;
|
||||||
bp = NULL; /* NB: force malloc */
|
bp = NULL; /* NB: force malloc */
|
||||||
}
|
}
|
||||||
if (bp == NULL) {
|
if (bp == NULL)
|
||||||
bp = _TIFFmalloc(size);
|
{
|
||||||
if (bp == NULL) {
|
bp = _TIFFmallocExt(tif, size);
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "No space for output buffer");
|
if (bp == NULL)
|
||||||
|
{
|
||||||
|
TIFFErrorExtR(tif, module, "No space for output buffer");
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
tif->tif_flags |= TIFF_MYBUFFER;
|
tif->tif_flags |= TIFF_MYBUFFER;
|
||||||
} else
|
}
|
||||||
|
else
|
||||||
tif->tif_flags &= ~TIFF_MYBUFFER;
|
tif->tif_flags &= ~TIFF_MYBUFFER;
|
||||||
tif->tif_rawdata = (uint8*) bp;
|
tif->tif_rawdata = (uint8_t *)bp;
|
||||||
tif->tif_rawdatasize = size;
|
tif->tif_rawdatasize = size;
|
||||||
tif->tif_rawcc = 0;
|
tif->tif_rawcc = 0;
|
||||||
tif->tif_rawcp = tif->tif_rawdata;
|
tif->tif_rawcp = tif->tif_rawdata;
|
||||||
@ -699,33 +719,34 @@ TIFFWriteBufferSetup(TIFF* tif, void* bp, tmsize_t size)
|
|||||||
/*
|
/*
|
||||||
* Grow the strip data structures by delta strips.
|
* Grow the strip data structures by delta strips.
|
||||||
*/
|
*/
|
||||||
static int
|
static int TIFFGrowStrips(TIFF *tif, uint32_t delta, const char *module)
|
||||||
TIFFGrowStrips(TIFF* tif, uint32 delta, const char* module)
|
|
||||||
{
|
{
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
TIFFDirectory *td = &tif->tif_dir;
|
||||||
uint64* new_stripoffset;
|
uint64_t *new_stripoffset;
|
||||||
uint64* new_stripbytecount;
|
uint64_t *new_stripbytecount;
|
||||||
|
|
||||||
assert(td->td_planarconfig == PLANARCONFIG_CONTIG);
|
assert(td->td_planarconfig == PLANARCONFIG_CONTIG);
|
||||||
new_stripoffset = (uint64*)_TIFFrealloc(td->td_stripoffset_p,
|
new_stripoffset = (uint64_t *)_TIFFreallocExt(
|
||||||
(td->td_nstrips + delta) * sizeof (uint64));
|
tif, td->td_stripoffset_p, (td->td_nstrips + delta) * sizeof(uint64_t));
|
||||||
new_stripbytecount = (uint64*)_TIFFrealloc(td->td_stripbytecount_p,
|
new_stripbytecount = (uint64_t *)_TIFFreallocExt(
|
||||||
(td->td_nstrips + delta) * sizeof (uint64));
|
tif, td->td_stripbytecount_p,
|
||||||
if (new_stripoffset == NULL || new_stripbytecount == NULL) {
|
(td->td_nstrips + delta) * sizeof(uint64_t));
|
||||||
|
if (new_stripoffset == NULL || new_stripbytecount == NULL)
|
||||||
|
{
|
||||||
if (new_stripoffset)
|
if (new_stripoffset)
|
||||||
_TIFFfree(new_stripoffset);
|
_TIFFfreeExt(tif, new_stripoffset);
|
||||||
if (new_stripbytecount)
|
if (new_stripbytecount)
|
||||||
_TIFFfree(new_stripbytecount);
|
_TIFFfreeExt(tif, new_stripbytecount);
|
||||||
td->td_nstrips = 0;
|
td->td_nstrips = 0;
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "No space to expand strip arrays");
|
TIFFErrorExtR(tif, module, "No space to expand strip arrays");
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
td->td_stripoffset_p = new_stripoffset;
|
td->td_stripoffset_p = new_stripoffset;
|
||||||
td->td_stripbytecount_p = new_stripbytecount;
|
td->td_stripbytecount_p = new_stripbytecount;
|
||||||
_TIFFmemset(td->td_stripoffset_p + td->td_nstrips,
|
_TIFFmemset(td->td_stripoffset_p + td->td_nstrips, 0,
|
||||||
0, delta*sizeof (uint64));
|
delta * sizeof(uint64_t));
|
||||||
_TIFFmemset(td->td_stripbytecount_p + td->td_nstrips,
|
_TIFFmemset(td->td_stripbytecount_p + td->td_nstrips, 0,
|
||||||
0, delta*sizeof (uint64));
|
delta * sizeof(uint64_t));
|
||||||
td->td_nstrips += delta;
|
td->td_nstrips += delta;
|
||||||
tif->tif_flags |= TIFF_DIRTYDIRECT;
|
tif->tif_flags |= TIFF_DIRTYDIRECT;
|
||||||
|
|
||||||
@ -735,20 +756,24 @@ TIFFGrowStrips(TIFF* tif, uint32 delta, const char* module)
|
|||||||
/*
|
/*
|
||||||
* Append the data to the specified strip.
|
* Append the data to the specified strip.
|
||||||
*/
|
*/
|
||||||
static int
|
static int TIFFAppendToStrip(TIFF *tif, uint32_t strip, uint8_t *data,
|
||||||
TIFFAppendToStrip(TIFF* tif, uint32 strip, uint8* data, tmsize_t cc)
|
tmsize_t cc)
|
||||||
{
|
{
|
||||||
static const char module[] = "TIFFAppendToStrip";
|
static const char module[] = "TIFFAppendToStrip";
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
TIFFDirectory *td = &tif->tif_dir;
|
||||||
uint64 m;
|
uint64_t m;
|
||||||
int64 old_byte_count = -1;
|
int64_t old_byte_count = -1;
|
||||||
|
|
||||||
if (td->td_stripoffset_p[strip] == 0 || tif->tif_curoff == 0) {
|
if (tif->tif_curoff == 0)
|
||||||
|
tif->tif_lastvalidoff = 0;
|
||||||
|
|
||||||
|
if (td->td_stripoffset_p[strip] == 0 || tif->tif_curoff == 0)
|
||||||
|
{
|
||||||
assert(td->td_nstrips > 0);
|
assert(td->td_nstrips > 0);
|
||||||
|
|
||||||
if( td->td_stripbytecount_p[strip] != 0
|
if (td->td_stripbytecount_p[strip] != 0 &&
|
||||||
&& td->td_stripoffset_p[strip] != 0
|
td->td_stripoffset_p[strip] != 0 &&
|
||||||
&& td->td_stripbytecount_p[strip] >= (uint64) cc )
|
td->td_stripbytecount_p[strip] >= (uint64_t)cc)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* There is already tile data on disk, and the new tile
|
* There is already tile data on disk, and the new tile
|
||||||
@ -757,12 +782,15 @@ TIFFAppendToStrip(TIFF* tif, uint32 strip, uint8* data, tmsize_t cc)
|
|||||||
* more data to append to this strip before we are done
|
* more data to append to this strip before we are done
|
||||||
* depending on how we are getting called.
|
* depending on how we are getting called.
|
||||||
*/
|
*/
|
||||||
if (!SeekOK(tif, td->td_stripoffset_p[strip])) {
|
if (!SeekOK(tif, td->td_stripoffset_p[strip]))
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
"Seek error at scanline %lu",
|
TIFFErrorExtR(tif, module, "Seek error at scanline %lu",
|
||||||
(unsigned long)tif->tif_row);
|
(unsigned long)tif->tif_row);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tif->tif_lastvalidoff =
|
||||||
|
td->td_stripoffset_p[strip] + td->td_stripbytecount_p[strip];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -785,21 +813,106 @@ TIFFAppendToStrip(TIFF* tif, uint32 strip, uint8* data, tmsize_t cc)
|
|||||||
|
|
||||||
m = tif->tif_curoff + cc;
|
m = tif->tif_curoff + cc;
|
||||||
if (!(tif->tif_flags & TIFF_BIGTIFF))
|
if (!(tif->tif_flags & TIFF_BIGTIFF))
|
||||||
m = (uint32)m;
|
m = (uint32_t)m;
|
||||||
if ((m<tif->tif_curoff)||(m<(uint64)cc))
|
if ((m < tif->tif_curoff) || (m < (uint64_t)cc))
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "Maximum TIFF file size exceeded");
|
TIFFErrorExtR(tif, module, "Maximum TIFF file size exceeded");
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
if (!WriteOK(tif, data, cc)) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "Write error at scanline %lu",
|
if (tif->tif_lastvalidoff != 0 && m > tif->tif_lastvalidoff &&
|
||||||
|
td->td_stripbytecount_p[strip] > 0)
|
||||||
|
{
|
||||||
|
/* Ouch: we have detected that we are rewriting in place a strip/tile */
|
||||||
|
/* with several calls to TIFFAppendToStrip(). The first call was with */
|
||||||
|
/* a size smaller than the previous size of the strip/tile, so we */
|
||||||
|
/* opted to rewrite in place, but a following call causes us to go */
|
||||||
|
/* outsize of the strip/tile area, so we have to finally go for a */
|
||||||
|
/* append-at-end-of-file strategy, and start by moving what we already
|
||||||
|
*/
|
||||||
|
/* wrote. */
|
||||||
|
tmsize_t tempSize;
|
||||||
|
void *temp;
|
||||||
|
uint64_t offsetRead;
|
||||||
|
uint64_t offsetWrite;
|
||||||
|
uint64_t toCopy = td->td_stripbytecount_p[strip];
|
||||||
|
|
||||||
|
if (toCopy < 1024 * 1024)
|
||||||
|
tempSize = (tmsize_t)toCopy;
|
||||||
|
else
|
||||||
|
tempSize = 1024 * 1024;
|
||||||
|
|
||||||
|
offsetRead = td->td_stripoffset_p[strip];
|
||||||
|
offsetWrite = TIFFSeekFile(tif, 0, SEEK_END);
|
||||||
|
|
||||||
|
m = offsetWrite + toCopy + cc;
|
||||||
|
if (!(tif->tif_flags & TIFF_BIGTIFF) && m != (uint32_t)m)
|
||||||
|
{
|
||||||
|
TIFFErrorExtR(tif, module, "Maximum TIFF file size exceeded");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
temp = _TIFFmallocExt(tif, tempSize);
|
||||||
|
if (temp == NULL)
|
||||||
|
{
|
||||||
|
TIFFErrorExtR(tif, module, "No space for output buffer");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
tif->tif_flags |= TIFF_DIRTYSTRIP;
|
||||||
|
|
||||||
|
td->td_stripoffset_p[strip] = offsetWrite;
|
||||||
|
td->td_stripbytecount_p[strip] = 0;
|
||||||
|
|
||||||
|
/* Move data written by previous calls to us at end of file */
|
||||||
|
while (toCopy > 0)
|
||||||
|
{
|
||||||
|
if (!SeekOK(tif, offsetRead))
|
||||||
|
{
|
||||||
|
TIFFErrorExtR(tif, module, "Seek error");
|
||||||
|
_TIFFfreeExt(tif, temp);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (!ReadOK(tif, temp, tempSize))
|
||||||
|
{
|
||||||
|
TIFFErrorExtR(tif, module, "Cannot read");
|
||||||
|
_TIFFfreeExt(tif, temp);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (!SeekOK(tif, offsetWrite))
|
||||||
|
{
|
||||||
|
TIFFErrorExtR(tif, module, "Seek error");
|
||||||
|
_TIFFfreeExt(tif, temp);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (!WriteOK(tif, temp, tempSize))
|
||||||
|
{
|
||||||
|
TIFFErrorExtR(tif, module, "Cannot write");
|
||||||
|
_TIFFfreeExt(tif, temp);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
offsetRead += tempSize;
|
||||||
|
offsetWrite += tempSize;
|
||||||
|
td->td_stripbytecount_p[strip] += tempSize;
|
||||||
|
toCopy -= tempSize;
|
||||||
|
}
|
||||||
|
_TIFFfreeExt(tif, temp);
|
||||||
|
|
||||||
|
/* Append the data of this call */
|
||||||
|
offsetWrite += cc;
|
||||||
|
m = offsetWrite;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!WriteOK(tif, data, cc))
|
||||||
|
{
|
||||||
|
TIFFErrorExtR(tif, module, "Write error at scanline %lu",
|
||||||
(unsigned long)tif->tif_row);
|
(unsigned long)tif->tif_row);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
tif->tif_curoff = m;
|
tif->tif_curoff = m;
|
||||||
td->td_stripbytecount_p[strip] += cc;
|
td->td_stripbytecount_p[strip] += cc;
|
||||||
|
|
||||||
if( (int64) td->td_stripbytecount_p[strip] != old_byte_count )
|
if ((int64_t)td->td_stripbytecount_p[strip] != old_byte_count)
|
||||||
tif->tif_flags |= TIFF_DIRTYSTRIP;
|
tif->tif_flags |= TIFF_DIRTYSTRIP;
|
||||||
|
|
||||||
return (1);
|
return (1);
|
||||||
@ -810,16 +923,15 @@ TIFFAppendToStrip(TIFF* tif, uint32 strip, uint8* data, tmsize_t cc)
|
|||||||
* called by ``encodestrip routines'' w/o concern
|
* called by ``encodestrip routines'' w/o concern
|
||||||
* for infinite recursion.
|
* for infinite recursion.
|
||||||
*/
|
*/
|
||||||
int
|
int TIFFFlushData1(TIFF *tif)
|
||||||
TIFFFlushData1(TIFF* tif)
|
{
|
||||||
|
if (tif->tif_rawcc > 0 && tif->tif_flags & TIFF_BUF4WRITE)
|
||||||
{
|
{
|
||||||
if (tif->tif_rawcc > 0 && tif->tif_flags & TIFF_BUF4WRITE ) {
|
|
||||||
if (!isFillOrder(tif, tif->tif_dir.td_fillorder) &&
|
if (!isFillOrder(tif, tif->tif_dir.td_fillorder) &&
|
||||||
(tif->tif_flags & TIFF_NOBITREV) == 0)
|
(tif->tif_flags & TIFF_NOBITREV) == 0)
|
||||||
TIFFReverseBits((uint8*)tif->tif_rawdata,
|
TIFFReverseBits((uint8_t *)tif->tif_rawdata, tif->tif_rawcc);
|
||||||
tif->tif_rawcc);
|
if (!TIFFAppendToStrip(
|
||||||
if (!TIFFAppendToStrip(tif,
|
tif, isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip,
|
||||||
isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip,
|
|
||||||
tif->tif_rawdata, tif->tif_rawcc))
|
tif->tif_rawdata, tif->tif_rawcc))
|
||||||
{
|
{
|
||||||
/* We update those variables even in case of error since there's */
|
/* We update those variables even in case of error since there's */
|
||||||
@ -841,17 +953,8 @@ TIFFFlushData1(TIFF* tif)
|
|||||||
* (very carefully), or to 0 so that the next write gets
|
* (very carefully), or to 0 so that the next write gets
|
||||||
* appended to the end of the file.
|
* appended to the end of the file.
|
||||||
*/
|
*/
|
||||||
void
|
void TIFFSetWriteOffset(TIFF *tif, toff_t off)
|
||||||
TIFFSetWriteOffset(TIFF* tif, toff_t off)
|
|
||||||
{
|
{
|
||||||
tif->tif_curoff = off;
|
tif->tif_curoff = off;
|
||||||
|
tif->tif_lastvalidoff = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
291
3rdparty/libtiff/tif_zip.c
vendored
291
3rdparty/libtiff/tif_zip.c
vendored
@ -63,14 +63,16 @@
|
|||||||
* State block for each open TIFF
|
* State block for each open TIFF
|
||||||
* file using ZIP compression/decompression.
|
* file using ZIP compression/decompression.
|
||||||
*/
|
*/
|
||||||
typedef struct {
|
typedef struct
|
||||||
|
{
|
||||||
TIFFPredictorState predict;
|
TIFFPredictorState predict;
|
||||||
z_stream stream;
|
z_stream stream;
|
||||||
int zipquality; /* compression level */
|
int zipquality; /* compression level */
|
||||||
int state; /* state flags */
|
int state; /* state flags */
|
||||||
int subcodec; /* DEFLATE_SUBCODEC_ZLIB or DEFLATE_SUBCODEC_LIBDEFLATE */
|
int subcodec; /* DEFLATE_SUBCODEC_ZLIB or DEFLATE_SUBCODEC_LIBDEFLATE */
|
||||||
#if LIBDEFLATE_SUPPORT
|
#if LIBDEFLATE_SUPPORT
|
||||||
int libdeflate_state; /* -1 = until first time ZIPEncode() / ZIPDecode() is called, 0 = use zlib, 1 = use libdeflate */
|
int libdeflate_state; /* -1 = until first time ZIPEncode() / ZIPDecode() is
|
||||||
|
called, 0 = use zlib, 1 = use libdeflate */
|
||||||
struct libdeflate_decompressor *libdeflate_dec;
|
struct libdeflate_decompressor *libdeflate_dec;
|
||||||
struct libdeflate_compressor *libdeflate_enc;
|
struct libdeflate_compressor *libdeflate_enc;
|
||||||
#endif
|
#endif
|
||||||
@ -85,18 +87,16 @@ typedef struct {
|
|||||||
#define DecoderState(tif) ZState(tif)
|
#define DecoderState(tif) ZState(tif)
|
||||||
#define EncoderState(tif) ZState(tif)
|
#define EncoderState(tif) ZState(tif)
|
||||||
|
|
||||||
static int ZIPEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s);
|
static int ZIPEncode(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s);
|
||||||
static int ZIPDecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s);
|
static int ZIPDecode(TIFF *tif, uint8_t *op, tmsize_t occ, uint16_t s);
|
||||||
|
|
||||||
static int
|
static int ZIPFixupTags(TIFF *tif)
|
||||||
ZIPFixupTags(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
(void)tif;
|
(void)tif;
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int ZIPSetupDecode(TIFF *tif)
|
||||||
ZIPSetupDecode(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "ZIPSetupDecode";
|
static const char module[] = "ZIPSetupDecode";
|
||||||
ZIPState *sp = DecoderState(tif);
|
ZIPState *sp = DecoderState(tif);
|
||||||
@ -104,7 +104,8 @@ ZIPSetupDecode(TIFF* tif)
|
|||||||
assert(sp != NULL);
|
assert(sp != NULL);
|
||||||
|
|
||||||
/* if we were last encoding, terminate this mode */
|
/* if we were last encoding, terminate this mode */
|
||||||
if (sp->state & ZSTATE_INIT_ENCODE) {
|
if (sp->state & ZSTATE_INIT_ENCODE)
|
||||||
|
{
|
||||||
deflateEnd(&sp->stream);
|
deflateEnd(&sp->stream);
|
||||||
sp->state = 0;
|
sp->state = 0;
|
||||||
}
|
}
|
||||||
@ -113,10 +114,13 @@ ZIPSetupDecode(TIFF* tif)
|
|||||||
/* PredictorSetupDecode() if this function succeeds but */
|
/* PredictorSetupDecode() if this function succeeds but */
|
||||||
/* PredictorSetup() fails */
|
/* PredictorSetup() fails */
|
||||||
if ((sp->state & ZSTATE_INIT_DECODE) == 0 &&
|
if ((sp->state & ZSTATE_INIT_DECODE) == 0 &&
|
||||||
inflateInit(&sp->stream) != Z_OK) {
|
inflateInit(&sp->stream) != Z_OK)
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "%s", SAFE_MSG(sp));
|
{
|
||||||
|
TIFFErrorExtR(tif, module, "%s", SAFE_MSG(sp));
|
||||||
return (0);
|
return (0);
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
sp->state |= ZSTATE_INIT_DECODE;
|
sp->state |= ZSTATE_INIT_DECODE;
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
@ -125,8 +129,7 @@ ZIPSetupDecode(TIFF* tif)
|
|||||||
/*
|
/*
|
||||||
* Setup state for decoding a strip.
|
* Setup state for decoding a strip.
|
||||||
*/
|
*/
|
||||||
static int
|
static int ZIPPreDecode(TIFF *tif, uint16_t s)
|
||||||
ZIPPreDecode(TIFF* tif, uint16 s)
|
|
||||||
{
|
{
|
||||||
ZIPState *sp = DecoderState(tif);
|
ZIPState *sp = DecoderState(tif);
|
||||||
|
|
||||||
@ -144,12 +147,13 @@ ZIPPreDecode(TIFF* tif, uint16 s)
|
|||||||
we need to simplify this code to reflect a ZLib that is likely updated
|
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
|
to deal with 8byte memory sizes, though this code will respond
|
||||||
appropriately even before we simplify it */
|
appropriately even before we simplify it */
|
||||||
sp->stream.avail_in = (uint64)tif->tif_rawcc < 0xFFFFFFFFU ? (uInt) tif->tif_rawcc : 0xFFFFFFFFU;
|
sp->stream.avail_in = (uint64_t)tif->tif_rawcc < 0xFFFFFFFFU
|
||||||
|
? (uInt)tif->tif_rawcc
|
||||||
|
: 0xFFFFFFFFU;
|
||||||
return (inflateReset(&sp->stream) == Z_OK);
|
return (inflateReset(&sp->stream) == Z_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int ZIPDecode(TIFF *tif, uint8_t *op, tmsize_t occ, uint16_t s)
|
||||||
ZIPDecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "ZIPDecode";
|
static const char module[] = "ZIPDecode";
|
||||||
ZIPState *sp = DecoderState(tif);
|
ZIPState *sp = DecoderState(tif);
|
||||||
@ -164,7 +168,8 @@ ZIPDecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s)
|
|||||||
|
|
||||||
/* If we have libdeflate support and we are asked to read a whole */
|
/* If we have libdeflate support and we are asked to read a whole */
|
||||||
/* strip/tile, then go for using it */
|
/* strip/tile, then go for using it */
|
||||||
do {
|
do
|
||||||
|
{
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
TIFFDirectory *td = &tif->tif_dir;
|
||||||
|
|
||||||
if (sp->libdeflate_state == 0)
|
if (sp->libdeflate_state == 0)
|
||||||
@ -173,21 +178,24 @@ ZIPDecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
/* Check if we are in the situation where we can use libdeflate */
|
/* Check if we are in the situation where we can use libdeflate */
|
||||||
if (isTiled(tif)) {
|
if (isTiled(tif))
|
||||||
if( TIFFTileSize64(tif) != (uint64)occ )
|
{
|
||||||
|
if (TIFFTileSize64(tif) != (uint64_t)occ)
|
||||||
break;
|
break;
|
||||||
} else {
|
}
|
||||||
uint32 strip_height = td->td_imagelength - tif->tif_row;
|
else
|
||||||
|
{
|
||||||
|
uint32_t strip_height = td->td_imagelength - tif->tif_row;
|
||||||
if (strip_height > td->td_rowsperstrip)
|
if (strip_height > td->td_rowsperstrip)
|
||||||
strip_height = td->td_rowsperstrip;
|
strip_height = td->td_rowsperstrip;
|
||||||
if( TIFFVStripSize64(tif, strip_height) != (uint64)occ )
|
if (TIFFVStripSize64(tif, strip_height) != (uint64_t)occ)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check for overflow */
|
/* Check for overflow */
|
||||||
if( (size_t)tif->tif_rawcc != (uint64)tif->tif_rawcc )
|
if ((size_t)tif->tif_rawcc != (uint64_t)tif->tif_rawcc)
|
||||||
break;
|
break;
|
||||||
if( (size_t)occ != (uint64)occ )
|
if ((size_t)occ != (uint64_t)occ)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Go for decompression using libdeflate */
|
/* Go for decompression using libdeflate */
|
||||||
@ -204,21 +212,22 @@ ZIPDecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s)
|
|||||||
|
|
||||||
sp->libdeflate_state = 1;
|
sp->libdeflate_state = 1;
|
||||||
|
|
||||||
res = libdeflate_zlib_decompress(
|
res = libdeflate_zlib_decompress(sp->libdeflate_dec, tif->tif_rawcp,
|
||||||
sp->libdeflate_dec, tif->tif_rawcp, (size_t)tif->tif_rawcc, op, (size_t)occ, NULL);
|
(size_t)tif->tif_rawcc, op,
|
||||||
|
(size_t)occ, NULL);
|
||||||
|
|
||||||
tif->tif_rawcp += tif->tif_rawcc;
|
tif->tif_rawcp += tif->tif_rawcc;
|
||||||
tif->tif_rawcc = 0;
|
tif->tif_rawcc = 0;
|
||||||
|
|
||||||
/* We accept LIBDEFLATE_INSUFFICIENT_SPACE has a return */
|
/* We accept LIBDEFLATE_INSUFFICIENT_SPACE has a return */
|
||||||
/* There are odd files in the wild where the last strip, when */
|
/* There are odd files in the wild where the last strip, when */
|
||||||
/* it is smaller in height than td_rowsperstrip, actually contains */
|
/* it is smaller in height than td_rowsperstrip, actually contains
|
||||||
|
*/
|
||||||
/* data for td_rowsperstrip lines. Just ignore that silently. */
|
/* data for td_rowsperstrip lines. Just ignore that silently. */
|
||||||
if (res != LIBDEFLATE_SUCCESS &&
|
if (res != LIBDEFLATE_SUCCESS &&
|
||||||
res != LIBDEFLATE_INSUFFICIENT_SPACE)
|
res != LIBDEFLATE_INSUFFICIENT_SPACE)
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
TIFFErrorExtR(tif, module, "Decoding error at scanline %lu",
|
||||||
"Decoding error at scanline %lu",
|
|
||||||
(unsigned long)tif->tif_row);
|
(unsigned long)tif->tif_row);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -236,33 +245,40 @@ ZIPDecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s)
|
|||||||
we need to simplify this code to reflect a ZLib that is likely updated
|
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
|
to deal with 8byte memory sizes, though this code will respond
|
||||||
appropriately even before we simplify it */
|
appropriately even before we simplify it */
|
||||||
do {
|
do
|
||||||
|
{
|
||||||
int state;
|
int state;
|
||||||
uInt avail_in_before = (uint64)tif->tif_rawcc <= 0xFFFFFFFFU ? (uInt)tif->tif_rawcc : 0xFFFFFFFFU;
|
uInt avail_in_before = (uint64_t)tif->tif_rawcc <= 0xFFFFFFFFU
|
||||||
uInt avail_out_before = (uint64)occ < 0xFFFFFFFFU ? (uInt) occ : 0xFFFFFFFFU;
|
? (uInt)tif->tif_rawcc
|
||||||
|
: 0xFFFFFFFFU;
|
||||||
|
uInt avail_out_before =
|
||||||
|
(uint64_t)occ < 0xFFFFFFFFU ? (uInt)occ : 0xFFFFFFFFU;
|
||||||
sp->stream.avail_in = avail_in_before;
|
sp->stream.avail_in = avail_in_before;
|
||||||
sp->stream.avail_out = avail_out_before;
|
sp->stream.avail_out = avail_out_before;
|
||||||
|
/* coverity[overrun-buffer-arg] */
|
||||||
state = inflate(&sp->stream, Z_PARTIAL_FLUSH);
|
state = inflate(&sp->stream, Z_PARTIAL_FLUSH);
|
||||||
tif->tif_rawcc -= (avail_in_before - sp->stream.avail_in);
|
tif->tif_rawcc -= (avail_in_before - sp->stream.avail_in);
|
||||||
occ -= (avail_out_before - sp->stream.avail_out);
|
occ -= (avail_out_before - sp->stream.avail_out);
|
||||||
if (state == Z_STREAM_END)
|
if (state == Z_STREAM_END)
|
||||||
break;
|
break;
|
||||||
if (state == Z_DATA_ERROR) {
|
if (state == Z_DATA_ERROR)
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
"Decoding error at scanline %lu, %s",
|
TIFFErrorExtR(tif, module, "Decoding error at scanline %lu, %s",
|
||||||
(unsigned long)tif->tif_row, SAFE_MSG(sp));
|
(unsigned long)tif->tif_row, SAFE_MSG(sp));
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
if (state != Z_OK) {
|
if (state != Z_OK)
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
"ZLib error: %s", SAFE_MSG(sp));
|
TIFFErrorExtR(tif, module, "ZLib error: %s", SAFE_MSG(sp));
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
} while (occ > 0);
|
} while (occ > 0);
|
||||||
if (occ != 0) {
|
if (occ != 0)
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
"Not enough data at scanline %lu (short " TIFF_UINT64_FORMAT " bytes)",
|
TIFFErrorExtR(tif, module,
|
||||||
(unsigned long) tif->tif_row, (TIFF_UINT64_T) occ);
|
"Not enough data at scanline %lu (short %" PRIu64
|
||||||
|
" bytes)",
|
||||||
|
(unsigned long)tif->tif_row, (uint64_t)occ);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -271,15 +287,15 @@ ZIPDecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s)
|
|||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int ZIPSetupEncode(TIFF *tif)
|
||||||
ZIPSetupEncode(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "ZIPSetupEncode";
|
static const char module[] = "ZIPSetupEncode";
|
||||||
ZIPState *sp = EncoderState(tif);
|
ZIPState *sp = EncoderState(tif);
|
||||||
int cappedQuality;
|
int cappedQuality;
|
||||||
|
|
||||||
assert(sp != NULL);
|
assert(sp != NULL);
|
||||||
if (sp->state & ZSTATE_INIT_DECODE) {
|
if (sp->state & ZSTATE_INIT_DECODE)
|
||||||
|
{
|
||||||
inflateEnd(&sp->stream);
|
inflateEnd(&sp->stream);
|
||||||
sp->state = 0;
|
sp->state = 0;
|
||||||
}
|
}
|
||||||
@ -288,10 +304,13 @@ ZIPSetupEncode(TIFF* tif)
|
|||||||
if (cappedQuality > Z_BEST_COMPRESSION)
|
if (cappedQuality > Z_BEST_COMPRESSION)
|
||||||
cappedQuality = Z_BEST_COMPRESSION;
|
cappedQuality = Z_BEST_COMPRESSION;
|
||||||
|
|
||||||
if (deflateInit(&sp->stream, cappedQuality) != Z_OK) {
|
if (deflateInit(&sp->stream, cappedQuality) != Z_OK)
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "%s", SAFE_MSG(sp));
|
{
|
||||||
|
TIFFErrorExtR(tif, module, "%s", SAFE_MSG(sp));
|
||||||
return (0);
|
return (0);
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
sp->state |= ZSTATE_INIT_ENCODE;
|
sp->state |= ZSTATE_INIT_ENCODE;
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
@ -300,8 +319,7 @@ ZIPSetupEncode(TIFF* tif)
|
|||||||
/*
|
/*
|
||||||
* Reset encoding state at the start of a strip.
|
* Reset encoding state at the start of a strip.
|
||||||
*/
|
*/
|
||||||
static int
|
static int ZIPPreEncode(TIFF *tif, uint16_t s)
|
||||||
ZIPPreEncode(TIFF* tif, uint16 s)
|
|
||||||
{
|
{
|
||||||
ZIPState *sp = EncoderState(tif);
|
ZIPState *sp = EncoderState(tif);
|
||||||
|
|
||||||
@ -318,15 +336,16 @@ ZIPPreEncode(TIFF* tif, uint16 s)
|
|||||||
we need to simplify this code to reflect a ZLib that is likely updated
|
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
|
to deal with 8byte memory sizes, though this code will respond
|
||||||
appropriately even before we simplify it */
|
appropriately even before we simplify it */
|
||||||
sp->stream.avail_out = (uint64)tif->tif_rawdatasize <= 0xFFFFFFFFU ? (uInt)tif->tif_rawdatasize : 0xFFFFFFFFU;
|
sp->stream.avail_out = (uint64_t)tif->tif_rawdatasize <= 0xFFFFFFFFU
|
||||||
|
? (uInt)tif->tif_rawdatasize
|
||||||
|
: 0xFFFFFFFFU;
|
||||||
return (deflateReset(&sp->stream) == Z_OK);
|
return (deflateReset(&sp->stream) == Z_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Encode a chunk of pixels.
|
* Encode a chunk of pixels.
|
||||||
*/
|
*/
|
||||||
static int
|
static int ZIPEncode(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s)
|
||||||
ZIPEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "ZIPEncode";
|
static const char module[] = "ZIPEncode";
|
||||||
ZIPState *sp = EncoderState(tif);
|
ZIPState *sp = EncoderState(tif);
|
||||||
@ -342,7 +361,8 @@ ZIPEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
|
|||||||
|
|
||||||
/* If we have libdeflate support and we are asked to write a whole */
|
/* If we have libdeflate support and we are asked to write a whole */
|
||||||
/* strip/tile, then go for using it */
|
/* strip/tile, then go for using it */
|
||||||
do {
|
do
|
||||||
|
{
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
TIFFDirectory *td = &tif->tif_dir;
|
||||||
|
|
||||||
if (sp->libdeflate_state == 0)
|
if (sp->libdeflate_state == 0)
|
||||||
@ -355,21 +375,24 @@ ZIPEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
/* Check if we are in the situation where we can use libdeflate */
|
/* Check if we are in the situation where we can use libdeflate */
|
||||||
if (isTiled(tif)) {
|
if (isTiled(tif))
|
||||||
if( TIFFTileSize64(tif) != (uint64)cc )
|
{
|
||||||
|
if (TIFFTileSize64(tif) != (uint64_t)cc)
|
||||||
break;
|
break;
|
||||||
} else {
|
}
|
||||||
uint32 strip_height = td->td_imagelength - tif->tif_row;
|
else
|
||||||
|
{
|
||||||
|
uint32_t strip_height = td->td_imagelength - tif->tif_row;
|
||||||
if (strip_height > td->td_rowsperstrip)
|
if (strip_height > td->td_rowsperstrip)
|
||||||
strip_height = td->td_rowsperstrip;
|
strip_height = td->td_rowsperstrip;
|
||||||
if( TIFFVStripSize64(tif, strip_height) != (uint64)cc )
|
if (TIFFVStripSize64(tif, strip_height) != (uint64_t)cc)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check for overflow */
|
/* Check for overflow */
|
||||||
if( (size_t)tif->tif_rawdatasize != (uint64)tif->tif_rawdatasize )
|
if ((size_t)tif->tif_rawdatasize != (uint64_t)tif->tif_rawdatasize)
|
||||||
break;
|
break;
|
||||||
if( (size_t)cc != (uint64)cc )
|
if ((size_t)cc != (uint64_t)cc)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Go for compression using libdeflate */
|
/* Go for compression using libdeflate */
|
||||||
@ -380,20 +403,22 @@ ZIPEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
|
|||||||
/* To get results as good as zlib, we asked for an extra */
|
/* To get results as good as zlib, we asked for an extra */
|
||||||
/* level of compression */
|
/* level of compression */
|
||||||
sp->libdeflate_enc = libdeflate_alloc_compressor(
|
sp->libdeflate_enc = libdeflate_alloc_compressor(
|
||||||
sp->zipquality == Z_DEFAULT_COMPRESSION ? 7 :
|
sp->zipquality == Z_DEFAULT_COMPRESSION ? 7
|
||||||
sp->zipquality >= 6 && sp->zipquality <= 9 ? sp->zipquality + 1 :
|
: sp->zipquality >= 6 && sp->zipquality <= 9
|
||||||
sp->zipquality);
|
? sp->zipquality + 1
|
||||||
|
: sp->zipquality);
|
||||||
if (sp->libdeflate_enc == NULL)
|
if (sp->libdeflate_enc == NULL)
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
TIFFErrorExtR(tif, module, "Cannot allocate compressor");
|
||||||
"Cannot allocate compressor");
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Make sure the output buffer is large enough for the worse case. */
|
/* Make sure the output buffer is large enough for the worse case.
|
||||||
|
*/
|
||||||
/* In TIFFWriteBufferSetup(), when libtiff allocates the buffer */
|
/* In TIFFWriteBufferSetup(), when libtiff allocates the buffer */
|
||||||
/* we've taken a 10% margin over the uncompressed size, which should */
|
/* we've taken a 10% margin over the uncompressed size, which should
|
||||||
|
*/
|
||||||
/* be large enough even for the the worse case scenario. */
|
/* be large enough even for the the worse case scenario. */
|
||||||
if (libdeflate_zlib_compress_bound(sp->libdeflate_enc, (size_t)cc) >
|
if (libdeflate_zlib_compress_bound(sp->libdeflate_enc, (size_t)cc) >
|
||||||
(size_t)tif->tif_rawdatasize)
|
(size_t)tif->tif_rawdatasize)
|
||||||
@ -403,12 +428,12 @@ ZIPEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
|
|||||||
|
|
||||||
sp->libdeflate_state = 1;
|
sp->libdeflate_state = 1;
|
||||||
nCompressedBytes = libdeflate_zlib_compress(
|
nCompressedBytes = libdeflate_zlib_compress(
|
||||||
sp->libdeflate_enc, bp, (size_t)cc, tif->tif_rawdata, (size_t)tif->tif_rawdatasize);
|
sp->libdeflate_enc, bp, (size_t)cc, tif->tif_rawdata,
|
||||||
|
(size_t)tif->tif_rawdatasize);
|
||||||
|
|
||||||
if (nCompressedBytes == 0)
|
if (nCompressedBytes == 0)
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
TIFFErrorExtR(tif, module, "Encoder error at scanline %lu",
|
||||||
"Encoder error at scanline %lu",
|
|
||||||
(unsigned long)tif->tif_row);
|
(unsigned long)tif->tif_row);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -429,21 +454,26 @@ ZIPEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
|
|||||||
we need to simplify this code to reflect a ZLib that is likely updated
|
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
|
to deal with 8byte memory sizes, though this code will respond
|
||||||
appropriately even before we simplify it */
|
appropriately even before we simplify it */
|
||||||
do {
|
do
|
||||||
uInt avail_in_before = (uint64)cc <= 0xFFFFFFFFU ? (uInt)cc : 0xFFFFFFFFU;
|
{
|
||||||
|
uInt avail_in_before =
|
||||||
|
(uint64_t)cc <= 0xFFFFFFFFU ? (uInt)cc : 0xFFFFFFFFU;
|
||||||
sp->stream.avail_in = avail_in_before;
|
sp->stream.avail_in = avail_in_before;
|
||||||
if (deflate(&sp->stream, Z_NO_FLUSH) != Z_OK) {
|
/* coverity[overrun-buffer-arg] */
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
if (deflate(&sp->stream, Z_NO_FLUSH) != Z_OK)
|
||||||
"Encoder error: %s",
|
{
|
||||||
SAFE_MSG(sp));
|
TIFFErrorExtR(tif, module, "Encoder error: %s", SAFE_MSG(sp));
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
if (sp->stream.avail_out == 0) {
|
if (sp->stream.avail_out == 0)
|
||||||
|
{
|
||||||
tif->tif_rawcc = tif->tif_rawdatasize;
|
tif->tif_rawcc = tif->tif_rawdatasize;
|
||||||
if (!TIFFFlushData1(tif))
|
if (!TIFFFlushData1(tif))
|
||||||
return 0;
|
return 0;
|
||||||
sp->stream.next_out = tif->tif_rawdata;
|
sp->stream.next_out = tif->tif_rawdata;
|
||||||
sp->stream.avail_out = (uint64)tif->tif_rawdatasize <= 0xFFFFFFFFU ? (uInt)tif->tif_rawdatasize : 0xFFFFFFFFU;
|
sp->stream.avail_out = (uint64_t)tif->tif_rawdatasize <= 0xFFFFFFFFU
|
||||||
|
? (uInt)tif->tif_rawdatasize
|
||||||
|
: 0xFFFFFFFFU;
|
||||||
}
|
}
|
||||||
cc -= (avail_in_before - sp->stream.avail_in);
|
cc -= (avail_in_before - sp->stream.avail_in);
|
||||||
} while (cc > 0);
|
} while (cc > 0);
|
||||||
@ -454,8 +484,7 @@ ZIPEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
|
|||||||
* Finish off an encoded strip by flushing the last
|
* Finish off an encoded strip by flushing the last
|
||||||
* string and tacking on an End Of Information code.
|
* string and tacking on an End Of Information code.
|
||||||
*/
|
*/
|
||||||
static int
|
static int ZIPPostEncode(TIFF *tif)
|
||||||
ZIPPostEncode(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "ZIPPostEncode";
|
static const char module[] = "ZIPPostEncode";
|
||||||
ZIPState *sp = EncoderState(tif);
|
ZIPState *sp = EncoderState(tif);
|
||||||
@ -467,31 +496,35 @@ ZIPPostEncode(TIFF* tif)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
sp->stream.avail_in = 0;
|
sp->stream.avail_in = 0;
|
||||||
do {
|
do
|
||||||
|
{
|
||||||
state = deflate(&sp->stream, Z_FINISH);
|
state = deflate(&sp->stream, Z_FINISH);
|
||||||
switch (state) {
|
switch (state)
|
||||||
|
{
|
||||||
case Z_STREAM_END:
|
case Z_STREAM_END:
|
||||||
case Z_OK:
|
case Z_OK:
|
||||||
if ((tmsize_t)sp->stream.avail_out != tif->tif_rawdatasize)
|
if ((tmsize_t)sp->stream.avail_out != tif->tif_rawdatasize)
|
||||||
{
|
{
|
||||||
tif->tif_rawcc = tif->tif_rawdatasize - sp->stream.avail_out;
|
tif->tif_rawcc =
|
||||||
|
tif->tif_rawdatasize - sp->stream.avail_out;
|
||||||
if (!TIFFFlushData1(tif))
|
if (!TIFFFlushData1(tif))
|
||||||
return 0;
|
return 0;
|
||||||
sp->stream.next_out = tif->tif_rawdata;
|
sp->stream.next_out = tif->tif_rawdata;
|
||||||
sp->stream.avail_out = (uint64)tif->tif_rawdatasize <= 0xFFFFFFFFU ? (uInt)tif->tif_rawdatasize : 0xFFFFFFFFU;
|
sp->stream.avail_out =
|
||||||
|
(uint64_t)tif->tif_rawdatasize <= 0xFFFFFFFFU
|
||||||
|
? (uInt)tif->tif_rawdatasize
|
||||||
|
: 0xFFFFFFFFU;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
TIFFErrorExtR(tif, module, "ZLib error: %s", SAFE_MSG(sp));
|
||||||
"ZLib error: %s", SAFE_MSG(sp));
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
} while (state != Z_STREAM_END);
|
} while (state != Z_STREAM_END);
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void ZIPCleanup(TIFF *tif)
|
||||||
ZIPCleanup(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
ZIPState *sp = ZState(tif);
|
ZIPState *sp = ZState(tif);
|
||||||
|
|
||||||
@ -502,10 +535,13 @@ ZIPCleanup(TIFF* tif)
|
|||||||
tif->tif_tagmethods.vgetfield = sp->vgetparent;
|
tif->tif_tagmethods.vgetfield = sp->vgetparent;
|
||||||
tif->tif_tagmethods.vsetfield = sp->vsetparent;
|
tif->tif_tagmethods.vsetfield = sp->vsetparent;
|
||||||
|
|
||||||
if (sp->state & ZSTATE_INIT_ENCODE) {
|
if (sp->state & ZSTATE_INIT_ENCODE)
|
||||||
|
{
|
||||||
deflateEnd(&sp->stream);
|
deflateEnd(&sp->stream);
|
||||||
sp->state = 0;
|
sp->state = 0;
|
||||||
} else if( sp->state & ZSTATE_INIT_DECODE) {
|
}
|
||||||
|
else if (sp->state & ZSTATE_INIT_DECODE)
|
||||||
|
{
|
||||||
inflateEnd(&sp->stream);
|
inflateEnd(&sp->stream);
|
||||||
sp->state = 0;
|
sp->state = 0;
|
||||||
}
|
}
|
||||||
@ -517,37 +553,40 @@ ZIPCleanup(TIFF* tif)
|
|||||||
libdeflate_free_compressor(sp->libdeflate_enc);
|
libdeflate_free_compressor(sp->libdeflate_enc);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
_TIFFfree(sp);
|
_TIFFfreeExt(tif, sp);
|
||||||
tif->tif_data = NULL;
|
tif->tif_data = NULL;
|
||||||
|
|
||||||
_TIFFSetDefaultCompressionState(tif);
|
_TIFFSetDefaultCompressionState(tif);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int ZIPVSetField(TIFF *tif, uint32_t tag, va_list ap)
|
||||||
ZIPVSetField(TIFF* tif, uint32 tag, va_list ap)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "ZIPVSetField";
|
static const char module[] = "ZIPVSetField";
|
||||||
ZIPState *sp = ZState(tif);
|
ZIPState *sp = ZState(tif);
|
||||||
|
|
||||||
switch (tag) {
|
switch (tag)
|
||||||
|
{
|
||||||
case TIFFTAG_ZIPQUALITY:
|
case TIFFTAG_ZIPQUALITY:
|
||||||
sp->zipquality = (int)va_arg(ap, int);
|
sp->zipquality = (int)va_arg(ap, int);
|
||||||
if (sp->zipquality < Z_DEFAULT_COMPRESSION ||
|
if (sp->zipquality < Z_DEFAULT_COMPRESSION ||
|
||||||
sp->zipquality > LIBDEFLATE_MAX_COMPRESSION_LEVEL ) {
|
sp->zipquality > LIBDEFLATE_MAX_COMPRESSION_LEVEL)
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
|
TIFFErrorExtR(
|
||||||
|
tif, module,
|
||||||
"Invalid ZipQuality value. Should be in [-1,%d] range",
|
"Invalid ZipQuality value. Should be in [-1,%d] range",
|
||||||
LIBDEFLATE_MAX_COMPRESSION_LEVEL);
|
LIBDEFLATE_MAX_COMPRESSION_LEVEL);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( sp->state&ZSTATE_INIT_ENCODE ) {
|
if (sp->state & ZSTATE_INIT_ENCODE)
|
||||||
|
{
|
||||||
int cappedQuality = sp->zipquality;
|
int cappedQuality = sp->zipquality;
|
||||||
if (cappedQuality > Z_BEST_COMPRESSION)
|
if (cappedQuality > Z_BEST_COMPRESSION)
|
||||||
cappedQuality = Z_BEST_COMPRESSION;
|
cappedQuality = Z_BEST_COMPRESSION;
|
||||||
if (deflateParams(&sp->stream,
|
if (deflateParams(&sp->stream, cappedQuality,
|
||||||
cappedQuality, Z_DEFAULT_STRATEGY) != Z_OK) {
|
Z_DEFAULT_STRATEGY) != Z_OK)
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "ZLib error: %s",
|
{
|
||||||
SAFE_MSG(sp));
|
TIFFErrorExtR(tif, module, "ZLib error: %s", SAFE_MSG(sp));
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -567,15 +606,15 @@ ZIPVSetField(TIFF* tif, uint32 tag, va_list ap)
|
|||||||
if (sp->subcodec != DEFLATE_SUBCODEC_ZLIB &&
|
if (sp->subcodec != DEFLATE_SUBCODEC_ZLIB &&
|
||||||
sp->subcodec != DEFLATE_SUBCODEC_LIBDEFLATE)
|
sp->subcodec != DEFLATE_SUBCODEC_LIBDEFLATE)
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
TIFFErrorExtR(tif, module, "Invalid DeflateCodec value.");
|
||||||
"Invalid DeflateCodec value.");
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#if !LIBDEFLATE_SUPPORT
|
#if !LIBDEFLATE_SUPPORT
|
||||||
if (sp->subcodec == DEFLATE_SUBCODEC_LIBDEFLATE)
|
if (sp->subcodec == DEFLATE_SUBCODEC_LIBDEFLATE)
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
TIFFErrorExtR(tif, module,
|
||||||
"DeflateCodec = DEFLATE_SUBCODEC_LIBDEFLATE unsupported in this build");
|
"DeflateCodec = DEFLATE_SUBCODEC_LIBDEFLATE "
|
||||||
|
"unsupported in this build");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -587,12 +626,12 @@ ZIPVSetField(TIFF* tif, uint32 tag, va_list ap)
|
|||||||
/*NOTREACHED*/
|
/*NOTREACHED*/
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int ZIPVGetField(TIFF *tif, uint32_t tag, va_list ap)
|
||||||
ZIPVGetField(TIFF* tif, uint32 tag, va_list ap)
|
|
||||||
{
|
{
|
||||||
ZIPState *sp = ZState(tif);
|
ZIPState *sp = ZState(tif);
|
||||||
|
|
||||||
switch (tag) {
|
switch (tag)
|
||||||
|
{
|
||||||
case TIFFTAG_ZIPQUALITY:
|
case TIFFTAG_ZIPQUALITY:
|
||||||
*va_arg(ap, int *) = sp->zipquality;
|
*va_arg(ap, int *) = sp->zipquality;
|
||||||
break;
|
break;
|
||||||
@ -608,18 +647,19 @@ ZIPVGetField(TIFF* tif, uint32 tag, va_list ap)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static const TIFFField zipFields[] = {
|
static const TIFFField zipFields[] = {
|
||||||
{ TIFFTAG_ZIPQUALITY, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "", NULL },
|
{TIFFTAG_ZIPQUALITY, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT,
|
||||||
{ TIFFTAG_DEFLATE_SUBCODEC, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT, TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "", NULL },
|
TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "", NULL},
|
||||||
|
{TIFFTAG_DEFLATE_SUBCODEC, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT,
|
||||||
|
TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "", NULL},
|
||||||
};
|
};
|
||||||
|
|
||||||
int
|
int TIFFInitZIP(TIFF *tif, int scheme)
|
||||||
TIFFInitZIP(TIFF* tif, int scheme)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "TIFFInitZIP";
|
static const char module[] = "TIFFInitZIP";
|
||||||
ZIPState *sp;
|
ZIPState *sp;
|
||||||
|
|
||||||
assert( (scheme == COMPRESSION_DEFLATE)
|
assert((scheme == COMPRESSION_DEFLATE) ||
|
||||||
|| (scheme == COMPRESSION_ADOBE_DEFLATE));
|
(scheme == COMPRESSION_ADOBE_DEFLATE));
|
||||||
#ifdef NDEBUG
|
#ifdef NDEBUG
|
||||||
(void)scheme;
|
(void)scheme;
|
||||||
#endif
|
#endif
|
||||||
@ -627,8 +667,9 @@ TIFFInitZIP(TIFF* tif, int scheme)
|
|||||||
/*
|
/*
|
||||||
* Merge codec-specific tag information.
|
* Merge codec-specific tag information.
|
||||||
*/
|
*/
|
||||||
if (!_TIFFMergeFields(tif, zipFields, TIFFArrayCount(zipFields))) {
|
if (!_TIFFMergeFields(tif, zipFields, TIFFArrayCount(zipFields)))
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
|
TIFFErrorExtR(tif, module,
|
||||||
"Merging Deflate codec-specific tags failed");
|
"Merging Deflate codec-specific tags failed");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -636,7 +677,7 @@ TIFFInitZIP(TIFF* tif, int scheme)
|
|||||||
/*
|
/*
|
||||||
* Allocate state block so tag methods have storage to record values.
|
* Allocate state block so tag methods have storage to record values.
|
||||||
*/
|
*/
|
||||||
tif->tif_data = (uint8*) _TIFFcalloc(sizeof (ZIPState), 1);
|
tif->tif_data = (uint8_t *)_TIFFcallocExt(tif, sizeof(ZIPState), 1);
|
||||||
if (tif->tif_data == NULL)
|
if (tif->tif_data == NULL)
|
||||||
goto bad;
|
goto bad;
|
||||||
sp = ZState(tif);
|
sp = ZState(tif);
|
||||||
@ -684,17 +725,7 @@ TIFFInitZIP(TIFF* tif, int scheme)
|
|||||||
(void)TIFFPredictorInit(tif);
|
(void)TIFFPredictorInit(tif);
|
||||||
return (1);
|
return (1);
|
||||||
bad:
|
bad:
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
TIFFErrorExtR(tif, module, "No space for ZIP state block");
|
||||||
"No space for ZIP state block");
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
#endif /* ZIP_SUPPORT */
|
#endif /* ZIP_SUPPORT */
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
172
3rdparty/libtiff/tif_zstd.c
vendored
172
3rdparty/libtiff/tif_zstd.c
vendored
@ -39,7 +39,8 @@
|
|||||||
/*
|
/*
|
||||||
* State block for each open TIFF file using ZSTD compression/decompression.
|
* State block for each open TIFF file using ZSTD compression/decompression.
|
||||||
*/
|
*/
|
||||||
typedef struct {
|
typedef struct
|
||||||
|
{
|
||||||
TIFFPredictorState predict;
|
TIFFPredictorState predict;
|
||||||
ZSTD_DStream *dstream;
|
ZSTD_DStream *dstream;
|
||||||
ZSTD_CStream *cstream;
|
ZSTD_CStream *cstream;
|
||||||
@ -57,25 +58,24 @@ typedef struct {
|
|||||||
#define DecoderState(tif) LState(tif)
|
#define DecoderState(tif) LState(tif)
|
||||||
#define EncoderState(tif) LState(tif)
|
#define EncoderState(tif) LState(tif)
|
||||||
|
|
||||||
static int ZSTDEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s);
|
static int ZSTDEncode(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s);
|
||||||
static int ZSTDDecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s);
|
static int ZSTDDecode(TIFF *tif, uint8_t *op, tmsize_t occ, uint16_t s);
|
||||||
|
|
||||||
static int
|
static int ZSTDFixupTags(TIFF *tif)
|
||||||
ZSTDFixupTags(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
(void)tif;
|
(void)tif;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int ZSTDSetupDecode(TIFF *tif)
|
||||||
ZSTDSetupDecode(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
ZSTDState *sp = DecoderState(tif);
|
ZSTDState *sp = DecoderState(tif);
|
||||||
|
|
||||||
assert(sp != NULL);
|
assert(sp != NULL);
|
||||||
|
|
||||||
/* if we were last encoding, terminate this mode */
|
/* if we were last encoding, terminate this mode */
|
||||||
if (sp->state & LSTATE_INIT_ENCODE) {
|
if (sp->state & LSTATE_INIT_ENCODE)
|
||||||
|
{
|
||||||
ZSTD_freeCStream(sp->cstream);
|
ZSTD_freeCStream(sp->cstream);
|
||||||
sp->cstream = NULL;
|
sp->cstream = NULL;
|
||||||
sp->state = 0;
|
sp->state = 0;
|
||||||
@ -88,8 +88,7 @@ ZSTDSetupDecode(TIFF* tif)
|
|||||||
/*
|
/*
|
||||||
* Setup state for decoding a strip.
|
* Setup state for decoding a strip.
|
||||||
*/
|
*/
|
||||||
static int
|
static int ZSTDPreDecode(TIFF *tif, uint16_t s)
|
||||||
ZSTDPreDecode(TIFF* tif, uint16 s)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "ZSTDPreDecode";
|
static const char module[] = "ZSTDPreDecode";
|
||||||
ZSTDState *sp = DecoderState(tif);
|
ZSTDState *sp = DecoderState(tif);
|
||||||
@ -101,22 +100,20 @@ ZSTDPreDecode(TIFF* tif, uint16 s)
|
|||||||
if ((sp->state & LSTATE_INIT_DECODE) == 0)
|
if ((sp->state & LSTATE_INIT_DECODE) == 0)
|
||||||
tif->tif_setupdecode(tif);
|
tif->tif_setupdecode(tif);
|
||||||
|
|
||||||
if( sp->dstream )
|
if (sp->dstream == NULL)
|
||||||
{
|
{
|
||||||
ZSTD_freeDStream(sp->dstream);
|
|
||||||
sp->dstream = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
sp->dstream = ZSTD_createDStream();
|
sp->dstream = ZSTD_createDStream();
|
||||||
if( sp->dstream == NULL ) {
|
if (sp->dstream == NULL)
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
"Cannot allocate decompression stream");
|
TIFFErrorExtR(tif, module, "Cannot allocate decompression stream");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
zstd_ret = ZSTD_initDStream(sp->dstream);
|
zstd_ret = ZSTD_initDStream(sp->dstream);
|
||||||
if( ZSTD_isError(zstd_ret) ) {
|
if (ZSTD_isError(zstd_ret))
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
"Error in ZSTD_initDStream(): %s",
|
TIFFErrorExtR(tif, module, "Error in ZSTD_initDStream(): %s",
|
||||||
ZSTD_getErrorName(zstd_ret));
|
ZSTD_getErrorName(zstd_ret));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -124,8 +121,7 @@ ZSTDPreDecode(TIFF* tif, uint16 s)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int ZSTDDecode(TIFF *tif, uint8_t *op, tmsize_t occ, uint16_t s)
|
||||||
ZSTDDecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "ZSTDDecode";
|
static const char module[] = "ZSTDDecode";
|
||||||
ZSTDState *sp = DecoderState(tif);
|
ZSTDState *sp = DecoderState(tif);
|
||||||
@ -145,24 +141,24 @@ ZSTDDecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s)
|
|||||||
out_buffer.size = (size_t)occ;
|
out_buffer.size = (size_t)occ;
|
||||||
out_buffer.pos = 0;
|
out_buffer.pos = 0;
|
||||||
|
|
||||||
do {
|
do
|
||||||
zstd_ret = ZSTD_decompressStream(sp->dstream, &out_buffer,
|
{
|
||||||
&in_buffer);
|
zstd_ret = ZSTD_decompressStream(sp->dstream, &out_buffer, &in_buffer);
|
||||||
if( ZSTD_isError(zstd_ret) ) {
|
if (ZSTD_isError(zstd_ret))
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
"Error in ZSTD_decompressStream(): %s",
|
TIFFErrorExtR(tif, module, "Error in ZSTD_decompressStream(): %s",
|
||||||
ZSTD_getErrorName(zstd_ret));
|
ZSTD_getErrorName(zstd_ret));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
} while( zstd_ret != 0 &&
|
} while (zstd_ret != 0 && in_buffer.pos < in_buffer.size &&
|
||||||
in_buffer.pos < in_buffer.size &&
|
|
||||||
out_buffer.pos < out_buffer.size);
|
out_buffer.pos < out_buffer.size);
|
||||||
|
|
||||||
if (out_buffer.pos < (size_t)occ) {
|
if (out_buffer.pos < (size_t)occ)
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
|
TIFFErrorExtR(tif, module,
|
||||||
"Not enough data at scanline %lu (short %lu bytes)",
|
"Not enough data at scanline %lu (short %lu bytes)",
|
||||||
(unsigned long)tif->tif_row,
|
(unsigned long)tif->tif_row,
|
||||||
(unsigned long) (size_t)occ - out_buffer.pos);
|
(unsigned long)((size_t)occ - out_buffer.pos));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -172,13 +168,13 @@ ZSTDDecode(TIFF* tif, uint8* op, tmsize_t occ, uint16 s)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int ZSTDSetupEncode(TIFF *tif)
|
||||||
ZSTDSetupEncode(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
ZSTDState *sp = EncoderState(tif);
|
ZSTDState *sp = EncoderState(tif);
|
||||||
|
|
||||||
assert(sp != NULL);
|
assert(sp != NULL);
|
||||||
if (sp->state & LSTATE_INIT_DECODE) {
|
if (sp->state & LSTATE_INIT_DECODE)
|
||||||
|
{
|
||||||
ZSTD_freeDStream(sp->dstream);
|
ZSTD_freeDStream(sp->dstream);
|
||||||
sp->dstream = NULL;
|
sp->dstream = NULL;
|
||||||
sp->state = 0;
|
sp->state = 0;
|
||||||
@ -191,8 +187,7 @@ ZSTDSetupEncode(TIFF* tif)
|
|||||||
/*
|
/*
|
||||||
* Reset encoding state at the start of a strip.
|
* Reset encoding state at the start of a strip.
|
||||||
*/
|
*/
|
||||||
static int
|
static int ZSTDPreEncode(TIFF *tif, uint16_t s)
|
||||||
ZSTDPreEncode(TIFF* tif, uint16 s)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "ZSTDPreEncode";
|
static const char module[] = "ZSTDPreEncode";
|
||||||
ZSTDState *sp = EncoderState(tif);
|
ZSTDState *sp = EncoderState(tif);
|
||||||
@ -203,21 +198,20 @@ ZSTDPreEncode(TIFF* tif, uint16 s)
|
|||||||
if (sp->state != LSTATE_INIT_ENCODE)
|
if (sp->state != LSTATE_INIT_ENCODE)
|
||||||
tif->tif_setupencode(tif);
|
tif->tif_setupencode(tif);
|
||||||
|
|
||||||
if (sp->cstream) {
|
if (sp->cstream == NULL)
|
||||||
ZSTD_freeCStream(sp->cstream);
|
{
|
||||||
sp->cstream = NULL;
|
|
||||||
}
|
|
||||||
sp->cstream = ZSTD_createCStream();
|
sp->cstream = ZSTD_createCStream();
|
||||||
if( sp->cstream == NULL ) {
|
if (sp->cstream == NULL)
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
"Cannot allocate compression stream");
|
TIFFErrorExtR(tif, module, "Cannot allocate compression stream");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
zstd_ret = ZSTD_initCStream(sp->cstream, sp->compression_level);
|
zstd_ret = ZSTD_initCStream(sp->cstream, sp->compression_level);
|
||||||
if( ZSTD_isError(zstd_ret) ) {
|
if (ZSTD_isError(zstd_ret))
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
"Error in ZSTD_initCStream(): %s",
|
TIFFErrorExtR(tif, module, "Error in ZSTD_initCStream(): %s",
|
||||||
ZSTD_getErrorName(zstd_ret));
|
ZSTD_getErrorName(zstd_ret));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -232,8 +226,7 @@ ZSTDPreEncode(TIFF* tif, uint16 s)
|
|||||||
/*
|
/*
|
||||||
* Encode a chunk of pixels.
|
* Encode a chunk of pixels.
|
||||||
*/
|
*/
|
||||||
static int
|
static int ZSTDEncode(TIFF *tif, uint8_t *bp, tmsize_t cc, uint16_t s)
|
||||||
ZSTDEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "ZSTDEncode";
|
static const char module[] = "ZSTDEncode";
|
||||||
ZSTDState *sp = EncoderState(tif);
|
ZSTDState *sp = EncoderState(tif);
|
||||||
@ -249,16 +242,18 @@ ZSTDEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
|
|||||||
in_buffer.size = (size_t)cc;
|
in_buffer.size = (size_t)cc;
|
||||||
in_buffer.pos = 0;
|
in_buffer.pos = 0;
|
||||||
|
|
||||||
do {
|
do
|
||||||
zstd_ret = ZSTD_compressStream(sp->cstream, &sp->out_buffer,
|
{
|
||||||
&in_buffer);
|
zstd_ret =
|
||||||
if( ZSTD_isError(zstd_ret) ) {
|
ZSTD_compressStream(sp->cstream, &sp->out_buffer, &in_buffer);
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
if (ZSTD_isError(zstd_ret))
|
||||||
"Error in ZSTD_compressStream(): %s",
|
{
|
||||||
|
TIFFErrorExtR(tif, module, "Error in ZSTD_compressStream(): %s",
|
||||||
ZSTD_getErrorName(zstd_ret));
|
ZSTD_getErrorName(zstd_ret));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if( sp->out_buffer.pos == sp->out_buffer.size ) {
|
if (sp->out_buffer.pos == sp->out_buffer.size)
|
||||||
|
{
|
||||||
tif->tif_rawcc = tif->tif_rawdatasize;
|
tif->tif_rawcc = tif->tif_rawdatasize;
|
||||||
if (!TIFFFlushData1(tif))
|
if (!TIFFFlushData1(tif))
|
||||||
return 0;
|
return 0;
|
||||||
@ -273,22 +268,23 @@ ZSTDEncode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
|
|||||||
/*
|
/*
|
||||||
* Finish off an encoded strip by flushing it.
|
* Finish off an encoded strip by flushing it.
|
||||||
*/
|
*/
|
||||||
static int
|
static int ZSTDPostEncode(TIFF *tif)
|
||||||
ZSTDPostEncode(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "ZSTDPostEncode";
|
static const char module[] = "ZSTDPostEncode";
|
||||||
ZSTDState *sp = EncoderState(tif);
|
ZSTDState *sp = EncoderState(tif);
|
||||||
size_t zstd_ret;
|
size_t zstd_ret;
|
||||||
|
|
||||||
do {
|
do
|
||||||
|
{
|
||||||
zstd_ret = ZSTD_endStream(sp->cstream, &sp->out_buffer);
|
zstd_ret = ZSTD_endStream(sp->cstream, &sp->out_buffer);
|
||||||
if( ZSTD_isError(zstd_ret) ) {
|
if (ZSTD_isError(zstd_ret))
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
"Error in ZSTD_endStream(): %s",
|
TIFFErrorExtR(tif, module, "Error in ZSTD_endStream(): %s",
|
||||||
ZSTD_getErrorName(zstd_ret));
|
ZSTD_getErrorName(zstd_ret));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if( sp->out_buffer.pos > 0 ) {
|
if (sp->out_buffer.pos > 0)
|
||||||
|
{
|
||||||
tif->tif_rawcc = sp->out_buffer.pos;
|
tif->tif_rawcc = sp->out_buffer.pos;
|
||||||
if (!TIFFFlushData1(tif))
|
if (!TIFFFlushData1(tif))
|
||||||
return 0;
|
return 0;
|
||||||
@ -299,8 +295,7 @@ ZSTDPostEncode(TIFF* tif)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void ZSTDCleanup(TIFF *tif)
|
||||||
ZSTDCleanup(TIFF* tif)
|
|
||||||
{
|
{
|
||||||
ZSTDState *sp = LState(tif);
|
ZSTDState *sp = LState(tif);
|
||||||
|
|
||||||
@ -311,33 +306,35 @@ ZSTDCleanup(TIFF* tif)
|
|||||||
tif->tif_tagmethods.vgetfield = sp->vgetparent;
|
tif->tif_tagmethods.vgetfield = sp->vgetparent;
|
||||||
tif->tif_tagmethods.vsetfield = sp->vsetparent;
|
tif->tif_tagmethods.vsetfield = sp->vsetparent;
|
||||||
|
|
||||||
if (sp->dstream) {
|
if (sp->dstream)
|
||||||
|
{
|
||||||
ZSTD_freeDStream(sp->dstream);
|
ZSTD_freeDStream(sp->dstream);
|
||||||
sp->dstream = NULL;
|
sp->dstream = NULL;
|
||||||
}
|
}
|
||||||
if (sp->cstream) {
|
if (sp->cstream)
|
||||||
|
{
|
||||||
ZSTD_freeCStream(sp->cstream);
|
ZSTD_freeCStream(sp->cstream);
|
||||||
sp->cstream = NULL;
|
sp->cstream = NULL;
|
||||||
}
|
}
|
||||||
_TIFFfree(sp);
|
_TIFFfreeExt(tif, sp);
|
||||||
tif->tif_data = NULL;
|
tif->tif_data = NULL;
|
||||||
|
|
||||||
_TIFFSetDefaultCompressionState(tif);
|
_TIFFSetDefaultCompressionState(tif);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int ZSTDVSetField(TIFF *tif, uint32_t tag, va_list ap)
|
||||||
ZSTDVSetField(TIFF* tif, uint32 tag, va_list ap)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "ZSTDVSetField";
|
static const char module[] = "ZSTDVSetField";
|
||||||
ZSTDState *sp = LState(tif);
|
ZSTDState *sp = LState(tif);
|
||||||
|
|
||||||
switch (tag) {
|
switch (tag)
|
||||||
|
{
|
||||||
case TIFFTAG_ZSTD_LEVEL:
|
case TIFFTAG_ZSTD_LEVEL:
|
||||||
sp->compression_level = (int)va_arg(ap, int);
|
sp->compression_level = (int)va_arg(ap, int);
|
||||||
if (sp->compression_level <= 0 ||
|
if (sp->compression_level <= 0 ||
|
||||||
sp->compression_level > ZSTD_maxCLevel())
|
sp->compression_level > ZSTD_maxCLevel())
|
||||||
{
|
{
|
||||||
TIFFWarningExt(tif->tif_clientdata, module,
|
TIFFWarningExtR(tif, module,
|
||||||
"ZSTD_LEVEL should be between 1 and %d",
|
"ZSTD_LEVEL should be between 1 and %d",
|
||||||
ZSTD_maxCLevel());
|
ZSTD_maxCLevel());
|
||||||
}
|
}
|
||||||
@ -348,12 +345,12 @@ ZSTDVSetField(TIFF* tif, uint32 tag, va_list ap)
|
|||||||
/*NOTREACHED*/
|
/*NOTREACHED*/
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int ZSTDVGetField(TIFF *tif, uint32_t tag, va_list ap)
|
||||||
ZSTDVGetField(TIFF* tif, uint32 tag, va_list ap)
|
|
||||||
{
|
{
|
||||||
ZSTDState *sp = LState(tif);
|
ZSTDState *sp = LState(tif);
|
||||||
|
|
||||||
switch (tag) {
|
switch (tag)
|
||||||
|
{
|
||||||
case TIFFTAG_ZSTD_LEVEL:
|
case TIFFTAG_ZSTD_LEVEL:
|
||||||
*va_arg(ap, int *) = sp->compression_level;
|
*va_arg(ap, int *) = sp->compression_level;
|
||||||
break;
|
break;
|
||||||
@ -365,31 +362,31 @@ ZSTDVGetField(TIFF* tif, uint32 tag, va_list ap)
|
|||||||
|
|
||||||
static const TIFFField ZSTDFields[] = {
|
static const TIFFField ZSTDFields[] = {
|
||||||
{TIFFTAG_ZSTD_LEVEL, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT,
|
{TIFFTAG_ZSTD_LEVEL, 0, 0, TIFF_ANY, 0, TIFF_SETGET_INT,
|
||||||
TIFF_SETGET_UNDEFINED,
|
TIFF_SETGET_UNDEFINED, FIELD_PSEUDO, TRUE, FALSE, "ZSTD compression_level",
|
||||||
FIELD_PSEUDO, TRUE, FALSE, "ZSTD compression_level", NULL },
|
NULL},
|
||||||
};
|
};
|
||||||
|
|
||||||
int
|
int TIFFInitZSTD(TIFF *tif, int scheme)
|
||||||
TIFFInitZSTD(TIFF* tif, int scheme)
|
|
||||||
{
|
{
|
||||||
static const char module[] = "TIFFInitZSTD";
|
static const char module[] = "TIFFInitZSTD";
|
||||||
ZSTDState *sp;
|
ZSTDState *sp;
|
||||||
|
|
||||||
|
(void)scheme;
|
||||||
assert(scheme == COMPRESSION_ZSTD);
|
assert(scheme == COMPRESSION_ZSTD);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Merge codec-specific tag information.
|
* Merge codec-specific tag information.
|
||||||
*/
|
*/
|
||||||
if (!_TIFFMergeFields(tif, ZSTDFields, TIFFArrayCount(ZSTDFields))) {
|
if (!_TIFFMergeFields(tif, ZSTDFields, TIFFArrayCount(ZSTDFields)))
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
{
|
||||||
"Merging ZSTD codec-specific tags failed");
|
TIFFErrorExtR(tif, module, "Merging ZSTD codec-specific tags failed");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Allocate state block so tag methods have storage to record values.
|
* Allocate state block so tag methods have storage to record values.
|
||||||
*/
|
*/
|
||||||
tif->tif_data = (uint8*) _TIFFmalloc(sizeof(ZSTDState));
|
tif->tif_data = (uint8_t *)_TIFFmallocExt(tif, sizeof(ZSTDState));
|
||||||
if (tif->tif_data == NULL)
|
if (tif->tif_data == NULL)
|
||||||
goto bad;
|
goto bad;
|
||||||
sp = LState(tif);
|
sp = LState(tif);
|
||||||
@ -433,10 +430,7 @@ TIFFInitZSTD(TIFF* tif, int scheme)
|
|||||||
(void)TIFFPredictorInit(tif);
|
(void)TIFFPredictorInit(tif);
|
||||||
return 1;
|
return 1;
|
||||||
bad:
|
bad:
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
TIFFErrorExtR(tif, module, "No space for ZSTD state block");
|
||||||
"No space for ZSTD state block");
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif /* ZSTD_SUPPORT */
|
#endif /* ZSTD_SUPPORT */
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
|
381
3rdparty/libtiff/tiff.h
vendored
381
3rdparty/libtiff/tiff.h
vendored
@ -56,24 +56,38 @@
|
|||||||
/*
|
/*
|
||||||
* Intrinsic data types required by the file format:
|
* Intrinsic data types required by the file format:
|
||||||
*
|
*
|
||||||
* 8-bit quantities int8/uint8
|
* 8-bit quantities int8_t/uint_8_t
|
||||||
* 16-bit quantities int16/uint16
|
* 16-bit quantities int16_t/uint_16_t
|
||||||
* 32-bit quantities int32/uint32
|
* 32-bit quantities int32_t/uint_32_t
|
||||||
* 64-bit quantities int64/uint64
|
* 64-bit quantities int64_t/uint_64_t
|
||||||
* strings unsigned char*
|
* strings unsigned char*
|
||||||
*/
|
*/
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#define TIFF_GCC_DEPRECATED __attribute__((deprecated))
|
||||||
|
#else
|
||||||
|
#define TIFF_GCC_DEPRECATED
|
||||||
|
#endif
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#define TIFF_MSC_DEPRECATED \
|
||||||
|
__declspec(deprecated("libtiff type deprecated; please use corresponding " \
|
||||||
|
"C99 stdint.h type"))
|
||||||
|
#else
|
||||||
|
#define TIFF_MSC_DEPRECATED
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef TIFF_INT8_T int8;
|
#ifndef TIFF_DISABLE_DEPRECATED
|
||||||
typedef TIFF_UINT8_T uint8;
|
typedef TIFF_MSC_DEPRECATED int8_t int8 TIFF_GCC_DEPRECATED;
|
||||||
|
typedef TIFF_MSC_DEPRECATED uint8_t uint8 TIFF_GCC_DEPRECATED;
|
||||||
|
|
||||||
typedef TIFF_INT16_T int16;
|
typedef TIFF_MSC_DEPRECATED int16_t int16 TIFF_GCC_DEPRECATED;
|
||||||
typedef TIFF_UINT16_T uint16;
|
typedef TIFF_MSC_DEPRECATED uint16_t uint16 TIFF_GCC_DEPRECATED;
|
||||||
|
|
||||||
typedef TIFF_INT32_T int32;
|
typedef TIFF_MSC_DEPRECATED int32_t int32 TIFF_GCC_DEPRECATED;
|
||||||
typedef TIFF_UINT32_T uint32;
|
typedef TIFF_MSC_DEPRECATED uint32_t uint32 TIFF_GCC_DEPRECATED;
|
||||||
|
|
||||||
typedef TIFF_INT64_T int64;
|
typedef TIFF_MSC_DEPRECATED int64_t int64 TIFF_GCC_DEPRECATED;
|
||||||
typedef TIFF_UINT64_T uint64;
|
typedef TIFF_MSC_DEPRECATED uint64_t uint64 TIFF_GCC_DEPRECATED;
|
||||||
|
#endif /* TIFF_DISABLE_DEPRECATED */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Some types as promoted in a variable argument list
|
* Some types as promoted in a variable argument list
|
||||||
@ -88,24 +102,26 @@ typedef int uint16_vap;
|
|||||||
/*
|
/*
|
||||||
* TIFF header.
|
* TIFF header.
|
||||||
*/
|
*/
|
||||||
typedef struct {
|
typedef struct
|
||||||
uint16 tiff_magic; /* magic number (defines byte order) */
|
{
|
||||||
uint16 tiff_version; /* TIFF version number */
|
uint16_t tiff_magic; /* magic number (defines byte order) */
|
||||||
|
uint16_t tiff_version; /* TIFF version number */
|
||||||
} TIFFHeaderCommon;
|
} TIFFHeaderCommon;
|
||||||
typedef struct {
|
typedef struct
|
||||||
uint16 tiff_magic; /* magic number (defines byte order) */
|
{
|
||||||
uint16 tiff_version; /* TIFF version number */
|
uint16_t tiff_magic; /* magic number (defines byte order) */
|
||||||
uint32 tiff_diroff; /* byte offset to first directory */
|
uint16_t tiff_version; /* TIFF version number */
|
||||||
|
uint32_t tiff_diroff; /* byte offset to first directory */
|
||||||
} TIFFHeaderClassic;
|
} TIFFHeaderClassic;
|
||||||
typedef struct {
|
typedef struct
|
||||||
uint16 tiff_magic; /* magic number (defines byte order) */
|
{
|
||||||
uint16 tiff_version; /* TIFF version number */
|
uint16_t tiff_magic; /* magic number (defines byte order) */
|
||||||
uint16 tiff_offsetsize; /* size of offsets, should be 8 */
|
uint16_t tiff_version; /* TIFF version number */
|
||||||
uint16 tiff_unused; /* unused word, should be 0 */
|
uint16_t tiff_offsetsize; /* size of offsets, should be 8 */
|
||||||
uint64 tiff_diroff; /* byte offset to first directory */
|
uint16_t tiff_unused; /* unused word, should be 0 */
|
||||||
|
uint64_t tiff_diroff; /* byte offset to first directory */
|
||||||
} TIFFHeaderBig;
|
} TIFFHeaderBig;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NB: In the comments below,
|
* NB: In the comments below,
|
||||||
* - items marked with a + are obsoleted by revision 5.0,
|
* - items marked with a + are obsoleted by revision 5.0,
|
||||||
@ -120,12 +136,14 @@ typedef struct {
|
|||||||
*
|
*
|
||||||
* Note: RATIONALs are the ratio of two 32-bit integer values.
|
* Note: RATIONALs are the ratio of two 32-bit integer values.
|
||||||
*--:
|
*--:
|
||||||
* Note2: TIFF_IFD8 data type is used in tiffFields[]-tag definition in order to distinguish the write-handling
|
* Note2: TIFF_IFD8 data type is used in tiffFields[]-tag definition in order to
|
||||||
of those tags between ClassicTIFF and BigTiff:
|
distinguish the write-handling of those tags between ClassicTIFF and BigTiff:
|
||||||
For ClassicTIFF libtiff writes a 32-bit value and the TIFF_IFD type-id into the file
|
For ClassicTIFF libtiff writes a 32-bit value and the TIFF_IFD
|
||||||
For BigTIFF libtiff writes a 64-bit value and the TIFF_IFD8 type-id into the file
|
type-id into the file For BigTIFF libtiff writes a 64-bit value and the
|
||||||
|
TIFF_IFD8 type-id into the file
|
||||||
*/
|
*/
|
||||||
typedef enum {
|
typedef enum
|
||||||
|
{
|
||||||
TIFF_NOTYPE = 0, /* placeholder */
|
TIFF_NOTYPE = 0, /* placeholder */
|
||||||
TIFF_BYTE = 1, /* 8-bit unsigned integer */
|
TIFF_BYTE = 1, /* 8-bit unsigned integer */
|
||||||
TIFF_ASCII = 2, /* 8-bit bytes w/ last byte null */
|
TIFF_ASCII = 2, /* 8-bit bytes w/ last byte null */
|
||||||
@ -148,6 +166,7 @@ typedef enum {
|
|||||||
/*
|
/*
|
||||||
* TIFF Tag Definitions.
|
* TIFF Tag Definitions.
|
||||||
*/
|
*/
|
||||||
|
/* clang-format off */ /* for better readability of tag comments */
|
||||||
#define TIFFTAG_SUBFILETYPE 254 /* subfile data descriptor */
|
#define TIFFTAG_SUBFILETYPE 254 /* subfile data descriptor */
|
||||||
#define FILETYPE_REDUCEDIMAGE 0x1 /* reduced resolution version */
|
#define FILETYPE_REDUCEDIMAGE 0x1 /* reduced resolution version */
|
||||||
#define FILETYPE_PAGE 0x2 /* one page of many */
|
#define FILETYPE_PAGE 0x2 /* one page of many */
|
||||||
@ -183,9 +202,8 @@ typedef enum {
|
|||||||
/* compression codes 32908-32911 are reserved for Pixar */
|
/* compression codes 32908-32911 are reserved for Pixar */
|
||||||
#define COMPRESSION_PIXARFILM 32908 /* Pixar companded 10bit LZW */
|
#define COMPRESSION_PIXARFILM 32908 /* Pixar companded 10bit LZW */
|
||||||
#define COMPRESSION_PIXARLOG 32909 /* Pixar companded 11bit ZIP */
|
#define COMPRESSION_PIXARLOG 32909 /* Pixar companded 11bit ZIP */
|
||||||
#define COMPRESSION_DEFLATE 32946 /* Deflate compression */
|
#define COMPRESSION_DEFLATE 32946 /* Deflate compression, legacy tag */
|
||||||
#define COMPRESSION_ADOBE_DEFLATE 8 /* Deflate compression,
|
#define COMPRESSION_ADOBE_DEFLATE 8 /* Deflate compression, as recognized by Adobe */
|
||||||
as recognized by Adobe */
|
|
||||||
/* compression code 32947 is reserved for Oceana Matrix <dev@oceana.com> */
|
/* compression code 32947 is reserved for Oceana Matrix <dev@oceana.com> */
|
||||||
#define COMPRESSION_DCS 32947 /* Kodak DCS encoding */
|
#define COMPRESSION_DCS 32947 /* Kodak DCS encoding */
|
||||||
#define COMPRESSION_JBIG 34661 /* ISO JBIG */
|
#define COMPRESSION_JBIG 34661 /* ISO JBIG */
|
||||||
@ -197,6 +215,7 @@ typedef enum {
|
|||||||
#define COMPRESSION_LZMA 34925 /* LZMA2 */
|
#define COMPRESSION_LZMA 34925 /* LZMA2 */
|
||||||
#define COMPRESSION_ZSTD 50000 /* ZSTD: WARNING not registered in Adobe-maintained registry */
|
#define COMPRESSION_ZSTD 50000 /* ZSTD: WARNING not registered in Adobe-maintained registry */
|
||||||
#define COMPRESSION_WEBP 50001 /* WEBP: WARNING not registered in Adobe-maintained registry */
|
#define COMPRESSION_WEBP 50001 /* WEBP: WARNING not registered in Adobe-maintained registry */
|
||||||
|
#define COMPRESSION_JXL 50002 /* JPEGXL: WARNING not registered in Adobe-maintained registry */
|
||||||
#define TIFFTAG_PHOTOMETRIC 262 /* photometric interpretation */
|
#define TIFFTAG_PHOTOMETRIC 262 /* photometric interpretation */
|
||||||
#define PHOTOMETRIC_MINISWHITE 0 /* min value is white */
|
#define PHOTOMETRIC_MINISWHITE 0 /* min value is white */
|
||||||
#define PHOTOMETRIC_MINISBLACK 1 /* min value is black */
|
#define PHOTOMETRIC_MINISBLACK 1 /* min value is black */
|
||||||
@ -319,14 +338,10 @@ typedef enum {
|
|||||||
#define SAMPLEFORMAT_COMPLEXIEEEFP 6 /* !complex ieee floating */
|
#define SAMPLEFORMAT_COMPLEXIEEEFP 6 /* !complex ieee floating */
|
||||||
#define TIFFTAG_SMINSAMPLEVALUE 340 /* !variable MinSampleValue */
|
#define TIFFTAG_SMINSAMPLEVALUE 340 /* !variable MinSampleValue */
|
||||||
#define TIFFTAG_SMAXSAMPLEVALUE 341 /* !variable MaxSampleValue */
|
#define TIFFTAG_SMAXSAMPLEVALUE 341 /* !variable MaxSampleValue */
|
||||||
#define TIFFTAG_CLIPPATH 343 /* %ClipPath
|
#define TIFFTAG_CLIPPATH 343 /* %ClipPath [Adobe TIFF technote 2] */
|
||||||
[Adobe TIFF technote 2] */
|
#define TIFFTAG_XCLIPPATHUNITS 344 /* %XClipPathUnits [Adobe TIFF technote 2] */
|
||||||
#define TIFFTAG_XCLIPPATHUNITS 344 /* %XClipPathUnits
|
#define TIFFTAG_YCLIPPATHUNITS 345 /* %YClipPathUnits [Adobe TIFF technote 2] */
|
||||||
[Adobe TIFF technote 2] */
|
#define TIFFTAG_INDEXED 346 /* %Indexed [Adobe TIFF Technote 3] */
|
||||||
#define TIFFTAG_YCLIPPATHUNITS 345 /* %YClipPathUnits
|
|
||||||
[Adobe TIFF technote 2] */
|
|
||||||
#define TIFFTAG_INDEXED 346 /* %Indexed
|
|
||||||
[Adobe TIFF Technote 3] */
|
|
||||||
#define TIFFTAG_JPEGTABLES 347 /* %JPEG table stream */
|
#define TIFFTAG_JPEGTABLES 347 /* %JPEG table stream */
|
||||||
#define TIFFTAG_OPIPROXY 351 /* %OPI Proxy [Adobe TIFF technote] */
|
#define TIFFTAG_OPIPROXY 351 /* %OPI Proxy [Adobe TIFF technote] */
|
||||||
/* Tags 400-435 are from the TIFF/FX spec */
|
/* Tags 400-435 are from the TIFF/FX spec */
|
||||||
@ -375,12 +390,11 @@ typedef enum {
|
|||||||
#define YCBCRPOSITION_COSITED 2 /* !as in CCIR 601-1 */
|
#define YCBCRPOSITION_COSITED 2 /* !as in CCIR 601-1 */
|
||||||
#define TIFFTAG_REFERENCEBLACKWHITE 532 /* !colorimetry info */
|
#define TIFFTAG_REFERENCEBLACKWHITE 532 /* !colorimetry info */
|
||||||
#define TIFFTAG_STRIPROWCOUNTS 559 /* !TIFF/FX strip row counts */
|
#define TIFFTAG_STRIPROWCOUNTS 559 /* !TIFF/FX strip row counts */
|
||||||
#define TIFFTAG_XMLPACKET 700 /* %XML packet
|
#define TIFFTAG_XMLPACKET 700 /* %XML packet [Adobe XMP Specification, January 2004 */
|
||||||
[Adobe XMP Specification,
|
#define TIFFTAG_OPIIMAGEID 32781 /* %OPI ImageID [Adobe TIFF technote] */
|
||||||
January 2004 */
|
/* For eiStream Annotation Specification, Version 1.00.06 see
|
||||||
#define TIFFTAG_OPIIMAGEID 32781 /* %OPI ImageID
|
* http://web.archive.org/web/20050309141348/http://www.kofile.com/support%20pro/faqs/annospec.htm */
|
||||||
[Adobe TIFF technote] */
|
#define TIFFTAG_TIFFANNOTATIONDATA 32932
|
||||||
#define TIFFTAG_TIFFANNOTATIONDATA 32932 /* http://web.archive.org/web/20050309141348/http://www.kofile.com/support%20pro/faqs/annospec.htm */
|
|
||||||
/* tags 32952-32956 are private tags registered to Island Graphics */
|
/* tags 32952-32956 are private tags registered to Island Graphics */
|
||||||
#define TIFFTAG_REFPTS 32953 /* image reference points */
|
#define TIFFTAG_REFPTS 32953 /* image reference points */
|
||||||
#define TIFFTAG_REGIONTACKPOINT 32954 /* region-xform tack point */
|
#define TIFFTAG_REGIONTACKPOINT 32954 /* region-xform tack point */
|
||||||
@ -411,21 +425,24 @@ typedef enum {
|
|||||||
#define TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA 33306
|
#define TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA 33306
|
||||||
/* tag 33405 is a private tag registered to Eastman Kodak */
|
/* tag 33405 is a private tag registered to Eastman Kodak */
|
||||||
#define TIFFTAG_WRITERSERIALNUMBER 33405 /* device serial number */
|
#define TIFFTAG_WRITERSERIALNUMBER 33405 /* device serial number */
|
||||||
#define TIFFTAG_CFAREPEATPATTERNDIM 33421 /* dimensions of CFA pattern */
|
#define TIFFTAG_CFAREPEATPATTERNDIM 33421 /* (alias for TIFFTAG_EP_CFAREPEATPATTERNDIM)*/
|
||||||
#define TIFFTAG_CFAPATTERN 33422 /* color filter array pattern */
|
#define TIFFTAG_CFAPATTERN 33422 /* (alias for TIFFTAG_EP_CFAPATTERN) */
|
||||||
|
#define TIFFTAG_BATTERYLEVEL 33423 /* (alias for TIFFTAG_EP_BATTERYLEVEL) */
|
||||||
/* tag 33432 is listed in the 6.0 spec w/ unknown ownership */
|
/* tag 33432 is listed in the 6.0 spec w/ unknown ownership */
|
||||||
#define TIFFTAG_COPYRIGHT 33432 /* copyright string */
|
#define TIFFTAG_COPYRIGHT 33432 /* copyright string */
|
||||||
/* Tags 33445-33452 are used for GEL fileformat, see
|
/* Tags 33445-33452 are used for Molecular Dynamics GEL fileformat,
|
||||||
* http://research.stowers-institute.org/mcm/efg/ScientificSoftware/Utility/TiffTags/GEL-FileFormat.pdf
|
* see http://research.stowers-institute.org/mcm/efg/ScientificSoftware/Utility/TiffTags/GEL-FileFormat.pdf
|
||||||
|
* (2023: the above web site is unavailable but tags are explained briefly at
|
||||||
|
* https://www.awaresystems.be/imaging/tiff/tifftags/docs/gel.html
|
||||||
*/
|
*/
|
||||||
#define TIFFTAG_MD_FILETAG 33445 /* http://research.stowers-institute.org/mcm/efg/ScientificSoftware/Utility/TiffTags/GEL-FileFormat.pdf */
|
#define TIFFTAG_MD_FILETAG 33445 /* Specifies the pixel data format encoding in the GEL file format. */
|
||||||
#define TIFFTAG_MD_SCALEPIXEL 33446 /* http://research.stowers-institute.org/mcm/efg/ScientificSoftware/Utility/TiffTags/GEL-FileFormat.pdf */
|
#define TIFFTAG_MD_SCALEPIXEL 33446 /* scale factor */
|
||||||
#define TIFFTAG_MD_COLORTABLE 33447 /* http://research.stowers-institute.org/mcm/efg/ScientificSoftware/Utility/TiffTags/GEL-FileFormat.pdf */
|
#define TIFFTAG_MD_COLORTABLE 33447 /* conversion from 16bit to 8bit */
|
||||||
#define TIFFTAG_MD_LABNAME 33448 /* http://research.stowers-institute.org/mcm/efg/ScientificSoftware/Utility/TiffTags/GEL-FileFormat.pdf */
|
#define TIFFTAG_MD_LABNAME 33448 /* name of the lab that scanned this file. */
|
||||||
#define TIFFTAG_MD_SAMPLEINFO 33449 /* http://research.stowers-institute.org/mcm/efg/ScientificSoftware/Utility/TiffTags/GEL-FileFormat.pdf */
|
#define TIFFTAG_MD_SAMPLEINFO 33449 /* information about the scanned GEL sample */
|
||||||
#define TIFFTAG_MD_PREPDATE 33450 /* http://research.stowers-institute.org/mcm/efg/ScientificSoftware/Utility/TiffTags/GEL-FileFormat.pdf */
|
#define TIFFTAG_MD_PREPDATE 33450 /* information about the date the sample was prepared YY/MM/DD */
|
||||||
#define TIFFTAG_MD_PREPTIME 33451 /* http://research.stowers-institute.org/mcm/efg/ScientificSoftware/Utility/TiffTags/GEL-FileFormat.pdf */
|
#define TIFFTAG_MD_PREPTIME 33451 /* information about the time the sample was prepared HH:MM*/
|
||||||
#define TIFFTAG_MD_FILEUNITS 33452 /* http://research.stowers-institute.org/mcm/efg/ScientificSoftware/Utility/TiffTags/GEL-FileFormat.pdf */
|
#define TIFFTAG_MD_FILEUNITS 33452 /* Units for data in this file, as used in the GEL file format. */
|
||||||
/* IPTC TAG from RichTIFF specifications */
|
/* IPTC TAG from RichTIFF specifications */
|
||||||
#define TIFFTAG_RICHTIFFIPTC 33723
|
#define TIFFTAG_RICHTIFFIPTC 33723
|
||||||
#define TIFFTAG_INGR_PACKET_DATA_TAG 33918 /* Intergraph Application specific storage. */
|
#define TIFFTAG_INGR_PACKET_DATA_TAG 33918 /* Intergraph Application specific storage. */
|
||||||
@ -448,8 +465,7 @@ typedef enum {
|
|||||||
#define TIFFTAG_IT8TRANSPARENCYINDICATOR 34028 /* HC transparency switch */
|
#define TIFFTAG_IT8TRANSPARENCYINDICATOR 34028 /* HC transparency switch */
|
||||||
#define TIFFTAG_IT8COLORCHARACTERIZATION 34029 /* color character. table */
|
#define TIFFTAG_IT8COLORCHARACTERIZATION 34029 /* color character. table */
|
||||||
#define TIFFTAG_IT8HCUSAGE 34030 /* HC usage indicator */
|
#define TIFFTAG_IT8HCUSAGE 34030 /* HC usage indicator */
|
||||||
#define TIFFTAG_IT8TRAPINDICATOR 34031 /* Trapping indicator
|
#define TIFFTAG_IT8TRAPINDICATOR 34031 /* Trapping indicator (untrapped=0, trapped=1) */
|
||||||
(untrapped=0, trapped=1) */
|
|
||||||
#define TIFFTAG_IT8CMYKEQUIVALENT 34032 /* CMYK color equivalents */
|
#define TIFFTAG_IT8CMYKEQUIVALENT 34032 /* CMYK color equivalents */
|
||||||
/* tags 34232-34236 are private tags registered to Texas Instruments */
|
/* tags 34232-34236 are private tags registered to Texas Instruments */
|
||||||
#define TIFFTAG_FRAMECOUNT 34232 /* Sequence Frame Count */
|
#define TIFFTAG_FRAMECOUNT 34232 /* Sequence Frame Count */
|
||||||
@ -463,9 +479,9 @@ typedef enum {
|
|||||||
#define TIFFTAG_IMAGELAYER 34732 /* !TIFF/FX image layer information */
|
#define TIFFTAG_IMAGELAYER 34732 /* !TIFF/FX image layer information */
|
||||||
/* tag 34750 is a private tag registered to Pixel Magic */
|
/* tag 34750 is a private tag registered to Pixel Magic */
|
||||||
#define TIFFTAG_JBIGOPTIONS 34750 /* JBIG options */
|
#define TIFFTAG_JBIGOPTIONS 34750 /* JBIG options */
|
||||||
#define TIFFTAG_GPSIFD 34853 /* Pointer to GPS private directory */
|
#define TIFFTAG_GPSIFD 34853 /* Pointer to EXIF GPS private directory */
|
||||||
/* tags 34908-34914 are private tags registered to SGI */
|
/* tags 34908-34914 are private tags registered to SGI */
|
||||||
#define TIFFTAG_FAXRECVPARAMS 34908 /* encoded Class 2 ses. parms */
|
#define TIFFTAG_FAXRECVPARAMS 34908 /* encoded Class 2 ses. params */
|
||||||
#define TIFFTAG_FAXSUBADDRESS 34909 /* received SubAddr string */
|
#define TIFFTAG_FAXSUBADDRESS 34909 /* received SubAddr string */
|
||||||
#define TIFFTAG_FAXRECVTIME 34910 /* receive time (secs) */
|
#define TIFFTAG_FAXRECVTIME 34910 /* receive time (secs) */
|
||||||
#define TIFFTAG_FAXDCS 34911 /* encoded fax ses. params, Table 2/T.30 */
|
#define TIFFTAG_FAXDCS 34911 /* encoded fax ses. params, Table 2/T.30 */
|
||||||
@ -474,106 +490,193 @@ typedef enum {
|
|||||||
/* tag 34929 is a private tag registered to FedEx */
|
/* tag 34929 is a private tag registered to FedEx */
|
||||||
#define TIFFTAG_FEDEX_EDR 34929 /* unknown use */
|
#define TIFFTAG_FEDEX_EDR 34929 /* unknown use */
|
||||||
#define TIFFTAG_IMAGESOURCEDATA 37724 /* http://justsolve.archiveteam.org/wiki/PSD, http://www.adobe.com/devnet-apps/photoshop/fileformatashtml/ */
|
#define TIFFTAG_IMAGESOURCEDATA 37724 /* http://justsolve.archiveteam.org/wiki/PSD, http://www.adobe.com/devnet-apps/photoshop/fileformatashtml/ */
|
||||||
#define TIFFTAG_INTEROPERABILITYIFD 40965 /* Pointer to Interoperability private directory */
|
#define TIFFTAG_INTEROPERABILITYIFD 40965 /* Pointer to EXIF Interoperability private directory */
|
||||||
#define TIFFTAG_GDAL_METADATA 42112 /* Used by the GDAL library */
|
#define TIFFTAG_GDAL_METADATA 42112 /* Used by the GDAL library */
|
||||||
#define TIFFTAG_GDAL_NODATA 42113 /* Used by the GDAL library */
|
#define TIFFTAG_GDAL_NODATA 42113 /* Used by the GDAL library */
|
||||||
#define TIFFTAG_OCE_SCANJOB_DESCRIPTION 50215 /* Used in the Oce scanning process */
|
#define TIFFTAG_OCE_SCANJOB_DESCRIPTION 50215 /* Used in the Oce scanning process */
|
||||||
#define TIFFTAG_OCE_APPLICATION_SELECTOR 50216 /* Used in the Oce scanning process. */
|
#define TIFFTAG_OCE_APPLICATION_SELECTOR 50216 /* Used in the Oce scanning process. */
|
||||||
#define TIFFTAG_OCE_IDENTIFICATION_NUMBER 50217
|
#define TIFFTAG_OCE_IDENTIFICATION_NUMBER 50217
|
||||||
#define TIFFTAG_OCE_IMAGELOGIC_CHARACTERISTICS 50218
|
#define TIFFTAG_OCE_IMAGELOGIC_CHARACTERISTICS 50218
|
||||||
|
|
||||||
/* tags 50674 to 50677 are reserved for ESRI */
|
/* tags 50674 to 50677 are reserved for ESRI */
|
||||||
#define TIFFTAG_LERC_PARAMETERS 50674 /* Stores LERC version and additional compression method */
|
#define TIFFTAG_LERC_PARAMETERS 50674 /* Stores LERC version and additional compression method */
|
||||||
|
|
||||||
/* Adobe Digital Negative (DNG) format tags */
|
/* Adobe Digital Negative (DNG) format tags */
|
||||||
#define TIFFTAG_DNGVERSION 50706 /* &DNG version number */
|
#define TIFFTAG_DNGVERSION 50706 /* &DNG version number */
|
||||||
#define TIFFTAG_DNGBACKWARDVERSION 50707 /* &DNG compatibility version */
|
#define TIFFTAG_DNGBACKWARDVERSION 50707 /* &DNG compatibility version */
|
||||||
#define TIFFTAG_UNIQUECAMERAMODEL 50708 /* &name for the camera model */
|
#define TIFFTAG_UNIQUECAMERAMODEL 50708 /* &name for the camera model */
|
||||||
#define TIFFTAG_LOCALIZEDCAMERAMODEL 50709 /* &localized camera model
|
#define TIFFTAG_LOCALIZEDCAMERAMODEL 50709 /* &localized camera model name (UTF-8) */
|
||||||
name */
|
#define TIFFTAG_CFAPLANECOLOR 50710 /* &CFAPattern->LinearRaw space mapping */
|
||||||
#define TIFFTAG_CFAPLANECOLOR 50710 /* &CFAPattern->LinearRaw space
|
|
||||||
mapping */
|
|
||||||
#define TIFFTAG_CFALAYOUT 50711 /* &spatial layout of the CFA */
|
#define TIFFTAG_CFALAYOUT 50711 /* &spatial layout of the CFA */
|
||||||
#define TIFFTAG_LINEARIZATIONTABLE 50712 /* &lookup table description */
|
#define TIFFTAG_LINEARIZATIONTABLE 50712 /* &lookup table description */
|
||||||
#define TIFFTAG_BLACKLEVELREPEATDIM 50713 /* &repeat pattern size for
|
#define TIFFTAG_BLACKLEVELREPEATDIM 50713 /* &repeat pattern size for the BlackLevel tag */
|
||||||
the BlackLevel tag */
|
|
||||||
#define TIFFTAG_BLACKLEVEL 50714 /* &zero light encoding level */
|
#define TIFFTAG_BLACKLEVEL 50714 /* &zero light encoding level */
|
||||||
#define TIFFTAG_BLACKLEVELDELTAH 50715 /* &zero light encoding level
|
#define TIFFTAG_BLACKLEVELDELTAH 50715 /* &zero light encoding level differences (columns) */
|
||||||
differences (columns) */
|
#define TIFFTAG_BLACKLEVELDELTAV 50716 /* &zero light encoding level differences (rows) */
|
||||||
#define TIFFTAG_BLACKLEVELDELTAV 50716 /* &zero light encoding level
|
#define TIFFTAG_WHITELEVEL 50717 /* &fully saturated encoding level */
|
||||||
differences (rows) */
|
|
||||||
#define TIFFTAG_WHITELEVEL 50717 /* &fully saturated encoding
|
|
||||||
level */
|
|
||||||
#define TIFFTAG_DEFAULTSCALE 50718 /* &default scale factors */
|
#define TIFFTAG_DEFAULTSCALE 50718 /* &default scale factors */
|
||||||
#define TIFFTAG_DEFAULTCROPORIGIN 50719 /* &origin of the final image
|
#define TIFFTAG_DEFAULTCROPORIGIN 50719 /* &origin of the final image area */
|
||||||
area */
|
#define TIFFTAG_DEFAULTCROPSIZE 50720 /* &size of the final image area */
|
||||||
#define TIFFTAG_DEFAULTCROPSIZE 50720 /* &size of the final image
|
#define TIFFTAG_COLORMATRIX1 50721 /* &XYZ->reference color space transformation matrix 1 */
|
||||||
area */
|
#define TIFFTAG_COLORMATRIX2 50722 /* &XYZ->reference color space transformation matrix 2 */
|
||||||
#define TIFFTAG_COLORMATRIX1 50721 /* &XYZ->reference color space
|
|
||||||
transformation matrix 1 */
|
|
||||||
#define TIFFTAG_COLORMATRIX2 50722 /* &XYZ->reference color space
|
|
||||||
transformation matrix 2 */
|
|
||||||
#define TIFFTAG_CAMERACALIBRATION1 50723 /* &calibration matrix 1 */
|
#define TIFFTAG_CAMERACALIBRATION1 50723 /* &calibration matrix 1 */
|
||||||
#define TIFFTAG_CAMERACALIBRATION2 50724 /* &calibration matrix 2 */
|
#define TIFFTAG_CAMERACALIBRATION2 50724 /* &calibration matrix 2 */
|
||||||
#define TIFFTAG_REDUCTIONMATRIX1 50725 /* &dimensionality reduction
|
#define TIFFTAG_REDUCTIONMATRIX1 50725 /* &dimensionality reduction matrix 1 */
|
||||||
matrix 1 */
|
#define TIFFTAG_REDUCTIONMATRIX2 50726 /* &dimensionality reduction matrix 2 */
|
||||||
#define TIFFTAG_REDUCTIONMATRIX2 50726 /* &dimensionality reduction
|
#define TIFFTAG_ANALOGBALANCE 50727 /* &gain applied the stored raw values*/
|
||||||
matrix 2 */
|
#define TIFFTAG_ASSHOTNEUTRAL 50728 /* &selected white balance in linear reference space */
|
||||||
#define TIFFTAG_ANALOGBALANCE 50727 /* &gain applied the stored raw
|
#define TIFFTAG_ASSHOTWHITEXY 50729 /* &selected white balance in x-y chromaticity coordinates */
|
||||||
values*/
|
#define TIFFTAG_BASELINEEXPOSURE 50730 /* &how much to move the zero point */
|
||||||
#define TIFFTAG_ASSHOTNEUTRAL 50728 /* &selected white balance in
|
|
||||||
linear reference space */
|
|
||||||
#define TIFFTAG_ASSHOTWHITEXY 50729 /* &selected white balance in
|
|
||||||
x-y chromaticity
|
|
||||||
coordinates */
|
|
||||||
#define TIFFTAG_BASELINEEXPOSURE 50730 /* &how much to move the zero
|
|
||||||
point */
|
|
||||||
#define TIFFTAG_BASELINENOISE 50731 /* &relative noise level */
|
#define TIFFTAG_BASELINENOISE 50731 /* &relative noise level */
|
||||||
#define TIFFTAG_BASELINESHARPNESS 50732 /* &relative amount of
|
#define TIFFTAG_BASELINESHARPNESS 50732 /* &relative amount of sharpening */
|
||||||
sharpening */
|
/* TIFFTAG_BAYERGREENSPLIT: &how closely the values of the green pixels in the blue/green rows
|
||||||
#define TIFFTAG_BAYERGREENSPLIT 50733 /* &how closely the values of
|
* track the values of the green pixels in the red/green rows */
|
||||||
the green pixels in the
|
#define TIFFTAG_BAYERGREENSPLIT 50733
|
||||||
blue/green rows track the
|
|
||||||
values of the green pixels
|
|
||||||
in the red/green rows */
|
|
||||||
#define TIFFTAG_LINEARRESPONSELIMIT 50734 /* &non-linear encoding range */
|
#define TIFFTAG_LINEARRESPONSELIMIT 50734 /* &non-linear encoding range */
|
||||||
#define TIFFTAG_CAMERASERIALNUMBER 50735 /* &camera's serial number */
|
#define TIFFTAG_CAMERASERIALNUMBER 50735 /* &camera's serial number */
|
||||||
#define TIFFTAG_LENSINFO 50736 /* info about the lens */
|
#define TIFFTAG_LENSINFO 50736 /* info about the lens */
|
||||||
#define TIFFTAG_CHROMABLURRADIUS 50737 /* &chroma blur radius */
|
#define TIFFTAG_CHROMABLURRADIUS 50737 /* &chroma blur radius */
|
||||||
#define TIFFTAG_ANTIALIASSTRENGTH 50738 /* &relative strength of the
|
#define TIFFTAG_ANTIALIASSTRENGTH 50738 /* &relative strength of the camera's anti-alias filter */
|
||||||
camera's anti-alias filter */
|
|
||||||
#define TIFFTAG_SHADOWSCALE 50739 /* &used by Adobe Camera Raw */
|
#define TIFFTAG_SHADOWSCALE 50739 /* &used by Adobe Camera Raw */
|
||||||
#define TIFFTAG_DNGPRIVATEDATA 50740 /* &manufacturer's private data */
|
#define TIFFTAG_DNGPRIVATEDATA 50740 /* &manufacturer's private data */
|
||||||
#define TIFFTAG_MAKERNOTESAFETY 50741 /* &whether the EXIF MakerNote
|
#define TIFFTAG_MAKERNOTESAFETY 50741 /* &whether the EXIF MakerNote tag is safe to preserve along with the rest of the EXIF data */
|
||||||
tag is safe to preserve
|
|
||||||
along with the rest of the
|
|
||||||
EXIF data */
|
|
||||||
#define TIFFTAG_CALIBRATIONILLUMINANT1 50778 /* &illuminant 1 */
|
#define TIFFTAG_CALIBRATIONILLUMINANT1 50778 /* &illuminant 1 */
|
||||||
#define TIFFTAG_CALIBRATIONILLUMINANT2 50779 /* &illuminant 2 */
|
#define TIFFTAG_CALIBRATIONILLUMINANT2 50779 /* &illuminant 2 */
|
||||||
#define TIFFTAG_BESTQUALITYSCALE 50780 /* &best quality multiplier */
|
#define TIFFTAG_BESTQUALITYSCALE 50780 /* &best quality multiplier */
|
||||||
#define TIFFTAG_RAWDATAUNIQUEID 50781 /* &unique identifier for
|
#define TIFFTAG_RAWDATAUNIQUEID 50781 /* &unique identifier for the raw image data */
|
||||||
the raw image data */
|
#define TIFFTAG_ORIGINALRAWFILENAME 50827 /* &file name of the original raw file (UTF-8) */
|
||||||
#define TIFFTAG_ORIGINALRAWFILENAME 50827 /* &file name of the original
|
#define TIFFTAG_ORIGINALRAWFILEDATA 50828 /* &contents of the original raw file */
|
||||||
raw file */
|
#define TIFFTAG_ACTIVEAREA 50829 /* &active (non-masked) pixels of the sensor */
|
||||||
#define TIFFTAG_ORIGINALRAWFILEDATA 50828 /* &contents of the original
|
#define TIFFTAG_MASKEDAREAS 50830 /* &list of coordinates of fully masked pixels */
|
||||||
raw file */
|
|
||||||
#define TIFFTAG_ACTIVEAREA 50829 /* &active (non-masked) pixels
|
|
||||||
of the sensor */
|
|
||||||
#define TIFFTAG_MASKEDAREAS 50830 /* &list of coordinates
|
|
||||||
of fully masked pixels */
|
|
||||||
#define TIFFTAG_ASSHOTICCPROFILE 50831 /* &these two tags used to */
|
#define TIFFTAG_ASSHOTICCPROFILE 50831 /* &these two tags used to */
|
||||||
#define TIFFTAG_ASSHOTPREPROFILEMATRIX 50832 /* map cameras's color space
|
#define TIFFTAG_ASSHOTPREPROFILEMATRIX 50832 /* map cameras's color space into ICC profile space */
|
||||||
into ICC profile space */
|
|
||||||
#define TIFFTAG_CURRENTICCPROFILE 50833 /* & */
|
#define TIFFTAG_CURRENTICCPROFILE 50833 /* & */
|
||||||
#define TIFFTAG_CURRENTPREPROFILEMATRIX 50834 /* & */
|
#define TIFFTAG_CURRENTPREPROFILEMATRIX 50834 /* & */
|
||||||
|
|
||||||
#define TIFFTAG_RPCCOEFFICIENT 50844 /* Define by GDAL for geospatial georeferencing through RPC: http://geotiff.maptools.org/rpc_prop.html */
|
/* DNG 1.2.0.0 */
|
||||||
|
#define TIFFTAG_COLORIMETRICREFERENCE 50879 /* &colorimetric reference */
|
||||||
|
#define TIFFTAG_CAMERACALIBRATIONSIGNATURE 50931 /* &camera calibration signature (UTF-8) */
|
||||||
|
#define TIFFTAG_PROFILECALIBRATIONSIGNATURE 50932 /* &profile calibration signature (UTF-8) */
|
||||||
|
/* TIFFTAG_EXTRACAMERAPROFILES 50933 &extra camera profiles : is already defined for GeoTIFF DGIWG */
|
||||||
|
#define TIFFTAG_ASSHOTPROFILENAME 50934 /* &as shot profile name (UTF-8) */
|
||||||
|
#define TIFFTAG_NOISEREDUCTIONAPPLIED 50935 /* &amount of applied noise reduction */
|
||||||
|
#define TIFFTAG_PROFILENAME 50936 /* &camera profile name (UTF-8) */
|
||||||
|
#define TIFFTAG_PROFILEHUESATMAPDIMS 50937 /* &dimensions of HSV mapping */
|
||||||
|
#define TIFFTAG_PROFILEHUESATMAPDATA1 50938 /* &first HSV mapping table */
|
||||||
|
#define TIFFTAG_PROFILEHUESATMAPDATA2 50939 /* &second HSV mapping table */
|
||||||
|
#define TIFFTAG_PROFILETONECURVE 50940 /* &default tone curve */
|
||||||
|
#define TIFFTAG_PROFILEEMBEDPOLICY 50941 /* &profile embedding policy */
|
||||||
|
#define TIFFTAG_PROFILECOPYRIGHT 50942 /* &profile copyright information (UTF-8) */
|
||||||
|
#define TIFFTAG_FORWARDMATRIX1 50964 /* &matrix for mapping white balanced camera colors to XYZ D50 */
|
||||||
|
#define TIFFTAG_FORWARDMATRIX2 50965 /* &matrix for mapping white balanced camera colors to XYZ D50 */
|
||||||
|
#define TIFFTAG_PREVIEWAPPLICATIONNAME 50966 /* &name of application that created preview (UTF-8) */
|
||||||
|
#define TIFFTAG_PREVIEWAPPLICATIONVERSION 50967 /* &version of application that created preview (UTF-8) */
|
||||||
|
#define TIFFTAG_PREVIEWSETTINGSNAME 50968 /* &name of conversion settings (UTF-8) */
|
||||||
|
#define TIFFTAG_PREVIEWSETTINGSDIGEST 50969 /* &unique id of conversion settings */
|
||||||
|
#define TIFFTAG_PREVIEWCOLORSPACE 50970 /* &preview color space */
|
||||||
|
#define TIFFTAG_PREVIEWDATETIME 50971 /* &date/time preview was rendered */
|
||||||
|
#define TIFFTAG_RAWIMAGEDIGEST 50972 /* &md5 of raw image data */
|
||||||
|
#define TIFFTAG_ORIGINALRAWFILEDIGEST 50973 /* &md5 of the data stored in the OriginalRawFileData tag */
|
||||||
|
#define TIFFTAG_SUBTILEBLOCKSIZE 50974 /* &subtile block size */
|
||||||
|
#define TIFFTAG_ROWINTERLEAVEFACTOR 50975 /* &number of interleaved fields */
|
||||||
|
#define TIFFTAG_PROFILELOOKTABLEDIMS 50981 /* &num of input samples in each dim of default "look" table */
|
||||||
|
#define TIFFTAG_PROFILELOOKTABLEDATA 50982 /* &default "look" table for use as starting point */
|
||||||
|
|
||||||
|
/* DNG 1.3.0.0 */
|
||||||
|
#define TIFFTAG_OPCODELIST1 51008 /* &opcodes that should be applied to raw image after reading */
|
||||||
|
#define TIFFTAG_OPCODELIST2 51009 /* &opcodes that should be applied after mapping to linear reference */
|
||||||
|
#define TIFFTAG_OPCODELIST3 51022 /* &opcodes that should be applied after demosaicing */
|
||||||
|
#define TIFFTAG_NOISEPROFILE 51041 /* &noise profile */
|
||||||
|
|
||||||
|
/* DNG 1.4.0.0 */
|
||||||
|
#define TIFFTAG_DEFAULTUSERCROP 51125 /* &default user crop rectangle in relative coords */
|
||||||
|
#define TIFFTAG_DEFAULTBLACKRENDER 51110 /* &black rendering hint */
|
||||||
|
#define TIFFTAG_BASELINEEXPOSUREOFFSET 51109 /* &baseline exposure offset */
|
||||||
|
#define TIFFTAG_PROFILELOOKTABLEENCODING 51108 /* &3D LookTable indexing conversion */
|
||||||
|
#define TIFFTAG_PROFILEHUESATMAPENCODING 51107 /* &3D HueSatMap indexing conversion */
|
||||||
|
#define TIFFTAG_ORIGINALDEFAULTFINALSIZE 51089 /* &default final size of larger original file for this proxy */
|
||||||
|
#define TIFFTAG_ORIGINALBESTQUALITYFINALSIZE 51090 /* &best quality final size of larger original file for this proxy */
|
||||||
|
#define TIFFTAG_ORIGINALDEFAULTCROPSIZE 51091 /* &the default crop size of larger original file for this proxy */
|
||||||
|
#define TIFFTAG_NEWRAWIMAGEDIGEST 51111 /* &modified MD5 digest of the raw image data */
|
||||||
|
#define TIFFTAG_RAWTOPREVIEWGAIN 51112 /* &The gain between the main raw FD and the preview IFD containing this tag */
|
||||||
|
|
||||||
|
/* DNG 1.5.0.0 */
|
||||||
|
#define TIFFTAG_DEPTHFORMAT 51177 /* &encoding of the depth data in the file */
|
||||||
|
#define TIFFTAG_DEPTHNEAR 51178 /* &distance from the camera represented by value 0 in the depth map */
|
||||||
|
#define TIFFTAG_DEPTHFAR 51179 /* &distance from the camera represented by the maximum value in the depth map */
|
||||||
|
#define TIFFTAG_DEPTHUNITS 51180 /* &measurement units for DepthNear and DepthFar */
|
||||||
|
#define TIFFTAG_DEPTHMEASURETYPE 51181 /* &measurement geometry for the depth map */
|
||||||
|
#define TIFFTAG_ENHANCEPARAMS 51182 /* &a string that documents how the enhanced image data was processed. */
|
||||||
|
|
||||||
|
/* DNG 1.6.0.0 */
|
||||||
|
#define TIFFTAG_PROFILEGAINTABLEMAP 52525 /* &spatially varying gain tables that can be applied as starting point */
|
||||||
|
#define TIFFTAG_SEMANTICNAME 52526 /* &a string that identifies the semantic mask */
|
||||||
|
#define TIFFTAG_SEMANTICINSTANCEID 52528 /* &a string that identifies a specific instance in a semantic mask */
|
||||||
|
#define TIFFTAG_MASKSUBAREA 52536 /* &the crop rectangle of this IFD's mask, relative to the main image */
|
||||||
|
#define TIFFTAG_RGBTABLES 52543 /* &color transforms to apply to masked image regions */
|
||||||
|
#define TIFFTAG_CALIBRATIONILLUMINANT3 52529 /* &the illuminant used for the third set of color calibration tags */
|
||||||
|
#define TIFFTAG_COLORMATRIX3 52531 /* &matrix to convert XYZ values to reference camera native color space under CalibrationIlluminant3 */
|
||||||
|
#define TIFFTAG_CAMERACALIBRATION3 52530 /* &matrix to transform reference camera native space values to individual camera native space values under CalibrationIlluminant3 */
|
||||||
|
#define TIFFTAG_REDUCTIONMATRIX3 52538 /* &dimensionality reduction matrix for use in color conversion to XYZ under CalibrationIlluminant3 */
|
||||||
|
#define TIFFTAG_PROFILEHUESATMAPDATA3 52537 /* &the data for the third HSV table */
|
||||||
|
#define TIFFTAG_FORWARDMATRIX3 52532 /* &matrix to map white balanced camera colors to XYZ D50 */
|
||||||
|
#define TIFFTAG_ILLUMINANTDATA1 52533 /* &data for the first calibration illuminant */
|
||||||
|
#define TIFFTAG_ILLUMINANTDATA2 52534 /* &data for the second calibration illuminant */
|
||||||
|
#define TIFFTAG_ILLUMINANTDATA3 53535 /* &data for the third calibration illuminant */
|
||||||
|
|
||||||
|
/* TIFF/EP */
|
||||||
|
#define TIFFTAG_EP_CFAREPEATPATTERNDIM 33421 /* dimensions of CFA pattern */
|
||||||
|
#define TIFFTAG_EP_CFAPATTERN 33422 /* color filter array pattern */
|
||||||
|
#define TIFFTAG_EP_BATTERYLEVEL 33423 /* battery level (rational or ASCII) */
|
||||||
|
#define TIFFTAG_EP_INTERLACE 34857 /* Number of multi-field images */
|
||||||
|
/* TIFFTAG_EP_IPTC_NAA and TIFFTAG_RICHTIFFIPTC share the same tag number (33723)
|
||||||
|
* LibTIFF type is UNDEFINED or BYTE, but often times incorrectly specified as LONG,
|
||||||
|
* because TIFF/EP (ISO/DIS 12234-2) specifies type LONG or ASCII. */
|
||||||
|
#define TIFFTAG_EP_IPTC_NAA 33723 /* Alias IPTC/NAA Newspaper Association RichTIFF */
|
||||||
|
#define TIFFTAG_EP_TIMEZONEOFFSET 34858 /* Time zone offset relative to UTC */
|
||||||
|
#define TIFFTAG_EP_SELFTIMERMODE 34859 /* Number of seconds capture was delayed from button press */
|
||||||
|
#define TIFFTAG_EP_FLASHENERGY 37387 /* Flash energy, or range if there is uncertainty */
|
||||||
|
#define TIFFTAG_EP_SPATIALFREQUENCYRESPONSE 37388 /* Spatial frequency response */
|
||||||
|
#define TIFFTAG_EP_NOISE 37389 /* Camera noise measurement values */
|
||||||
|
#define TIFFTAG_EP_FOCALPLANEXRESOLUTION 37390 /* Focal plane X resolution */
|
||||||
|
#define TIFFTAG_EP_FOCALPLANEYRESOLUTION 37391 /* Focal plane Y resolution */
|
||||||
|
#define TIFFTAG_EP_FOCALPLANERESOLUTIONUNIT 37392 /* Focal plane resolution unit */
|
||||||
|
#define TIFFTAG_EP_IMAGENUMBER 37393 /* Number of image when several of burst shot stored in same TIFF/EP */
|
||||||
|
#define TIFFTAG_EP_SECURITYCLASSIFICATION 37394 /* Security classification */
|
||||||
|
#define TIFFTAG_EP_IMAGEHISTORY 37395 /* Record of what has been done to the image */
|
||||||
|
#define TIFFTAG_EP_EXPOSUREINDEX 37397 /* Exposure index */
|
||||||
|
#define TIFFTAG_EP_STANDARDID 37398 /* TIFF/EP standard version, n.n.n.n */
|
||||||
|
#define TIFFTAG_EP_SENSINGMETHOD 37399 /* Type of image sensor */
|
||||||
|
/*
|
||||||
|
* TIFF/EP tags equivalent to EXIF tags
|
||||||
|
* Note that TIFF-EP and EXIF use nearly the same metadata tag set, but TIFF-EP stores the tags in IFD 0,
|
||||||
|
* while EXIF store the tags in a separate IFD. Either location is allowed by DNG, but the EXIF location is preferred.
|
||||||
|
*/
|
||||||
|
#define TIFFTAG_EP_EXPOSURETIME 33434 /* Exposure time */
|
||||||
|
#define TIFFTAG_EP_FNUMBER 33437 /* F number */
|
||||||
|
#define TIFFTAG_EP_EXPOSUREPROGRAM 34850 /* Exposure program */
|
||||||
|
#define TIFFTAG_EP_SPECTRALSENSITIVITY 34852 /* Spectral sensitivity */
|
||||||
|
#define TIFFTAG_EP_ISOSPEEDRATINGS 34855 /* ISO speed rating */
|
||||||
|
#define TIFFTAG_EP_OECF 34856 /* Optoelectric conversion factor */
|
||||||
|
#define TIFFTAG_EP_DATETIMEORIGINAL 36867 /* Date and time of original data generation */
|
||||||
|
#define TIFFTAG_EP_COMPRESSEDBITSPERPIXEL 37122 /* Image compression mode */
|
||||||
|
#define TIFFTAG_EP_SHUTTERSPEEDVALUE 37377 /* Shutter speed */
|
||||||
|
#define TIFFTAG_EP_APERTUREVALUE 37378 /* Aperture */
|
||||||
|
#define TIFFTAG_EP_BRIGHTNESSVALUE 37379 /* Brightness */
|
||||||
|
#define TIFFTAG_EP_EXPOSUREBIASVALUE 37380 /* Exposure bias */
|
||||||
|
#define TIFFTAG_EP_MAXAPERTUREVALUE 37381 /* Maximum lens aperture */
|
||||||
|
#define TIFFTAG_EP_SUBJECTDISTANCE 37382 /* Subject distance */
|
||||||
|
#define TIFFTAG_EP_METERINGMODE 37383 /* Metering mode */
|
||||||
|
#define TIFFTAG_EP_LIGHTSOURCE 37384 /* Light source */
|
||||||
|
#define TIFFTAG_EP_FLASH 37385 /* Flash */
|
||||||
|
#define TIFFTAG_EP_FOCALLENGTH 37386 /* Lens focal length */
|
||||||
|
#define TIFFTAG_EP_SUBJECTLOCATION 37396 /* Subject location (area) */
|
||||||
|
|
||||||
|
#define TIFFTAG_RPCCOEFFICIENT 50844 /* Define by GDAL for geospatial georeferencing through RPC: http://geotiff.maptools.org/rpc_prop.html */
|
||||||
#define TIFFTAG_ALIAS_LAYER_METADATA 50784 /* Alias Sketchbook Pro layer usage description. */
|
#define TIFFTAG_ALIAS_LAYER_METADATA 50784 /* Alias Sketchbook Pro layer usage description. */
|
||||||
|
|
||||||
/* GeoTIFF DGIWG */
|
/* GeoTIFF DGIWG */
|
||||||
#define TIFFTAG_TIFF_RSID 50908 /* https://www.awaresystems.be/imaging/tiff/tifftags/tiff_rsid.html */
|
#define TIFFTAG_TIFF_RSID 50908 /* https://www.awaresystems.be/imaging/tiff/tifftags/tiff_rsid.html */
|
||||||
#define TIFFTAG_GEO_METADATA 50909 /* https://www.awaresystems.be/imaging/tiff/tifftags/geo_metadata.html */
|
#define TIFFTAG_GEO_METADATA 50909 /* https://www.awaresystems.be/imaging/tiff/tifftags/geo_metadata.html */
|
||||||
|
|
||||||
#define TIFFTAG_EXTRACAMERAPROFILES 50933 /* http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/products/photoshop/pdfs/dng_spec_1.4.0.0.pdf */
|
#define TIFFTAG_EXTRACAMERAPROFILES 50933 /* http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/products/photoshop/pdfs/dng_spec_1.4.0.0.pdf */
|
||||||
|
|
||||||
/* tag 65535 is an undefined tag used by Eastman Kodak */
|
/* tag 65535 is an undefined tag used by Eastman Kodak */
|
||||||
@ -658,6 +761,7 @@ typedef enum {
|
|||||||
#define TIFFTAG_LERC_MAXZERROR 65567 /* LERC maximum error */
|
#define TIFFTAG_LERC_MAXZERROR 65567 /* LERC maximum error */
|
||||||
#define TIFFTAG_WEBP_LEVEL 65568 /* WebP compression level */
|
#define TIFFTAG_WEBP_LEVEL 65568 /* WebP compression level */
|
||||||
#define TIFFTAG_WEBP_LOSSLESS 65569 /* WebP lossless/lossy */
|
#define TIFFTAG_WEBP_LOSSLESS 65569 /* WebP lossless/lossy */
|
||||||
|
#define TIFFTAG_WEBP_LOSSLESS_EXACT 65571 /* WebP lossless exact mode. Set-only mode. Default is 1. Can be set to 0 to increase compression rate, but R,G,B in areas where alpha = 0 will not be preserved */
|
||||||
#define TIFFTAG_DEFLATE_SUBCODEC 65570 /* ZIP codec: to get/set the sub-codec to use. Will default to libdeflate when available */
|
#define TIFFTAG_DEFLATE_SUBCODEC 65570 /* ZIP codec: to get/set the sub-codec to use. Will default to libdeflate when available */
|
||||||
#define DEFLATE_SUBCODEC_ZLIB 0
|
#define DEFLATE_SUBCODEC_ZLIB 0
|
||||||
#define DEFLATE_SUBCODEC_LIBDEFLATE 1
|
#define DEFLATE_SUBCODEC_LIBDEFLATE 1
|
||||||
@ -669,14 +773,14 @@ typedef enum {
|
|||||||
#define EXIFTAG_FNUMBER 33437 /* F number */
|
#define EXIFTAG_FNUMBER 33437 /* F number */
|
||||||
#define EXIFTAG_EXPOSUREPROGRAM 34850 /* Exposure program */
|
#define EXIFTAG_EXPOSUREPROGRAM 34850 /* Exposure program */
|
||||||
#define EXIFTAG_SPECTRALSENSITIVITY 34852 /* Spectral sensitivity */
|
#define EXIFTAG_SPECTRALSENSITIVITY 34852 /* Spectral sensitivity */
|
||||||
|
/* After EXIF 2.2.1 ISOSpeedRatings is named PhotographicSensitivity.
|
||||||
|
In addition, while "Count=Any", only 1 count should be used. */
|
||||||
#define EXIFTAG_ISOSPEEDRATINGS 34855 /* ISO speed rating */
|
#define EXIFTAG_ISOSPEEDRATINGS 34855 /* ISO speed rating */
|
||||||
#define EXIFTAG_PHOTOGRAPHICSENSITIVITY 34855 /* Photographic Sensitivity (new name for tag 34855) */
|
#define EXIFTAG_PHOTOGRAPHICSENSITIVITY 34855 /* Photographic Sensitivity (new name for tag 34855) */
|
||||||
#define EXIFTAG_OECF 34856 /* Optoelectric conversion factor */
|
#define EXIFTAG_OECF 34856 /* Optoelectric conversion factor */
|
||||||
#define EXIFTAG_EXIFVERSION 36864 /* Exif version */
|
#define EXIFTAG_EXIFVERSION 36864 /* Exif version */
|
||||||
#define EXIFTAG_DATETIMEORIGINAL 36867 /* Date and time of original
|
#define EXIFTAG_DATETIMEORIGINAL 36867 /* Date and time of original data generation */
|
||||||
data generation */
|
#define EXIFTAG_DATETIMEDIGITIZED 36868 /* Date and time of digital data generation */
|
||||||
#define EXIFTAG_DATETIMEDIGITIZED 36868 /* Date and time of digital
|
|
||||||
data generation */
|
|
||||||
#define EXIFTAG_COMPONENTSCONFIGURATION 37121 /* Meaning of each component */
|
#define EXIFTAG_COMPONENTSCONFIGURATION 37121 /* Meaning of each component */
|
||||||
#define EXIFTAG_COMPRESSEDBITSPERPIXEL 37122 /* Image compression mode */
|
#define EXIFTAG_COMPRESSEDBITSPERPIXEL 37122 /* Image compression mode */
|
||||||
#define EXIFTAG_SHUTTERSPEEDVALUE 37377 /* Shutter speed */
|
#define EXIFTAG_SHUTTERSPEEDVALUE 37377 /* Shutter speed */
|
||||||
@ -740,10 +844,14 @@ typedef enum {
|
|||||||
#define EXIFTAG_PRESSURE 37890 /* Pressure as the ambient situation at the shot hecto-Pascal (hPa) */
|
#define EXIFTAG_PRESSURE 37890 /* Pressure as the ambient situation at the shot hecto-Pascal (hPa) */
|
||||||
#define EXIFTAG_WATERDEPTH 37891 /* WaterDepth as the ambient situation at the shot in meter (m) */
|
#define EXIFTAG_WATERDEPTH 37891 /* WaterDepth as the ambient situation at the shot in meter (m) */
|
||||||
#define EXIFTAG_ACCELERATION 37892 /* Acceleration (a scalar regardless of direction) as the ambientsituation at the shot in units of mGal (10-5 m/s^2) */
|
#define EXIFTAG_ACCELERATION 37892 /* Acceleration (a scalar regardless of direction) as the ambientsituation at the shot in units of mGal (10-5 m/s^2) */
|
||||||
#define EXIFTAG_CAMERAELEVATIONANGLE 37893 /* Elevation/depression. angle of the orientation of the camera(imaging optical axis) as the ambient situation at the shot in degree from -180deg to +180deg. */
|
/* EXIFTAG_CAMERAELEVATIONANGLE: Elevation/depression. angle of the orientation of the camera(imaging optical axis)
|
||||||
|
* as the ambient situation at the shot in degree from -180deg to +180deg. */
|
||||||
|
#define EXIFTAG_CAMERAELEVATIONANGLE 37893
|
||||||
#define EXIFTAG_CAMERAOWNERNAME 42032 /* owner of a camera */
|
#define EXIFTAG_CAMERAOWNERNAME 42032 /* owner of a camera */
|
||||||
#define EXIFTAG_BODYSERIALNUMBER 42033 /* serial number of the body of the camera */
|
#define EXIFTAG_BODYSERIALNUMBER 42033 /* serial number of the body of the camera */
|
||||||
#define EXIFTAG_LENSSPECIFICATION 42034 /* minimum focal length (in mm), maximum focal length (in mm), minimum F number in the minimum focal length, and minimum F number in the maximum focal length, */
|
/* EXIFTAG_LENSSPECIFICATION: minimum focal length (in mm), maximum focal length (in mm),minimum F number in the minimum focal length,
|
||||||
|
* and minimum F number in the maximum focal length, */
|
||||||
|
#define EXIFTAG_LENSSPECIFICATION 42034
|
||||||
#define EXIFTAG_LENSMAKE 42035 /* the lens manufacturer */
|
#define EXIFTAG_LENSMAKE 42035 /* the lens manufacturer */
|
||||||
#define EXIFTAG_LENSMODEL 42036 /* the lens model name and model number */
|
#define EXIFTAG_LENSMODEL 42036 /* the lens model name and model number */
|
||||||
#define EXIFTAG_LENSSERIALNUMBER 42037 /* the serial number of the interchangeable lens */
|
#define EXIFTAG_LENSSERIALNUMBER 42037 /* the serial number of the interchangeable lens */
|
||||||
@ -789,12 +897,3 @@ typedef enum {
|
|||||||
#define GPSTAG_GPSHPOSITIONINGERROR 31 /* Indicates horizontal positioning errors in meters. */
|
#define GPSTAG_GPSHPOSITIONINGERROR 31 /* Indicates horizontal positioning errors in meters. */
|
||||||
|
|
||||||
#endif /* _TIFF_ */
|
#endif /* _TIFF_ */
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
42
3rdparty/libtiff/tiffconf.h.cmake.in
vendored
42
3rdparty/libtiff/tiffconf.h.cmake.in
vendored
@ -4,9 +4,21 @@
|
|||||||
from this file in your programs.
|
from this file in your programs.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* clang-format off */
|
||||||
|
/* clang-format disabled because CMake scripts are very sensitive to the
|
||||||
|
* formatting of this file. configure_file variables of type "@VAR@" are
|
||||||
|
* modified by clang-format and won't be substituted.
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef _TIFFCONF_
|
#ifndef _TIFFCONF_
|
||||||
#define _TIFFCONF_
|
#define _TIFFCONF_
|
||||||
|
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
|
||||||
|
|
||||||
/* Signed 16-bit type */
|
/* Signed 16-bit type */
|
||||||
#define TIFF_INT16_T @TIFF_INT16_T@
|
#define TIFF_INT16_T @TIFF_INT16_T@
|
||||||
|
|
||||||
@ -31,23 +43,26 @@
|
|||||||
/* Unsigned 8-bit type */
|
/* Unsigned 8-bit type */
|
||||||
#define TIFF_UINT8_T @TIFF_UINT8_T@
|
#define TIFF_UINT8_T @TIFF_UINT8_T@
|
||||||
|
|
||||||
/* Unsigned size type */
|
|
||||||
#define TIFF_SIZE_T @TIFF_SIZE_T@
|
|
||||||
|
|
||||||
/* Signed size type */
|
/* Signed size type */
|
||||||
#define TIFF_SSIZE_T @TIFF_SSIZE_T@
|
#define TIFF_SSIZE_T @TIFF_SSIZE_T@
|
||||||
|
|
||||||
/* Pointer difference type */
|
|
||||||
#define TIFF_PTRDIFF_T @TIFF_PTRDIFF_T@
|
|
||||||
|
|
||||||
/* Compatibility stuff. */
|
/* Compatibility stuff. */
|
||||||
|
|
||||||
/* Define as 0 or 1 according to the floating point format suported by the
|
/* Define as 0 or 1 according to the floating point format supported by the
|
||||||
machine */
|
machine */
|
||||||
#cmakedefine HAVE_IEEEFP 1
|
#cmakedefine HAVE_IEEEFP 1
|
||||||
|
|
||||||
/* Set the native cpu bit order (FILLORDER_LSB2MSB or FILLORDER_MSB2LSB) */
|
/* The concept of HOST_FILLORDER is broken. Since libtiff 4.5.1
|
||||||
#define HOST_FILLORDER @HOST_FILLORDER@
|
* this macro will always be hardcoded to FILLORDER_LSB2MSB on all
|
||||||
|
* architectures, to reflect past long behavior of doing so on x86 architecture.
|
||||||
|
* Note however that the default FillOrder used by libtiff is FILLORDER_MSB2LSB,
|
||||||
|
* as mandated per the TIFF specification.
|
||||||
|
* The influence of HOST_FILLORDER is only when passing the 'H' mode in
|
||||||
|
* TIFFOpen().
|
||||||
|
* You should NOT rely on this macro to decide the CPU endianness!
|
||||||
|
* This macro will be removed in libtiff 4.6
|
||||||
|
*/
|
||||||
|
#define HOST_FILLORDER FILLORDER_LSB2MSB
|
||||||
|
|
||||||
/* Native cpu byte order: 1 if big-endian (Motorola) or 0 if little-endian
|
/* Native cpu byte order: 1 if big-endian (Motorola) or 0 if little-endian
|
||||||
(Intel) */
|
(Intel) */
|
||||||
@ -62,6 +77,9 @@
|
|||||||
/* Support JBIG compression (requires JBIG-KIT library) */
|
/* Support JBIG compression (requires JBIG-KIT library) */
|
||||||
#cmakedefine JBIG_SUPPORT
|
#cmakedefine JBIG_SUPPORT
|
||||||
|
|
||||||
|
/* Support LERC compression */
|
||||||
|
#cmakedefine LERC_SUPPORT 1
|
||||||
|
|
||||||
/* Support LogLuv high dynamic range encoding */
|
/* Support LogLuv high dynamic range encoding */
|
||||||
#cmakedefine LOGLUV_SUPPORT 1
|
#cmakedefine LOGLUV_SUPPORT 1
|
||||||
|
|
||||||
@ -91,8 +109,8 @@
|
|||||||
#cmakedefine LIBDEFLATE_SUPPORT 1
|
#cmakedefine LIBDEFLATE_SUPPORT 1
|
||||||
|
|
||||||
/* Support strip chopping (whether or not to convert single-strip uncompressed
|
/* Support strip chopping (whether or not to convert single-strip uncompressed
|
||||||
images to mutiple strips of ~8Kb to reduce memory usage) */
|
images to multiple strips of ~8Kb to reduce memory usage) */
|
||||||
#cmakedefine STRIPCHOP_DEFAULT 1
|
#cmakedefine STRIPCHOP_DEFAULT TIFF_STRIPCHOP
|
||||||
|
|
||||||
/* Enable SubIFD tag (330) support */
|
/* Enable SubIFD tag (330) support */
|
||||||
#cmakedefine SUBIFD_SUPPORT 1
|
#cmakedefine SUBIFD_SUPPORT 1
|
||||||
@ -122,3 +140,5 @@
|
|||||||
#define IPTC_SUPPORT
|
#define IPTC_SUPPORT
|
||||||
|
|
||||||
#endif /* _TIFFCONF_ */
|
#endif /* _TIFFCONF_ */
|
||||||
|
|
||||||
|
/* clang-format on */
|
||||||
|
425
3rdparty/libtiff/tiffio.h
vendored
425
3rdparty/libtiff/tiffio.h
vendored
@ -60,16 +60,18 @@ typedef struct tiff TIFF;
|
|||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* this is the machine addressing size type, only it's signed, so make it
|
* this is the machine addressing size type, only it's signed, so make it
|
||||||
* int32 on 32bit machines, int64 on 64bit machines
|
* int32_t on 32bit machines, int64_t on 64bit machines
|
||||||
*/
|
*/
|
||||||
typedef TIFF_SSIZE_T tmsize_t;
|
typedef TIFF_SSIZE_T tmsize_t;
|
||||||
typedef uint64 toff_t; /* file offset */
|
#define TIFF_TMSIZE_T_MAX (tmsize_t)(SIZE_MAX >> 1)
|
||||||
|
|
||||||
|
typedef uint64_t toff_t; /* file offset */
|
||||||
/* the following are deprecated and should be replaced by their defining
|
/* the following are deprecated and should be replaced by their defining
|
||||||
counterparts */
|
counterparts */
|
||||||
typedef uint32 ttag_t; /* directory tag */
|
typedef uint32_t ttag_t; /* directory tag */
|
||||||
typedef uint16 tdir_t; /* directory index */
|
typedef uint32_t tdir_t; /* directory index */
|
||||||
typedef uint16 tsample_t; /* sample number */
|
typedef uint16_t tsample_t; /* sample number */
|
||||||
typedef uint32 tstrile_t; /* strip or tile number */
|
typedef uint32_t tstrile_t; /* strip or tile number */
|
||||||
typedef tstrile_t tstrip_t; /* strip number */
|
typedef tstrile_t tstrip_t; /* strip number */
|
||||||
typedef tstrile_t ttile_t; /* tile number */
|
typedef tstrile_t ttile_t; /* tile number */
|
||||||
typedef tmsize_t tsize_t; /* i/o size in bytes */
|
typedef tmsize_t tsize_t; /* i/o size in bytes */
|
||||||
@ -87,7 +89,8 @@ typedef void* tdata_t; /* image data ref */
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#if defined(_WINDOWS) || defined(__WIN32__) || defined(_Windows)
|
#if defined(_WINDOWS) || defined(__WIN32__) || defined(_Windows)
|
||||||
# if !defined(__CYGWIN) && !defined(AVOID_WIN32_FILEIO) && !defined(USE_WIN32_FILEIO)
|
#if !defined(__CYGWIN) && !defined(AVOID_WIN32_FILEIO) && \
|
||||||
|
!defined(USE_WIN32_FILEIO)
|
||||||
#define AVOID_WIN32_FILEIO
|
#define AVOID_WIN32_FILEIO
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@ -135,14 +138,15 @@ typedef void* thandle_t; /* client data handle */
|
|||||||
|
|
||||||
typedef unsigned char TIFFRGBValue; /* 8-bit samples */
|
typedef unsigned char TIFFRGBValue; /* 8-bit samples */
|
||||||
|
|
||||||
typedef struct {
|
typedef struct
|
||||||
|
{
|
||||||
float d_mat[3][3]; /* XYZ -> luminance matrix */
|
float d_mat[3][3]; /* XYZ -> luminance matrix */
|
||||||
float d_YCR; /* Light o/p for reference white */
|
float d_YCR; /* Light o/p for reference white */
|
||||||
float d_YCG;
|
float d_YCG;
|
||||||
float d_YCB;
|
float d_YCB;
|
||||||
uint32 d_Vrwr; /* Pixel values for ref. white */
|
uint32_t d_Vrwr; /* Pixel values for ref. white */
|
||||||
uint32 d_Vrwg;
|
uint32_t d_Vrwg;
|
||||||
uint32 d_Vrwb;
|
uint32_t d_Vrwb;
|
||||||
float d_Y0R; /* Residual light for black pixel */
|
float d_Y0R; /* Residual light for black pixel */
|
||||||
float d_Y0G;
|
float d_Y0G;
|
||||||
float d_Y0B;
|
float d_Y0B;
|
||||||
@ -151,16 +155,18 @@ typedef struct {
|
|||||||
float d_gammaB;
|
float d_gammaB;
|
||||||
} TIFFDisplay;
|
} TIFFDisplay;
|
||||||
|
|
||||||
typedef struct { /* YCbCr->RGB support */
|
typedef struct
|
||||||
|
{ /* YCbCr->RGB support */
|
||||||
TIFFRGBValue *clamptab; /* range clamping table */
|
TIFFRGBValue *clamptab; /* range clamping table */
|
||||||
int *Cr_r_tab;
|
int *Cr_r_tab;
|
||||||
int *Cb_b_tab;
|
int *Cb_b_tab;
|
||||||
int32* Cr_g_tab;
|
int32_t *Cr_g_tab;
|
||||||
int32* Cb_g_tab;
|
int32_t *Cb_g_tab;
|
||||||
int32* Y_tab;
|
int32_t *Y_tab;
|
||||||
} TIFFYCbCrToRGB;
|
} TIFFYCbCrToRGB;
|
||||||
|
|
||||||
typedef struct { /* CIE Lab 1976->RGB support */
|
typedef struct
|
||||||
|
{ /* CIE Lab 1976->RGB support */
|
||||||
int range; /* Size of conversion table */
|
int range; /* Size of conversion table */
|
||||||
#define CIELABTORGB_TABLE_RANGE 1500
|
#define CIELABTORGB_TABLE_RANGE 1500
|
||||||
float rstep, gstep, bstep;
|
float rstep, gstep, bstep;
|
||||||
@ -185,46 +191,49 @@ typedef struct _TIFFRGBAImage TIFFRGBAImage;
|
|||||||
* different format or, for example, unpack the data
|
* different format or, for example, unpack the data
|
||||||
* and draw the unpacked raster on the display.
|
* and draw the unpacked raster on the display.
|
||||||
*/
|
*/
|
||||||
typedef void (*tileContigRoutine)
|
typedef void (*tileContigRoutine)(TIFFRGBAImage *, uint32_t *, uint32_t,
|
||||||
(TIFFRGBAImage*, uint32*, uint32, uint32, uint32, uint32, int32, int32,
|
uint32_t, uint32_t, uint32_t, int32_t,
|
||||||
unsigned char*);
|
int32_t, unsigned char *);
|
||||||
typedef void (*tileSeparateRoutine)
|
typedef void (*tileSeparateRoutine)(TIFFRGBAImage *, uint32_t *, uint32_t,
|
||||||
(TIFFRGBAImage*, uint32*, uint32, uint32, uint32, uint32, int32, int32,
|
uint32_t, uint32_t, uint32_t, int32_t,
|
||||||
unsigned char*, unsigned char*, unsigned char*, unsigned char*);
|
int32_t, unsigned char *, unsigned char *,
|
||||||
|
unsigned char *, unsigned char *);
|
||||||
/*
|
/*
|
||||||
* RGBA-reader state.
|
* RGBA-reader state.
|
||||||
*/
|
*/
|
||||||
struct _TIFFRGBAImage {
|
struct _TIFFRGBAImage
|
||||||
|
{
|
||||||
TIFF *tif; /* image handle */
|
TIFF *tif; /* image handle */
|
||||||
int stoponerr; /* stop on read error */
|
int stoponerr; /* stop on read error */
|
||||||
int isContig; /* data is packed/separate */
|
int isContig; /* data is packed/separate */
|
||||||
int alpha; /* type of alpha data present */
|
int alpha; /* type of alpha data present */
|
||||||
uint32 width; /* image width */
|
uint32_t width; /* image width */
|
||||||
uint32 height; /* image height */
|
uint32_t height; /* image height */
|
||||||
uint16 bitspersample; /* image bits/sample */
|
uint16_t bitspersample; /* image bits/sample */
|
||||||
uint16 samplesperpixel; /* image samples/pixel */
|
uint16_t samplesperpixel; /* image samples/pixel */
|
||||||
uint16 orientation; /* image orientation */
|
uint16_t orientation; /* image orientation */
|
||||||
uint16 req_orientation; /* requested orientation */
|
uint16_t req_orientation; /* requested orientation */
|
||||||
uint16 photometric; /* image photometric interp */
|
uint16_t photometric; /* image photometric interp */
|
||||||
uint16* redcmap; /* colormap palette */
|
uint16_t *redcmap; /* colormap palette */
|
||||||
uint16* greencmap;
|
uint16_t *greencmap;
|
||||||
uint16* bluecmap;
|
uint16_t *bluecmap;
|
||||||
/* get image data routine */
|
/* get image data routine */
|
||||||
int (*get)(TIFFRGBAImage*, uint32*, uint32, uint32);
|
int (*get)(TIFFRGBAImage *, uint32_t *, uint32_t, uint32_t);
|
||||||
/* put decoded strip/tile */
|
/* put decoded strip/tile */
|
||||||
union {
|
union
|
||||||
|
{
|
||||||
void (*any)(TIFFRGBAImage *);
|
void (*any)(TIFFRGBAImage *);
|
||||||
tileContigRoutine contig;
|
tileContigRoutine contig;
|
||||||
tileSeparateRoutine separate;
|
tileSeparateRoutine separate;
|
||||||
} put;
|
} put;
|
||||||
TIFFRGBValue *Map; /* sample mapping array */
|
TIFFRGBValue *Map; /* sample mapping array */
|
||||||
uint32** BWmap; /* black&white map */
|
uint32_t **BWmap; /* black&white map */
|
||||||
uint32** PALmap; /* palette image map */
|
uint32_t **PALmap; /* palette image map */
|
||||||
TIFFYCbCrToRGB *ycbcr; /* YCbCr conversion state */
|
TIFFYCbCrToRGB *ycbcr; /* YCbCr conversion state */
|
||||||
TIFFCIELabToRGB *cielab; /* CIE L*a*b conversion state */
|
TIFFCIELabToRGB *cielab; /* CIE L*a*b conversion state */
|
||||||
|
|
||||||
uint8* UaToAa; /* Unassociated alpha to associated alpha conversion LUT */
|
uint8_t *UaToAa; /* Unassociated alpha to associated alpha conversion LUT */
|
||||||
uint8* Bitdepth16To8; /* LUT for conversion from 16bit to 8bit values */
|
uint8_t *Bitdepth16To8; /* LUT for conversion from 16bit to 8bit values */
|
||||||
|
|
||||||
int row_offset;
|
int row_offset;
|
||||||
int col_offset;
|
int col_offset;
|
||||||
@ -247,31 +256,42 @@ struct _TIFFRGBAImage {
|
|||||||
* and/or the builtin implementations may be overridden.
|
* and/or the builtin implementations may be overridden.
|
||||||
*/
|
*/
|
||||||
typedef int (*TIFFInitMethod)(TIFF *, int);
|
typedef int (*TIFFInitMethod)(TIFF *, int);
|
||||||
typedef struct {
|
typedef struct
|
||||||
|
{
|
||||||
char *name;
|
char *name;
|
||||||
uint16 scheme;
|
uint16_t scheme;
|
||||||
TIFFInitMethod init;
|
TIFFInitMethod init;
|
||||||
} TIFFCodec;
|
} TIFFCodec;
|
||||||
|
|
||||||
#include <stdio.h>
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t uNum;
|
||||||
|
uint32_t uDenom;
|
||||||
|
} TIFFRational_t;
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
/* share internal LogLuv conversion routines? */
|
/* share internal LogLuv conversion routines? */
|
||||||
#ifndef LOGLUV_PUBLIC
|
#ifndef LOGLUV_PUBLIC
|
||||||
#define LOGLUV_PUBLIC 1
|
#define LOGLUV_PUBLIC 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__GNUC__) || defined(__attribute__)
|
#if defined(__GNUC__) || defined(__clang__) || defined(__attribute__)
|
||||||
#define TIFF_ATTRIBUTE(x) __attribute__(x)
|
#define TIFF_ATTRIBUTE(x) __attribute__(x)
|
||||||
#else
|
#else
|
||||||
#define TIFF_ATTRIBUTE(x) /*nothing*/
|
#define TIFF_ATTRIBUTE(x) /*nothing*/
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(c_plusplus) || defined(__cplusplus)
|
#if defined(c_plusplus) || defined(__cplusplus)
|
||||||
extern "C" {
|
extern "C"
|
||||||
|
{
|
||||||
#endif
|
#endif
|
||||||
typedef void (*TIFFErrorHandler)(const char *, const char *, va_list);
|
typedef void (*TIFFErrorHandler)(const char *, const char *, va_list);
|
||||||
typedef void (*TIFFErrorHandlerExt)(thandle_t, const char*, const char*, va_list);
|
typedef void (*TIFFErrorHandlerExt)(thandle_t, const char *, const char *,
|
||||||
|
va_list);
|
||||||
|
typedef int (*TIFFErrorHandlerExtR)(TIFF *, void *user_data, const char *,
|
||||||
|
const char *, va_list);
|
||||||
typedef tmsize_t (*TIFFReadWriteProc)(thandle_t, void *, tmsize_t);
|
typedef tmsize_t (*TIFFReadWriteProc)(thandle_t, void *, tmsize_t);
|
||||||
typedef toff_t (*TIFFSeekProc)(thandle_t, toff_t, int);
|
typedef toff_t (*TIFFSeekProc)(thandle_t, toff_t, int);
|
||||||
typedef int (*TIFFCloseProc)(thandle_t);
|
typedef int (*TIFFCloseProc)(thandle_t);
|
||||||
@ -282,10 +302,10 @@ typedef void (*TIFFExtendProc)(TIFF*);
|
|||||||
|
|
||||||
extern const char *TIFFGetVersion(void);
|
extern const char *TIFFGetVersion(void);
|
||||||
|
|
||||||
extern const TIFFCodec* TIFFFindCODEC(uint16);
|
extern const TIFFCodec *TIFFFindCODEC(uint16_t);
|
||||||
extern TIFFCodec* TIFFRegisterCODEC(uint16, const char*, TIFFInitMethod);
|
extern TIFFCodec *TIFFRegisterCODEC(uint16_t, const char *, TIFFInitMethod);
|
||||||
extern void TIFFUnRegisterCODEC(TIFFCodec *);
|
extern void TIFFUnRegisterCODEC(TIFFCodec *);
|
||||||
extern int TIFFIsCODECConfigured(uint16);
|
extern int TIFFIsCODECConfigured(uint16_t);
|
||||||
extern TIFFCodec *TIFFGetConfiguredCODECs(void);
|
extern TIFFCodec *TIFFGetConfiguredCODECs(void);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -304,34 +324,42 @@ extern void _TIFFfree(void* p);
|
|||||||
** Stuff, related to tag handling and creating custom tags.
|
** Stuff, related to tag handling and creating custom tags.
|
||||||
*/
|
*/
|
||||||
extern int TIFFGetTagListCount(TIFF *);
|
extern int TIFFGetTagListCount(TIFF *);
|
||||||
extern uint32 TIFFGetTagListEntry( TIFF *, int tag_index );
|
extern uint32_t TIFFGetTagListEntry(TIFF *, int tag_index);
|
||||||
|
|
||||||
#define TIFF_ANY TIFF_NOTYPE /* for field descriptor searching */
|
#define TIFF_ANY TIFF_NOTYPE /* for field descriptor searching */
|
||||||
#define TIFF_VARIABLE -1 /* marker for variable length tags */
|
#define TIFF_VARIABLE -1 /* marker for variable length tags */
|
||||||
#define TIFF_SPP -2 /* marker for SamplesPerPixel tags */
|
#define TIFF_SPP -2 /* marker for SamplesPerPixel tags */
|
||||||
#define TIFF_VARIABLE2 -3 /* marker for uint32 var-length tags */
|
#define TIFF_VARIABLE2 -3 /* marker for uint32_t var-length tags */
|
||||||
|
|
||||||
#define FIELD_CUSTOM 65
|
#define FIELD_CUSTOM 65
|
||||||
|
|
||||||
typedef struct _TIFFField TIFFField;
|
typedef struct _TIFFField TIFFField;
|
||||||
typedef struct _TIFFFieldArray TIFFFieldArray;
|
typedef struct _TIFFFieldArray TIFFFieldArray;
|
||||||
|
|
||||||
extern const TIFFField* TIFFFindField(TIFF *, uint32, TIFFDataType);
|
extern const TIFFField *TIFFFindField(TIFF *, uint32_t, TIFFDataType);
|
||||||
extern const TIFFField* TIFFFieldWithTag(TIFF*, uint32);
|
extern const TIFFField *TIFFFieldWithTag(TIFF *, uint32_t);
|
||||||
extern const TIFFField *TIFFFieldWithName(TIFF *, const char *);
|
extern const TIFFField *TIFFFieldWithName(TIFF *, const char *);
|
||||||
|
|
||||||
extern uint32 TIFFFieldTag(const TIFFField*);
|
extern uint32_t TIFFFieldTag(const TIFFField *);
|
||||||
extern const char *TIFFFieldName(const TIFFField *);
|
extern const char *TIFFFieldName(const TIFFField *);
|
||||||
extern TIFFDataType TIFFFieldDataType(const TIFFField *);
|
extern TIFFDataType TIFFFieldDataType(const TIFFField *);
|
||||||
extern int TIFFFieldPassCount(const TIFFField *);
|
extern int TIFFFieldPassCount(const TIFFField *);
|
||||||
extern int TIFFFieldReadCount(const TIFFField *);
|
extern int TIFFFieldReadCount(const TIFFField *);
|
||||||
extern int TIFFFieldWriteCount(const TIFFField *);
|
extern int TIFFFieldWriteCount(const TIFFField *);
|
||||||
|
extern int
|
||||||
|
TIFFFieldSetGetSize(const TIFFField *); /* returns internal storage size of
|
||||||
|
TIFFSetGetFieldType in bytes. */
|
||||||
|
extern int TIFFFieldSetGetCountSize(
|
||||||
|
const TIFFField *); /* returns size of count parameter 0=none,
|
||||||
|
2=uint16_t, 4=uint32_t */
|
||||||
|
extern int TIFFFieldIsAnonymous(const TIFFField *);
|
||||||
|
|
||||||
typedef int (*TIFFVSetMethod)(TIFF*, uint32, va_list);
|
typedef int (*TIFFVSetMethod)(TIFF *, uint32_t, va_list);
|
||||||
typedef int (*TIFFVGetMethod)(TIFF*, uint32, va_list);
|
typedef int (*TIFFVGetMethod)(TIFF *, uint32_t, va_list);
|
||||||
typedef void (*TIFFPrintMethod)(TIFF *, FILE *, long);
|
typedef void (*TIFFPrintMethod)(TIFF *, FILE *, long);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct
|
||||||
|
{
|
||||||
TIFFVSetMethod vsetfield; /* tag set routine */
|
TIFFVSetMethod vsetfield; /* tag set routine */
|
||||||
TIFFVGetMethod vgetfield; /* tag get routine */
|
TIFFVGetMethod vgetfield; /* tag get routine */
|
||||||
TIFFPrintMethod printdir; /* directory print routine */
|
TIFFPrintMethod printdir; /* directory print routine */
|
||||||
@ -345,32 +373,33 @@ extern void TIFFCleanup(TIFF* tif);
|
|||||||
extern void TIFFClose(TIFF *tif);
|
extern void TIFFClose(TIFF *tif);
|
||||||
extern int TIFFFlush(TIFF *tif);
|
extern int TIFFFlush(TIFF *tif);
|
||||||
extern int TIFFFlushData(TIFF *tif);
|
extern int TIFFFlushData(TIFF *tif);
|
||||||
extern int TIFFGetField(TIFF* tif, uint32 tag, ...);
|
extern int TIFFGetField(TIFF *tif, uint32_t tag, ...);
|
||||||
extern int TIFFVGetField(TIFF* tif, uint32 tag, va_list ap);
|
extern int TIFFVGetField(TIFF *tif, uint32_t tag, va_list ap);
|
||||||
extern int TIFFGetFieldDefaulted(TIFF* tif, uint32 tag, ...);
|
extern int TIFFGetFieldDefaulted(TIFF *tif, uint32_t tag, ...);
|
||||||
extern int TIFFVGetFieldDefaulted(TIFF* tif, uint32 tag, va_list ap);
|
extern int TIFFVGetFieldDefaulted(TIFF *tif, uint32_t tag, va_list ap);
|
||||||
extern int TIFFReadDirectory(TIFF *tif);
|
extern int TIFFReadDirectory(TIFF *tif);
|
||||||
extern int TIFFReadCustomDirectory(TIFF* tif, toff_t diroff, const TIFFFieldArray* infoarray);
|
extern int TIFFReadCustomDirectory(TIFF *tif, toff_t diroff,
|
||||||
|
const TIFFFieldArray *infoarray);
|
||||||
extern int TIFFReadEXIFDirectory(TIFF *tif, toff_t diroff);
|
extern int TIFFReadEXIFDirectory(TIFF *tif, toff_t diroff);
|
||||||
extern int TIFFReadGPSDirectory(TIFF *tif, toff_t diroff);
|
extern int TIFFReadGPSDirectory(TIFF *tif, toff_t diroff);
|
||||||
extern uint64 TIFFScanlineSize64(TIFF* tif);
|
extern uint64_t TIFFScanlineSize64(TIFF *tif);
|
||||||
extern tmsize_t TIFFScanlineSize(TIFF *tif);
|
extern tmsize_t TIFFScanlineSize(TIFF *tif);
|
||||||
extern uint64 TIFFRasterScanlineSize64(TIFF* tif);
|
extern uint64_t TIFFRasterScanlineSize64(TIFF *tif);
|
||||||
extern tmsize_t TIFFRasterScanlineSize(TIFF *tif);
|
extern tmsize_t TIFFRasterScanlineSize(TIFF *tif);
|
||||||
extern uint64 TIFFStripSize64(TIFF* tif);
|
extern uint64_t TIFFStripSize64(TIFF *tif);
|
||||||
extern tmsize_t TIFFStripSize(TIFF *tif);
|
extern tmsize_t TIFFStripSize(TIFF *tif);
|
||||||
extern uint64 TIFFRawStripSize64(TIFF* tif, uint32 strip);
|
extern uint64_t TIFFRawStripSize64(TIFF *tif, uint32_t strip);
|
||||||
extern tmsize_t TIFFRawStripSize(TIFF* tif, uint32 strip);
|
extern tmsize_t TIFFRawStripSize(TIFF *tif, uint32_t strip);
|
||||||
extern uint64 TIFFVStripSize64(TIFF* tif, uint32 nrows);
|
extern uint64_t TIFFVStripSize64(TIFF *tif, uint32_t nrows);
|
||||||
extern tmsize_t TIFFVStripSize(TIFF* tif, uint32 nrows);
|
extern tmsize_t TIFFVStripSize(TIFF *tif, uint32_t nrows);
|
||||||
extern uint64 TIFFTileRowSize64(TIFF* tif);
|
extern uint64_t TIFFTileRowSize64(TIFF *tif);
|
||||||
extern tmsize_t TIFFTileRowSize(TIFF *tif);
|
extern tmsize_t TIFFTileRowSize(TIFF *tif);
|
||||||
extern uint64 TIFFTileSize64(TIFF* tif);
|
extern uint64_t TIFFTileSize64(TIFF *tif);
|
||||||
extern tmsize_t TIFFTileSize(TIFF *tif);
|
extern tmsize_t TIFFTileSize(TIFF *tif);
|
||||||
extern uint64 TIFFVTileSize64(TIFF* tif, uint32 nrows);
|
extern uint64_t TIFFVTileSize64(TIFF *tif, uint32_t nrows);
|
||||||
extern tmsize_t TIFFVTileSize(TIFF* tif, uint32 nrows);
|
extern tmsize_t TIFFVTileSize(TIFF *tif, uint32_t nrows);
|
||||||
extern uint32 TIFFDefaultStripSize(TIFF* tif, uint32 request);
|
extern uint32_t TIFFDefaultStripSize(TIFF *tif, uint32_t request);
|
||||||
extern void TIFFDefaultTileSize(TIFF*, uint32*, uint32*);
|
extern void TIFFDefaultTileSize(TIFF *, uint32_t *, uint32_t *);
|
||||||
extern int TIFFFileno(TIFF *);
|
extern int TIFFFileno(TIFF *);
|
||||||
extern int TIFFSetFileno(TIFF *, int);
|
extern int TIFFSetFileno(TIFF *, int);
|
||||||
extern thandle_t TIFFClientdata(TIFF *);
|
extern thandle_t TIFFClientdata(TIFF *);
|
||||||
@ -382,6 +411,7 @@ extern int TIFFIsByteSwapped(TIFF*);
|
|||||||
extern int TIFFIsUpSampled(TIFF *);
|
extern int TIFFIsUpSampled(TIFF *);
|
||||||
extern int TIFFIsMSB2LSB(TIFF *);
|
extern int TIFFIsMSB2LSB(TIFF *);
|
||||||
extern int TIFFIsBigEndian(TIFF *);
|
extern int TIFFIsBigEndian(TIFF *);
|
||||||
|
extern int TIFFIsBigTIFF(TIFF *);
|
||||||
extern TIFFReadWriteProc TIFFGetReadProc(TIFF *);
|
extern TIFFReadWriteProc TIFFGetReadProc(TIFF *);
|
||||||
extern TIFFReadWriteProc TIFFGetWriteProc(TIFF *);
|
extern TIFFReadWriteProc TIFFGetWriteProc(TIFF *);
|
||||||
extern TIFFSeekProc TIFFGetSeekProc(TIFF *);
|
extern TIFFSeekProc TIFFGetSeekProc(TIFF *);
|
||||||
@ -389,12 +419,12 @@ extern TIFFCloseProc TIFFGetCloseProc(TIFF*);
|
|||||||
extern TIFFSizeProc TIFFGetSizeProc(TIFF *);
|
extern TIFFSizeProc TIFFGetSizeProc(TIFF *);
|
||||||
extern TIFFMapFileProc TIFFGetMapFileProc(TIFF *);
|
extern TIFFMapFileProc TIFFGetMapFileProc(TIFF *);
|
||||||
extern TIFFUnmapFileProc TIFFGetUnmapFileProc(TIFF *);
|
extern TIFFUnmapFileProc TIFFGetUnmapFileProc(TIFF *);
|
||||||
extern uint32 TIFFCurrentRow(TIFF*);
|
extern uint32_t TIFFCurrentRow(TIFF *);
|
||||||
extern uint16 TIFFCurrentDirectory(TIFF*);
|
extern tdir_t TIFFCurrentDirectory(TIFF *);
|
||||||
extern uint16 TIFFNumberOfDirectories(TIFF*);
|
extern tdir_t TIFFNumberOfDirectories(TIFF *);
|
||||||
extern uint64 TIFFCurrentDirOffset(TIFF*);
|
extern uint64_t TIFFCurrentDirOffset(TIFF *);
|
||||||
extern uint32 TIFFCurrentStrip(TIFF*);
|
extern uint32_t TIFFCurrentStrip(TIFF *);
|
||||||
extern uint32 TIFFCurrentTile(TIFF* tif);
|
extern uint32_t TIFFCurrentTile(TIFF *tif);
|
||||||
extern int TIFFReadBufferSetup(TIFF *tif, void *bp, tmsize_t size);
|
extern int TIFFReadBufferSetup(TIFF *tif, void *bp, tmsize_t size);
|
||||||
extern int TIFFWriteBufferSetup(TIFF *tif, void *bp, tmsize_t size);
|
extern int TIFFWriteBufferSetup(TIFF *tif, void *bp, tmsize_t size);
|
||||||
extern int TIFFSetupStrips(TIFF *);
|
extern int TIFFSetupStrips(TIFF *);
|
||||||
@ -405,14 +435,14 @@ extern int TIFFCreateCustomDirectory(TIFF*,const TIFFFieldArray*);
|
|||||||
extern int TIFFCreateEXIFDirectory(TIFF *);
|
extern int TIFFCreateEXIFDirectory(TIFF *);
|
||||||
extern int TIFFCreateGPSDirectory(TIFF *);
|
extern int TIFFCreateGPSDirectory(TIFF *);
|
||||||
extern int TIFFLastDirectory(TIFF *);
|
extern int TIFFLastDirectory(TIFF *);
|
||||||
extern int TIFFSetDirectory(TIFF*, uint16);
|
extern int TIFFSetDirectory(TIFF *, tdir_t);
|
||||||
extern int TIFFSetSubDirectory(TIFF*, uint64);
|
extern int TIFFSetSubDirectory(TIFF *, uint64_t);
|
||||||
extern int TIFFUnlinkDirectory(TIFF*, uint16);
|
extern int TIFFUnlinkDirectory(TIFF *, tdir_t);
|
||||||
extern int TIFFSetField(TIFF*, uint32, ...);
|
extern int TIFFSetField(TIFF *, uint32_t, ...);
|
||||||
extern int TIFFVSetField(TIFF*, uint32, va_list);
|
extern int TIFFVSetField(TIFF *, uint32_t, va_list);
|
||||||
extern int TIFFUnsetField(TIFF*, uint32);
|
extern int TIFFUnsetField(TIFF *, uint32_t);
|
||||||
extern int TIFFWriteDirectory(TIFF *);
|
extern int TIFFWriteDirectory(TIFF *);
|
||||||
extern int TIFFWriteCustomDirectory(TIFF *, uint64 *);
|
extern int TIFFWriteCustomDirectory(TIFF *, uint64_t *);
|
||||||
extern int TIFFCheckpointDirectory(TIFF *);
|
extern int TIFFCheckpointDirectory(TIFF *);
|
||||||
extern int TIFFRewriteDirectory(TIFF *);
|
extern int TIFFRewriteDirectory(TIFF *);
|
||||||
extern int TIFFDeferStrileArrayWriting(TIFF *);
|
extern int TIFFDeferStrileArrayWriting(TIFF *);
|
||||||
@ -420,87 +450,145 @@ extern int TIFFForceStrileArrayWriting(TIFF* );
|
|||||||
|
|
||||||
#if defined(c_plusplus) || defined(__cplusplus)
|
#if defined(c_plusplus) || defined(__cplusplus)
|
||||||
extern void TIFFPrintDirectory(TIFF *, FILE *, long = 0);
|
extern void TIFFPrintDirectory(TIFF *, FILE *, long = 0);
|
||||||
extern int TIFFReadScanline(TIFF* tif, void* buf, uint32 row, uint16 sample = 0);
|
extern int TIFFReadScanline(TIFF *tif, void *buf, uint32_t row,
|
||||||
extern int TIFFWriteScanline(TIFF* tif, void* buf, uint32 row, uint16 sample = 0);
|
uint16_t sample = 0);
|
||||||
extern int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int = 0);
|
extern int TIFFWriteScanline(TIFF *tif, void *buf, uint32_t row,
|
||||||
extern int TIFFReadRGBAImageOriented(TIFF*, uint32, uint32, uint32*,
|
uint16_t sample = 0);
|
||||||
|
extern int TIFFReadRGBAImage(TIFF *, uint32_t, uint32_t, uint32_t *,
|
||||||
|
int = 0);
|
||||||
|
extern int TIFFReadRGBAImageOriented(TIFF *, uint32_t, uint32_t, uint32_t *,
|
||||||
int = ORIENTATION_BOTLEFT, int = 0);
|
int = ORIENTATION_BOTLEFT, int = 0);
|
||||||
#else
|
#else
|
||||||
extern void TIFFPrintDirectory(TIFF *, FILE *, long);
|
extern void TIFFPrintDirectory(TIFF *, FILE *, long);
|
||||||
extern int TIFFReadScanline(TIFF* tif, void* buf, uint32 row, uint16 sample);
|
extern int TIFFReadScanline(TIFF *tif, void *buf, uint32_t row,
|
||||||
extern int TIFFWriteScanline(TIFF* tif, void* buf, uint32 row, uint16 sample);
|
uint16_t sample);
|
||||||
extern int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int);
|
extern int TIFFWriteScanline(TIFF *tif, void *buf, uint32_t row,
|
||||||
extern int TIFFReadRGBAImageOriented(TIFF*, uint32, uint32, uint32*, int, int);
|
uint16_t sample);
|
||||||
|
extern int TIFFReadRGBAImage(TIFF *, uint32_t, uint32_t, uint32_t *, int);
|
||||||
|
extern int TIFFReadRGBAImageOriented(TIFF *, uint32_t, uint32_t, uint32_t *,
|
||||||
|
int, int);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern int TIFFReadRGBAStrip(TIFF*, uint32, uint32 * );
|
extern int TIFFReadRGBAStrip(TIFF *, uint32_t, uint32_t *);
|
||||||
extern int TIFFReadRGBATile(TIFF*, uint32, uint32, uint32 * );
|
extern int TIFFReadRGBATile(TIFF *, uint32_t, uint32_t, uint32_t *);
|
||||||
extern int TIFFReadRGBAStripExt(TIFF*, uint32, uint32 *, int stop_on_error );
|
extern int TIFFReadRGBAStripExt(TIFF *, uint32_t, uint32_t *,
|
||||||
extern int TIFFReadRGBATileExt(TIFF*, uint32, uint32, uint32 *, int stop_on_error );
|
int stop_on_error);
|
||||||
|
extern int TIFFReadRGBATileExt(TIFF *, uint32_t, uint32_t, uint32_t *,
|
||||||
|
int stop_on_error);
|
||||||
extern int TIFFRGBAImageOK(TIFF *, char[1024]);
|
extern int TIFFRGBAImageOK(TIFF *, char[1024]);
|
||||||
extern int TIFFRGBAImageBegin(TIFFRGBAImage *, TIFF *, int, char[1024]);
|
extern int TIFFRGBAImageBegin(TIFFRGBAImage *, TIFF *, int, char[1024]);
|
||||||
extern int TIFFRGBAImageGet(TIFFRGBAImage*, uint32*, uint32, uint32);
|
extern int TIFFRGBAImageGet(TIFFRGBAImage *, uint32_t *, uint32_t,
|
||||||
|
uint32_t);
|
||||||
extern void TIFFRGBAImageEnd(TIFFRGBAImage *);
|
extern void TIFFRGBAImageEnd(TIFFRGBAImage *);
|
||||||
extern TIFF* TIFFOpen(const char*, const char*);
|
|
||||||
# ifdef __WIN32__
|
|
||||||
extern TIFF* TIFFOpenW(const wchar_t*, const char*);
|
|
||||||
# endif /* __WIN32__ */
|
|
||||||
extern TIFF* TIFFFdOpen(int, const char*, const char*);
|
|
||||||
extern TIFF* TIFFClientOpen(const char*, const char*,
|
|
||||||
thandle_t,
|
|
||||||
TIFFReadWriteProc, TIFFReadWriteProc,
|
|
||||||
TIFFSeekProc, TIFFCloseProc,
|
|
||||||
TIFFSizeProc,
|
|
||||||
TIFFMapFileProc, TIFFUnmapFileProc);
|
|
||||||
extern const char *TIFFFileName(TIFF *);
|
extern const char *TIFFFileName(TIFF *);
|
||||||
extern const char *TIFFSetFileName(TIFF *, const char *);
|
extern const char *TIFFSetFileName(TIFF *, const char *);
|
||||||
extern void TIFFError(const char*, const char*, ...) TIFF_ATTRIBUTE((__format__ (__printf__,2,3)));
|
extern void TIFFError(const char *, const char *, ...)
|
||||||
extern void TIFFErrorExt(thandle_t, const char*, const char*, ...) TIFF_ATTRIBUTE((__format__ (__printf__,3,4)));
|
TIFF_ATTRIBUTE((__format__(__printf__, 2, 3)));
|
||||||
extern void TIFFWarning(const char*, const char*, ...) TIFF_ATTRIBUTE((__format__ (__printf__,2,3)));
|
extern void TIFFErrorExt(thandle_t, const char *, const char *, ...)
|
||||||
extern void TIFFWarningExt(thandle_t, const char*, const char*, ...) TIFF_ATTRIBUTE((__format__ (__printf__,3,4)));
|
TIFF_ATTRIBUTE((__format__(__printf__, 3, 4)));
|
||||||
|
extern void TIFFWarning(const char *, const char *, ...)
|
||||||
|
TIFF_ATTRIBUTE((__format__(__printf__, 2, 3)));
|
||||||
|
extern void TIFFWarningExt(thandle_t, const char *, const char *, ...)
|
||||||
|
TIFF_ATTRIBUTE((__format__(__printf__, 3, 4)));
|
||||||
extern TIFFErrorHandler TIFFSetErrorHandler(TIFFErrorHandler);
|
extern TIFFErrorHandler TIFFSetErrorHandler(TIFFErrorHandler);
|
||||||
extern TIFFErrorHandlerExt TIFFSetErrorHandlerExt(TIFFErrorHandlerExt);
|
extern TIFFErrorHandlerExt TIFFSetErrorHandlerExt(TIFFErrorHandlerExt);
|
||||||
extern TIFFErrorHandler TIFFSetWarningHandler(TIFFErrorHandler);
|
extern TIFFErrorHandler TIFFSetWarningHandler(TIFFErrorHandler);
|
||||||
extern TIFFErrorHandlerExt TIFFSetWarningHandlerExt(TIFFErrorHandlerExt);
|
extern TIFFErrorHandlerExt TIFFSetWarningHandlerExt(TIFFErrorHandlerExt);
|
||||||
|
|
||||||
|
extern void TIFFWarningExtR(TIFF *, const char *, const char *, ...)
|
||||||
|
TIFF_ATTRIBUTE((__format__(__printf__, 3, 4)));
|
||||||
|
extern void TIFFErrorExtR(TIFF *, const char *, const char *, ...)
|
||||||
|
TIFF_ATTRIBUTE((__format__(__printf__, 3, 4)));
|
||||||
|
|
||||||
|
typedef struct TIFFOpenOptions TIFFOpenOptions;
|
||||||
|
extern TIFFOpenOptions *TIFFOpenOptionsAlloc(void);
|
||||||
|
extern void TIFFOpenOptionsFree(TIFFOpenOptions *);
|
||||||
|
extern void
|
||||||
|
TIFFOpenOptionsSetMaxSingleMemAlloc(TIFFOpenOptions *opts,
|
||||||
|
tmsize_t max_single_mem_alloc);
|
||||||
|
extern void
|
||||||
|
TIFFOpenOptionsSetErrorHandlerExtR(TIFFOpenOptions *opts,
|
||||||
|
TIFFErrorHandlerExtR handler,
|
||||||
|
void *errorhandler_user_data);
|
||||||
|
extern void
|
||||||
|
TIFFOpenOptionsSetWarningHandlerExtR(TIFFOpenOptions *opts,
|
||||||
|
TIFFErrorHandlerExtR handler,
|
||||||
|
void *warnhandler_user_data);
|
||||||
|
|
||||||
|
extern TIFF *TIFFOpen(const char *, const char *);
|
||||||
|
extern TIFF *TIFFOpenExt(const char *, const char *, TIFFOpenOptions *opts);
|
||||||
|
#ifdef __WIN32__
|
||||||
|
extern TIFF *TIFFOpenW(const wchar_t *, const char *);
|
||||||
|
extern TIFF *TIFFOpenWExt(const wchar_t *, const char *,
|
||||||
|
TIFFOpenOptions *opts);
|
||||||
|
#endif /* __WIN32__ */
|
||||||
|
extern TIFF *TIFFFdOpen(int, const char *, const char *);
|
||||||
|
extern TIFF *TIFFFdOpenExt(int, const char *, const char *,
|
||||||
|
TIFFOpenOptions *opts);
|
||||||
|
extern TIFF *TIFFClientOpen(const char *, const char *, thandle_t,
|
||||||
|
TIFFReadWriteProc, TIFFReadWriteProc,
|
||||||
|
TIFFSeekProc, TIFFCloseProc, TIFFSizeProc,
|
||||||
|
TIFFMapFileProc, TIFFUnmapFileProc);
|
||||||
|
extern TIFF *TIFFClientOpenExt(const char *, const char *, thandle_t,
|
||||||
|
TIFFReadWriteProc, TIFFReadWriteProc,
|
||||||
|
TIFFSeekProc, TIFFCloseProc, TIFFSizeProc,
|
||||||
|
TIFFMapFileProc, TIFFUnmapFileProc,
|
||||||
|
TIFFOpenOptions *opts);
|
||||||
extern TIFFExtendProc TIFFSetTagExtender(TIFFExtendProc);
|
extern TIFFExtendProc TIFFSetTagExtender(TIFFExtendProc);
|
||||||
extern uint32 TIFFComputeTile(TIFF* tif, uint32 x, uint32 y, uint32 z, uint16 s);
|
extern uint32_t TIFFComputeTile(TIFF *tif, uint32_t x, uint32_t y,
|
||||||
extern int TIFFCheckTile(TIFF* tif, uint32 x, uint32 y, uint32 z, uint16 s);
|
uint32_t z, uint16_t s);
|
||||||
extern uint32 TIFFNumberOfTiles(TIFF*);
|
extern int TIFFCheckTile(TIFF *tif, uint32_t x, uint32_t y, uint32_t z,
|
||||||
extern tmsize_t TIFFReadTile(TIFF* tif, void* buf, uint32 x, uint32 y, uint32 z, uint16 s);
|
uint16_t s);
|
||||||
extern tmsize_t TIFFWriteTile(TIFF* tif, void* buf, uint32 x, uint32 y, uint32 z, uint16 s);
|
extern uint32_t TIFFNumberOfTiles(TIFF *);
|
||||||
extern uint32 TIFFComputeStrip(TIFF*, uint32, uint16);
|
extern tmsize_t TIFFReadTile(TIFF *tif, void *buf, uint32_t x, uint32_t y,
|
||||||
extern uint32 TIFFNumberOfStrips(TIFF*);
|
uint32_t z, uint16_t s);
|
||||||
extern tmsize_t TIFFReadEncodedStrip(TIFF* tif, uint32 strip, void* buf, tmsize_t size);
|
extern tmsize_t TIFFWriteTile(TIFF *tif, void *buf, uint32_t x, uint32_t y,
|
||||||
extern tmsize_t TIFFReadRawStrip(TIFF* tif, uint32 strip, void* buf, tmsize_t size);
|
uint32_t z, uint16_t s);
|
||||||
extern tmsize_t TIFFReadEncodedTile(TIFF* tif, uint32 tile, void* buf, tmsize_t size);
|
extern uint32_t TIFFComputeStrip(TIFF *, uint32_t, uint16_t);
|
||||||
extern tmsize_t TIFFReadRawTile(TIFF* tif, uint32 tile, void* buf, tmsize_t size);
|
extern uint32_t TIFFNumberOfStrips(TIFF *);
|
||||||
extern int TIFFReadFromUserBuffer(TIFF* tif, uint32 strile,
|
extern tmsize_t TIFFReadEncodedStrip(TIFF *tif, uint32_t strip, void *buf,
|
||||||
void* inbuf, tmsize_t insize,
|
tmsize_t size);
|
||||||
void* outbuf, tmsize_t outsize);
|
extern tmsize_t TIFFReadRawStrip(TIFF *tif, uint32_t strip, void *buf,
|
||||||
extern tmsize_t TIFFWriteEncodedStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc);
|
tmsize_t size);
|
||||||
extern tmsize_t TIFFWriteRawStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc);
|
extern tmsize_t TIFFReadEncodedTile(TIFF *tif, uint32_t tile, void *buf,
|
||||||
extern tmsize_t TIFFWriteEncodedTile(TIFF* tif, uint32 tile, void* data, tmsize_t cc);
|
tmsize_t size);
|
||||||
extern tmsize_t TIFFWriteRawTile(TIFF* tif, uint32 tile, void* data, tmsize_t cc);
|
extern tmsize_t TIFFReadRawTile(TIFF *tif, uint32_t tile, void *buf,
|
||||||
extern int TIFFDataWidth(TIFFDataType); /* table of tag datatype widths */
|
tmsize_t size);
|
||||||
|
extern int TIFFReadFromUserBuffer(TIFF *tif, uint32_t strile, void *inbuf,
|
||||||
|
tmsize_t insize, void *outbuf,
|
||||||
|
tmsize_t outsize);
|
||||||
|
extern tmsize_t TIFFWriteEncodedStrip(TIFF *tif, uint32_t strip, void *data,
|
||||||
|
tmsize_t cc);
|
||||||
|
extern tmsize_t TIFFWriteRawStrip(TIFF *tif, uint32_t strip, void *data,
|
||||||
|
tmsize_t cc);
|
||||||
|
extern tmsize_t TIFFWriteEncodedTile(TIFF *tif, uint32_t tile, void *data,
|
||||||
|
tmsize_t cc);
|
||||||
|
extern tmsize_t TIFFWriteRawTile(TIFF *tif, uint32_t tile, void *data,
|
||||||
|
tmsize_t cc);
|
||||||
|
extern int TIFFDataWidth(
|
||||||
|
TIFFDataType); /* table of tag datatype widths within TIFF file. */
|
||||||
extern void TIFFSetWriteOffset(TIFF *tif, toff_t off);
|
extern void TIFFSetWriteOffset(TIFF *tif, toff_t off);
|
||||||
extern void TIFFSwabShort(uint16*);
|
extern void TIFFSwabShort(uint16_t *);
|
||||||
extern void TIFFSwabLong(uint32*);
|
extern void TIFFSwabLong(uint32_t *);
|
||||||
extern void TIFFSwabLong8(uint64*);
|
extern void TIFFSwabLong8(uint64_t *);
|
||||||
extern void TIFFSwabFloat(float *);
|
extern void TIFFSwabFloat(float *);
|
||||||
extern void TIFFSwabDouble(double *);
|
extern void TIFFSwabDouble(double *);
|
||||||
extern void TIFFSwabArrayOfShort(uint16* wp, tmsize_t n);
|
extern void TIFFSwabArrayOfShort(uint16_t *wp, tmsize_t n);
|
||||||
extern void TIFFSwabArrayOfTriples(uint8* tp, tmsize_t n);
|
extern void TIFFSwabArrayOfTriples(uint8_t *tp, tmsize_t n);
|
||||||
extern void TIFFSwabArrayOfLong(uint32* lp, tmsize_t n);
|
extern void TIFFSwabArrayOfLong(uint32_t *lp, tmsize_t n);
|
||||||
extern void TIFFSwabArrayOfLong8(uint64* lp, tmsize_t n);
|
extern void TIFFSwabArrayOfLong8(uint64_t *lp, tmsize_t n);
|
||||||
extern void TIFFSwabArrayOfFloat(float *fp, tmsize_t n);
|
extern void TIFFSwabArrayOfFloat(float *fp, tmsize_t n);
|
||||||
extern void TIFFSwabArrayOfDouble(double *dp, tmsize_t n);
|
extern void TIFFSwabArrayOfDouble(double *dp, tmsize_t n);
|
||||||
extern void TIFFReverseBits(uint8* cp, tmsize_t n);
|
extern void TIFFReverseBits(uint8_t *cp, tmsize_t n);
|
||||||
extern const unsigned char *TIFFGetBitRevTable(int);
|
extern const unsigned char *TIFFGetBitRevTable(int);
|
||||||
|
|
||||||
extern uint64 TIFFGetStrileOffset(TIFF *tif, uint32 strile);
|
extern uint64_t TIFFGetStrileOffset(TIFF *tif, uint32_t strile);
|
||||||
extern uint64 TIFFGetStrileByteCount(TIFF *tif, uint32 strile);
|
extern uint64_t TIFFGetStrileByteCount(TIFF *tif, uint32_t strile);
|
||||||
extern uint64 TIFFGetStrileOffsetWithErr(TIFF *tif, uint32 strile, int *pbErr);
|
extern uint64_t TIFFGetStrileOffsetWithErr(TIFF *tif, uint32_t strile,
|
||||||
extern uint64 TIFFGetStrileByteCountWithErr(TIFF *tif, uint32 strile, int *pbErr);
|
int *pbErr);
|
||||||
|
extern uint64_t TIFFGetStrileByteCountWithErr(TIFF *tif, uint32_t strile,
|
||||||
|
int *pbErr);
|
||||||
|
|
||||||
#ifdef LOGLUV_PUBLIC
|
#ifdef LOGLUV_PUBLIC
|
||||||
#define U_NEU 0.210526316
|
#define U_NEU 0.210526316
|
||||||
@ -508,42 +596,44 @@ extern uint64 TIFFGetStrileByteCountWithErr(TIFF *tif, uint32 strile, int *pbErr
|
|||||||
#define UVSCALE 410.
|
#define UVSCALE 410.
|
||||||
extern double LogL16toY(int);
|
extern double LogL16toY(int);
|
||||||
extern double LogL10toY(int);
|
extern double LogL10toY(int);
|
||||||
extern void XYZtoRGB24(float*, uint8*);
|
extern void XYZtoRGB24(float *, uint8_t *);
|
||||||
extern int uv_decode(double *, double *, int);
|
extern int uv_decode(double *, double *, int);
|
||||||
extern void LogLuv24toXYZ(uint32, float*);
|
extern void LogLuv24toXYZ(uint32_t, float *);
|
||||||
extern void LogLuv32toXYZ(uint32, float*);
|
extern void LogLuv32toXYZ(uint32_t, float *);
|
||||||
#if defined(c_plusplus) || defined(__cplusplus)
|
#if defined(c_plusplus) || defined(__cplusplus)
|
||||||
extern int LogL16fromY(double, int = SGILOGENCODE_NODITHER);
|
extern int LogL16fromY(double, int = SGILOGENCODE_NODITHER);
|
||||||
extern int LogL10fromY(double, int = SGILOGENCODE_NODITHER);
|
extern int LogL10fromY(double, int = SGILOGENCODE_NODITHER);
|
||||||
extern int uv_encode(double, double, int = SGILOGENCODE_NODITHER);
|
extern int uv_encode(double, double, int = SGILOGENCODE_NODITHER);
|
||||||
extern uint32 LogLuv24fromXYZ(float*, int = SGILOGENCODE_NODITHER);
|
extern uint32_t LogLuv24fromXYZ(float *, int = SGILOGENCODE_NODITHER);
|
||||||
extern uint32 LogLuv32fromXYZ(float*, int = SGILOGENCODE_NODITHER);
|
extern uint32_t LogLuv32fromXYZ(float *, int = SGILOGENCODE_NODITHER);
|
||||||
#else
|
#else
|
||||||
extern int LogL16fromY(double, int);
|
extern int LogL16fromY(double, int);
|
||||||
extern int LogL10fromY(double, int);
|
extern int LogL10fromY(double, int);
|
||||||
extern int uv_encode(double, double, int);
|
extern int uv_encode(double, double, int);
|
||||||
extern uint32 LogLuv24fromXYZ(float*, int);
|
extern uint32_t LogLuv24fromXYZ(float *, int);
|
||||||
extern uint32 LogLuv32fromXYZ(float*, int);
|
extern uint32_t LogLuv32fromXYZ(float *, int);
|
||||||
#endif
|
#endif
|
||||||
#endif /* LOGLUV_PUBLIC */
|
#endif /* LOGLUV_PUBLIC */
|
||||||
|
|
||||||
extern int TIFFCIELabToRGBInit(TIFFCIELabToRGB*, const TIFFDisplay *, float*);
|
extern int TIFFCIELabToRGBInit(TIFFCIELabToRGB *, const TIFFDisplay *,
|
||||||
extern void TIFFCIELabToXYZ(TIFFCIELabToRGB *, uint32, int32, int32,
|
float *);
|
||||||
|
extern void TIFFCIELabToXYZ(TIFFCIELabToRGB *, uint32_t, int32_t, int32_t,
|
||||||
float *, float *, float *);
|
float *, float *, float *);
|
||||||
extern void TIFFXYZToRGB(TIFFCIELabToRGB *, float, float, float,
|
extern void TIFFXYZToRGB(TIFFCIELabToRGB *, float, float, float, uint32_t *,
|
||||||
uint32 *, uint32 *, uint32 *);
|
uint32_t *, uint32_t *);
|
||||||
|
|
||||||
extern int TIFFYCbCrToRGBInit(TIFFYCbCrToRGB *, float *, float *);
|
extern int TIFFYCbCrToRGBInit(TIFFYCbCrToRGB *, float *, float *);
|
||||||
extern void TIFFYCbCrtoRGB(TIFFYCbCrToRGB *, uint32, int32, int32,
|
extern void TIFFYCbCrtoRGB(TIFFYCbCrToRGB *, uint32_t, int32_t, int32_t,
|
||||||
uint32 *, uint32 *, uint32 *);
|
uint32_t *, uint32_t *, uint32_t *);
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* O B S O L E T E D I N T E R F A C E S
|
* O B S O L E T E D I N T E R F A C E S
|
||||||
*
|
*
|
||||||
* Don't use this stuff in your applications, it may be removed in the future
|
* Don't use this stuff in your applications, it may be removed in the
|
||||||
* libtiff versions.
|
*future libtiff versions.
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
typedef struct {
|
typedef struct
|
||||||
|
{
|
||||||
ttag_t field_tag; /* field's tag */
|
ttag_t field_tag; /* field's tag */
|
||||||
short field_readcount; /* read count/TIFF_VARIABLE/TIFF_SPP */
|
short field_readcount; /* read count/TIFF_VARIABLE/TIFF_SPP */
|
||||||
short field_writecount; /* write count/TIFF_VARIABLE */
|
short field_writecount; /* write count/TIFF_VARIABLE */
|
||||||
@ -554,19 +644,10 @@ typedef struct {
|
|||||||
char *field_name; /* ASCII name */
|
char *field_name; /* ASCII name */
|
||||||
} TIFFFieldInfo;
|
} TIFFFieldInfo;
|
||||||
|
|
||||||
extern int TIFFMergeFieldInfo(TIFF*, const TIFFFieldInfo[], uint32);
|
extern int TIFFMergeFieldInfo(TIFF *, const TIFFFieldInfo[], uint32_t);
|
||||||
|
|
||||||
#if defined(c_plusplus) || defined(__cplusplus)
|
#if defined(c_plusplus) || defined(__cplusplus)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* _TIFFIO_ */
|
#endif /* _TIFFIO_ */
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
11
3rdparty/libtiff/tiffio.hxx
vendored
11
3rdparty/libtiff/tiffio.hxx
vendored
@ -29,20 +29,11 @@
|
|||||||
* TIFF I/O library definitions which provide C++ streams API.
|
* TIFF I/O library definitions which provide C++ streams API.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include "tiff.h"
|
#include "tiff.h"
|
||||||
#include "tiffio.h"
|
#include "tiffio.h"
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
extern TIFF *TIFFStreamOpen(const char *, std::ostream *);
|
extern TIFF *TIFFStreamOpen(const char *, std::ostream *);
|
||||||
extern TIFF *TIFFStreamOpen(const char *, std::istream *);
|
extern TIFF *TIFFStreamOpen(const char *, std::istream *);
|
||||||
|
|
||||||
#endif /* _TIFFIO_HXX_ */
|
#endif /* _TIFFIO_HXX_ */
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c++
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
342
3rdparty/libtiff/tiffiop.h
vendored
342
3rdparty/libtiff/tiffiop.h
vendored
@ -38,9 +38,7 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_STRING_H
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_ASSERT_H
|
#ifdef HAVE_ASSERT_H
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
@ -48,27 +46,23 @@
|
|||||||
#define assert(x)
|
#define assert(x)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_SEARCH_H
|
#include "tif_hash_set.h"
|
||||||
# include <search.h>
|
|
||||||
#else
|
|
||||||
extern void *lfind(const void *, const void *, size_t *, size_t,
|
|
||||||
int (*)(const void *, const void *));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(HAVE_SNPRINTF) && !defined(HAVE__SNPRINTF)
|
|
||||||
#undef snprintf
|
|
||||||
#define snprintf _TIFF_snprintf_f
|
|
||||||
extern int snprintf(char* str, size_t size, const char* format, ...);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "tiffio.h"
|
#include "tiffio.h"
|
||||||
|
|
||||||
#include "tif_dir.h"
|
#include "tif_dir.h"
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
#ifndef STRIP_SIZE_DEFAULT
|
#ifndef STRIP_SIZE_DEFAULT
|
||||||
#define STRIP_SIZE_DEFAULT 8192
|
#define STRIP_SIZE_DEFAULT 8192
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef TIFF_MAX_DIR_COUNT
|
||||||
|
#define TIFF_MAX_DIR_COUNT 1048576
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define TIFF_NON_EXISTENT_DIR_NUMBER UINT_MAX
|
||||||
|
|
||||||
#define streq(a, b) (strcmp(a, b) == 0)
|
#define streq(a, b) (strcmp(a, b) == 0)
|
||||||
#define strneq(a, b, n) (strncmp(a, b, n) == 0)
|
#define strneq(a, b, n) (strncmp(a, b, n) == 0)
|
||||||
|
|
||||||
@ -77,20 +71,8 @@ extern int snprintf(char* str, size_t size, const char* format, ...);
|
|||||||
#define FALSE 0
|
#define FALSE 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define TIFF_SIZE_T_MAX ((size_t) ~ ((size_t)0))
|
typedef struct client_info
|
||||||
#define TIFF_TMSIZE_T_MAX (tmsize_t)(TIFF_SIZE_T_MAX >> 1)
|
{
|
||||||
|
|
||||||
/*
|
|
||||||
* Largest 32-bit unsigned integer value.
|
|
||||||
*/
|
|
||||||
#define TIFF_UINT32_MAX 0xFFFFFFFFU
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Largest 64-bit unsigned integer value.
|
|
||||||
*/
|
|
||||||
#define TIFF_UINT64_MAX (((uint64)(TIFF_UINT32_MAX)) << 32 | TIFF_UINT32_MAX)
|
|
||||||
|
|
||||||
typedef struct client_info {
|
|
||||||
struct client_info *next;
|
struct client_info *next;
|
||||||
void *data;
|
void *data;
|
||||||
char *name;
|
char *name;
|
||||||
@ -105,18 +87,27 @@ typedef tidataval_t* tidata_t; /* reference to internal image data */
|
|||||||
|
|
||||||
typedef void (*TIFFVoidMethod)(TIFF *);
|
typedef void (*TIFFVoidMethod)(TIFF *);
|
||||||
typedef int (*TIFFBoolMethod)(TIFF *);
|
typedef int (*TIFFBoolMethod)(TIFF *);
|
||||||
typedef int (*TIFFPreMethod)(TIFF*, uint16);
|
typedef int (*TIFFPreMethod)(TIFF *, uint16_t);
|
||||||
typedef int (*TIFFCodeMethod)(TIFF* tif, uint8* buf, tmsize_t size, uint16 sample);
|
typedef int (*TIFFCodeMethod)(TIFF *tif, uint8_t *buf, tmsize_t size,
|
||||||
typedef int (*TIFFSeekMethod)(TIFF*, uint32);
|
uint16_t sample);
|
||||||
typedef void (*TIFFPostMethod)(TIFF* tif, uint8* buf, tmsize_t size);
|
typedef int (*TIFFSeekMethod)(TIFF *, uint32_t);
|
||||||
typedef uint32 (*TIFFStripMethod)(TIFF*, uint32);
|
typedef void (*TIFFPostMethod)(TIFF *tif, uint8_t *buf, tmsize_t size);
|
||||||
typedef void (*TIFFTileMethod)(TIFF*, uint32*, uint32*);
|
typedef uint32_t (*TIFFStripMethod)(TIFF *, uint32_t);
|
||||||
|
typedef void (*TIFFTileMethod)(TIFF *, uint32_t *, uint32_t *);
|
||||||
|
|
||||||
struct tiff {
|
struct TIFFOffsetAndDirNumber
|
||||||
|
{
|
||||||
|
uint64_t offset;
|
||||||
|
tdir_t dirNumber;
|
||||||
|
};
|
||||||
|
typedef struct TIFFOffsetAndDirNumber TIFFOffsetAndDirNumber;
|
||||||
|
|
||||||
|
struct tiff
|
||||||
|
{
|
||||||
char *tif_name; /* name of open file */
|
char *tif_name; /* name of open file */
|
||||||
int tif_fd; /* open file descriptor */
|
int tif_fd; /* open file descriptor */
|
||||||
int tif_mode; /* open mode (O_*) */
|
int tif_mode; /* open mode (O_*) */
|
||||||
uint32 tif_flags;
|
uint32_t tif_flags;
|
||||||
#define TIFF_FILLORDER 0x00003U /* natural bit fill order for machine */
|
#define TIFF_FILLORDER 0x00003U /* natural bit fill order for machine */
|
||||||
#define TIFF_DIRTYHEADER 0x00004U /* header must be written on close */
|
#define TIFF_DIRTYHEADER 0x00004U /* header must be written on close */
|
||||||
#define TIFF_DIRTYDIRECT 0x00008U /* current directory must be written */
|
#define TIFF_DIRTYDIRECT 0x00008U /* current directory must be written */
|
||||||
@ -132,41 +123,56 @@ struct tiff {
|
|||||||
#define TIFF_INSUBIFD 0x02000U /* currently writing a subifd */
|
#define TIFF_INSUBIFD 0x02000U /* currently writing a subifd */
|
||||||
#define TIFF_UPSAMPLED 0x04000U /* library is doing data up-sampling */
|
#define TIFF_UPSAMPLED 0x04000U /* library is doing data up-sampling */
|
||||||
#define TIFF_STRIPCHOP 0x08000U /* enable strip chopping support */
|
#define TIFF_STRIPCHOP 0x08000U /* enable strip chopping support */
|
||||||
#define TIFF_HEADERONLY 0x10000U /* read header only, do not process the first directory */
|
#define TIFF_HEADERONLY \
|
||||||
#define TIFF_NOREADRAW 0x20000U /* skip reading of raw uncompressed image data */
|
0x10000U /* read header only, do not process the first directory */
|
||||||
|
#define TIFF_NOREADRAW \
|
||||||
|
0x20000U /* skip reading of raw uncompressed image data */
|
||||||
#define TIFF_INCUSTOMIFD 0x40000U /* currently writing a custom IFD */
|
#define TIFF_INCUSTOMIFD 0x40000U /* currently writing a custom IFD */
|
||||||
#define TIFF_BIGTIFF 0x80000U /* read/write bigtiff */
|
#define TIFF_BIGTIFF 0x80000U /* read/write bigtiff */
|
||||||
#define TIFF_BUF4WRITE 0x100000U /* rawcc bytes are for writing */
|
#define TIFF_BUF4WRITE 0x100000U /* rawcc bytes are for writing */
|
||||||
#define TIFF_DIRTYSTRIP 0x200000U /* stripoffsets/stripbytecount dirty*/
|
#define TIFF_DIRTYSTRIP 0x200000U /* stripoffsets/stripbytecount dirty*/
|
||||||
#define TIFF_PERSAMPLE 0x400000U /* get/set per sample tags as arrays */
|
#define TIFF_PERSAMPLE 0x400000U /* get/set per sample tags as arrays */
|
||||||
#define TIFF_BUFFERMMAP 0x800000U /* read buffer (tif_rawdata) points into mmap() memory */
|
#define TIFF_BUFFERMMAP \
|
||||||
#define TIFF_DEFERSTRILELOAD 0x1000000U /* defer strip/tile offset/bytecount array loading. */
|
0x800000U /* read buffer (tif_rawdata) points into mmap() memory */
|
||||||
#define TIFF_LAZYSTRILELOAD 0x2000000U /* lazy/ondemand loading of strip/tile offset/bytecount values. Only used if TIFF_DEFERSTRILELOAD is set and in read-only mode */
|
#define TIFF_DEFERSTRILELOAD \
|
||||||
#define TIFF_CHOPPEDUPARRAYS 0x4000000U /* set when allocChoppedUpStripArrays() has modified strip array */
|
0x1000000U /* defer strip/tile offset/bytecount array loading. */
|
||||||
uint64 tif_diroff; /* file offset of current directory */
|
#define TIFF_LAZYSTRILELOAD \
|
||||||
uint64 tif_nextdiroff; /* file offset of following directory */
|
0x2000000U /* lazy/ondemand loading of strip/tile offset/bytecount values. \
|
||||||
uint64* tif_dirlist; /* list of offsets to already seen directories to prevent IFD looping */
|
Only used if TIFF_DEFERSTRILELOAD is set and in read-only \
|
||||||
uint16 tif_dirlistsize; /* number of entries in offset list */
|
mode */
|
||||||
uint16 tif_dirnumber; /* number of already seen directories */
|
#define TIFF_CHOPPEDUPARRAYS \
|
||||||
|
0x4000000U /* set when allocChoppedUpStripArrays() has modified strip \
|
||||||
|
array */
|
||||||
|
uint64_t tif_diroff; /* file offset of current directory */
|
||||||
|
uint64_t tif_nextdiroff; /* file offset of following directory */
|
||||||
|
uint64_t tif_lastdiroff; /* file offset of last directory written so far */
|
||||||
|
TIFFHashSet *tif_map_dir_offset_to_number;
|
||||||
|
TIFFHashSet *tif_map_dir_number_to_offset;
|
||||||
|
int tif_setdirectory_force_absolute; /* switch between relative and absolute
|
||||||
|
stepping in TIFFSetDirectory() */
|
||||||
TIFFDirectory tif_dir; /* internal rep of current directory */
|
TIFFDirectory tif_dir; /* internal rep of current directory */
|
||||||
TIFFDirectory tif_customdir; /* custom IFDs are separated from the main ones */
|
TIFFDirectory
|
||||||
union {
|
tif_customdir; /* custom IFDs are separated from the main ones */
|
||||||
|
union
|
||||||
|
{
|
||||||
TIFFHeaderCommon common;
|
TIFFHeaderCommon common;
|
||||||
TIFFHeaderClassic classic;
|
TIFFHeaderClassic classic;
|
||||||
TIFFHeaderBig big;
|
TIFFHeaderBig big;
|
||||||
} tif_header;
|
} tif_header;
|
||||||
uint16 tif_header_size; /* file's header block and its length */
|
uint16_t tif_header_size; /* file's header block and its length */
|
||||||
uint32 tif_row; /* current scanline */
|
uint32_t tif_row; /* current scanline */
|
||||||
uint16 tif_curdir; /* current directory (index) */
|
tdir_t tif_curdir; /* current directory (index) */
|
||||||
uint32 tif_curstrip; /* current strip for read/write */
|
uint32_t tif_curstrip; /* current strip for read/write */
|
||||||
uint64 tif_curoff; /* current offset for read/write */
|
uint64_t tif_curoff; /* current offset for read/write */
|
||||||
uint64 tif_dataoff; /* current offset for writing dir */
|
uint64_t tif_lastvalidoff; /* last valid offset allowed for rewrite in
|
||||||
|
place. Used only by TIFFAppendToStrip() */
|
||||||
|
uint64_t tif_dataoff; /* current offset for writing dir */
|
||||||
/* SubIFD support */
|
/* SubIFD support */
|
||||||
uint16 tif_nsubifd; /* remaining subifds to write */
|
uint16_t tif_nsubifd; /* remaining subifds to write */
|
||||||
uint64 tif_subifdoff; /* offset for patching SubIFD link */
|
uint64_t tif_subifdoff; /* offset for patching SubIFD link */
|
||||||
/* tiling support */
|
/* tiling support */
|
||||||
uint32 tif_col; /* current column (offset by row too) */
|
uint32_t tif_col; /* current column (offset by row too) */
|
||||||
uint32 tif_curtile; /* current tile for read/write */
|
uint32_t tif_curtile; /* current tile for read/write */
|
||||||
tmsize_t tif_tilesize; /* # of bytes in a tile */
|
tmsize_t tif_tilesize; /* # of bytes in a tile */
|
||||||
/* compression scheme hooks */
|
/* compression scheme hooks */
|
||||||
int tif_decodestatus;
|
int tif_decodestatus;
|
||||||
@ -188,18 +194,18 @@ struct tiff {
|
|||||||
TIFFVoidMethod tif_cleanup; /* cleanup state routine */
|
TIFFVoidMethod tif_cleanup; /* cleanup state routine */
|
||||||
TIFFStripMethod tif_defstripsize; /* calculate/constrain strip size */
|
TIFFStripMethod tif_defstripsize; /* calculate/constrain strip size */
|
||||||
TIFFTileMethod tif_deftilesize; /* calculate/constrain tile size */
|
TIFFTileMethod tif_deftilesize; /* calculate/constrain tile size */
|
||||||
uint8* tif_data; /* compression scheme private data */
|
uint8_t *tif_data; /* compression scheme private data */
|
||||||
/* input/output buffering */
|
/* input/output buffering */
|
||||||
tmsize_t tif_scanlinesize; /* # of bytes in a scanline */
|
tmsize_t tif_scanlinesize; /* # of bytes in a scanline */
|
||||||
tmsize_t tif_scanlineskew; /* scanline skew for reading strips */
|
tmsize_t tif_scanlineskew; /* scanline skew for reading strips */
|
||||||
uint8* tif_rawdata; /* raw data buffer */
|
uint8_t *tif_rawdata; /* raw data buffer */
|
||||||
tmsize_t tif_rawdatasize; /* # of bytes in raw data buffer */
|
tmsize_t tif_rawdatasize; /* # of bytes in raw data buffer */
|
||||||
tmsize_t tif_rawdataoff; /* rawdata offset within strip */
|
tmsize_t tif_rawdataoff; /* rawdata offset within strip */
|
||||||
tmsize_t tif_rawdataloaded; /* amount of data in rawdata */
|
tmsize_t tif_rawdataloaded; /* amount of data in rawdata */
|
||||||
uint8* tif_rawcp; /* current spot in raw buffer */
|
uint8_t *tif_rawcp; /* current spot in raw buffer */
|
||||||
tmsize_t tif_rawcc; /* bytes unread from raw buffer */
|
tmsize_t tif_rawcc; /* bytes unread from raw buffer */
|
||||||
/* memory-mapped file support */
|
/* memory-mapped file support */
|
||||||
uint8* tif_base; /* base of mapped file */
|
uint8_t *tif_base; /* base of mapped file */
|
||||||
tmsize_t tif_size; /* size of mapped file region (bytes, thus tmsize_t) */
|
tmsize_t tif_size; /* size of mapped file region (bytes, thus tmsize_t) */
|
||||||
TIFFMapFileProc tif_mapproc; /* map file method */
|
TIFFMapFileProc tif_mapproc; /* map file method */
|
||||||
TIFFUnmapFileProc tif_unmapproc; /* unmap file method */
|
TIFFUnmapFileProc tif_unmapproc; /* unmap file method */
|
||||||
@ -222,6 +228,21 @@ struct tiff {
|
|||||||
* setting up an old tag extension scheme. */
|
* setting up an old tag extension scheme. */
|
||||||
TIFFFieldArray *tif_fieldscompat;
|
TIFFFieldArray *tif_fieldscompat;
|
||||||
size_t tif_nfieldscompat;
|
size_t tif_nfieldscompat;
|
||||||
|
/* Error handler support */
|
||||||
|
TIFFErrorHandlerExtR tif_errorhandler;
|
||||||
|
void *tif_errorhandler_user_data;
|
||||||
|
TIFFErrorHandlerExtR tif_warnhandler;
|
||||||
|
void *tif_warnhandler_user_data;
|
||||||
|
tmsize_t tif_max_single_mem_alloc; /* in bytes. 0 for unlimited */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TIFFOpenOptions
|
||||||
|
{
|
||||||
|
TIFFErrorHandlerExtR errorhandler; /* may be NULL */
|
||||||
|
void *errorhandler_user_data; /* may be NULL */
|
||||||
|
TIFFErrorHandlerExtR warnhandler; /* may be NULL */
|
||||||
|
void *warnhandler_user_data; /* may be NULL */
|
||||||
|
tmsize_t max_single_mem_alloc; /* in bytes. 0 for unlimited */
|
||||||
};
|
};
|
||||||
|
|
||||||
#define isPseudoTag(t) (t > 0xffff) /* is tag value normal or pseudo */
|
#define isPseudoTag(t) (t > 0xffff) /* is tag value normal or pseudo */
|
||||||
@ -236,10 +257,8 @@ struct tiff {
|
|||||||
((*(tif)->tif_writeproc)((tif)->tif_clientdata, (buf), (size)))
|
((*(tif)->tif_writeproc)((tif)->tif_clientdata, (buf), (size)))
|
||||||
#define TIFFSeekFile(tif, off, whence) \
|
#define TIFFSeekFile(tif, off, whence) \
|
||||||
((*(tif)->tif_seekproc)((tif)->tif_clientdata, (off), (whence)))
|
((*(tif)->tif_seekproc)((tif)->tif_clientdata, (off), (whence)))
|
||||||
#define TIFFCloseFile(tif) \
|
#define TIFFCloseFile(tif) ((*(tif)->tif_closeproc)((tif)->tif_clientdata))
|
||||||
((*(tif)->tif_closeproc)((tif)->tif_clientdata))
|
#define TIFFGetFileSize(tif) ((*(tif)->tif_sizeproc)((tif)->tif_clientdata))
|
||||||
#define TIFFGetFileSize(tif) \
|
|
||||||
((*(tif)->tif_sizeproc)((tif)->tif_clientdata))
|
|
||||||
#define TIFFMapFileContents(tif, paddr, psize) \
|
#define TIFFMapFileContents(tif, paddr, psize) \
|
||||||
((*(tif)->tif_mapproc)((tif)->tif_clientdata, (paddr), (psize)))
|
((*(tif)->tif_mapproc)((tif)->tif_clientdata, (paddr), (psize)))
|
||||||
#define TIFFUnmapFileContents(tif, addr, size) \
|
#define TIFFUnmapFileContents(tif, addr, size) \
|
||||||
@ -249,33 +268,40 @@ struct tiff {
|
|||||||
* Default Read/Seek/Write definitions.
|
* Default Read/Seek/Write definitions.
|
||||||
*/
|
*/
|
||||||
#ifndef ReadOK
|
#ifndef ReadOK
|
||||||
#define ReadOK(tif, buf, size) \
|
#define ReadOK(tif, buf, size) (TIFFReadFile((tif), (buf), (size)) == (size))
|
||||||
(TIFFReadFile((tif),(buf),(size))==(size))
|
|
||||||
#endif
|
#endif
|
||||||
#ifndef SeekOK
|
#ifndef SeekOK
|
||||||
#define SeekOK(tif, off) _TIFFSeekOK(tif, off)
|
#define SeekOK(tif, off) _TIFFSeekOK(tif, off)
|
||||||
#endif
|
#endif
|
||||||
#ifndef WriteOK
|
#ifndef WriteOK
|
||||||
#define WriteOK(tif, buf, size) \
|
#define WriteOK(tif, buf, size) (TIFFWriteFile((tif), (buf), (size)) == (size))
|
||||||
(TIFFWriteFile((tif),(buf),(size))==(size))
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* NB: the uint32 casts are to silence certain ANSI-C compilers */
|
/* NB: the uint32_t casts are to silence certain ANSI-C compilers */
|
||||||
#define TIFFhowmany_32(x, y) (((uint32)x < (0xffffffff - (uint32)(y-1))) ? \
|
#define TIFFhowmany_32(x, y) \
|
||||||
((((uint32)(x))+(((uint32)(y))-1))/((uint32)(y))) : \
|
(((uint32_t)x < (0xffffffff - (uint32_t)(y - 1))) \
|
||||||
0U)
|
? ((((uint32_t)(x)) + (((uint32_t)(y)) - 1)) / ((uint32_t)(y))) \
|
||||||
|
: 0U)
|
||||||
/* Variant of TIFFhowmany_32() that doesn't return 0 if x close to MAXUINT. */
|
/* Variant of TIFFhowmany_32() that doesn't return 0 if x close to MAXUINT. */
|
||||||
/* Caution: TIFFhowmany_32_maxuint_compat(x,y)*y might overflow */
|
/* Caution: TIFFhowmany_32_maxuint_compat(x,y)*y might overflow */
|
||||||
#define TIFFhowmany_32_maxuint_compat(x, y) \
|
#define TIFFhowmany_32_maxuint_compat(x, y) \
|
||||||
(((uint32)(x) / (uint32)(y)) + ((((uint32)(x) % (uint32)(y)) != 0) ? 1 : 0))
|
(((uint32_t)(x) / (uint32_t)(y)) + \
|
||||||
#define TIFFhowmany8_32(x) (((x)&0x07)?((uint32)(x)>>3)+1:(uint32)(x)>>3)
|
((((uint32_t)(x) % (uint32_t)(y)) != 0) ? 1 : 0))
|
||||||
|
#define TIFFhowmany8_32(x) \
|
||||||
|
(((x)&0x07) ? ((uint32_t)(x) >> 3) + 1 : (uint32_t)(x) >> 3)
|
||||||
#define TIFFroundup_32(x, y) (TIFFhowmany_32(x, y) * (y))
|
#define TIFFroundup_32(x, y) (TIFFhowmany_32(x, y) * (y))
|
||||||
#define TIFFhowmany_64(x, y) ((((uint64)(x))+(((uint64)(y))-1))/((uint64)(y)))
|
#define TIFFhowmany_64(x, y) \
|
||||||
#define TIFFhowmany8_64(x) (((x)&0x07)?((uint64)(x)>>3)+1:(uint64)(x)>>3)
|
((((uint64_t)(x)) + (((uint64_t)(y)) - 1)) / ((uint64_t)(y)))
|
||||||
|
#define TIFFhowmany8_64(x) \
|
||||||
|
(((x)&0x07) ? ((uint64_t)(x) >> 3) + 1 : (uint64_t)(x) >> 3)
|
||||||
#define TIFFroundup_64(x, y) (TIFFhowmany_64(x, y) * (y))
|
#define TIFFroundup_64(x, y) (TIFFhowmany_64(x, y) * (y))
|
||||||
|
|
||||||
/* Safe multiply which returns zero if there is an *unsigned* integer overflow. This macro is not safe for *signed* integer types */
|
/* Safe multiply which returns zero if there is an *unsigned* integer overflow.
|
||||||
#define TIFFSafeMultiply(t,v,m) ((((t)(m) != (t)0) && (((t)(((v)*(m))/(m))) == (t)(v))) ? (t)((v)*(m)) : (t)0)
|
* This macro is not safe for *signed* integer types */
|
||||||
|
#define TIFFSafeMultiply(t, v, m) \
|
||||||
|
((((t)(m) != (t)0) && (((t)(((v) * (m)) / (m))) == (t)(v))) \
|
||||||
|
? (t)((v) * (m)) \
|
||||||
|
: (t)0)
|
||||||
|
|
||||||
#define TIFFmax(A, B) ((A) > (B) ? (A) : (B))
|
#define TIFFmax(A, B) ((A) > (B) ? (A) : (B))
|
||||||
#define TIFFmin(A, B) ((A) < (B) ? (A) : (B))
|
#define TIFFmin(A, B) ((A) < (B) ? (A) : (B))
|
||||||
@ -305,16 +331,19 @@ struct tiff {
|
|||||||
#define ftell(stream, offset, whence) ftello(stream, offset, whence)
|
#define ftell(stream, offset, whence) ftello(stream, offset, whence)
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if defined(__WIN32__) && \
|
#if defined(__WIN32__) && !(defined(_MSC_VER) && _MSC_VER < 1400) && \
|
||||||
!(defined(_MSC_VER) && _MSC_VER < 1400) && \
|
|
||||||
!(defined(__MSVCRT_VERSION__) && __MSVCRT_VERSION__ < 0x800)
|
!(defined(__MSVCRT_VERSION__) && __MSVCRT_VERSION__ < 0x800)
|
||||||
typedef unsigned int TIFFIOSize_t;
|
typedef unsigned int TIFFIOSize_t;
|
||||||
#define _TIFF_lseek_f(fildes,offset,whence) _lseeki64(fildes,/* __int64 */ offset,whence)
|
#define _TIFF_lseek_f(fildes, offset, whence) \
|
||||||
|
_lseeki64(fildes, /* __int64 */ offset, whence)
|
||||||
/* #define _TIFF_tell_f(fildes) /\* __int64 *\/ _telli64(fildes) */
|
/* #define _TIFF_tell_f(fildes) /\* __int64 *\/ _telli64(fildes) */
|
||||||
#define _TIFF_fseek_f(stream,offset,whence) _fseeki64(stream,/* __int64 */ offset,whence)
|
#define _TIFF_fseek_f(stream, offset, whence) \
|
||||||
#define _TIFF_fstat_f(fildes,stat_buff) _fstati64(fildes,/* struct _stati64 */ stat_buff)
|
_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_ftell_f(stream) /\* __int64 *\/ _ftelli64(stream) */
|
||||||
/* #define _TIFF_stat_f(path,stat_buff) _stati64(path,/\* struct _stati64 *\/ stat_buff) */
|
/* #define _TIFF_stat_f(path,stat_buff) _stati64(path,/\* struct _stati64 *\/
|
||||||
|
* stat_buff) */
|
||||||
#define _TIFF_stat_s struct _stati64
|
#define _TIFF_stat_s struct _stati64
|
||||||
#define _TIFF_off_t __int64
|
#define _TIFF_off_t __int64
|
||||||
#else
|
#else
|
||||||
@ -331,7 +360,8 @@ typedef size_t TIFFIOSize_t;
|
|||||||
|
|
||||||
#if defined(__has_attribute) && defined(__clang__)
|
#if defined(__has_attribute) && defined(__clang__)
|
||||||
#if __has_attribute(no_sanitize)
|
#if __has_attribute(no_sanitize)
|
||||||
#define TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW __attribute__((no_sanitize("unsigned-integer-overflow")))
|
#define TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW \
|
||||||
|
__attribute__((no_sanitize("unsigned-integer-overflow")))
|
||||||
#else
|
#else
|
||||||
#define TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW
|
#define TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW
|
||||||
#endif
|
#endif
|
||||||
@ -339,43 +369,53 @@ typedef size_t TIFFIOSize_t;
|
|||||||
#define TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW
|
#define TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
extern "C" {
|
extern "C"
|
||||||
|
{
|
||||||
#endif
|
#endif
|
||||||
extern int _TIFFgetMode(const char* mode, const char* module);
|
extern int _TIFFgetMode(TIFFOpenOptions *opts, thandle_t clientdata,
|
||||||
extern int _TIFFNoRowEncode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s);
|
const char *mode, const char *module);
|
||||||
extern int _TIFFNoStripEncode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s);
|
extern int _TIFFNoRowEncode(TIFF *tif, uint8_t *pp, tmsize_t cc,
|
||||||
extern int _TIFFNoTileEncode(TIFF*, uint8* pp, tmsize_t cc, uint16 s);
|
uint16_t s);
|
||||||
extern int _TIFFNoRowDecode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s);
|
extern int _TIFFNoStripEncode(TIFF *tif, uint8_t *pp, tmsize_t cc,
|
||||||
extern int _TIFFNoStripDecode(TIFF* tif, uint8* pp, tmsize_t cc, uint16 s);
|
uint16_t s);
|
||||||
extern int _TIFFNoTileDecode(TIFF*, uint8* pp, tmsize_t cc, uint16 s);
|
extern int _TIFFNoTileEncode(TIFF *, uint8_t *pp, tmsize_t cc, uint16_t s);
|
||||||
extern void _TIFFNoPostDecode(TIFF* tif, uint8* buf, tmsize_t cc);
|
extern int _TIFFNoRowDecode(TIFF *tif, uint8_t *pp, tmsize_t cc,
|
||||||
extern int _TIFFNoPreCode(TIFF* tif, uint16 s);
|
uint16_t s);
|
||||||
extern int _TIFFNoSeek(TIFF* tif, uint32 off);
|
extern int _TIFFNoStripDecode(TIFF *tif, uint8_t *pp, tmsize_t cc,
|
||||||
extern void _TIFFSwab16BitData(TIFF* tif, uint8* buf, tmsize_t cc);
|
uint16_t s);
|
||||||
extern void _TIFFSwab24BitData(TIFF* tif, uint8* buf, tmsize_t cc);
|
extern int _TIFFNoTileDecode(TIFF *, uint8_t *pp, tmsize_t cc, uint16_t s);
|
||||||
extern void _TIFFSwab32BitData(TIFF* tif, uint8* buf, tmsize_t cc);
|
extern void _TIFFNoPostDecode(TIFF *tif, uint8_t *buf, tmsize_t cc);
|
||||||
extern void _TIFFSwab64BitData(TIFF* tif, uint8* buf, tmsize_t cc);
|
extern int _TIFFNoPreCode(TIFF *tif, uint16_t s);
|
||||||
|
extern int _TIFFNoSeek(TIFF *tif, uint32_t off);
|
||||||
|
extern void _TIFFSwab16BitData(TIFF *tif, uint8_t *buf, tmsize_t cc);
|
||||||
|
extern void _TIFFSwab24BitData(TIFF *tif, uint8_t *buf, tmsize_t cc);
|
||||||
|
extern void _TIFFSwab32BitData(TIFF *tif, uint8_t *buf, tmsize_t cc);
|
||||||
|
extern void _TIFFSwab64BitData(TIFF *tif, uint8_t *buf, tmsize_t cc);
|
||||||
extern int TIFFFlushData1(TIFF *tif);
|
extern int TIFFFlushData1(TIFF *tif);
|
||||||
extern int TIFFDefaultDirectory(TIFF *tif);
|
extern int TIFFDefaultDirectory(TIFF *tif);
|
||||||
extern void _TIFFSetDefaultCompressionState(TIFF *tif);
|
extern void _TIFFSetDefaultCompressionState(TIFF *tif);
|
||||||
extern int _TIFFRewriteField(TIFF *, uint16, TIFFDataType, tmsize_t, void *);
|
extern int _TIFFRewriteField(TIFF *, uint16_t, TIFFDataType, tmsize_t,
|
||||||
|
void *);
|
||||||
extern int TIFFSetCompressionScheme(TIFF *tif, int scheme);
|
extern int TIFFSetCompressionScheme(TIFF *tif, int scheme);
|
||||||
extern int TIFFSetDefaultCompressionState(TIFF *tif);
|
extern int TIFFSetDefaultCompressionState(TIFF *tif);
|
||||||
extern uint32 _TIFFDefaultStripSize(TIFF* tif, uint32 s);
|
extern uint32_t _TIFFDefaultStripSize(TIFF *tif, uint32_t s);
|
||||||
extern void _TIFFDefaultTileSize(TIFF* tif, uint32* tw, uint32* th);
|
extern void _TIFFDefaultTileSize(TIFF *tif, uint32_t *tw, uint32_t *th);
|
||||||
extern int _TIFFDataSize(TIFFDataType type);
|
|
||||||
|
|
||||||
/*--: Rational2Double: Return size of TIFFSetGetFieldType in bytes. */
|
extern void _TIFFsetByteArray(void **, const void *, uint32_t);
|
||||||
extern int _TIFFSetGetFieldSize(TIFFSetGetFieldType setgettype);
|
extern void _TIFFsetByteArrayExt(TIFF *, void **, const void *, uint32_t);
|
||||||
|
extern void _TIFFsetShortArray(uint16_t **, const uint16_t *, uint32_t);
|
||||||
extern void _TIFFsetByteArray(void**, void*, uint32);
|
extern void _TIFFsetShortArrayExt(TIFF *, uint16_t **, const uint16_t *,
|
||||||
extern void _TIFFsetString(char**, char*);
|
uint32_t);
|
||||||
extern void _TIFFsetShortArray(uint16**, uint16*, uint32);
|
extern void _TIFFsetLongArray(uint32_t **, const uint32_t *, uint32_t);
|
||||||
extern void _TIFFsetLongArray(uint32**, uint32*, uint32);
|
extern void _TIFFsetLongArrayExt(TIFF *, uint32_t **, const uint32_t *,
|
||||||
extern void _TIFFsetFloatArray(float**, float*, uint32);
|
uint32_t);
|
||||||
extern void _TIFFsetDoubleArray(double**, double*, uint32);
|
extern void _TIFFsetFloatArray(float **, const float *, uint32_t);
|
||||||
|
extern void _TIFFsetFloatArrayExt(TIFF *, float **, const float *,
|
||||||
|
uint32_t);
|
||||||
|
extern void _TIFFsetDoubleArray(double **, const double *, uint32_t);
|
||||||
|
extern void _TIFFsetDoubleArrayExt(TIFF *, double **, const double *,
|
||||||
|
uint32_t);
|
||||||
|
|
||||||
extern void _TIFFprintAscii(FILE *, const char *);
|
extern void _TIFFprintAscii(FILE *, const char *);
|
||||||
extern void _TIFFprintAsciiTag(FILE *, const char *, const char *);
|
extern void _TIFFprintAsciiTag(FILE *, const char *, const char *);
|
||||||
@ -384,31 +424,40 @@ extern TIFFErrorHandler _TIFFwarningHandler;
|
|||||||
extern TIFFErrorHandler _TIFFerrorHandler;
|
extern TIFFErrorHandler _TIFFerrorHandler;
|
||||||
extern TIFFErrorHandlerExt _TIFFwarningHandlerExt;
|
extern TIFFErrorHandlerExt _TIFFwarningHandlerExt;
|
||||||
extern TIFFErrorHandlerExt _TIFFerrorHandlerExt;
|
extern TIFFErrorHandlerExt _TIFFerrorHandlerExt;
|
||||||
|
void _TIFFErrorEarly(TIFFOpenOptions *opts, thandle_t clientdata,
|
||||||
|
const char *module, const char *fmt, ...)
|
||||||
|
TIFF_ATTRIBUTE((__format__(__printf__, 4, 5)));
|
||||||
|
|
||||||
extern uint32 _TIFFMultiply32(TIFF*, uint32, uint32, const char*);
|
extern uint32_t _TIFFMultiply32(TIFF *, uint32_t, uint32_t, const char *);
|
||||||
extern uint64 _TIFFMultiply64(TIFF*, uint64, uint64, const char*);
|
extern uint64_t _TIFFMultiply64(TIFF *, uint64_t, uint64_t, const char *);
|
||||||
extern tmsize_t _TIFFMultiplySSize(TIFF*, tmsize_t, tmsize_t, const char*);
|
extern tmsize_t _TIFFMultiplySSize(TIFF *, tmsize_t, tmsize_t,
|
||||||
extern tmsize_t _TIFFCastUInt64ToSSize(TIFF*, uint64, const char*);
|
const char *);
|
||||||
|
extern tmsize_t _TIFFCastUInt64ToSSize(TIFF *, uint64_t, const char *);
|
||||||
extern void *_TIFFCheckMalloc(TIFF *, tmsize_t, tmsize_t, const char *);
|
extern void *_TIFFCheckMalloc(TIFF *, tmsize_t, tmsize_t, const char *);
|
||||||
extern void* _TIFFCheckRealloc(TIFF*, void*, tmsize_t, tmsize_t, const char*);
|
extern void *_TIFFCheckRealloc(TIFF *, void *, tmsize_t, tmsize_t,
|
||||||
|
const char *);
|
||||||
|
|
||||||
extern double _TIFFUInt64ToDouble(uint64);
|
extern double _TIFFUInt64ToDouble(uint64_t);
|
||||||
extern float _TIFFUInt64ToFloat(uint64);
|
extern float _TIFFUInt64ToFloat(uint64_t);
|
||||||
|
|
||||||
extern float _TIFFClampDoubleToFloat(double);
|
extern float _TIFFClampDoubleToFloat(double);
|
||||||
|
extern uint32_t _TIFFClampDoubleToUInt32(double);
|
||||||
|
|
||||||
extern tmsize_t
|
extern void _TIFFCleanupIFDOffsetAndNumberMaps(TIFF *tif);
|
||||||
_TIFFReadEncodedStripAndAllocBuffer(TIFF* tif, uint32 strip,
|
|
||||||
void **buf, tmsize_t bufsizetoalloc,
|
extern tmsize_t _TIFFReadEncodedStripAndAllocBuffer(TIFF *tif,
|
||||||
|
uint32_t strip,
|
||||||
|
void **buf,
|
||||||
|
tmsize_t bufsizetoalloc,
|
||||||
tmsize_t size_to_read);
|
tmsize_t size_to_read);
|
||||||
extern tmsize_t
|
extern tmsize_t _TIFFReadEncodedTileAndAllocBuffer(TIFF *tif, uint32_t tile,
|
||||||
_TIFFReadEncodedTileAndAllocBuffer(TIFF* tif, uint32 tile,
|
void **buf,
|
||||||
void **buf, tmsize_t bufsizetoalloc,
|
tmsize_t bufsizetoalloc,
|
||||||
tmsize_t size_to_read);
|
tmsize_t size_to_read);
|
||||||
extern tmsize_t
|
extern tmsize_t _TIFFReadTileAndAllocBuffer(TIFF *tif, void **buf,
|
||||||
_TIFFReadTileAndAllocBuffer(TIFF* tif,
|
tmsize_t bufsizetoalloc,
|
||||||
void **buf, tmsize_t bufsizetoalloc,
|
uint32_t x, uint32_t y,
|
||||||
uint32 x, uint32 y, uint32 z, uint16 s);
|
uint32_t z, uint16_t s);
|
||||||
extern int _TIFFSeekOK(TIFF *tif, toff_t off);
|
extern int _TIFFSeekOK(TIFF *tif, toff_t off);
|
||||||
|
|
||||||
extern int TIFFInitDumpMode(TIFF *, int);
|
extern int TIFFInitDumpMode(TIFF *, int);
|
||||||
@ -447,6 +496,9 @@ extern int TIFFInitPixarLog(TIFF*, int);
|
|||||||
#ifdef LOGLUV_SUPPORT
|
#ifdef LOGLUV_SUPPORT
|
||||||
extern int TIFFInitSGILog(TIFF *, int);
|
extern int TIFFInitSGILog(TIFF *, int);
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef LERC_SUPPORT
|
||||||
|
extern int TIFFInitLERC(TIFF *tif, int);
|
||||||
|
#endif
|
||||||
#ifdef LZMA_SUPPORT
|
#ifdef LZMA_SUPPORT
|
||||||
extern int TIFFInitLZMA(TIFF *, int);
|
extern int TIFFInitLZMA(TIFF *, int);
|
||||||
#endif
|
#endif
|
||||||
@ -456,22 +508,16 @@ extern int TIFFInitZSTD(TIFF*, int);
|
|||||||
#ifdef WEBP_SUPPORT
|
#ifdef WEBP_SUPPORT
|
||||||
extern int TIFFInitWebP(TIFF *, int);
|
extern int TIFFInitWebP(TIFF *, int);
|
||||||
#endif
|
#endif
|
||||||
#ifdef VMS
|
|
||||||
extern const TIFFCodec _TIFFBuiltinCODECS[];
|
extern const TIFFCodec _TIFFBuiltinCODECS[];
|
||||||
#else
|
extern void TIFFCIELab16ToXYZ(TIFFCIELabToRGB *, uint32_t l, int32_t a,
|
||||||
extern TIFFCodec _TIFFBuiltinCODECS[];
|
int32_t b, float *, float *, float *);
|
||||||
#endif
|
|
||||||
|
extern void *_TIFFmallocExt(TIFF *tif, tmsize_t s);
|
||||||
|
extern void *_TIFFcallocExt(TIFF *tif, tmsize_t nmemb, tmsize_t siz);
|
||||||
|
extern void *_TIFFreallocExt(TIFF *tif, void *p, tmsize_t s);
|
||||||
|
extern void _TIFFfreeExt(TIFF *tif, void *p);
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif /* _TIFFIOP_ */
|
#endif /* _TIFFIOP_ */
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
9
3rdparty/libtiff/tiffvers.h
vendored
9
3rdparty/libtiff/tiffvers.h
vendored
@ -1,9 +0,0 @@
|
|||||||
#define TIFFLIB_VERSION_STR "LIBTIFF, Version 4.2.0\nCopyright (c) 1988-1996 Sam Leffler\nCopyright (c) 1991-1996 Silicon Graphics, Inc."
|
|
||||||
/*
|
|
||||||
* This define can be used in code that requires
|
|
||||||
* compilation-related definitions specific to a
|
|
||||||
* version or versions of the library. Runtime
|
|
||||||
* version checking should be done based on the
|
|
||||||
* string returned by TIFFGetVersion.
|
|
||||||
*/
|
|
||||||
#define TIFFLIB_VERSION 20201219
|
|
36
3rdparty/libtiff/tiffvers.h.cmake.in
vendored
Normal file
36
3rdparty/libtiff/tiffvers.h.cmake.in
vendored
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
/* tiffvers.h version information is updated according to version information
|
||||||
|
* in configure.ac */
|
||||||
|
|
||||||
|
/* clang-format off */
|
||||||
|
|
||||||
|
/* clang-format disabled because FindTIFF.cmake is very sensitive to the
|
||||||
|
* formatting of below line being a single line.
|
||||||
|
* Furthermore, configure_file variables of type "@VAR@" are
|
||||||
|
* modified by clang-format and won't be substituted by CMake.
|
||||||
|
*/
|
||||||
|
#define TIFFLIB_VERSION_STR "LIBTIFF, Version @LIBTIFF_VERSION@\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 @LIBTIFF_RELEASE_DATE@
|
||||||
|
|
||||||
|
/* The following defines have been added in 4.5.0 */
|
||||||
|
#define TIFFLIB_MAJOR_VERSION @LIBTIFF_MAJOR_VERSION@
|
||||||
|
#define TIFFLIB_MINOR_VERSION @LIBTIFF_MINOR_VERSION@
|
||||||
|
#define TIFFLIB_MICRO_VERSION @LIBTIFF_MICRO_VERSION@
|
||||||
|
#define TIFFLIB_VERSION_STR_MAJ_MIN_MIC "@LIBTIFF_VERSION@"
|
||||||
|
|
||||||
|
/* Macro added in 4.5.0. Returns TRUE if the current libtiff version is
|
||||||
|
* greater or equal to major.minor.micro
|
||||||
|
*/
|
||||||
|
#define TIFFLIB_AT_LEAST(major, minor, micro) \
|
||||||
|
(TIFFLIB_MAJOR_VERSION > (major) || \
|
||||||
|
(TIFFLIB_MAJOR_VERSION == (major) && TIFFLIB_MINOR_VERSION > (minor)) || \
|
||||||
|
(TIFFLIB_MAJOR_VERSION == (major) && TIFFLIB_MINOR_VERSION == (minor) && \
|
||||||
|
TIFFLIB_MICRO_VERSION >= (micro)))
|
||||||
|
|
||||||
|
/* clang-format on */
|
253
3rdparty/libtiff/uvcode.h
vendored
253
3rdparty/libtiff/uvcode.h
vendored
@ -3,178 +3,91 @@
|
|||||||
#define UV_NDIVS 16289
|
#define UV_NDIVS 16289
|
||||||
#define UV_VSTART (float)0.016940
|
#define UV_VSTART (float)0.016940
|
||||||
#define UV_NVS 163
|
#define UV_NVS 163
|
||||||
static const struct {
|
static const struct
|
||||||
|
{
|
||||||
float ustart;
|
float ustart;
|
||||||
short nus, ncum;
|
short nus, ncum;
|
||||||
} uv_row[UV_NVS] = {
|
} uv_row[UV_NVS] = {
|
||||||
{ (float)0.247663, 4, 0 },
|
{(float)0.247663, 4, 0}, {(float)0.243779, 6, 4},
|
||||||
{ (float)0.243779, 6, 4 },
|
{(float)0.241684, 7, 10}, {(float)0.237874, 9, 17},
|
||||||
{ (float)0.241684, 7, 10 },
|
{(float)0.235906, 10, 26}, {(float)0.232153, 12, 36},
|
||||||
{ (float)0.237874, 9, 17 },
|
{(float)0.228352, 14, 48}, {(float)0.226259, 15, 62},
|
||||||
{ (float)0.235906, 10, 26 },
|
{(float)0.222371, 17, 77}, {(float)0.220410, 18, 94},
|
||||||
{ (float)0.232153, 12, 36 },
|
{(float)0.214710, 21, 112}, {(float)0.212714, 22, 133},
|
||||||
{ (float)0.228352, 14, 48 },
|
{(float)0.210721, 23, 155}, {(float)0.204976, 26, 178},
|
||||||
{ (float)0.226259, 15, 62 },
|
{(float)0.202986, 27, 204}, {(float)0.199245, 29, 231},
|
||||||
{ (float)0.222371, 17, 77 },
|
{(float)0.195525, 31, 260}, {(float)0.193560, 32, 291},
|
||||||
{ (float)0.220410, 18, 94 },
|
{(float)0.189878, 34, 323}, {(float)0.186216, 36, 357},
|
||||||
{ (float)0.214710, 21, 112 },
|
{(float)0.186216, 36, 393}, {(float)0.182592, 38, 429},
|
||||||
{ (float)0.212714, 22, 133 },
|
{(float)0.179003, 40, 467}, {(float)0.175466, 42, 507},
|
||||||
{ (float)0.210721, 23, 155 },
|
{(float)0.172001, 44, 549}, {(float)0.172001, 44, 593},
|
||||||
{ (float)0.204976, 26, 178 },
|
{(float)0.168612, 46, 637}, {(float)0.168612, 46, 683},
|
||||||
{ (float)0.202986, 27, 204 },
|
{(float)0.163575, 49, 729}, {(float)0.158642, 52, 778},
|
||||||
{ (float)0.199245, 29, 231 },
|
{(float)0.158642, 52, 830}, {(float)0.158642, 52, 882},
|
||||||
{ (float)0.195525, 31, 260 },
|
{(float)0.153815, 55, 934}, {(float)0.153815, 55, 989},
|
||||||
{ (float)0.193560, 32, 291 },
|
{(float)0.149097, 58, 1044}, {(float)0.149097, 58, 1102},
|
||||||
{ (float)0.189878, 34, 323 },
|
{(float)0.142746, 62, 1160}, {(float)0.142746, 62, 1222},
|
||||||
{ (float)0.186216, 36, 357 },
|
{(float)0.142746, 62, 1284}, {(float)0.138270, 65, 1346},
|
||||||
{ (float)0.186216, 36, 393 },
|
{(float)0.138270, 65, 1411}, {(float)0.138270, 65, 1476},
|
||||||
{ (float)0.182592, 38, 429 },
|
{(float)0.132166, 69, 1541}, {(float)0.132166, 69, 1610},
|
||||||
{ (float)0.179003, 40, 467 },
|
{(float)0.126204, 73, 1679}, {(float)0.126204, 73, 1752},
|
||||||
{ (float)0.175466, 42, 507 },
|
{(float)0.126204, 73, 1825}, {(float)0.120381, 77, 1898},
|
||||||
{ (float)0.172001, 44, 549 },
|
{(float)0.120381, 77, 1975}, {(float)0.120381, 77, 2052},
|
||||||
{ (float)0.172001, 44, 593 },
|
{(float)0.120381, 77, 2129}, {(float)0.112962, 82, 2206},
|
||||||
{ (float)0.168612, 46, 637 },
|
{(float)0.112962, 82, 2288}, {(float)0.112962, 82, 2370},
|
||||||
{ (float)0.168612, 46, 683 },
|
{(float)0.107450, 86, 2452}, {(float)0.107450, 86, 2538},
|
||||||
{ (float)0.163575, 49, 729 },
|
{(float)0.107450, 86, 2624}, {(float)0.107450, 86, 2710},
|
||||||
{ (float)0.158642, 52, 778 },
|
{(float)0.100343, 91, 2796}, {(float)0.100343, 91, 2887},
|
||||||
{ (float)0.158642, 52, 830 },
|
{(float)0.100343, 91, 2978}, {(float)0.095126, 95, 3069},
|
||||||
{ (float)0.158642, 52, 882 },
|
{(float)0.095126, 95, 3164}, {(float)0.095126, 95, 3259},
|
||||||
{ (float)0.153815, 55, 934 },
|
{(float)0.095126, 95, 3354}, {(float)0.088276, 100, 3449},
|
||||||
{ (float)0.153815, 55, 989 },
|
{(float)0.088276, 100, 3549}, {(float)0.088276, 100, 3649},
|
||||||
{ (float)0.149097, 58, 1044 },
|
{(float)0.088276, 100, 3749}, {(float)0.081523, 105, 3849},
|
||||||
{ (float)0.149097, 58, 1102 },
|
{(float)0.081523, 105, 3954}, {(float)0.081523, 105, 4059},
|
||||||
{ (float)0.142746, 62, 1160 },
|
{(float)0.081523, 105, 4164}, {(float)0.074861, 110, 4269},
|
||||||
{ (float)0.142746, 62, 1222 },
|
{(float)0.074861, 110, 4379}, {(float)0.074861, 110, 4489},
|
||||||
{ (float)0.142746, 62, 1284 },
|
{(float)0.074861, 110, 4599}, {(float)0.068290, 115, 4709},
|
||||||
{ (float)0.138270, 65, 1346 },
|
{(float)0.068290, 115, 4824}, {(float)0.068290, 115, 4939},
|
||||||
{ (float)0.138270, 65, 1411 },
|
{(float)0.068290, 115, 5054}, {(float)0.063573, 119, 5169},
|
||||||
{ (float)0.138270, 65, 1476 },
|
{(float)0.063573, 119, 5288}, {(float)0.063573, 119, 5407},
|
||||||
{ (float)0.132166, 69, 1541 },
|
{(float)0.063573, 119, 5526}, {(float)0.057219, 124, 5645},
|
||||||
{ (float)0.132166, 69, 1610 },
|
{(float)0.057219, 124, 5769}, {(float)0.057219, 124, 5893},
|
||||||
{ (float)0.126204, 73, 1679 },
|
{(float)0.057219, 124, 6017}, {(float)0.050985, 129, 6141},
|
||||||
{ (float)0.126204, 73, 1752 },
|
{(float)0.050985, 129, 6270}, {(float)0.050985, 129, 6399},
|
||||||
{ (float)0.126204, 73, 1825 },
|
{(float)0.050985, 129, 6528}, {(float)0.050985, 129, 6657},
|
||||||
{ (float)0.120381, 77, 1898 },
|
{(float)0.044859, 134, 6786}, {(float)0.044859, 134, 6920},
|
||||||
{ (float)0.120381, 77, 1975 },
|
{(float)0.044859, 134, 7054}, {(float)0.044859, 134, 7188},
|
||||||
{ (float)0.120381, 77, 2052 },
|
{(float)0.040571, 138, 7322}, {(float)0.040571, 138, 7460},
|
||||||
{ (float)0.120381, 77, 2129 },
|
{(float)0.040571, 138, 7598}, {(float)0.040571, 138, 7736},
|
||||||
{ (float)0.112962, 82, 2206 },
|
{(float)0.036339, 142, 7874}, {(float)0.036339, 142, 8016},
|
||||||
{ (float)0.112962, 82, 2288 },
|
{(float)0.036339, 142, 8158}, {(float)0.036339, 142, 8300},
|
||||||
{ (float)0.112962, 82, 2370 },
|
{(float)0.032139, 146, 8442}, {(float)0.032139, 146, 8588},
|
||||||
{ (float)0.107450, 86, 2452 },
|
{(float)0.032139, 146, 8734}, {(float)0.032139, 146, 8880},
|
||||||
{ (float)0.107450, 86, 2538 },
|
{(float)0.027947, 150, 9026}, {(float)0.027947, 150, 9176},
|
||||||
{ (float)0.107450, 86, 2624 },
|
{(float)0.027947, 150, 9326}, {(float)0.023739, 154, 9476},
|
||||||
{ (float)0.107450, 86, 2710 },
|
{(float)0.023739, 154, 9630}, {(float)0.023739, 154, 9784},
|
||||||
{ (float)0.100343, 91, 2796 },
|
{(float)0.023739, 154, 9938}, {(float)0.019504, 158, 10092},
|
||||||
{ (float)0.100343, 91, 2887 },
|
{(float)0.019504, 158, 10250}, {(float)0.019504, 158, 10408},
|
||||||
{ (float)0.100343, 91, 2978 },
|
{(float)0.016976, 161, 10566}, {(float)0.016976, 161, 10727},
|
||||||
{ (float)0.095126, 95, 3069 },
|
{(float)0.016976, 161, 10888}, {(float)0.016976, 161, 11049},
|
||||||
{ (float)0.095126, 95, 3164 },
|
{(float)0.012639, 165, 11210}, {(float)0.012639, 165, 11375},
|
||||||
{ (float)0.095126, 95, 3259 },
|
{(float)0.012639, 165, 11540}, {(float)0.009991, 168, 11705},
|
||||||
{ (float)0.095126, 95, 3354 },
|
{(float)0.009991, 168, 11873}, {(float)0.009991, 168, 12041},
|
||||||
{ (float)0.088276, 100, 3449 },
|
{(float)0.009016, 170, 12209}, {(float)0.009016, 170, 12379},
|
||||||
{ (float)0.088276, 100, 3549 },
|
{(float)0.009016, 170, 12549}, {(float)0.006217, 173, 12719},
|
||||||
{ (float)0.088276, 100, 3649 },
|
{(float)0.006217, 173, 12892}, {(float)0.005097, 175, 13065},
|
||||||
{ (float)0.088276, 100, 3749 },
|
{(float)0.005097, 175, 13240}, {(float)0.005097, 175, 13415},
|
||||||
{ (float)0.081523, 105, 3849 },
|
{(float)0.003909, 177, 13590}, {(float)0.003909, 177, 13767},
|
||||||
{ (float)0.081523, 105, 3954 },
|
{(float)0.002340, 177, 13944}, {(float)0.002389, 170, 14121},
|
||||||
{ (float)0.081523, 105, 4059 },
|
{(float)0.001068, 164, 14291}, {(float)0.001653, 157, 14455},
|
||||||
{ (float)0.081523, 105, 4164 },
|
{(float)0.000717, 150, 14612}, {(float)0.001614, 143, 14762},
|
||||||
{ (float)0.074861, 110, 4269 },
|
{(float)0.000270, 136, 14905}, {(float)0.000484, 129, 15041},
|
||||||
{ (float)0.074861, 110, 4379 },
|
{(float)0.001103, 123, 15170}, {(float)0.001242, 115, 15293},
|
||||||
{ (float)0.074861, 110, 4489 },
|
{(float)0.001188, 109, 15408}, {(float)0.001011, 103, 15517},
|
||||||
{ (float)0.074861, 110, 4599 },
|
{(float)0.000709, 97, 15620}, {(float)0.000301, 89, 15717},
|
||||||
{ (float)0.068290, 115, 4709 },
|
{(float)0.002416, 82, 15806}, {(float)0.003251, 76, 15888},
|
||||||
{ (float)0.068290, 115, 4824 },
|
{(float)0.003246, 69, 15964}, {(float)0.004141, 62, 16033},
|
||||||
{ (float)0.068290, 115, 4939 },
|
{(float)0.005963, 55, 16095}, {(float)0.008839, 47, 16150},
|
||||||
{ (float)0.068290, 115, 5054 },
|
{(float)0.010490, 40, 16197}, {(float)0.016994, 31, 16237},
|
||||||
{ (float)0.063573, 119, 5169 },
|
|
||||||
{ (float)0.063573, 119, 5288 },
|
|
||||||
{ (float)0.063573, 119, 5407 },
|
|
||||||
{ (float)0.063573, 119, 5526 },
|
|
||||||
{ (float)0.057219, 124, 5645 },
|
|
||||||
{ (float)0.057219, 124, 5769 },
|
|
||||||
{ (float)0.057219, 124, 5893 },
|
|
||||||
{ (float)0.057219, 124, 6017 },
|
|
||||||
{ (float)0.050985, 129, 6141 },
|
|
||||||
{ (float)0.050985, 129, 6270 },
|
|
||||||
{ (float)0.050985, 129, 6399 },
|
|
||||||
{ (float)0.050985, 129, 6528 },
|
|
||||||
{ (float)0.050985, 129, 6657 },
|
|
||||||
{ (float)0.044859, 134, 6786 },
|
|
||||||
{ (float)0.044859, 134, 6920 },
|
|
||||||
{ (float)0.044859, 134, 7054 },
|
|
||||||
{ (float)0.044859, 134, 7188 },
|
|
||||||
{ (float)0.040571, 138, 7322 },
|
|
||||||
{ (float)0.040571, 138, 7460 },
|
|
||||||
{ (float)0.040571, 138, 7598 },
|
|
||||||
{ (float)0.040571, 138, 7736 },
|
|
||||||
{ (float)0.036339, 142, 7874 },
|
|
||||||
{ (float)0.036339, 142, 8016 },
|
|
||||||
{ (float)0.036339, 142, 8158 },
|
|
||||||
{ (float)0.036339, 142, 8300 },
|
|
||||||
{ (float)0.032139, 146, 8442 },
|
|
||||||
{ (float)0.032139, 146, 8588 },
|
|
||||||
{ (float)0.032139, 146, 8734 },
|
|
||||||
{ (float)0.032139, 146, 8880 },
|
|
||||||
{ (float)0.027947, 150, 9026 },
|
|
||||||
{ (float)0.027947, 150, 9176 },
|
|
||||||
{ (float)0.027947, 150, 9326 },
|
|
||||||
{ (float)0.023739, 154, 9476 },
|
|
||||||
{ (float)0.023739, 154, 9630 },
|
|
||||||
{ (float)0.023739, 154, 9784 },
|
|
||||||
{ (float)0.023739, 154, 9938 },
|
|
||||||
{ (float)0.019504, 158, 10092 },
|
|
||||||
{ (float)0.019504, 158, 10250 },
|
|
||||||
{ (float)0.019504, 158, 10408 },
|
|
||||||
{ (float)0.016976, 161, 10566 },
|
|
||||||
{ (float)0.016976, 161, 10727 },
|
|
||||||
{ (float)0.016976, 161, 10888 },
|
|
||||||
{ (float)0.016976, 161, 11049 },
|
|
||||||
{ (float)0.012639, 165, 11210 },
|
|
||||||
{ (float)0.012639, 165, 11375 },
|
|
||||||
{ (float)0.012639, 165, 11540 },
|
|
||||||
{ (float)0.009991, 168, 11705 },
|
|
||||||
{ (float)0.009991, 168, 11873 },
|
|
||||||
{ (float)0.009991, 168, 12041 },
|
|
||||||
{ (float)0.009016, 170, 12209 },
|
|
||||||
{ (float)0.009016, 170, 12379 },
|
|
||||||
{ (float)0.009016, 170, 12549 },
|
|
||||||
{ (float)0.006217, 173, 12719 },
|
|
||||||
{ (float)0.006217, 173, 12892 },
|
|
||||||
{ (float)0.005097, 175, 13065 },
|
|
||||||
{ (float)0.005097, 175, 13240 },
|
|
||||||
{ (float)0.005097, 175, 13415 },
|
|
||||||
{ (float)0.003909, 177, 13590 },
|
|
||||||
{ (float)0.003909, 177, 13767 },
|
|
||||||
{ (float)0.002340, 177, 13944 },
|
|
||||||
{ (float)0.002389, 170, 14121 },
|
|
||||||
{ (float)0.001068, 164, 14291 },
|
|
||||||
{ (float)0.001653, 157, 14455 },
|
|
||||||
{ (float)0.000717, 150, 14612 },
|
|
||||||
{ (float)0.001614, 143, 14762 },
|
|
||||||
{ (float)0.000270, 136, 14905 },
|
|
||||||
{ (float)0.000484, 129, 15041 },
|
|
||||||
{ (float)0.001103, 123, 15170 },
|
|
||||||
{ (float)0.001242, 115, 15293 },
|
|
||||||
{ (float)0.001188, 109, 15408 },
|
|
||||||
{ (float)0.001011, 103, 15517 },
|
|
||||||
{ (float)0.000709, 97, 15620 },
|
|
||||||
{ (float)0.000301, 89, 15717 },
|
|
||||||
{ (float)0.002416, 82, 15806 },
|
|
||||||
{ (float)0.003251, 76, 15888 },
|
|
||||||
{ (float)0.003246, 69, 15964 },
|
|
||||||
{ (float)0.004141, 62, 16033 },
|
|
||||||
{ (float)0.005963, 55, 16095 },
|
|
||||||
{ (float)0.008839, 47, 16150 },
|
|
||||||
{ (float)0.010490, 40, 16197 },
|
|
||||||
{ (float)0.016994, 31, 16237 },
|
|
||||||
{(float)0.023659, 21, 16268},
|
{(float)0.023659, 21, 16268},
|
||||||
};
|
};
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
|
@ -60,6 +60,16 @@ namespace tiff_dummy_namespace {
|
|||||||
}
|
}
|
||||||
using namespace tiff_dummy_namespace;
|
using namespace tiff_dummy_namespace;
|
||||||
|
|
||||||
|
#ifndef _MSC_VER
|
||||||
|
namespace numeric_types = tiff_dummy_namespace;
|
||||||
|
#else
|
||||||
|
#include <cstdint>
|
||||||
|
namespace numeric_types {
|
||||||
|
using uint16 = std::uint16_t;
|
||||||
|
using uint32 = std::uint32_t;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace cv
|
namespace cv
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -264,8 +274,8 @@ bool TiffDecoder::readHeader()
|
|||||||
|
|
||||||
if (tif)
|
if (tif)
|
||||||
{
|
{
|
||||||
uint32 wdth = 0, hght = 0;
|
numeric_types::uint32 wdth = 0, hght = 0;
|
||||||
uint16 photometric = 0;
|
numeric_types::uint16 photometric = 0;
|
||||||
|
|
||||||
CV_TIFF_CHECK_CALL(TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &wdth));
|
CV_TIFF_CHECK_CALL(TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &wdth));
|
||||||
CV_TIFF_CHECK_CALL(TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &hght));
|
CV_TIFF_CHECK_CALL(TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &hght));
|
||||||
@ -273,7 +283,7 @@ bool TiffDecoder::readHeader()
|
|||||||
|
|
||||||
{
|
{
|
||||||
bool isGrayScale = photometric == PHOTOMETRIC_MINISWHITE || photometric == PHOTOMETRIC_MINISBLACK;
|
bool isGrayScale = photometric == PHOTOMETRIC_MINISWHITE || photometric == PHOTOMETRIC_MINISBLACK;
|
||||||
uint16 bpp = 8, ncn = isGrayScale ? 1 : 3;
|
numeric_types::uint16 bpp = 8, ncn = isGrayScale ? 1 : 3;
|
||||||
if (0 == TIFFGetField(tif, TIFFTAG_BITSPERSAMPLE, &bpp))
|
if (0 == TIFFGetField(tif, TIFFTAG_BITSPERSAMPLE, &bpp))
|
||||||
{
|
{
|
||||||
// TIFF bi-level images don't require TIFFTAG_BITSPERSAMPLE tag
|
// TIFF bi-level images don't require TIFFTAG_BITSPERSAMPLE tag
|
||||||
@ -296,7 +306,7 @@ bool TiffDecoder::readHeader()
|
|||||||
(ncn != 1 && ncn != 3 && ncn != 4)))
|
(ncn != 1 && ncn != 3 && ncn != 4)))
|
||||||
bpp = 8;
|
bpp = 8;
|
||||||
|
|
||||||
uint16 sample_format = SAMPLEFORMAT_UINT;
|
numeric_types::uint16 sample_format = SAMPLEFORMAT_UINT;
|
||||||
TIFFGetField(tif, TIFFTAG_SAMPLEFORMAT, &sample_format);
|
TIFFGetField(tif, TIFFTAG_SAMPLEFORMAT, &sample_format);
|
||||||
int wanted_channels = normalizeChannelsNumber(ncn);
|
int wanted_channels = normalizeChannelsNumber(ncn);
|
||||||
switch (bpp)
|
switch (bpp)
|
||||||
@ -378,7 +388,7 @@ bool TiffDecoder::nextPage()
|
|||||||
readHeader();
|
readHeader();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fixOrientationPartial(Mat &img, uint16 orientation)
|
static void fixOrientationPartial(Mat &img, numeric_types::uint16 orientation)
|
||||||
{
|
{
|
||||||
switch(orientation) {
|
switch(orientation) {
|
||||||
case ORIENTATION_RIGHTTOP:
|
case ORIENTATION_RIGHTTOP:
|
||||||
@ -434,7 +444,7 @@ static void fixOrientationFull(Mat &img, int orientation)
|
|||||||
* For 8 bit some corrections are done by TIFFReadRGBAStrip/Tile already.
|
* For 8 bit some corrections are done by TIFFReadRGBAStrip/Tile already.
|
||||||
* Not so for 16/32/64 bit.
|
* Not so for 16/32/64 bit.
|
||||||
*/
|
*/
|
||||||
static void fixOrientation(Mat &img, uint16 orientation, bool isOrientationFull)
|
static void fixOrientation(Mat &img, numeric_types::uint16 orientation, bool isOrientationFull)
|
||||||
{
|
{
|
||||||
if( isOrientationFull )
|
if( isOrientationFull )
|
||||||
{
|
{
|
||||||
@ -595,7 +605,7 @@ bool TiffDecoder::readData( Mat& img )
|
|||||||
CV_Assert(!m_tif.empty());
|
CV_Assert(!m_tif.empty());
|
||||||
TIFF* tif = (TIFF*)m_tif.get();
|
TIFF* tif = (TIFF*)m_tif.get();
|
||||||
|
|
||||||
uint16 photometric = (uint16)-1;
|
numeric_types::uint16 photometric = (numeric_types::uint16)-1;
|
||||||
CV_TIFF_CHECK_CALL(TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &photometric));
|
CV_TIFF_CHECK_CALL(TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &photometric));
|
||||||
|
|
||||||
if (m_hdr && depth >= CV_32F)
|
if (m_hdr && depth >= CV_32F)
|
||||||
@ -611,14 +621,14 @@ bool TiffDecoder::readData( Mat& img )
|
|||||||
{
|
{
|
||||||
int is_tiled = TIFFIsTiled(tif) != 0;
|
int is_tiled = TIFFIsTiled(tif) != 0;
|
||||||
bool isGrayScale = photometric == PHOTOMETRIC_MINISWHITE || photometric == PHOTOMETRIC_MINISBLACK;
|
bool isGrayScale = photometric == PHOTOMETRIC_MINISWHITE || photometric == PHOTOMETRIC_MINISBLACK;
|
||||||
uint16 bpp = 8, ncn = isGrayScale ? 1 : 3;
|
numeric_types::uint16 bpp = 8, ncn = isGrayScale ? 1 : 3;
|
||||||
if (0 == TIFFGetField(tif, TIFFTAG_BITSPERSAMPLE, &bpp))
|
if (0 == TIFFGetField(tif, TIFFTAG_BITSPERSAMPLE, &bpp))
|
||||||
{
|
{
|
||||||
// TIFF bi-level images don't require TIFFTAG_BITSPERSAMPLE tag
|
// TIFF bi-level images don't require TIFFTAG_BITSPERSAMPLE tag
|
||||||
bpp = 1;
|
bpp = 1;
|
||||||
}
|
}
|
||||||
CV_TIFF_CHECK_CALL_DEBUG(TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &ncn));
|
CV_TIFF_CHECK_CALL_DEBUG(TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &ncn));
|
||||||
uint16 img_orientation = ORIENTATION_TOPLEFT;
|
numeric_types::uint16 img_orientation = ORIENTATION_TOPLEFT;
|
||||||
CV_TIFF_CHECK_CALL_DEBUG(TIFFGetField(tif, TIFFTAG_ORIENTATION, &img_orientation));
|
CV_TIFF_CHECK_CALL_DEBUG(TIFFGetField(tif, TIFFTAG_ORIENTATION, &img_orientation));
|
||||||
constexpr const int bitsPerByte = 8;
|
constexpr const int bitsPerByte = 8;
|
||||||
int dst_bpp = (int)(img.elemSize1() * bitsPerByte);
|
int dst_bpp = (int)(img.elemSize1() * bitsPerByte);
|
||||||
@ -628,7 +638,7 @@ bool TiffDecoder::readData( Mat& img )
|
|||||||
int wanted_channels = normalizeChannelsNumber(img.channels());
|
int wanted_channels = normalizeChannelsNumber(img.channels());
|
||||||
bool doReadScanline = false;
|
bool doReadScanline = false;
|
||||||
|
|
||||||
uint32 tile_width0 = m_width, tile_height0 = 0;
|
numeric_types::uint32 tile_width0 = m_width, tile_height0 = 0;
|
||||||
|
|
||||||
if (is_tiled)
|
if (is_tiled)
|
||||||
{
|
{
|
||||||
@ -646,7 +656,7 @@ bool TiffDecoder::readData( Mat& img )
|
|||||||
tile_width0 = m_width;
|
tile_width0 = m_width;
|
||||||
|
|
||||||
if (tile_height0 == 0 ||
|
if (tile_height0 == 0 ||
|
||||||
(!is_tiled && tile_height0 == std::numeric_limits<uint32>::max()) )
|
(!is_tiled && tile_height0 == std::numeric_limits<numeric_types::uint32>::max()) )
|
||||||
tile_height0 = m_height;
|
tile_height0 = m_height;
|
||||||
|
|
||||||
const int TILE_MAX_WIDTH = (1 << 24);
|
const int TILE_MAX_WIDTH = (1 << 24);
|
||||||
@ -671,7 +681,7 @@ bool TiffDecoder::readData( Mat& img )
|
|||||||
( (uint64_t) MAX_TILE_SIZE * 95 / 100)
|
( (uint64_t) MAX_TILE_SIZE * 95 / 100)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
uint16_t planerConfig = (uint16)-1;
|
uint16_t planerConfig = (numeric_types::uint16)-1;
|
||||||
CV_TIFF_CHECK_CALL(TIFFGetField(tif, TIFFTAG_PLANARCONFIG, &planerConfig));
|
CV_TIFF_CHECK_CALL(TIFFGetField(tif, TIFFTAG_PLANARCONFIG, &planerConfig));
|
||||||
|
|
||||||
doReadScanline = (!is_tiled) // no tile
|
doReadScanline = (!is_tiled) // no tile
|
||||||
@ -727,7 +737,7 @@ bool TiffDecoder::readData( Mat& img )
|
|||||||
MAX_TILE_SIZE * 95 / 100
|
MAX_TILE_SIZE * 95 / 100
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
uint16_t planerConfig = (uint16)-1;
|
uint16_t planerConfig = (numeric_types::uint16)-1;
|
||||||
CV_TIFF_CHECK_CALL(TIFFGetField(tif, TIFFTAG_PLANARCONFIG, &planerConfig));
|
CV_TIFF_CHECK_CALL(TIFFGetField(tif, TIFFTAG_PLANARCONFIG, &planerConfig));
|
||||||
|
|
||||||
doReadScanline = (!is_tiled) // no tile
|
doReadScanline = (!is_tiled) // no tile
|
||||||
@ -811,7 +821,7 @@ bool TiffDecoder::readData( Mat& img )
|
|||||||
uchar* bstart = src_buffer;
|
uchar* bstart = src_buffer;
|
||||||
if (doReadScanline)
|
if (doReadScanline)
|
||||||
{
|
{
|
||||||
CV_TIFF_CHECK_CALL((int)TIFFReadScanline(tif, (uint32*)src_buffer, y) >= 0);
|
CV_TIFF_CHECK_CALL((int)TIFFReadScanline(tif, (numeric_types::uint32*)src_buffer, y) >= 0);
|
||||||
|
|
||||||
if ( isNeedConvert16to8 )
|
if ( isNeedConvert16to8 )
|
||||||
{
|
{
|
||||||
@ -833,11 +843,11 @@ bool TiffDecoder::readData( Mat& img )
|
|||||||
}
|
}
|
||||||
else if (!is_tiled)
|
else if (!is_tiled)
|
||||||
{
|
{
|
||||||
CV_TIFF_CHECK_CALL(TIFFReadRGBAStrip(tif, y, (uint32*)src_buffer));
|
CV_TIFF_CHECK_CALL(TIFFReadRGBAStrip(tif, y, (numeric_types::uint32*)src_buffer));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CV_TIFF_CHECK_CALL(TIFFReadRGBATile(tif, x, y, (uint32*)src_buffer));
|
CV_TIFF_CHECK_CALL(TIFFReadRGBATile(tif, x, y, (numeric_types::uint32*)src_buffer));
|
||||||
// Tiles fill the buffer from the bottom up
|
// Tiles fill the buffer from the bottom up
|
||||||
bstart += (tile_height0 - tile_height) * tile_width0 * 4;
|
bstart += (tile_height0 - tile_height) * tile_width0 * 4;
|
||||||
}
|
}
|
||||||
@ -931,15 +941,15 @@ bool TiffDecoder::readData( Mat& img )
|
|||||||
{
|
{
|
||||||
if (doReadScanline)
|
if (doReadScanline)
|
||||||
{
|
{
|
||||||
CV_TIFF_CHECK_CALL((int)TIFFReadScanline(tif, (uint32*)src_buffer, y) >= 0);
|
CV_TIFF_CHECK_CALL((int)TIFFReadScanline(tif, (numeric_types::uint32*)src_buffer, y) >= 0);
|
||||||
}
|
}
|
||||||
else if (!is_tiled)
|
else if (!is_tiled)
|
||||||
{
|
{
|
||||||
CV_TIFF_CHECK_CALL((int)TIFFReadEncodedStrip(tif, tileidx, (uint32*)src_buffer, src_buffer_size) >= 0);
|
CV_TIFF_CHECK_CALL((int)TIFFReadEncodedStrip(tif, tileidx, (numeric_types::uint32*)src_buffer, src_buffer_size) >= 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CV_TIFF_CHECK_CALL((int)TIFFReadEncodedTile(tif, tileidx, (uint32*)src_buffer, src_buffer_size) >= 0);
|
CV_TIFF_CHECK_CALL((int)TIFFReadEncodedTile(tif, tileidx, (numeric_types::uint32*)src_buffer, src_buffer_size) >= 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < tile_height; i++)
|
for (int i = 0; i < tile_height; i++)
|
||||||
@ -1256,7 +1266,7 @@ bool TiffEncoder::writeLibTiff( const std::vector<Mat>& img_vec, const std::vect
|
|||||||
int page_compression = compression;
|
int page_compression = compression;
|
||||||
|
|
||||||
int bitsPerChannel = -1;
|
int bitsPerChannel = -1;
|
||||||
uint16 sample_format = SAMPLEFORMAT_INT;
|
numeric_types::uint16 sample_format = SAMPLEFORMAT_INT;
|
||||||
switch (depth)
|
switch (depth)
|
||||||
{
|
{
|
||||||
case CV_8U:
|
case CV_8U:
|
||||||
|
Loading…
Reference in New Issue
Block a user