tiff: drop sources and headers from the source tree
* also drop jpeg and png headers
This commit is contained in:
@@ -1,48 +0,0 @@
|
|||||||
/* jconfig.h. Generated automatically by configure. */
|
|
||||||
/* jconfig.cfg --- source file edited by configure script */
|
|
||||||
/* see jconfig.doc for explanations */
|
|
||||||
|
|
||||||
#define HAVE_PROTOTYPES
|
|
||||||
#define HAVE_UNSIGNED_CHAR
|
|
||||||
#define HAVE_UNSIGNED_SHORT
|
|
||||||
#undef void
|
|
||||||
#undef const
|
|
||||||
#undef CHAR_IS_UNSIGNED
|
|
||||||
#define HAVE_STDDEF_H
|
|
||||||
#define HAVE_STDLIB_H
|
|
||||||
#undef NEED_BSD_STRINGS
|
|
||||||
#undef NEED_SYS_TYPES_H
|
|
||||||
#undef NEED_FAR_POINTERS
|
|
||||||
#undef NEED_SHORT_EXTERNAL_NAMES
|
|
||||||
#define C_LOSSLESS_SUPPORTED
|
|
||||||
/* Define this if you get warnings about undefined structures. */
|
|
||||||
#undef INCOMPLETE_TYPES_BROKEN
|
|
||||||
|
|
||||||
//#define USE_BEOS_ALERT // use Alert window for error messages in BeOS
|
|
||||||
|
|
||||||
#ifdef JPEG_INTERNALS
|
|
||||||
|
|
||||||
#undef RIGHT_SHIFT_IS_UNSIGNED
|
|
||||||
#define INLINE __inline__
|
|
||||||
/* These are for configuring the JPEG memory manager. */
|
|
||||||
#undef DEFAULT_MAX_MEM
|
|
||||||
#undef NO_MKTEMP
|
|
||||||
|
|
||||||
#endif /* JPEG_INTERNALS */
|
|
||||||
|
|
||||||
#ifdef JPEG_CJPEG_DJPEG
|
|
||||||
|
|
||||||
#define BMP_SUPPORTED /* BMP image file format */
|
|
||||||
#define GIF_SUPPORTED /* GIF image file format */
|
|
||||||
#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */
|
|
||||||
#undef RLE_SUPPORTED /* Utah RLE image file format */
|
|
||||||
#define TARGA_SUPPORTED /* Targa image file format */
|
|
||||||
|
|
||||||
#undef TWO_FILE_COMMANDLINE
|
|
||||||
#undef NEED_SIGNAL_CATCHER
|
|
||||||
#undef DONT_USE_B_MODE
|
|
||||||
|
|
||||||
/* Define this if you want percent-done progress reports from cjpeg/djpeg. */
|
|
||||||
#undef PROGRESS_REPORT
|
|
||||||
|
|
||||||
#endif /* JPEG_CJPEG_DJPEG */
|
|
||||||
@@ -1,304 +0,0 @@
|
|||||||
/*
|
|
||||||
* jerror.h
|
|
||||||
*
|
|
||||||
* Copyright (C) 1994-1997, Thomas G. Lane.
|
|
||||||
* Modified 1997-2009 by Guido Vollbeding.
|
|
||||||
* This file is part of the Independent JPEG Group's software.
|
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
|
||||||
*
|
|
||||||
* This file defines the error and message codes for the JPEG library.
|
|
||||||
* Edit this file to add new codes, or to translate the message strings to
|
|
||||||
* some other language.
|
|
||||||
* A set of error-reporting macros are defined too. Some applications using
|
|
||||||
* the JPEG library may wish to include this file to get the error codes
|
|
||||||
* and/or the macros.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* To define the enum list of message codes, include this file without
|
|
||||||
* defining macro JMESSAGE. To create a message string table, include it
|
|
||||||
* again with a suitable JMESSAGE definition (see jerror.c for an example).
|
|
||||||
*/
|
|
||||||
#ifndef JMESSAGE
|
|
||||||
#ifndef JERROR_H
|
|
||||||
/* First time through, define the enum list */
|
|
||||||
#define JMAKE_ENUM_LIST
|
|
||||||
#else
|
|
||||||
/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */
|
|
||||||
#define JMESSAGE(code,string)
|
|
||||||
#endif /* JERROR_H */
|
|
||||||
#endif /* JMESSAGE */
|
|
||||||
|
|
||||||
#ifdef JMAKE_ENUM_LIST
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
|
|
||||||
#define JMESSAGE(code,string) code ,
|
|
||||||
|
|
||||||
#endif /* JMAKE_ENUM_LIST */
|
|
||||||
|
|
||||||
JMESSAGE(JMSG_NOMESSAGE, "Bogus message code %d") /* Must be first entry! */
|
|
||||||
|
|
||||||
/* For maintenance convenience, list is alphabetical by message code name */
|
|
||||||
JMESSAGE(JERR_BAD_ALIGN_TYPE, "ALIGN_TYPE is wrong, please fix")
|
|
||||||
JMESSAGE(JERR_BAD_ALLOC_CHUNK, "MAX_ALLOC_CHUNK is wrong, please fix")
|
|
||||||
JMESSAGE(JERR_BAD_BUFFER_MODE, "Bogus buffer control mode")
|
|
||||||
JMESSAGE(JERR_BAD_COMPONENT_ID, "Invalid component ID %d in SOS")
|
|
||||||
JMESSAGE(JERR_BAD_CROP_SPEC, "Invalid crop request")
|
|
||||||
JMESSAGE(JERR_BAD_DCT_COEF, "DCT coefficient out of range")
|
|
||||||
JMESSAGE(JERR_BAD_DCTSIZE, "DCT scaled block size %dx%d not supported")
|
|
||||||
JMESSAGE(JERR_BAD_DROP_SAMPLING,
|
|
||||||
"Component index %d: mismatching sampling ratio %d:%d, %d:%d, %c")
|
|
||||||
JMESSAGE(JERR_BAD_HUFF_TABLE, "Bogus Huffman table definition")
|
|
||||||
JMESSAGE(JERR_BAD_IN_COLORSPACE, "Bogus input colorspace")
|
|
||||||
JMESSAGE(JERR_BAD_J_COLORSPACE, "Bogus JPEG colorspace")
|
|
||||||
JMESSAGE(JERR_BAD_LENGTH, "Bogus marker length")
|
|
||||||
JMESSAGE(JERR_BAD_LIB_VERSION,
|
|
||||||
"Wrong JPEG library version: library is %d, caller expects %d")
|
|
||||||
JMESSAGE(JERR_BAD_MCU_SIZE, "Sampling factors too large for interleaved scan")
|
|
||||||
JMESSAGE(JERR_BAD_POOL_ID, "Invalid memory pool code %d")
|
|
||||||
JMESSAGE(JERR_BAD_PRECISION, "Unsupported JPEG data precision %d")
|
|
||||||
JMESSAGE(JERR_BAD_PROGRESSION,
|
|
||||||
"Invalid progressive parameters Ss=%d Se=%d Ah=%d Al=%d")
|
|
||||||
JMESSAGE(JERR_BAD_PROG_SCRIPT,
|
|
||||||
"Invalid progressive parameters at scan script entry %d")
|
|
||||||
JMESSAGE(JERR_BAD_SAMPLING, "Bogus sampling factors")
|
|
||||||
JMESSAGE(JERR_BAD_SCAN_SCRIPT, "Invalid scan script at entry %d")
|
|
||||||
JMESSAGE(JERR_BAD_STATE, "Improper call to JPEG library in state %d")
|
|
||||||
JMESSAGE(JERR_BAD_STRUCT_SIZE,
|
|
||||||
"JPEG parameter struct mismatch: library thinks size is %u, caller expects %u")
|
|
||||||
JMESSAGE(JERR_BAD_VIRTUAL_ACCESS, "Bogus virtual array access")
|
|
||||||
JMESSAGE(JERR_BUFFER_SIZE, "Buffer passed to JPEG library is too small")
|
|
||||||
JMESSAGE(JERR_CANT_SUSPEND, "Suspension not allowed here")
|
|
||||||
JMESSAGE(JERR_CCIR601_NOTIMPL, "CCIR601 sampling not implemented yet")
|
|
||||||
JMESSAGE(JERR_COMPONENT_COUNT, "Too many color components: %d, max %d")
|
|
||||||
JMESSAGE(JERR_CONVERSION_NOTIMPL, "Unsupported color conversion request")
|
|
||||||
JMESSAGE(JERR_DAC_INDEX, "Bogus DAC index %d")
|
|
||||||
JMESSAGE(JERR_DAC_VALUE, "Bogus DAC value 0x%x")
|
|
||||||
JMESSAGE(JERR_DHT_INDEX, "Bogus DHT index %d")
|
|
||||||
JMESSAGE(JERR_DQT_INDEX, "Bogus DQT index %d")
|
|
||||||
JMESSAGE(JERR_EMPTY_IMAGE, "Empty JPEG image (DNL not supported)")
|
|
||||||
JMESSAGE(JERR_EMS_READ, "Read from EMS failed")
|
|
||||||
JMESSAGE(JERR_EMS_WRITE, "Write to EMS failed")
|
|
||||||
JMESSAGE(JERR_EOI_EXPECTED, "Didn't expect more than one scan")
|
|
||||||
JMESSAGE(JERR_FILE_READ, "Input file read error")
|
|
||||||
JMESSAGE(JERR_FILE_WRITE, "Output file write error --- out of disk space?")
|
|
||||||
JMESSAGE(JERR_FRACT_SAMPLE_NOTIMPL, "Fractional sampling not implemented yet")
|
|
||||||
JMESSAGE(JERR_HUFF_CLEN_OVERFLOW, "Huffman code size table overflow")
|
|
||||||
JMESSAGE(JERR_HUFF_MISSING_CODE, "Missing Huffman code table entry")
|
|
||||||
JMESSAGE(JERR_IMAGE_TOO_BIG, "Maximum supported image dimension is %u pixels")
|
|
||||||
JMESSAGE(JERR_INPUT_EMPTY, "Empty input file")
|
|
||||||
JMESSAGE(JERR_INPUT_EOF, "Premature end of input file")
|
|
||||||
JMESSAGE(JERR_MISMATCHED_QUANT_TABLE,
|
|
||||||
"Cannot transcode due to multiple use of quantization table %d")
|
|
||||||
JMESSAGE(JERR_MISSING_DATA, "Scan script does not transmit all data")
|
|
||||||
JMESSAGE(JERR_MODE_CHANGE, "Invalid color quantization mode change")
|
|
||||||
JMESSAGE(JERR_NOTIMPL, "Not implemented yet")
|
|
||||||
JMESSAGE(JERR_NOT_COMPILED, "Requested feature was omitted at compile time")
|
|
||||||
JMESSAGE(JERR_NO_ARITH_TABLE, "Arithmetic table 0x%02x was not defined")
|
|
||||||
JMESSAGE(JERR_NO_BACKING_STORE, "Backing store not supported")
|
|
||||||
JMESSAGE(JERR_NO_HUFF_TABLE, "Huffman table 0x%02x was not defined")
|
|
||||||
JMESSAGE(JERR_NO_IMAGE, "JPEG datastream contains no image")
|
|
||||||
JMESSAGE(JERR_NO_QUANT_TABLE, "Quantization table 0x%02x was not defined")
|
|
||||||
JMESSAGE(JERR_NO_SOI, "Not a JPEG file: starts with 0x%02x 0x%02x")
|
|
||||||
JMESSAGE(JERR_OUT_OF_MEMORY, "Insufficient memory (case %d)")
|
|
||||||
JMESSAGE(JERR_QUANT_COMPONENTS,
|
|
||||||
"Cannot quantize more than %d color components")
|
|
||||||
JMESSAGE(JERR_QUANT_FEW_COLORS, "Cannot quantize to fewer than %d colors")
|
|
||||||
JMESSAGE(JERR_QUANT_MANY_COLORS, "Cannot quantize to more than %d colors")
|
|
||||||
JMESSAGE(JERR_SOF_DUPLICATE, "Invalid JPEG file structure: two SOF markers")
|
|
||||||
JMESSAGE(JERR_SOF_NO_SOS, "Invalid JPEG file structure: missing SOS marker")
|
|
||||||
JMESSAGE(JERR_SOF_UNSUPPORTED, "Unsupported JPEG process: SOF type 0x%02x")
|
|
||||||
JMESSAGE(JERR_SOI_DUPLICATE, "Invalid JPEG file structure: two SOI markers")
|
|
||||||
JMESSAGE(JERR_SOS_NO_SOF, "Invalid JPEG file structure: SOS before SOF")
|
|
||||||
JMESSAGE(JERR_TFILE_CREATE, "Failed to create temporary file %s")
|
|
||||||
JMESSAGE(JERR_TFILE_READ, "Read failed on temporary file")
|
|
||||||
JMESSAGE(JERR_TFILE_SEEK, "Seek failed on temporary file")
|
|
||||||
JMESSAGE(JERR_TFILE_WRITE,
|
|
||||||
"Write failed on temporary file --- out of disk space?")
|
|
||||||
JMESSAGE(JERR_TOO_LITTLE_DATA, "Application transferred too few scanlines")
|
|
||||||
JMESSAGE(JERR_UNKNOWN_MARKER, "Unsupported marker type 0x%02x")
|
|
||||||
JMESSAGE(JERR_VIRTUAL_BUG, "Virtual array controller messed up")
|
|
||||||
JMESSAGE(JERR_WIDTH_OVERFLOW, "Image too wide for this implementation")
|
|
||||||
JMESSAGE(JERR_XMS_READ, "Read from XMS failed")
|
|
||||||
JMESSAGE(JERR_XMS_WRITE, "Write to XMS failed")
|
|
||||||
JMESSAGE(JMSG_COPYRIGHT, JCOPYRIGHT)
|
|
||||||
JMESSAGE(JMSG_VERSION, JVERSION)
|
|
||||||
JMESSAGE(JTRC_16BIT_TABLES,
|
|
||||||
"Caution: quantization tables are too coarse for baseline JPEG")
|
|
||||||
JMESSAGE(JTRC_ADOBE,
|
|
||||||
"Adobe APP14 marker: version %d, flags 0x%04x 0x%04x, transform %d")
|
|
||||||
JMESSAGE(JTRC_APP0, "Unknown APP0 marker (not JFIF), length %u")
|
|
||||||
JMESSAGE(JTRC_APP14, "Unknown APP14 marker (not Adobe), length %u")
|
|
||||||
JMESSAGE(JTRC_DAC, "Define Arithmetic Table 0x%02x: 0x%02x")
|
|
||||||
JMESSAGE(JTRC_DHT, "Define Huffman Table 0x%02x")
|
|
||||||
JMESSAGE(JTRC_DQT, "Define Quantization Table %d precision %d")
|
|
||||||
JMESSAGE(JTRC_DRI, "Define Restart Interval %u")
|
|
||||||
JMESSAGE(JTRC_EMS_CLOSE, "Freed EMS handle %u")
|
|
||||||
JMESSAGE(JTRC_EMS_OPEN, "Obtained EMS handle %u")
|
|
||||||
JMESSAGE(JTRC_EOI, "End Of Image")
|
|
||||||
JMESSAGE(JTRC_HUFFBITS, " %3d %3d %3d %3d %3d %3d %3d %3d")
|
|
||||||
JMESSAGE(JTRC_JFIF, "JFIF APP0 marker: version %d.%02d, density %dx%d %d")
|
|
||||||
JMESSAGE(JTRC_JFIF_BADTHUMBNAILSIZE,
|
|
||||||
"Warning: thumbnail image size does not match data length %u")
|
|
||||||
JMESSAGE(JTRC_JFIF_EXTENSION,
|
|
||||||
"JFIF extension marker: type 0x%02x, length %u")
|
|
||||||
JMESSAGE(JTRC_JFIF_THUMBNAIL, " with %d x %d thumbnail image")
|
|
||||||
JMESSAGE(JTRC_MISC_MARKER, "Miscellaneous marker 0x%02x, length %u")
|
|
||||||
JMESSAGE(JTRC_PARMLESS_MARKER, "Unexpected marker 0x%02x")
|
|
||||||
JMESSAGE(JTRC_QUANTVALS, " %4u %4u %4u %4u %4u %4u %4u %4u")
|
|
||||||
JMESSAGE(JTRC_QUANT_3_NCOLORS, "Quantizing to %d = %d*%d*%d colors")
|
|
||||||
JMESSAGE(JTRC_QUANT_NCOLORS, "Quantizing to %d colors")
|
|
||||||
JMESSAGE(JTRC_QUANT_SELECTED, "Selected %d colors for quantization")
|
|
||||||
JMESSAGE(JTRC_RECOVERY_ACTION, "At marker 0x%02x, recovery action %d")
|
|
||||||
JMESSAGE(JTRC_RST, "RST%d")
|
|
||||||
JMESSAGE(JTRC_SMOOTH_NOTIMPL,
|
|
||||||
"Smoothing not supported with nonstandard sampling ratios")
|
|
||||||
JMESSAGE(JTRC_SOF, "Start Of Frame 0x%02x: width=%u, height=%u, components=%d")
|
|
||||||
JMESSAGE(JTRC_SOF_COMPONENT, " Component %d: %dhx%dv q=%d")
|
|
||||||
JMESSAGE(JTRC_SOI, "Start of Image")
|
|
||||||
JMESSAGE(JTRC_SOS, "Start Of Scan: %d components")
|
|
||||||
JMESSAGE(JTRC_SOS_COMPONENT, " Component %d: dc=%d ac=%d")
|
|
||||||
JMESSAGE(JTRC_SOS_PARAMS, " Ss=%d, Se=%d, Ah=%d, Al=%d")
|
|
||||||
JMESSAGE(JTRC_TFILE_CLOSE, "Closed temporary file %s")
|
|
||||||
JMESSAGE(JTRC_TFILE_OPEN, "Opened temporary file %s")
|
|
||||||
JMESSAGE(JTRC_THUMB_JPEG,
|
|
||||||
"JFIF extension marker: JPEG-compressed thumbnail image, length %u")
|
|
||||||
JMESSAGE(JTRC_THUMB_PALETTE,
|
|
||||||
"JFIF extension marker: palette thumbnail image, length %u")
|
|
||||||
JMESSAGE(JTRC_THUMB_RGB,
|
|
||||||
"JFIF extension marker: RGB thumbnail image, length %u")
|
|
||||||
JMESSAGE(JTRC_UNKNOWN_IDS,
|
|
||||||
"Unrecognized component IDs %d %d %d, assuming YCbCr")
|
|
||||||
JMESSAGE(JTRC_XMS_CLOSE, "Freed XMS handle %u")
|
|
||||||
JMESSAGE(JTRC_XMS_OPEN, "Obtained XMS handle %u")
|
|
||||||
JMESSAGE(JWRN_ADOBE_XFORM, "Unknown Adobe color transform code %d")
|
|
||||||
JMESSAGE(JWRN_ARITH_BAD_CODE, "Corrupt JPEG data: bad arithmetic code")
|
|
||||||
JMESSAGE(JWRN_BOGUS_PROGRESSION,
|
|
||||||
"Inconsistent progression sequence for component %d coefficient %d")
|
|
||||||
JMESSAGE(JWRN_EXTRANEOUS_DATA,
|
|
||||||
"Corrupt JPEG data: %u extraneous bytes before marker 0x%02x")
|
|
||||||
JMESSAGE(JWRN_HIT_MARKER, "Corrupt JPEG data: premature end of data segment")
|
|
||||||
JMESSAGE(JWRN_HUFF_BAD_CODE, "Corrupt JPEG data: bad Huffman code")
|
|
||||||
JMESSAGE(JWRN_JFIF_MAJOR, "Warning: unknown JFIF revision number %d.%02d")
|
|
||||||
JMESSAGE(JWRN_JPEG_EOF, "Premature end of JPEG file")
|
|
||||||
JMESSAGE(JWRN_MUST_RESYNC,
|
|
||||||
"Corrupt JPEG data: found marker 0x%02x instead of RST%d")
|
|
||||||
JMESSAGE(JWRN_NOT_SEQUENTIAL, "Invalid SOS parameters for sequential JPEG")
|
|
||||||
JMESSAGE(JWRN_TOO_MUCH_DATA, "Application transferred too many scanlines")
|
|
||||||
|
|
||||||
#ifdef JMAKE_ENUM_LIST
|
|
||||||
|
|
||||||
JMSG_LASTMSGCODE
|
|
||||||
} J_MESSAGE_CODE;
|
|
||||||
|
|
||||||
#undef JMAKE_ENUM_LIST
|
|
||||||
#endif /* JMAKE_ENUM_LIST */
|
|
||||||
|
|
||||||
/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */
|
|
||||||
#undef JMESSAGE
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef JERROR_H
|
|
||||||
#define JERROR_H
|
|
||||||
|
|
||||||
/* Macros to simplify using the error and trace message stuff */
|
|
||||||
/* The first parameter is either type of cinfo pointer */
|
|
||||||
|
|
||||||
/* Fatal errors (print message and exit) */
|
|
||||||
#define ERREXIT(cinfo,code) \
|
|
||||||
((cinfo)->err->msg_code = (code), \
|
|
||||||
(*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
|
|
||||||
#define ERREXIT1(cinfo,code,p1) \
|
|
||||||
((cinfo)->err->msg_code = (code), \
|
|
||||||
(cinfo)->err->msg_parm.i[0] = (p1), \
|
|
||||||
(*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
|
|
||||||
#define ERREXIT2(cinfo,code,p1,p2) \
|
|
||||||
((cinfo)->err->msg_code = (code), \
|
|
||||||
(cinfo)->err->msg_parm.i[0] = (p1), \
|
|
||||||
(cinfo)->err->msg_parm.i[1] = (p2), \
|
|
||||||
(*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
|
|
||||||
#define ERREXIT3(cinfo,code,p1,p2,p3) \
|
|
||||||
((cinfo)->err->msg_code = (code), \
|
|
||||||
(cinfo)->err->msg_parm.i[0] = (p1), \
|
|
||||||
(cinfo)->err->msg_parm.i[1] = (p2), \
|
|
||||||
(cinfo)->err->msg_parm.i[2] = (p3), \
|
|
||||||
(*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
|
|
||||||
#define ERREXIT4(cinfo,code,p1,p2,p3,p4) \
|
|
||||||
((cinfo)->err->msg_code = (code), \
|
|
||||||
(cinfo)->err->msg_parm.i[0] = (p1), \
|
|
||||||
(cinfo)->err->msg_parm.i[1] = (p2), \
|
|
||||||
(cinfo)->err->msg_parm.i[2] = (p3), \
|
|
||||||
(cinfo)->err->msg_parm.i[3] = (p4), \
|
|
||||||
(*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
|
|
||||||
#define ERREXIT6(cinfo,code,p1,p2,p3,p4,p5,p6) \
|
|
||||||
((cinfo)->err->msg_code = (code), \
|
|
||||||
(cinfo)->err->msg_parm.i[0] = (p1), \
|
|
||||||
(cinfo)->err->msg_parm.i[1] = (p2), \
|
|
||||||
(cinfo)->err->msg_parm.i[2] = (p3), \
|
|
||||||
(cinfo)->err->msg_parm.i[3] = (p4), \
|
|
||||||
(cinfo)->err->msg_parm.i[4] = (p5), \
|
|
||||||
(cinfo)->err->msg_parm.i[5] = (p6), \
|
|
||||||
(*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
|
|
||||||
#define ERREXITS(cinfo,code,str) \
|
|
||||||
((cinfo)->err->msg_code = (code), \
|
|
||||||
strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \
|
|
||||||
(*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
|
|
||||||
|
|
||||||
#define MAKESTMT(stuff) do { stuff } while (0)
|
|
||||||
|
|
||||||
/* Nonfatal errors (we can keep going, but the data is probably corrupt) */
|
|
||||||
#define WARNMS(cinfo,code) \
|
|
||||||
((cinfo)->err->msg_code = (code), \
|
|
||||||
(*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))
|
|
||||||
#define WARNMS1(cinfo,code,p1) \
|
|
||||||
((cinfo)->err->msg_code = (code), \
|
|
||||||
(cinfo)->err->msg_parm.i[0] = (p1), \
|
|
||||||
(*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))
|
|
||||||
#define WARNMS2(cinfo,code,p1,p2) \
|
|
||||||
((cinfo)->err->msg_code = (code), \
|
|
||||||
(cinfo)->err->msg_parm.i[0] = (p1), \
|
|
||||||
(cinfo)->err->msg_parm.i[1] = (p2), \
|
|
||||||
(*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))
|
|
||||||
|
|
||||||
/* Informational/debugging messages */
|
|
||||||
#define TRACEMS(cinfo,lvl,code) \
|
|
||||||
((cinfo)->err->msg_code = (code), \
|
|
||||||
(*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))
|
|
||||||
#define TRACEMS1(cinfo,lvl,code,p1) \
|
|
||||||
((cinfo)->err->msg_code = (code), \
|
|
||||||
(cinfo)->err->msg_parm.i[0] = (p1), \
|
|
||||||
(*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))
|
|
||||||
#define TRACEMS2(cinfo,lvl,code,p1,p2) \
|
|
||||||
((cinfo)->err->msg_code = (code), \
|
|
||||||
(cinfo)->err->msg_parm.i[0] = (p1), \
|
|
||||||
(cinfo)->err->msg_parm.i[1] = (p2), \
|
|
||||||
(*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))
|
|
||||||
#define TRACEMS3(cinfo,lvl,code,p1,p2,p3) \
|
|
||||||
MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \
|
|
||||||
_mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); \
|
|
||||||
(cinfo)->err->msg_code = (code); \
|
|
||||||
(*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )
|
|
||||||
#define TRACEMS4(cinfo,lvl,code,p1,p2,p3,p4) \
|
|
||||||
MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \
|
|
||||||
_mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \
|
|
||||||
(cinfo)->err->msg_code = (code); \
|
|
||||||
(*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )
|
|
||||||
#define TRACEMS5(cinfo,lvl,code,p1,p2,p3,p4,p5) \
|
|
||||||
MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \
|
|
||||||
_mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \
|
|
||||||
_mp[4] = (p5); \
|
|
||||||
(cinfo)->err->msg_code = (code); \
|
|
||||||
(*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )
|
|
||||||
#define TRACEMS8(cinfo,lvl,code,p1,p2,p3,p4,p5,p6,p7,p8) \
|
|
||||||
MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \
|
|
||||||
_mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \
|
|
||||||
_mp[4] = (p5); _mp[5] = (p6); _mp[6] = (p7); _mp[7] = (p8); \
|
|
||||||
(cinfo)->err->msg_code = (code); \
|
|
||||||
(*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )
|
|
||||||
#define TRACEMSS(cinfo,lvl,code,str) \
|
|
||||||
((cinfo)->err->msg_code = (code), \
|
|
||||||
strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \
|
|
||||||
(*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))
|
|
||||||
|
|
||||||
#endif /* JERROR_H */
|
|
||||||
@@ -1,371 +0,0 @@
|
|||||||
/*
|
|
||||||
* jmorecfg.h
|
|
||||||
*
|
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
|
||||||
* Modified 1997-2009 by Guido Vollbeding.
|
|
||||||
* This file is part of the Independent JPEG Group's software.
|
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
|
||||||
*
|
|
||||||
* This file contains additional configuration options that customize the
|
|
||||||
* JPEG software for special applications or support machine-dependent
|
|
||||||
* optimizations. Most users will not need to touch this file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Define BITS_IN_JSAMPLE as either
|
|
||||||
* 8 for 8-bit sample values (the usual setting)
|
|
||||||
* 12 for 12-bit sample values
|
|
||||||
* Only 8 and 12 are legal data precisions for lossy JPEG according to the
|
|
||||||
* JPEG standard, and the IJG code does not support anything else!
|
|
||||||
* We do not support run-time selection of data precision, sorry.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define BITS_IN_JSAMPLE 8 /* use 8 or 12 */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Maximum number of components (color channels) allowed in JPEG image.
|
|
||||||
* To meet the letter of the JPEG spec, set this to 255. However, darn
|
|
||||||
* few applications need more than 4 channels (maybe 5 for CMYK + alpha
|
|
||||||
* mask). We recommend 10 as a reasonable compromise; use 4 if you are
|
|
||||||
* really short on memory. (Each allowed component costs a hundred or so
|
|
||||||
* bytes of storage, whether actually used in an image or not.)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define MAX_COMPONENTS 10 /* maximum number of image components */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Basic data types.
|
|
||||||
* You may need to change these if you have a machine with unusual data
|
|
||||||
* type sizes; for example, "char" not 8 bits, "short" not 16 bits,
|
|
||||||
* or "long" not 32 bits. We don't care whether "int" is 16 or 32 bits,
|
|
||||||
* but it had better be at least 16.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Representation of a single sample (pixel element value).
|
|
||||||
* We frequently allocate large arrays of these, so it's important to keep
|
|
||||||
* them small. But if you have memory to burn and access to char or short
|
|
||||||
* arrays is very slow on your hardware, you might want to change these.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if BITS_IN_JSAMPLE == 8
|
|
||||||
/* JSAMPLE should be the smallest type that will hold the values 0..255.
|
|
||||||
* You can use a signed char by having GETJSAMPLE mask it with 0xFF.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_UNSIGNED_CHAR
|
|
||||||
|
|
||||||
typedef unsigned char JSAMPLE;
|
|
||||||
#define GETJSAMPLE(value) ((int) (value))
|
|
||||||
|
|
||||||
#else /* not HAVE_UNSIGNED_CHAR */
|
|
||||||
|
|
||||||
typedef char JSAMPLE;
|
|
||||||
#ifdef CHAR_IS_UNSIGNED
|
|
||||||
#define GETJSAMPLE(value) ((int) (value))
|
|
||||||
#else
|
|
||||||
#define GETJSAMPLE(value) ((int) (value) & 0xFF)
|
|
||||||
#endif /* CHAR_IS_UNSIGNED */
|
|
||||||
|
|
||||||
#endif /* HAVE_UNSIGNED_CHAR */
|
|
||||||
|
|
||||||
#define MAXJSAMPLE 255
|
|
||||||
#define CENTERJSAMPLE 128
|
|
||||||
|
|
||||||
#endif /* BITS_IN_JSAMPLE == 8 */
|
|
||||||
|
|
||||||
|
|
||||||
#if BITS_IN_JSAMPLE == 12
|
|
||||||
/* JSAMPLE should be the smallest type that will hold the values 0..4095.
|
|
||||||
* On nearly all machines "short" will do nicely.
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef short JSAMPLE;
|
|
||||||
#define GETJSAMPLE(value) ((int) (value))
|
|
||||||
|
|
||||||
#define MAXJSAMPLE 4095
|
|
||||||
#define CENTERJSAMPLE 2048
|
|
||||||
|
|
||||||
#endif /* BITS_IN_JSAMPLE == 12 */
|
|
||||||
|
|
||||||
|
|
||||||
/* Representation of a DCT frequency coefficient.
|
|
||||||
* This should be a signed value of at least 16 bits; "short" is usually OK.
|
|
||||||
* Again, we allocate large arrays of these, but you can change to int
|
|
||||||
* if you have memory to burn and "short" is really slow.
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef short JCOEF;
|
|
||||||
|
|
||||||
|
|
||||||
/* Compressed datastreams are represented as arrays of JOCTET.
|
|
||||||
* These must be EXACTLY 8 bits wide, at least once they are written to
|
|
||||||
* external storage. Note that when using the stdio data source/destination
|
|
||||||
* managers, this is also the data type passed to fread/fwrite.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_UNSIGNED_CHAR
|
|
||||||
|
|
||||||
typedef unsigned char JOCTET;
|
|
||||||
#define GETJOCTET(value) (value)
|
|
||||||
|
|
||||||
#else /* not HAVE_UNSIGNED_CHAR */
|
|
||||||
|
|
||||||
typedef char JOCTET;
|
|
||||||
#ifdef CHAR_IS_UNSIGNED
|
|
||||||
#define GETJOCTET(value) (value)
|
|
||||||
#else
|
|
||||||
#define GETJOCTET(value) ((value) & 0xFF)
|
|
||||||
#endif /* CHAR_IS_UNSIGNED */
|
|
||||||
|
|
||||||
#endif /* HAVE_UNSIGNED_CHAR */
|
|
||||||
|
|
||||||
|
|
||||||
/* These typedefs are used for various table entries and so forth.
|
|
||||||
* They must be at least as wide as specified; but making them too big
|
|
||||||
* won't cost a huge amount of memory, so we don't provide special
|
|
||||||
* extraction code like we did for JSAMPLE. (In other words, these
|
|
||||||
* typedefs live at a different point on the speed/space tradeoff curve.)
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* UINT8 must hold at least the values 0..255. */
|
|
||||||
|
|
||||||
#ifdef HAVE_UNSIGNED_CHAR
|
|
||||||
typedef unsigned char UINT8;
|
|
||||||
#else /* not HAVE_UNSIGNED_CHAR */
|
|
||||||
#ifdef CHAR_IS_UNSIGNED
|
|
||||||
typedef char UINT8;
|
|
||||||
#else /* not CHAR_IS_UNSIGNED */
|
|
||||||
typedef short UINT8;
|
|
||||||
#endif /* CHAR_IS_UNSIGNED */
|
|
||||||
#endif /* HAVE_UNSIGNED_CHAR */
|
|
||||||
|
|
||||||
/* UINT16 must hold at least the values 0..65535. */
|
|
||||||
|
|
||||||
#ifdef HAVE_UNSIGNED_SHORT
|
|
||||||
typedef unsigned short UINT16;
|
|
||||||
#else /* not HAVE_UNSIGNED_SHORT */
|
|
||||||
typedef unsigned int UINT16;
|
|
||||||
#endif /* HAVE_UNSIGNED_SHORT */
|
|
||||||
|
|
||||||
/* INT16 must hold at least the values -32768..32767. */
|
|
||||||
|
|
||||||
#ifndef XMD_H /* X11/xmd.h correctly defines INT16 */
|
|
||||||
typedef short INT16;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* INT32 must hold at least signed 32-bit values. */
|
|
||||||
|
|
||||||
#ifndef XMD_H /* X11/xmd.h correctly defines INT32 */
|
|
||||||
#ifndef _BASETSD_H_ /* Microsoft defines it in basetsd.h */
|
|
||||||
#ifndef _BASETSD_H /* MinGW is slightly different */
|
|
||||||
#ifndef QGLOBAL_H /* Qt defines it in qglobal.h */
|
|
||||||
typedef long INT32;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Datatype used for image dimensions. The JPEG standard only supports
|
|
||||||
* images up to 64K*64K due to 16-bit fields in SOF markers. Therefore
|
|
||||||
* "unsigned int" is sufficient on all machines. However, if you need to
|
|
||||||
* handle larger images and you don't mind deviating from the spec, you
|
|
||||||
* can change this datatype.
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef unsigned int JDIMENSION;
|
|
||||||
|
|
||||||
#define JPEG_MAX_DIMENSION 65500L /* a tad under 64K to prevent overflows */
|
|
||||||
|
|
||||||
|
|
||||||
/* These macros are used in all function definitions and extern declarations.
|
|
||||||
* You could modify them if you need to change function linkage conventions;
|
|
||||||
* in particular, you'll need to do that to make the library a Windows DLL.
|
|
||||||
* Another application is to make all functions global for use with debuggers
|
|
||||||
* or code profilers that require it.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* a function called through method pointers: */
|
|
||||||
#define METHODDEF(type) static type
|
|
||||||
/* a function used only in its module: */
|
|
||||||
#define LOCAL(type) static type
|
|
||||||
/* a function referenced thru EXTERNs: */
|
|
||||||
#define GLOBAL(type) type
|
|
||||||
/* a reference to a GLOBAL function: */
|
|
||||||
#define EXTERN(type) extern type
|
|
||||||
|
|
||||||
|
|
||||||
/* This macro is used to declare a "method", that is, a function pointer.
|
|
||||||
* We want to supply prototype parameters if the compiler can cope.
|
|
||||||
* Note that the arglist parameter must be parenthesized!
|
|
||||||
* Again, you can customize this if you need special linkage keywords.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_PROTOTYPES
|
|
||||||
#define JMETHOD(type,methodname,arglist) type (*methodname) arglist
|
|
||||||
#else
|
|
||||||
#define JMETHOD(type,methodname,arglist) type (*methodname) ()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Here is the pseudo-keyword for declaring pointers that must be "far"
|
|
||||||
* on 80x86 machines. Most of the specialized coding for 80x86 is handled
|
|
||||||
* by just saying "FAR *" where such a pointer is needed. In a few places
|
|
||||||
* explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef FAR
|
|
||||||
#ifdef NEED_FAR_POINTERS
|
|
||||||
#define FAR far
|
|
||||||
#else
|
|
||||||
#define FAR
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* On a few systems, type boolean and/or its values FALSE, TRUE may appear
|
|
||||||
* in standard header files. Or you may have conflicts with application-
|
|
||||||
* specific header files that you want to include together with these files.
|
|
||||||
* Defining HAVE_BOOLEAN before including jpeglib.h should make it work.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef HAVE_BOOLEAN
|
|
||||||
typedef int boolean;
|
|
||||||
#endif
|
|
||||||
#ifndef FALSE /* in case these macros already exist */
|
|
||||||
#define FALSE 0 /* values of boolean */
|
|
||||||
#endif
|
|
||||||
#ifndef TRUE
|
|
||||||
#define TRUE 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The remaining options affect code selection within the JPEG library,
|
|
||||||
* but they don't need to be visible to most applications using the library.
|
|
||||||
* To minimize application namespace pollution, the symbols won't be
|
|
||||||
* defined unless JPEG_INTERNALS or JPEG_INTERNAL_OPTIONS has been defined.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef JPEG_INTERNALS
|
|
||||||
#define JPEG_INTERNAL_OPTIONS
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef JPEG_INTERNAL_OPTIONS
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* These defines indicate whether to include various optional functions.
|
|
||||||
* Undefining some of these symbols will produce a smaller but less capable
|
|
||||||
* library. Note that you can leave certain source files out of the
|
|
||||||
* compilation/linking process if you've #undef'd the corresponding symbols.
|
|
||||||
* (You may HAVE to do that if your compiler doesn't like null source files.)
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Capability options common to encoder and decoder: */
|
|
||||||
|
|
||||||
#define DCT_ISLOW_SUPPORTED /* slow but accurate integer algorithm */
|
|
||||||
#define DCT_IFAST_SUPPORTED /* faster, less accurate integer method */
|
|
||||||
#define DCT_FLOAT_SUPPORTED /* floating-point: accurate, fast on fast HW */
|
|
||||||
|
|
||||||
/* Encoder capability options: */
|
|
||||||
|
|
||||||
#define C_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */
|
|
||||||
#define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */
|
|
||||||
#define C_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/
|
|
||||||
#define DCT_SCALING_SUPPORTED /* Input rescaling via DCT? (Requires DCT_ISLOW)*/
|
|
||||||
#define ENTROPY_OPT_SUPPORTED /* Optimization of entropy coding parms? */
|
|
||||||
/* Note: if you selected 12-bit data precision, it is dangerous to turn off
|
|
||||||
* ENTROPY_OPT_SUPPORTED. The standard Huffman tables are only good for 8-bit
|
|
||||||
* precision, so jchuff.c normally uses entropy optimization to compute
|
|
||||||
* usable tables for higher precision. If you don't want to do optimization,
|
|
||||||
* you'll have to supply different default Huffman tables.
|
|
||||||
* The exact same statements apply for progressive JPEG: the default tables
|
|
||||||
* don't work for progressive mode. (This may get fixed, however.)
|
|
||||||
*/
|
|
||||||
#define INPUT_SMOOTHING_SUPPORTED /* Input image smoothing option? */
|
|
||||||
|
|
||||||
/* Decoder capability options: */
|
|
||||||
|
|
||||||
#define D_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */
|
|
||||||
#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */
|
|
||||||
#define D_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/
|
|
||||||
#define IDCT_SCALING_SUPPORTED /* Output rescaling via IDCT? */
|
|
||||||
#define SAVE_MARKERS_SUPPORTED /* jpeg_save_markers() needed? */
|
|
||||||
#define BLOCK_SMOOTHING_SUPPORTED /* Block smoothing? (Progressive only) */
|
|
||||||
#undef UPSAMPLE_SCALING_SUPPORTED /* Output rescaling at upsample stage? */
|
|
||||||
#define UPSAMPLE_MERGING_SUPPORTED /* Fast path for sloppy upsampling? */
|
|
||||||
#define QUANT_1PASS_SUPPORTED /* 1-pass color quantization? */
|
|
||||||
#define QUANT_2PASS_SUPPORTED /* 2-pass color quantization? */
|
|
||||||
|
|
||||||
/* more capability options later, no doubt */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Ordering of RGB data in scanlines passed to or from the application.
|
|
||||||
* If your application wants to deal with data in the order B,G,R, just
|
|
||||||
* change these macros. You can also deal with formats such as R,G,B,X
|
|
||||||
* (one extra byte per pixel) by changing RGB_PIXELSIZE. Note that changing
|
|
||||||
* the offsets will also change the order in which colormap data is organized.
|
|
||||||
* RESTRICTIONS:
|
|
||||||
* 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats.
|
|
||||||
* 2. These macros only affect RGB<=>YCbCr color conversion, so they are not
|
|
||||||
* useful if you are using JPEG color spaces other than YCbCr or grayscale.
|
|
||||||
* 3. The color quantizer modules will not behave desirably if RGB_PIXELSIZE
|
|
||||||
* is not 3 (they don't understand about dummy color components!). So you
|
|
||||||
* can't use color quantization if you change that value.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define RGB_RED 0 /* Offset of Red in an RGB scanline element */
|
|
||||||
#define RGB_GREEN 1 /* Offset of Green */
|
|
||||||
#define RGB_BLUE 2 /* Offset of Blue */
|
|
||||||
#define RGB_PIXELSIZE 3 /* JSAMPLEs per RGB scanline element */
|
|
||||||
|
|
||||||
|
|
||||||
/* Definitions for speed-related optimizations. */
|
|
||||||
|
|
||||||
|
|
||||||
/* If your compiler supports inline functions, define INLINE
|
|
||||||
* as the inline keyword; otherwise define it as empty.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef INLINE
|
|
||||||
#ifdef __GNUC__ /* for instance, GNU C knows about inline */
|
|
||||||
#define INLINE __inline__
|
|
||||||
#endif
|
|
||||||
#ifndef INLINE
|
|
||||||
#define INLINE /* default is to define it as empty */
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* On some machines (notably 68000 series) "int" is 32 bits, but multiplying
|
|
||||||
* two 16-bit shorts is faster than multiplying two ints. Define MULTIPLIER
|
|
||||||
* as short on such a machine. MULTIPLIER must be at least 16 bits wide.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef MULTIPLIER
|
|
||||||
#define MULTIPLIER int /* type for fastest integer multiply */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* FAST_FLOAT should be either float or double, whichever is done faster
|
|
||||||
* by your compiler. (Note that this type is only used in the floating point
|
|
||||||
* DCT routines, so it only matters if you've defined DCT_FLOAT_SUPPORTED.)
|
|
||||||
* Typically, float is faster in ANSI C compilers, while double is faster in
|
|
||||||
* pre-ANSI compilers (because they insist on converting to double anyway).
|
|
||||||
* The code below therefore chooses float if we have ANSI-style prototypes.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef FAST_FLOAT
|
|
||||||
#ifdef HAVE_PROTOTYPES
|
|
||||||
#define FAST_FLOAT float
|
|
||||||
#else
|
|
||||||
#define FAST_FLOAT double
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* JPEG_INTERNAL_OPTIONS */
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,660 +0,0 @@
|
|||||||
/* $Id: tiff.h,v 1.43.2.1 2010-06-08 18:50:43 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _TIFF_
|
|
||||||
#define _TIFF_
|
|
||||||
|
|
||||||
#include "tiffconf.h"
|
|
||||||
#include <SupportDefs.h>
|
|
||||||
// Use Be's typedefs for [u]int# instead of having libtiff define them.
|
|
||||||
// This resolves the problem of Be's types being redefined by libtiff
|
|
||||||
// without breaking or making mass changes to libtiff.
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Tag Image File Format (TIFF)
|
|
||||||
*
|
|
||||||
* Based on Rev 6.0 from:
|
|
||||||
* Developer's Desk
|
|
||||||
* Aldus Corporation
|
|
||||||
* 411 First Ave. South
|
|
||||||
* Suite 200
|
|
||||||
* Seattle, WA 98104
|
|
||||||
* 206-622-5500
|
|
||||||
*
|
|
||||||
* (http://partners.adobe.com/asn/developer/PDFS/TN/TIFF6.pdf)
|
|
||||||
*
|
|
||||||
* For Big TIFF design notes see the following link
|
|
||||||
* http://www.remotesensing.org/libtiff/bigtiffdesign.html
|
|
||||||
*/
|
|
||||||
#define TIFF_VERSION 42
|
|
||||||
#define TIFF_BIGTIFF_VERSION 43
|
|
||||||
|
|
||||||
#define TIFF_BIGENDIAN 0x4d4d
|
|
||||||
#define TIFF_LITTLEENDIAN 0x4949
|
|
||||||
#define MDI_LITTLEENDIAN 0x5045
|
|
||||||
#define MDI_BIGENDIAN 0x4550
|
|
||||||
/*
|
|
||||||
* Intrinsic data types required by the file format:
|
|
||||||
*
|
|
||||||
* 8-bit quantities int8/uint8
|
|
||||||
* 16-bit quantities int16/uint16
|
|
||||||
* 32-bit quantities int32/uint32
|
|
||||||
* strings unsigned char*
|
|
||||||
*/
|
|
||||||
#ifndef __HAIKU__
|
|
||||||
#ifndef HAVE_INT8
|
|
||||||
typedef signed char int8; /* NB: non-ANSI compilers may not grok */
|
|
||||||
#endif
|
|
||||||
typedef unsigned char uint8;
|
|
||||||
#ifndef HAVE_INT16
|
|
||||||
typedef short int16;
|
|
||||||
#endif
|
|
||||||
typedef unsigned short uint16; /* sizeof (uint16) must == 2 */
|
|
||||||
#if SIZEOF_INT == 4
|
|
||||||
#ifndef HAVE_INT32
|
|
||||||
typedef int int32;
|
|
||||||
#endif
|
|
||||||
typedef unsigned int uint32; /* sizeof (uint32) must == 4 */
|
|
||||||
#elif SIZEOF_LONG == 4
|
|
||||||
#ifndef HAVE_INT32
|
|
||||||
typedef long int32;
|
|
||||||
#endif
|
|
||||||
typedef unsigned long uint32; /* sizeof (uint32) must == 4 */
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* For TIFFReassignTagToIgnore */
|
|
||||||
enum TIFFIgnoreSense /* IGNORE tag table */
|
|
||||||
{
|
|
||||||
TIS_STORE,
|
|
||||||
TIS_EXTRACT,
|
|
||||||
TIS_EMPTY
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF header.
|
|
||||||
*/
|
|
||||||
typedef struct {
|
|
||||||
uint16 tiff_magic; /* magic number (defines byte order) */
|
|
||||||
#define TIFF_MAGIC_SIZE 2
|
|
||||||
uint16 tiff_version; /* TIFF version number */
|
|
||||||
#define TIFF_VERSION_SIZE 2
|
|
||||||
uint32 tiff_diroff; /* byte offset to first directory */
|
|
||||||
#define TIFF_DIROFFSET_SIZE 4
|
|
||||||
} TIFFHeader;
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF Image File Directories are comprised of a table of field
|
|
||||||
* descriptors of the form shown below. The table is sorted in
|
|
||||||
* ascending order by tag. The values associated with each entry are
|
|
||||||
* disjoint and may appear anywhere in the file (so long as they are
|
|
||||||
* placed on a word boundary).
|
|
||||||
*
|
|
||||||
* If the value is 4 bytes or less, then it is placed in the offset
|
|
||||||
* field to save space. If the value is less than 4 bytes, it is
|
|
||||||
* left-justified in the offset field.
|
|
||||||
*/
|
|
||||||
typedef struct {
|
|
||||||
uint16 tdir_tag; /* see below */
|
|
||||||
uint16 tdir_type; /* data type; see below */
|
|
||||||
uint32 tdir_count; /* number of items; length in spec */
|
|
||||||
uint32 tdir_offset; /* byte offset to field data */
|
|
||||||
} TIFFDirEntry;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* NB: In the comments below,
|
|
||||||
* - items marked with a + are obsoleted by revision 5.0,
|
|
||||||
* - items marked with a ! are introduced in revision 6.0.
|
|
||||||
* - items marked with a % are introduced post revision 6.0.
|
|
||||||
* - items marked with a $ are obsoleted by revision 6.0.
|
|
||||||
* - items marked with a & are introduced by Adobe DNG specification.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Tag data type information.
|
|
||||||
*
|
|
||||||
* Note: RATIONALs are the ratio of two 32-bit integer values.
|
|
||||||
*/
|
|
||||||
typedef enum {
|
|
||||||
TIFF_NOTYPE = 0, /* placeholder */
|
|
||||||
TIFF_BYTE = 1, /* 8-bit unsigned integer */
|
|
||||||
TIFF_ASCII = 2, /* 8-bit bytes w/ last byte null */
|
|
||||||
TIFF_SHORT = 3, /* 16-bit unsigned integer */
|
|
||||||
TIFF_LONG = 4, /* 32-bit unsigned integer */
|
|
||||||
TIFF_RATIONAL = 5, /* 64-bit unsigned fraction */
|
|
||||||
TIFF_SBYTE = 6, /* !8-bit signed integer */
|
|
||||||
TIFF_UNDEFINED = 7, /* !8-bit untyped data */
|
|
||||||
TIFF_SSHORT = 8, /* !16-bit signed integer */
|
|
||||||
TIFF_SLONG = 9, /* !32-bit signed integer */
|
|
||||||
TIFF_SRATIONAL = 10, /* !64-bit signed fraction */
|
|
||||||
TIFF_FLOAT = 11, /* !32-bit IEEE floating point */
|
|
||||||
TIFF_DOUBLE = 12, /* !64-bit IEEE floating point */
|
|
||||||
TIFF_IFD = 13 /* %32-bit unsigned integer (offset) */
|
|
||||||
} TIFFDataType;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF Tag Definitions.
|
|
||||||
*/
|
|
||||||
#define TIFFTAG_SUBFILETYPE 254 /* subfile data descriptor */
|
|
||||||
#define FILETYPE_REDUCEDIMAGE 0x1 /* reduced resolution version */
|
|
||||||
#define FILETYPE_PAGE 0x2 /* one page of many */
|
|
||||||
#define FILETYPE_MASK 0x4 /* transparency mask */
|
|
||||||
#define TIFFTAG_OSUBFILETYPE 255 /* +kind of data in subfile */
|
|
||||||
#define OFILETYPE_IMAGE 1 /* full resolution image data */
|
|
||||||
#define OFILETYPE_REDUCEDIMAGE 2 /* reduced size image data */
|
|
||||||
#define OFILETYPE_PAGE 3 /* one page of many */
|
|
||||||
#define TIFFTAG_IMAGEWIDTH 256 /* image width in pixels */
|
|
||||||
#define TIFFTAG_IMAGELENGTH 257 /* image height in pixels */
|
|
||||||
#define TIFFTAG_BITSPERSAMPLE 258 /* bits per channel (sample) */
|
|
||||||
#define TIFFTAG_COMPRESSION 259 /* data compression technique */
|
|
||||||
#define COMPRESSION_NONE 1 /* dump mode */
|
|
||||||
#define COMPRESSION_CCITTRLE 2 /* CCITT modified Huffman RLE */
|
|
||||||
#define COMPRESSION_CCITTFAX3 3 /* CCITT Group 3 fax encoding */
|
|
||||||
#define COMPRESSION_CCITT_T4 3 /* CCITT T.4 (TIFF 6 name) */
|
|
||||||
#define COMPRESSION_CCITTFAX4 4 /* CCITT Group 4 fax encoding */
|
|
||||||
#define COMPRESSION_CCITT_T6 4 /* CCITT T.6 (TIFF 6 name) */
|
|
||||||
#define COMPRESSION_LZW 5 /* Lempel-Ziv & Welch */
|
|
||||||
#define COMPRESSION_OJPEG 6 /* !6.0 JPEG */
|
|
||||||
#define COMPRESSION_JPEG 7 /* %JPEG DCT compression */
|
|
||||||
#define COMPRESSION_NEXT 32766 /* NeXT 2-bit RLE */
|
|
||||||
#define COMPRESSION_CCITTRLEW 32771 /* #1 w/ word alignment */
|
|
||||||
#define COMPRESSION_PACKBITS 32773 /* Macintosh RLE */
|
|
||||||
#define COMPRESSION_THUNDERSCAN 32809 /* ThunderScan RLE */
|
|
||||||
/* codes 32895-32898 are reserved for ANSI IT8 TIFF/IT <[email protected]) */
|
|
||||||
#define COMPRESSION_IT8CTPAD 32895 /* IT8 CT w/padding */
|
|
||||||
#define COMPRESSION_IT8LW 32896 /* IT8 Linework RLE */
|
|
||||||
#define COMPRESSION_IT8MP 32897 /* IT8 Monochrome picture */
|
|
||||||
#define COMPRESSION_IT8BL 32898 /* IT8 Binary line art */
|
|
||||||
/* compression codes 32908-32911 are reserved for Pixar */
|
|
||||||
#define COMPRESSION_PIXARFILM 32908 /* Pixar companded 10bit LZW */
|
|
||||||
#define COMPRESSION_PIXARLOG 32909 /* Pixar companded 11bit ZIP */
|
|
||||||
#define COMPRESSION_DEFLATE 32946 /* Deflate compression */
|
|
||||||
#define COMPRESSION_ADOBE_DEFLATE 8 /* Deflate compression,
|
|
||||||
as recognized by Adobe */
|
|
||||||
/* compression code 32947 is reserved for Oceana Matrix <[email protected]> */
|
|
||||||
#define COMPRESSION_DCS 32947 /* Kodak DCS encoding */
|
|
||||||
#define COMPRESSION_JBIG 34661 /* ISO JBIG */
|
|
||||||
#define COMPRESSION_SGILOG 34676 /* SGI Log Luminance RLE */
|
|
||||||
#define COMPRESSION_SGILOG24 34677 /* SGI Log 24-bit packed */
|
|
||||||
#define COMPRESSION_JP2000 34712 /* Leadtools JPEG2000 */
|
|
||||||
#define TIFFTAG_PHOTOMETRIC 262 /* photometric interpretation */
|
|
||||||
#define PHOTOMETRIC_MINISWHITE 0 /* min value is white */
|
|
||||||
#define PHOTOMETRIC_MINISBLACK 1 /* min value is black */
|
|
||||||
#define PHOTOMETRIC_RGB 2 /* RGB color model */
|
|
||||||
#define PHOTOMETRIC_PALETTE 3 /* color map indexed */
|
|
||||||
#define PHOTOMETRIC_MASK 4 /* $holdout mask */
|
|
||||||
#define PHOTOMETRIC_SEPARATED 5 /* !color separations */
|
|
||||||
#define PHOTOMETRIC_YCBCR 6 /* !CCIR 601 */
|
|
||||||
#define PHOTOMETRIC_CIELAB 8 /* !1976 CIE L*a*b* */
|
|
||||||
#define PHOTOMETRIC_ICCLAB 9 /* ICC L*a*b* [Adobe TIFF Technote 4] */
|
|
||||||
#define PHOTOMETRIC_ITULAB 10 /* ITU L*a*b* */
|
|
||||||
#define PHOTOMETRIC_LOGL 32844 /* CIE Log2(L) */
|
|
||||||
#define PHOTOMETRIC_LOGLUV 32845 /* CIE Log2(L) (u',v') */
|
|
||||||
#define TIFFTAG_THRESHHOLDING 263 /* +thresholding used on data */
|
|
||||||
#define THRESHHOLD_BILEVEL 1 /* b&w art scan */
|
|
||||||
#define THRESHHOLD_HALFTONE 2 /* or dithered scan */
|
|
||||||
#define THRESHHOLD_ERRORDIFFUSE 3 /* usually floyd-steinberg */
|
|
||||||
#define TIFFTAG_CELLWIDTH 264 /* +dithering matrix width */
|
|
||||||
#define TIFFTAG_CELLLENGTH 265 /* +dithering matrix height */
|
|
||||||
#define TIFFTAG_FILLORDER 266 /* data order within a byte */
|
|
||||||
#define FILLORDER_MSB2LSB 1 /* most significant -> least */
|
|
||||||
#define FILLORDER_LSB2MSB 2 /* least significant -> most */
|
|
||||||
#define TIFFTAG_DOCUMENTNAME 269 /* name of doc. image is from */
|
|
||||||
#define TIFFTAG_IMAGEDESCRIPTION 270 /* info about image */
|
|
||||||
#define TIFFTAG_MAKE 271 /* scanner manufacturer name */
|
|
||||||
#define TIFFTAG_MODEL 272 /* scanner model name/number */
|
|
||||||
#define TIFFTAG_STRIPOFFSETS 273 /* offsets to data strips */
|
|
||||||
#define TIFFTAG_ORIENTATION 274 /* +image orientation */
|
|
||||||
#define ORIENTATION_TOPLEFT 1 /* row 0 top, col 0 lhs */
|
|
||||||
#define ORIENTATION_TOPRIGHT 2 /* row 0 top, col 0 rhs */
|
|
||||||
#define ORIENTATION_BOTRIGHT 3 /* row 0 bottom, col 0 rhs */
|
|
||||||
#define ORIENTATION_BOTLEFT 4 /* row 0 bottom, col 0 lhs */
|
|
||||||
#define ORIENTATION_LEFTTOP 5 /* row 0 lhs, col 0 top */
|
|
||||||
#define ORIENTATION_RIGHTTOP 6 /* row 0 rhs, col 0 top */
|
|
||||||
#define ORIENTATION_RIGHTBOT 7 /* row 0 rhs, col 0 bottom */
|
|
||||||
#define ORIENTATION_LEFTBOT 8 /* row 0 lhs, col 0 bottom */
|
|
||||||
#define TIFFTAG_SAMPLESPERPIXEL 277 /* samples per pixel */
|
|
||||||
#define TIFFTAG_ROWSPERSTRIP 278 /* rows per strip of data */
|
|
||||||
#define TIFFTAG_STRIPBYTECOUNTS 279 /* bytes counts for strips */
|
|
||||||
#define TIFFTAG_MINSAMPLEVALUE 280 /* +minimum sample value */
|
|
||||||
#define TIFFTAG_MAXSAMPLEVALUE 281 /* +maximum sample value */
|
|
||||||
#define TIFFTAG_XRESOLUTION 282 /* pixels/resolution in x */
|
|
||||||
#define TIFFTAG_YRESOLUTION 283 /* pixels/resolution in y */
|
|
||||||
#define TIFFTAG_PLANARCONFIG 284 /* storage organization */
|
|
||||||
#define PLANARCONFIG_CONTIG 1 /* single image plane */
|
|
||||||
#define PLANARCONFIG_SEPARATE 2 /* separate planes of data */
|
|
||||||
#define TIFFTAG_PAGENAME 285 /* page name image is from */
|
|
||||||
#define TIFFTAG_XPOSITION 286 /* x page offset of image lhs */
|
|
||||||
#define TIFFTAG_YPOSITION 287 /* y page offset of image lhs */
|
|
||||||
#define TIFFTAG_FREEOFFSETS 288 /* +byte offset to free block */
|
|
||||||
#define TIFFTAG_FREEBYTECOUNTS 289 /* +sizes of free blocks */
|
|
||||||
#define TIFFTAG_GRAYRESPONSEUNIT 290 /* $gray scale curve accuracy */
|
|
||||||
#define GRAYRESPONSEUNIT_10S 1 /* tenths of a unit */
|
|
||||||
#define GRAYRESPONSEUNIT_100S 2 /* hundredths of a unit */
|
|
||||||
#define GRAYRESPONSEUNIT_1000S 3 /* thousandths of a unit */
|
|
||||||
#define GRAYRESPONSEUNIT_10000S 4 /* ten-thousandths of a unit */
|
|
||||||
#define GRAYRESPONSEUNIT_100000S 5 /* hundred-thousandths */
|
|
||||||
#define TIFFTAG_GRAYRESPONSECURVE 291 /* $gray scale response curve */
|
|
||||||
#define TIFFTAG_GROUP3OPTIONS 292 /* 32 flag bits */
|
|
||||||
#define TIFFTAG_T4OPTIONS 292 /* TIFF 6.0 proper name alias */
|
|
||||||
#define GROUP3OPT_2DENCODING 0x1 /* 2-dimensional coding */
|
|
||||||
#define GROUP3OPT_UNCOMPRESSED 0x2 /* data not compressed */
|
|
||||||
#define GROUP3OPT_FILLBITS 0x4 /* fill to byte boundary */
|
|
||||||
#define TIFFTAG_GROUP4OPTIONS 293 /* 32 flag bits */
|
|
||||||
#define TIFFTAG_T6OPTIONS 293 /* TIFF 6.0 proper name */
|
|
||||||
#define GROUP4OPT_UNCOMPRESSED 0x2 /* data not compressed */
|
|
||||||
#define TIFFTAG_RESOLUTIONUNIT 296 /* units of resolutions */
|
|
||||||
#define RESUNIT_NONE 1 /* no meaningful units */
|
|
||||||
#define RESUNIT_INCH 2 /* english */
|
|
||||||
#define RESUNIT_CENTIMETER 3 /* metric */
|
|
||||||
#define TIFFTAG_PAGENUMBER 297 /* page numbers of multi-page */
|
|
||||||
#define TIFFTAG_COLORRESPONSEUNIT 300 /* $color curve accuracy */
|
|
||||||
#define COLORRESPONSEUNIT_10S 1 /* tenths of a unit */
|
|
||||||
#define COLORRESPONSEUNIT_100S 2 /* hundredths of a unit */
|
|
||||||
#define COLORRESPONSEUNIT_1000S 3 /* thousandths of a unit */
|
|
||||||
#define COLORRESPONSEUNIT_10000S 4 /* ten-thousandths of a unit */
|
|
||||||
#define COLORRESPONSEUNIT_100000S 5 /* hundred-thousandths */
|
|
||||||
#define TIFFTAG_TRANSFERFUNCTION 301 /* !colorimetry info */
|
|
||||||
#define TIFFTAG_SOFTWARE 305 /* name & release */
|
|
||||||
#define TIFFTAG_DATETIME 306 /* creation date and time */
|
|
||||||
#define TIFFTAG_ARTIST 315 /* creator of image */
|
|
||||||
#define TIFFTAG_HOSTCOMPUTER 316 /* machine where created */
|
|
||||||
#define TIFFTAG_PREDICTOR 317 /* prediction scheme w/ LZW */
|
|
||||||
#define PREDICTOR_NONE 1 /* no prediction scheme used */
|
|
||||||
#define PREDICTOR_HORIZONTAL 2 /* horizontal differencing */
|
|
||||||
#define PREDICTOR_FLOATINGPOINT 3 /* floating point predictor */
|
|
||||||
#define TIFFTAG_WHITEPOINT 318 /* image white point */
|
|
||||||
#define TIFFTAG_PRIMARYCHROMATICITIES 319 /* !primary chromaticities */
|
|
||||||
#define TIFFTAG_COLORMAP 320 /* RGB map for pallette image */
|
|
||||||
#define TIFFTAG_HALFTONEHINTS 321 /* !highlight+shadow info */
|
|
||||||
#define TIFFTAG_TILEWIDTH 322 /* !tile width in pixels */
|
|
||||||
#define TIFFTAG_TILELENGTH 323 /* !tile height in pixels */
|
|
||||||
#define TIFFTAG_TILEOFFSETS 324 /* !offsets to data tiles */
|
|
||||||
#define TIFFTAG_TILEBYTECOUNTS 325 /* !byte counts for tiles */
|
|
||||||
#define TIFFTAG_BADFAXLINES 326 /* lines w/ wrong pixel count */
|
|
||||||
#define TIFFTAG_CLEANFAXDATA 327 /* regenerated line info */
|
|
||||||
#define CLEANFAXDATA_CLEAN 0 /* no errors detected */
|
|
||||||
#define CLEANFAXDATA_REGENERATED 1 /* receiver regenerated lines */
|
|
||||||
#define CLEANFAXDATA_UNCLEAN 2 /* uncorrected errors exist */
|
|
||||||
#define TIFFTAG_CONSECUTIVEBADFAXLINES 328 /* max consecutive bad lines */
|
|
||||||
#define TIFFTAG_SUBIFD 330 /* subimage descriptors */
|
|
||||||
#define TIFFTAG_INKSET 332 /* !inks in separated image */
|
|
||||||
#define INKSET_CMYK 1 /* !cyan-magenta-yellow-black color */
|
|
||||||
#define INKSET_MULTIINK 2 /* !multi-ink or hi-fi color */
|
|
||||||
#define TIFFTAG_INKNAMES 333 /* !ascii names of inks */
|
|
||||||
#define TIFFTAG_NUMBEROFINKS 334 /* !number of inks */
|
|
||||||
#define TIFFTAG_DOTRANGE 336 /* !0% and 100% dot codes */
|
|
||||||
#define TIFFTAG_TARGETPRINTER 337 /* !separation target */
|
|
||||||
#define TIFFTAG_EXTRASAMPLES 338 /* !info about extra samples */
|
|
||||||
#define EXTRASAMPLE_UNSPECIFIED 0 /* !unspecified data */
|
|
||||||
#define EXTRASAMPLE_ASSOCALPHA 1 /* !associated alpha data */
|
|
||||||
#define EXTRASAMPLE_UNASSALPHA 2 /* !unassociated alpha data */
|
|
||||||
#define TIFFTAG_SAMPLEFORMAT 339 /* !data sample format */
|
|
||||||
#define SAMPLEFORMAT_UINT 1 /* !unsigned integer data */
|
|
||||||
#define SAMPLEFORMAT_INT 2 /* !signed integer data */
|
|
||||||
#define SAMPLEFORMAT_IEEEFP 3 /* !IEEE floating point data */
|
|
||||||
#define SAMPLEFORMAT_VOID 4 /* !untyped data */
|
|
||||||
#define SAMPLEFORMAT_COMPLEXINT 5 /* !complex signed int */
|
|
||||||
#define SAMPLEFORMAT_COMPLEXIEEEFP 6 /* !complex ieee floating */
|
|
||||||
#define TIFFTAG_SMINSAMPLEVALUE 340 /* !variable MinSampleValue */
|
|
||||||
#define TIFFTAG_SMAXSAMPLEVALUE 341 /* !variable MaxSampleValue */
|
|
||||||
#define TIFFTAG_CLIPPATH 343 /* %ClipPath
|
|
||||||
[Adobe TIFF technote 2] */
|
|
||||||
#define TIFFTAG_XCLIPPATHUNITS 344 /* %XClipPathUnits
|
|
||||||
[Adobe TIFF technote 2] */
|
|
||||||
#define TIFFTAG_YCLIPPATHUNITS 345 /* %YClipPathUnits
|
|
||||||
[Adobe TIFF technote 2] */
|
|
||||||
#define TIFFTAG_INDEXED 346 /* %Indexed
|
|
||||||
[Adobe TIFF Technote 3] */
|
|
||||||
#define TIFFTAG_JPEGTABLES 347 /* %JPEG table stream */
|
|
||||||
#define TIFFTAG_OPIPROXY 351 /* %OPI Proxy [Adobe TIFF technote] */
|
|
||||||
/*
|
|
||||||
* Tags 512-521 are obsoleted by Technical Note #2 which specifies a
|
|
||||||
* revised JPEG-in-TIFF scheme.
|
|
||||||
*/
|
|
||||||
#define TIFFTAG_JPEGPROC 512 /* !JPEG processing algorithm */
|
|
||||||
#define JPEGPROC_BASELINE 1 /* !baseline sequential */
|
|
||||||
#define JPEGPROC_LOSSLESS 14 /* !Huffman coded lossless */
|
|
||||||
#define TIFFTAG_JPEGIFOFFSET 513 /* !pointer to SOI marker */
|
|
||||||
#define TIFFTAG_JPEGIFBYTECOUNT 514 /* !JFIF stream length */
|
|
||||||
#define TIFFTAG_JPEGRESTARTINTERVAL 515 /* !restart interval length */
|
|
||||||
#define TIFFTAG_JPEGLOSSLESSPREDICTORS 517 /* !lossless proc predictor */
|
|
||||||
#define TIFFTAG_JPEGPOINTTRANSFORM 518 /* !lossless point transform */
|
|
||||||
#define TIFFTAG_JPEGQTABLES 519 /* !Q matrice offsets */
|
|
||||||
#define TIFFTAG_JPEGDCTABLES 520 /* !DCT table offsets */
|
|
||||||
#define TIFFTAG_JPEGACTABLES 521 /* !AC coefficient offsets */
|
|
||||||
#define TIFFTAG_YCBCRCOEFFICIENTS 529 /* !RGB -> YCbCr transform */
|
|
||||||
#define TIFFTAG_YCBCRSUBSAMPLING 530 /* !YCbCr subsampling factors */
|
|
||||||
#define TIFFTAG_YCBCRPOSITIONING 531 /* !subsample positioning */
|
|
||||||
#define YCBCRPOSITION_CENTERED 1 /* !as in PostScript Level 2 */
|
|
||||||
#define YCBCRPOSITION_COSITED 2 /* !as in CCIR 601-1 */
|
|
||||||
#define TIFFTAG_REFERENCEBLACKWHITE 532 /* !colorimetry info */
|
|
||||||
#define TIFFTAG_XMLPACKET 700 /* %XML packet
|
|
||||||
[Adobe XMP Specification,
|
|
||||||
January 2004 */
|
|
||||||
#define TIFFTAG_OPIIMAGEID 32781 /* %OPI ImageID
|
|
||||||
[Adobe TIFF technote] */
|
|
||||||
/* tags 32952-32956 are private tags registered to Island Graphics */
|
|
||||||
#define TIFFTAG_REFPTS 32953 /* image reference points */
|
|
||||||
#define TIFFTAG_REGIONTACKPOINT 32954 /* region-xform tack point */
|
|
||||||
#define TIFFTAG_REGIONWARPCORNERS 32955 /* warp quadrilateral */
|
|
||||||
#define TIFFTAG_REGIONAFFINE 32956 /* affine transformation mat */
|
|
||||||
/* tags 32995-32999 are private tags registered to SGI */
|
|
||||||
#define TIFFTAG_MATTEING 32995 /* $use ExtraSamples */
|
|
||||||
#define TIFFTAG_DATATYPE 32996 /* $use SampleFormat */
|
|
||||||
#define TIFFTAG_IMAGEDEPTH 32997 /* z depth of image */
|
|
||||||
#define TIFFTAG_TILEDEPTH 32998 /* z depth/data tile */
|
|
||||||
/* tags 33300-33309 are private tags registered to Pixar */
|
|
||||||
/*
|
|
||||||
* TIFFTAG_PIXAR_IMAGEFULLWIDTH and TIFFTAG_PIXAR_IMAGEFULLLENGTH
|
|
||||||
* are set when an image has been cropped out of a larger image.
|
|
||||||
* They reflect the size of the original uncropped image.
|
|
||||||
* The TIFFTAG_XPOSITION and TIFFTAG_YPOSITION can be used
|
|
||||||
* to determine the position of the smaller image in the larger one.
|
|
||||||
*/
|
|
||||||
#define TIFFTAG_PIXAR_IMAGEFULLWIDTH 33300 /* full image size in x */
|
|
||||||
#define TIFFTAG_PIXAR_IMAGEFULLLENGTH 33301 /* full image size in y */
|
|
||||||
/* Tags 33302-33306 are used to identify special image modes and data
|
|
||||||
* used by Pixar's texture formats.
|
|
||||||
*/
|
|
||||||
#define TIFFTAG_PIXAR_TEXTUREFORMAT 33302 /* texture map format */
|
|
||||||
#define TIFFTAG_PIXAR_WRAPMODES 33303 /* s & t wrap modes */
|
|
||||||
#define TIFFTAG_PIXAR_FOVCOT 33304 /* cotan(fov) for env. maps */
|
|
||||||
#define TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN 33305
|
|
||||||
#define TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA 33306
|
|
||||||
/* tag 33405 is a private tag registered to Eastman Kodak */
|
|
||||||
#define TIFFTAG_WRITERSERIALNUMBER 33405 /* device serial number */
|
|
||||||
/* tag 33432 is listed in the 6.0 spec w/ unknown ownership */
|
|
||||||
#define TIFFTAG_COPYRIGHT 33432 /* copyright string */
|
|
||||||
/* IPTC TAG from RichTIFF specifications */
|
|
||||||
#define TIFFTAG_RICHTIFFIPTC 33723
|
|
||||||
/* 34016-34029 are reserved for ANSI IT8 TIFF/IT <[email protected]) */
|
|
||||||
#define TIFFTAG_IT8SITE 34016 /* site name */
|
|
||||||
#define TIFFTAG_IT8COLORSEQUENCE 34017 /* color seq. [RGB,CMYK,etc] */
|
|
||||||
#define TIFFTAG_IT8HEADER 34018 /* DDES Header */
|
|
||||||
#define TIFFTAG_IT8RASTERPADDING 34019 /* raster scanline padding */
|
|
||||||
#define TIFFTAG_IT8BITSPERRUNLENGTH 34020 /* # of bits in short run */
|
|
||||||
#define TIFFTAG_IT8BITSPEREXTENDEDRUNLENGTH 34021/* # of bits in long run */
|
|
||||||
#define TIFFTAG_IT8COLORTABLE 34022 /* LW colortable */
|
|
||||||
#define TIFFTAG_IT8IMAGECOLORINDICATOR 34023 /* BP/BL image color switch */
|
|
||||||
#define TIFFTAG_IT8BKGCOLORINDICATOR 34024 /* BP/BL bg color switch */
|
|
||||||
#define TIFFTAG_IT8IMAGECOLORVALUE 34025 /* BP/BL image color value */
|
|
||||||
#define TIFFTAG_IT8BKGCOLORVALUE 34026 /* BP/BL bg color value */
|
|
||||||
#define TIFFTAG_IT8PIXELINTENSITYRANGE 34027 /* MP pixel intensity value */
|
|
||||||
#define TIFFTAG_IT8TRANSPARENCYINDICATOR 34028 /* HC transparency switch */
|
|
||||||
#define TIFFTAG_IT8COLORCHARACTERIZATION 34029 /* color character. table */
|
|
||||||
#define TIFFTAG_IT8HCUSAGE 34030 /* HC usage indicator */
|
|
||||||
#define TIFFTAG_IT8TRAPINDICATOR 34031 /* Trapping indicator
|
|
||||||
(untrapped=0, trapped=1) */
|
|
||||||
#define TIFFTAG_IT8CMYKEQUIVALENT 34032 /* CMYK color equivalents */
|
|
||||||
/* tags 34232-34236 are private tags registered to Texas Instruments */
|
|
||||||
#define TIFFTAG_FRAMECOUNT 34232 /* Sequence Frame Count */
|
|
||||||
/* tag 34377 is private tag registered to Adobe for PhotoShop */
|
|
||||||
#define TIFFTAG_PHOTOSHOP 34377
|
|
||||||
/* tags 34665, 34853 and 40965 are documented in EXIF specification */
|
|
||||||
#define TIFFTAG_EXIFIFD 34665 /* Pointer to EXIF private directory */
|
|
||||||
/* tag 34750 is a private tag registered to Adobe? */
|
|
||||||
#define TIFFTAG_ICCPROFILE 34675 /* ICC profile data */
|
|
||||||
/* tag 34750 is a private tag registered to Pixel Magic */
|
|
||||||
#define TIFFTAG_JBIGOPTIONS 34750 /* JBIG options */
|
|
||||||
#define TIFFTAG_GPSIFD 34853 /* Pointer to GPS private directory */
|
|
||||||
/* tags 34908-34914 are private tags registered to SGI */
|
|
||||||
#define TIFFTAG_FAXRECVPARAMS 34908 /* encoded Class 2 ses. parms */
|
|
||||||
#define TIFFTAG_FAXSUBADDRESS 34909 /* received SubAddr string */
|
|
||||||
#define TIFFTAG_FAXRECVTIME 34910 /* receive time (secs) */
|
|
||||||
#define TIFFTAG_FAXDCS 34911 /* encoded fax ses. params, Table 2/T.30 */
|
|
||||||
/* tags 37439-37443 are registered to SGI <[email protected]> */
|
|
||||||
#define TIFFTAG_STONITS 37439 /* Sample value to Nits */
|
|
||||||
/* tag 34929 is a private tag registered to FedEx */
|
|
||||||
#define TIFFTAG_FEDEX_EDR 34929 /* unknown use */
|
|
||||||
#define TIFFTAG_INTEROPERABILITYIFD 40965 /* Pointer to Interoperability private directory */
|
|
||||||
/* Adobe Digital Negative (DNG) format tags */
|
|
||||||
#define TIFFTAG_DNGVERSION 50706 /* &DNG version number */
|
|
||||||
#define TIFFTAG_DNGBACKWARDVERSION 50707 /* &DNG compatibility version */
|
|
||||||
#define TIFFTAG_UNIQUECAMERAMODEL 50708 /* &name for the camera model */
|
|
||||||
#define TIFFTAG_LOCALIZEDCAMERAMODEL 50709 /* &localized camera model
|
|
||||||
name */
|
|
||||||
#define TIFFTAG_CFAPLANECOLOR 50710 /* &CFAPattern->LinearRaw space
|
|
||||||
mapping */
|
|
||||||
#define TIFFTAG_CFALAYOUT 50711 /* &spatial layout of the CFA */
|
|
||||||
#define TIFFTAG_LINEARIZATIONTABLE 50712 /* &lookup table description */
|
|
||||||
#define TIFFTAG_BLACKLEVELREPEATDIM 50713 /* &repeat pattern size for
|
|
||||||
the BlackLevel tag */
|
|
||||||
#define TIFFTAG_BLACKLEVEL 50714 /* &zero light encoding level */
|
|
||||||
#define TIFFTAG_BLACKLEVELDELTAH 50715 /* &zero light encoding level
|
|
||||||
differences (columns) */
|
|
||||||
#define TIFFTAG_BLACKLEVELDELTAV 50716 /* &zero light encoding level
|
|
||||||
differences (rows) */
|
|
||||||
#define TIFFTAG_WHITELEVEL 50717 /* &fully saturated encoding
|
|
||||||
level */
|
|
||||||
#define TIFFTAG_DEFAULTSCALE 50718 /* &default scale factors */
|
|
||||||
#define TIFFTAG_DEFAULTCROPORIGIN 50719 /* &origin of the final image
|
|
||||||
area */
|
|
||||||
#define TIFFTAG_DEFAULTCROPSIZE 50720 /* &size of the final image
|
|
||||||
area */
|
|
||||||
#define TIFFTAG_COLORMATRIX1 50721 /* &XYZ->reference color space
|
|
||||||
transformation matrix 1 */
|
|
||||||
#define TIFFTAG_COLORMATRIX2 50722 /* &XYZ->reference color space
|
|
||||||
transformation matrix 2 */
|
|
||||||
#define TIFFTAG_CAMERACALIBRATION1 50723 /* &calibration matrix 1 */
|
|
||||||
#define TIFFTAG_CAMERACALIBRATION2 50724 /* &calibration matrix 2 */
|
|
||||||
#define TIFFTAG_REDUCTIONMATRIX1 50725 /* &dimensionality reduction
|
|
||||||
matrix 1 */
|
|
||||||
#define TIFFTAG_REDUCTIONMATRIX2 50726 /* &dimensionality reduction
|
|
||||||
matrix 2 */
|
|
||||||
#define TIFFTAG_ANALOGBALANCE 50727 /* &gain applied the stored raw
|
|
||||||
values*/
|
|
||||||
#define TIFFTAG_ASSHOTNEUTRAL 50728 /* &selected white balance in
|
|
||||||
linear reference space */
|
|
||||||
#define TIFFTAG_ASSHOTWHITEXY 50729 /* &selected white balance in
|
|
||||||
x-y chromaticity
|
|
||||||
coordinates */
|
|
||||||
#define TIFFTAG_BASELINEEXPOSURE 50730 /* &how much to move the zero
|
|
||||||
point */
|
|
||||||
#define TIFFTAG_BASELINENOISE 50731 /* &relative noise level */
|
|
||||||
#define TIFFTAG_BASELINESHARPNESS 50732 /* &relative amount of
|
|
||||||
sharpening */
|
|
||||||
#define TIFFTAG_BAYERGREENSPLIT 50733 /* &how closely the values of
|
|
||||||
the green pixels in the
|
|
||||||
blue/green rows track the
|
|
||||||
values of the green pixels
|
|
||||||
in the red/green rows */
|
|
||||||
#define TIFFTAG_LINEARRESPONSELIMIT 50734 /* &non-linear encoding range */
|
|
||||||
#define TIFFTAG_CAMERASERIALNUMBER 50735 /* &camera's serial number */
|
|
||||||
#define TIFFTAG_LENSINFO 50736 /* info about the lens */
|
|
||||||
#define TIFFTAG_CHROMABLURRADIUS 50737 /* &chroma blur radius */
|
|
||||||
#define TIFFTAG_ANTIALIASSTRENGTH 50738 /* &relative strength of the
|
|
||||||
camera's anti-alias filter */
|
|
||||||
#define TIFFTAG_SHADOWSCALE 50739 /* &used by Adobe Camera Raw */
|
|
||||||
#define TIFFTAG_DNGPRIVATEDATA 50740 /* &manufacturer's private data */
|
|
||||||
#define TIFFTAG_MAKERNOTESAFETY 50741 /* &whether the EXIF MakerNote
|
|
||||||
tag is safe to preserve
|
|
||||||
along with the rest of the
|
|
||||||
EXIF data */
|
|
||||||
#define TIFFTAG_CALIBRATIONILLUMINANT1 50778 /* &illuminant 1 */
|
|
||||||
#define TIFFTAG_CALIBRATIONILLUMINANT2 50779 /* &illuminant 2 */
|
|
||||||
#define TIFFTAG_BESTQUALITYSCALE 50780 /* &best quality multiplier */
|
|
||||||
#define TIFFTAG_RAWDATAUNIQUEID 50781 /* &unique identifier for
|
|
||||||
the raw image data */
|
|
||||||
#define TIFFTAG_ORIGINALRAWFILENAME 50827 /* &file name of the original
|
|
||||||
raw file */
|
|
||||||
#define TIFFTAG_ORIGINALRAWFILEDATA 50828 /* &contents of the original
|
|
||||||
raw file */
|
|
||||||
#define TIFFTAG_ACTIVEAREA 50829 /* &active (non-masked) pixels
|
|
||||||
of the sensor */
|
|
||||||
#define TIFFTAG_MASKEDAREAS 50830 /* &list of coordinates
|
|
||||||
of fully masked pixels */
|
|
||||||
#define TIFFTAG_ASSHOTICCPROFILE 50831 /* &these two tags used to */
|
|
||||||
#define TIFFTAG_ASSHOTPREPROFILEMATRIX 50832 /* map cameras's color space
|
|
||||||
into ICC profile space */
|
|
||||||
#define TIFFTAG_CURRENTICCPROFILE 50833 /* & */
|
|
||||||
#define TIFFTAG_CURRENTPREPROFILEMATRIX 50834 /* & */
|
|
||||||
/* tag 65535 is an undefined tag used by Eastman Kodak */
|
|
||||||
#define TIFFTAG_DCSHUESHIFTVALUES 65535 /* hue shift correction data */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The following are ``pseudo tags'' that can be used to control
|
|
||||||
* codec-specific functionality. These tags are not written to file.
|
|
||||||
* Note that these values start at 0xffff+1 so that they'll never
|
|
||||||
* collide with Aldus-assigned tags.
|
|
||||||
*
|
|
||||||
* If you want your private pseudo tags ``registered'' (i.e. added to
|
|
||||||
* this file), please post a bug report via the tracking system at
|
|
||||||
* http://www.remotesensing.org/libtiff/bugs.html with the appropriate
|
|
||||||
* C definitions to add.
|
|
||||||
*/
|
|
||||||
#define TIFFTAG_FAXMODE 65536 /* Group 3/4 format control */
|
|
||||||
#define FAXMODE_CLASSIC 0x0000 /* default, include RTC */
|
|
||||||
#define FAXMODE_NORTC 0x0001 /* no RTC at end of data */
|
|
||||||
#define FAXMODE_NOEOL 0x0002 /* no EOL code at end of row */
|
|
||||||
#define FAXMODE_BYTEALIGN 0x0004 /* byte align row */
|
|
||||||
#define FAXMODE_WORDALIGN 0x0008 /* word align row */
|
|
||||||
#define FAXMODE_CLASSF FAXMODE_NORTC /* TIFF Class F */
|
|
||||||
#define TIFFTAG_JPEGQUALITY 65537 /* Compression quality level */
|
|
||||||
/* Note: quality level is on the IJG 0-100 scale. Default value is 75 */
|
|
||||||
#define TIFFTAG_JPEGCOLORMODE 65538 /* Auto RGB<=>YCbCr convert? */
|
|
||||||
#define JPEGCOLORMODE_RAW 0x0000 /* no conversion (default) */
|
|
||||||
#define JPEGCOLORMODE_RGB 0x0001 /* do auto conversion */
|
|
||||||
#define TIFFTAG_JPEGTABLESMODE 65539 /* What to put in JPEGTables */
|
|
||||||
#define JPEGTABLESMODE_QUANT 0x0001 /* include quantization tbls */
|
|
||||||
#define JPEGTABLESMODE_HUFF 0x0002 /* include Huffman tbls */
|
|
||||||
/* Note: default is JPEGTABLESMODE_QUANT | JPEGTABLESMODE_HUFF */
|
|
||||||
#define TIFFTAG_FAXFILLFUNC 65540 /* G3/G4 fill function */
|
|
||||||
#define TIFFTAG_PIXARLOGDATAFMT 65549 /* PixarLogCodec I/O data sz */
|
|
||||||
#define PIXARLOGDATAFMT_8BIT 0 /* regular u_char samples */
|
|
||||||
#define PIXARLOGDATAFMT_8BITABGR 1 /* ABGR-order u_chars */
|
|
||||||
#define PIXARLOGDATAFMT_11BITLOG 2 /* 11-bit log-encoded (raw) */
|
|
||||||
#define PIXARLOGDATAFMT_12BITPICIO 3 /* as per PICIO (1.0==2048) */
|
|
||||||
#define PIXARLOGDATAFMT_16BIT 4 /* signed short samples */
|
|
||||||
#define PIXARLOGDATAFMT_FLOAT 5 /* IEEE float samples */
|
|
||||||
/* 65550-65556 are allocated to Oceana Matrix <[email protected]> */
|
|
||||||
#define TIFFTAG_DCSIMAGERTYPE 65550 /* imager model & filter */
|
|
||||||
#define DCSIMAGERMODEL_M3 0 /* M3 chip (1280 x 1024) */
|
|
||||||
#define DCSIMAGERMODEL_M5 1 /* M5 chip (1536 x 1024) */
|
|
||||||
#define DCSIMAGERMODEL_M6 2 /* M6 chip (3072 x 2048) */
|
|
||||||
#define DCSIMAGERFILTER_IR 0 /* infrared filter */
|
|
||||||
#define DCSIMAGERFILTER_MONO 1 /* monochrome filter */
|
|
||||||
#define DCSIMAGERFILTER_CFA 2 /* color filter array */
|
|
||||||
#define DCSIMAGERFILTER_OTHER 3 /* other filter */
|
|
||||||
#define TIFFTAG_DCSINTERPMODE 65551 /* interpolation mode */
|
|
||||||
#define DCSINTERPMODE_NORMAL 0x0 /* whole image, default */
|
|
||||||
#define DCSINTERPMODE_PREVIEW 0x1 /* preview of image (384x256) */
|
|
||||||
#define TIFFTAG_DCSBALANCEARRAY 65552 /* color balance values */
|
|
||||||
#define TIFFTAG_DCSCORRECTMATRIX 65553 /* color correction values */
|
|
||||||
#define TIFFTAG_DCSGAMMA 65554 /* gamma value */
|
|
||||||
#define TIFFTAG_DCSTOESHOULDERPTS 65555 /* toe & shoulder points */
|
|
||||||
#define TIFFTAG_DCSCALIBRATIONFD 65556 /* calibration file desc */
|
|
||||||
/* Note: quality level is on the ZLIB 1-9 scale. Default value is -1 */
|
|
||||||
#define TIFFTAG_ZIPQUALITY 65557 /* compression quality level */
|
|
||||||
#define TIFFTAG_PIXARLOGQUALITY 65558 /* PixarLog uses same scale */
|
|
||||||
/* 65559 is allocated to Oceana Matrix <[email protected]> */
|
|
||||||
#define TIFFTAG_DCSCLIPRECTANGLE 65559 /* area of image to acquire */
|
|
||||||
#define TIFFTAG_SGILOGDATAFMT 65560 /* SGILog user data format */
|
|
||||||
#define SGILOGDATAFMT_FLOAT 0 /* IEEE float samples */
|
|
||||||
#define SGILOGDATAFMT_16BIT 1 /* 16-bit samples */
|
|
||||||
#define SGILOGDATAFMT_RAW 2 /* uninterpreted data */
|
|
||||||
#define SGILOGDATAFMT_8BIT 3 /* 8-bit RGB monitor values */
|
|
||||||
#define TIFFTAG_SGILOGENCODE 65561 /* SGILog data encoding control*/
|
|
||||||
#define SGILOGENCODE_NODITHER 0 /* do not dither encoded values*/
|
|
||||||
#define SGILOGENCODE_RANDITHER 1 /* randomly dither encd values */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* EXIF tags
|
|
||||||
*/
|
|
||||||
#define EXIFTAG_EXPOSURETIME 33434 /* Exposure time */
|
|
||||||
#define EXIFTAG_FNUMBER 33437 /* F number */
|
|
||||||
#define EXIFTAG_EXPOSUREPROGRAM 34850 /* Exposure program */
|
|
||||||
#define EXIFTAG_SPECTRALSENSITIVITY 34852 /* Spectral sensitivity */
|
|
||||||
#define EXIFTAG_ISOSPEEDRATINGS 34855 /* ISO speed rating */
|
|
||||||
#define EXIFTAG_OECF 34856 /* Optoelectric conversion
|
|
||||||
factor */
|
|
||||||
#define EXIFTAG_EXIFVERSION 36864 /* Exif version */
|
|
||||||
#define EXIFTAG_DATETIMEORIGINAL 36867 /* Date and time of original
|
|
||||||
data generation */
|
|
||||||
#define EXIFTAG_DATETIMEDIGITIZED 36868 /* Date and time of digital
|
|
||||||
data generation */
|
|
||||||
#define EXIFTAG_COMPONENTSCONFIGURATION 37121 /* Meaning of each component */
|
|
||||||
#define EXIFTAG_COMPRESSEDBITSPERPIXEL 37122 /* Image compression mode */
|
|
||||||
#define EXIFTAG_SHUTTERSPEEDVALUE 37377 /* Shutter speed */
|
|
||||||
#define EXIFTAG_APERTUREVALUE 37378 /* Aperture */
|
|
||||||
#define EXIFTAG_BRIGHTNESSVALUE 37379 /* Brightness */
|
|
||||||
#define EXIFTAG_EXPOSUREBIASVALUE 37380 /* Exposure bias */
|
|
||||||
#define EXIFTAG_MAXAPERTUREVALUE 37381 /* Maximum lens aperture */
|
|
||||||
#define EXIFTAG_SUBJECTDISTANCE 37382 /* Subject distance */
|
|
||||||
#define EXIFTAG_METERINGMODE 37383 /* Metering mode */
|
|
||||||
#define EXIFTAG_LIGHTSOURCE 37384 /* Light source */
|
|
||||||
#define EXIFTAG_FLASH 37385 /* Flash */
|
|
||||||
#define EXIFTAG_FOCALLENGTH 37386 /* Lens focal length */
|
|
||||||
#define EXIFTAG_SUBJECTAREA 37396 /* Subject area */
|
|
||||||
#define EXIFTAG_MAKERNOTE 37500 /* Manufacturer notes */
|
|
||||||
#define EXIFTAG_USERCOMMENT 37510 /* User comments */
|
|
||||||
#define EXIFTAG_SUBSECTIME 37520 /* DateTime subseconds */
|
|
||||||
#define EXIFTAG_SUBSECTIMEORIGINAL 37521 /* DateTimeOriginal subseconds */
|
|
||||||
#define EXIFTAG_SUBSECTIMEDIGITIZED 37522 /* DateTimeDigitized subseconds */
|
|
||||||
#define EXIFTAG_FLASHPIXVERSION 40960 /* Supported Flashpix version */
|
|
||||||
#define EXIFTAG_COLORSPACE 40961 /* Color space information */
|
|
||||||
#define EXIFTAG_PIXELXDIMENSION 40962 /* Valid image width */
|
|
||||||
#define EXIFTAG_PIXELYDIMENSION 40963 /* Valid image height */
|
|
||||||
#define EXIFTAG_RELATEDSOUNDFILE 40964 /* Related audio file */
|
|
||||||
#define EXIFTAG_FLASHENERGY 41483 /* Flash energy */
|
|
||||||
#define EXIFTAG_SPATIALFREQUENCYRESPONSE 41484 /* Spatial frequency response */
|
|
||||||
#define EXIFTAG_FOCALPLANEXRESOLUTION 41486 /* Focal plane X resolution */
|
|
||||||
#define EXIFTAG_FOCALPLANEYRESOLUTION 41487 /* Focal plane Y resolution */
|
|
||||||
#define EXIFTAG_FOCALPLANERESOLUTIONUNIT 41488 /* Focal plane resolution unit */
|
|
||||||
#define EXIFTAG_SUBJECTLOCATION 41492 /* Subject location */
|
|
||||||
#define EXIFTAG_EXPOSUREINDEX 41493 /* Exposure index */
|
|
||||||
#define EXIFTAG_SENSINGMETHOD 41495 /* Sensing method */
|
|
||||||
#define EXIFTAG_FILESOURCE 41728 /* File source */
|
|
||||||
#define EXIFTAG_SCENETYPE 41729 /* Scene type */
|
|
||||||
#define EXIFTAG_CFAPATTERN 41730 /* CFA pattern */
|
|
||||||
#define EXIFTAG_CUSTOMRENDERED 41985 /* Custom image processing */
|
|
||||||
#define EXIFTAG_EXPOSUREMODE 41986 /* Exposure mode */
|
|
||||||
#define EXIFTAG_WHITEBALANCE 41987 /* White balance */
|
|
||||||
#define EXIFTAG_DIGITALZOOMRATIO 41988 /* Digital zoom ratio */
|
|
||||||
#define EXIFTAG_FOCALLENGTHIN35MMFILM 41989 /* Focal length in 35 mm film */
|
|
||||||
#define EXIFTAG_SCENECAPTURETYPE 41990 /* Scene capture type */
|
|
||||||
#define EXIFTAG_GAINCONTROL 41991 /* Gain control */
|
|
||||||
#define EXIFTAG_CONTRAST 41992 /* Contrast */
|
|
||||||
#define EXIFTAG_SATURATION 41993 /* Saturation */
|
|
||||||
#define EXIFTAG_SHARPNESS 41994 /* Sharpness */
|
|
||||||
#define EXIFTAG_DEVICESETTINGDESCRIPTION 41995 /* Device settings description */
|
|
||||||
#define EXIFTAG_SUBJECTDISTANCERANGE 41996 /* Subject distance range */
|
|
||||||
#define EXIFTAG_GAINCONTROL 41991 /* Gain control */
|
|
||||||
#define EXIFTAG_GAINCONTROL 41991 /* Gain control */
|
|
||||||
#define EXIFTAG_IMAGEUNIQUEID 42016 /* Unique image ID */
|
|
||||||
|
|
||||||
#endif /* _TIFF_ */
|
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
@@ -1,110 +0,0 @@
|
|||||||
/* libtiff/tiffconf.h. Generated from tiffconf.h.in by configure. */
|
|
||||||
/*
|
|
||||||
Configuration defines for installed libtiff.
|
|
||||||
This file maintained for backward compatibility. Do not use definitions
|
|
||||||
from this file in your programs.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _TIFFCONF_
|
|
||||||
#define _TIFFCONF_
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `int16'. */
|
|
||||||
#define HAVE_INT16 1
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `int32'. */
|
|
||||||
#define HAVE_INT32 1
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `int8'. */
|
|
||||||
#define HAVE_INT8 1
|
|
||||||
|
|
||||||
/* The size of a `int', as computed by sizeof. */
|
|
||||||
#define SIZEOF_INT 4
|
|
||||||
|
|
||||||
/* The size of a `long', as computed by sizeof. */
|
|
||||||
#define SIZEOF_LONG 4
|
|
||||||
|
|
||||||
/* Compatibility stuff. */
|
|
||||||
|
|
||||||
/* Define as 0 or 1 according to the floating point format suported by the
|
|
||||||
machine */
|
|
||||||
#define HAVE_IEEEFP 1
|
|
||||||
|
|
||||||
/* Set the native cpu bit order (FILLORDER_LSB2MSB or FILLORDER_MSB2LSB) */
|
|
||||||
#define HOST_FILLORDER FILLORDER_LSB2MSB
|
|
||||||
|
|
||||||
/* Native cpu byte order: 1 if big-endian (Motorola) or 0 if little-endian
|
|
||||||
(Intel) */
|
|
||||||
#define HOST_BIGENDIAN 0
|
|
||||||
|
|
||||||
/* Support CCITT Group 3 & 4 algorithms */
|
|
||||||
#define CCITT_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support JPEG compression (requires IJG JPEG library) */
|
|
||||||
#define JPEG_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support JBIG compression (requires JBIG-KIT library) */
|
|
||||||
/* #undef JBIG_SUPPORT */
|
|
||||||
|
|
||||||
/* Support LogLuv high dynamic range encoding */
|
|
||||||
#define LOGLUV_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support LZW algorithm */
|
|
||||||
#define LZW_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support NeXT 2-bit RLE algorithm */
|
|
||||||
#define NEXT_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support Old JPEG compresson (read contrib/ojpeg/README first! Compilation
|
|
||||||
fails with unpatched IJG JPEG library) */
|
|
||||||
#define OJPEG_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support Macintosh PackBits algorithm */
|
|
||||||
#define PACKBITS_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support Pixar log-format algorithm (requires Zlib) */
|
|
||||||
#define PIXARLOG_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support ThunderScan 4-bit RLE algorithm */
|
|
||||||
#define THUNDER_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support Deflate compression */
|
|
||||||
#define ZIP_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support strip chopping (whether or not to convert single-strip uncompressed
|
|
||||||
images to mutiple strips of ~8Kb to reduce memory usage) */
|
|
||||||
#define STRIPCHOP_DEFAULT TIFF_STRIPCHOP
|
|
||||||
|
|
||||||
/* Enable SubIFD tag (330) support */
|
|
||||||
#define SUBIFD_SUPPORT 1
|
|
||||||
|
|
||||||
/* Treat extra sample as alpha (default enabled). The RGBA interface will
|
|
||||||
treat a fourth sample with no EXTRASAMPLE_ value as being ASSOCALPHA. Many
|
|
||||||
packages produce RGBA files but don't mark the alpha properly. */
|
|
||||||
#define DEFAULT_EXTRASAMPLE_AS_ALPHA 1
|
|
||||||
|
|
||||||
/* Pick up YCbCr subsampling info from the JPEG data stream to support files
|
|
||||||
lacking the tag (default enabled). */
|
|
||||||
#define CHECK_JPEG_YCBCR_SUBSAMPLING 1
|
|
||||||
|
|
||||||
/* Support MS MDI magic number files as TIFF */
|
|
||||||
#define MDI_SUPPORT 1
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Feature support definitions.
|
|
||||||
* XXX: These macros are obsoleted. Don't use them in your apps!
|
|
||||||
* Macros stays here for backward compatibility and should be always defined.
|
|
||||||
*/
|
|
||||||
#define COLORIMETRY_SUPPORT
|
|
||||||
#define YCBCR_SUPPORT
|
|
||||||
#define CMYK_SUPPORT
|
|
||||||
#define ICC_SUPPORT
|
|
||||||
#define PHOTOSHOP_SUPPORT
|
|
||||||
#define IPTC_SUPPORT
|
|
||||||
|
|
||||||
#include <SupportDefs.h>
|
|
||||||
// Use Be's typedefs for [u]int# instead of having libtiff define them.
|
|
||||||
// This resolves the problem of Be's types being redefined by libtiff
|
|
||||||
// without breaking or making mass changes to libtiff.
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* _TIFFCONF_ */
|
|
||||||
@@ -1,526 +0,0 @@
|
|||||||
/* $Id: tiffio.h,v 1.56.2.4 2010-06-08 18:50:43 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _TIFFIO_
|
|
||||||
#define _TIFFIO_
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF I/O Library Definitions.
|
|
||||||
*/
|
|
||||||
#include "tiff.h"
|
|
||||||
#include "tiffvers.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF is defined as an incomplete type to hide the
|
|
||||||
* library's internal data structures from clients.
|
|
||||||
*/
|
|
||||||
typedef struct tiff TIFF;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The following typedefs define the intrinsic size of
|
|
||||||
* data types used in the *exported* interfaces. These
|
|
||||||
* definitions depend on the proper definition of types
|
|
||||||
* in tiff.h. Note also that the varargs interface used
|
|
||||||
* to pass tag types and values uses the types defined in
|
|
||||||
* tiff.h directly.
|
|
||||||
*
|
|
||||||
* NB: ttag_t is unsigned int and not unsigned short because
|
|
||||||
* ANSI C requires that the type before the ellipsis be a
|
|
||||||
* promoted type (i.e. one of int, unsigned int, pointer,
|
|
||||||
* or double) and because we defined pseudo-tags that are
|
|
||||||
* outside the range of legal Aldus-assigned tags.
|
|
||||||
* NB: tsize_t is int32 and not uint32 because some functions
|
|
||||||
* return -1.
|
|
||||||
* NB: toff_t is not off_t for many reasons; TIFFs max out at
|
|
||||||
* 32-bit file offsets being the most important, and to ensure
|
|
||||||
* that it is unsigned, rather than signed.
|
|
||||||
*/
|
|
||||||
typedef uint32 ttag_t; /* directory tag */
|
|
||||||
typedef uint16 tdir_t; /* directory index */
|
|
||||||
typedef uint16 tsample_t; /* sample number */
|
|
||||||
typedef uint32 tstrile_t; /* strip or tile number */
|
|
||||||
typedef tstrile_t tstrip_t; /* strip number */
|
|
||||||
typedef tstrile_t ttile_t; /* tile number */
|
|
||||||
typedef int32 tsize_t; /* i/o size in bytes */
|
|
||||||
typedef void* tdata_t; /* image data ref */
|
|
||||||
typedef uint32 toff_t; /* file offset */
|
|
||||||
|
|
||||||
#if !defined(__WIN32__) && (defined(_WIN32) || defined(WIN32))
|
|
||||||
#define __WIN32__
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* On windows you should define USE_WIN32_FILEIO if you are using tif_win32.c
|
|
||||||
* or AVOID_WIN32_FILEIO if you are using something else (like tif_unix.c).
|
|
||||||
*
|
|
||||||
* By default tif_unix.c is assumed.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined(_WINDOWS) || defined(__WIN32__) || defined(_Windows)
|
|
||||||
# if !defined(__CYGWIN) && !defined(AVOID_WIN32_FILEIO) && !defined(USE_WIN32_FILEIO)
|
|
||||||
# define AVOID_WIN32_FILEIO
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(USE_WIN32_FILEIO)
|
|
||||||
# define VC_EXTRALEAN
|
|
||||||
# include <windows.h>
|
|
||||||
# ifdef __WIN32__
|
|
||||||
DECLARE_HANDLE(thandle_t); /* Win32 file handle */
|
|
||||||
# else
|
|
||||||
typedef HFILE thandle_t; /* client data handle */
|
|
||||||
# endif /* __WIN32__ */
|
|
||||||
#else
|
|
||||||
typedef void* thandle_t; /* client data handle */
|
|
||||||
#endif /* USE_WIN32_FILEIO */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Flags to pass to TIFFPrintDirectory to control
|
|
||||||
* printing of data structures that are potentially
|
|
||||||
* very large. Bit-or these flags to enable printing
|
|
||||||
* multiple items.
|
|
||||||
*/
|
|
||||||
#define TIFFPRINT_NONE 0x0 /* no extra info */
|
|
||||||
#define TIFFPRINT_STRIPS 0x1 /* strips/tiles info */
|
|
||||||
#define TIFFPRINT_CURVES 0x2 /* color/gray response curves */
|
|
||||||
#define TIFFPRINT_COLORMAP 0x4 /* colormap */
|
|
||||||
#define TIFFPRINT_JPEGQTABLES 0x100 /* JPEG Q matrices */
|
|
||||||
#define TIFFPRINT_JPEGACTABLES 0x200 /* JPEG AC tables */
|
|
||||||
#define TIFFPRINT_JPEGDCTABLES 0x200 /* JPEG DC tables */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Colour conversion stuff
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* reference white */
|
|
||||||
#define D65_X0 (95.0470F)
|
|
||||||
#define D65_Y0 (100.0F)
|
|
||||||
#define D65_Z0 (108.8827F)
|
|
||||||
|
|
||||||
#define D50_X0 (96.4250F)
|
|
||||||
#define D50_Y0 (100.0F)
|
|
||||||
#define D50_Z0 (82.4680F)
|
|
||||||
|
|
||||||
/* Structure for holding information about a display device. */
|
|
||||||
|
|
||||||
typedef unsigned char TIFFRGBValue; /* 8-bit samples */
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
float d_mat[3][3]; /* XYZ -> luminance matrix */
|
|
||||||
float d_YCR; /* Light o/p for reference white */
|
|
||||||
float d_YCG;
|
|
||||||
float d_YCB;
|
|
||||||
uint32 d_Vrwr; /* Pixel values for ref. white */
|
|
||||||
uint32 d_Vrwg;
|
|
||||||
uint32 d_Vrwb;
|
|
||||||
float d_Y0R; /* Residual light for black pixel */
|
|
||||||
float d_Y0G;
|
|
||||||
float d_Y0B;
|
|
||||||
float d_gammaR; /* Gamma values for the three guns */
|
|
||||||
float d_gammaG;
|
|
||||||
float d_gammaB;
|
|
||||||
} TIFFDisplay;
|
|
||||||
|
|
||||||
typedef struct { /* YCbCr->RGB support */
|
|
||||||
TIFFRGBValue* clamptab; /* range clamping table */
|
|
||||||
int* Cr_r_tab;
|
|
||||||
int* Cb_b_tab;
|
|
||||||
int32* Cr_g_tab;
|
|
||||||
int32* Cb_g_tab;
|
|
||||||
int32* Y_tab;
|
|
||||||
} TIFFYCbCrToRGB;
|
|
||||||
|
|
||||||
typedef struct { /* CIE Lab 1976->RGB support */
|
|
||||||
int range; /* Size of conversion table */
|
|
||||||
#define CIELABTORGB_TABLE_RANGE 1500
|
|
||||||
float rstep, gstep, bstep;
|
|
||||||
float X0, Y0, Z0; /* Reference white point */
|
|
||||||
TIFFDisplay display;
|
|
||||||
float Yr2r[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yr to r */
|
|
||||||
float Yg2g[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yg to g */
|
|
||||||
float Yb2b[CIELABTORGB_TABLE_RANGE + 1]; /* Conversion of Yb to b */
|
|
||||||
} TIFFCIELabToRGB;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* RGBA-style image support.
|
|
||||||
*/
|
|
||||||
typedef struct _TIFFRGBAImage TIFFRGBAImage;
|
|
||||||
/*
|
|
||||||
* The image reading and conversion routines invoke
|
|
||||||
* ``put routines'' to copy/image/whatever tiles of
|
|
||||||
* raw image data. A default set of routines are
|
|
||||||
* provided to convert/copy raw image data to 8-bit
|
|
||||||
* packed ABGR format rasters. Applications can supply
|
|
||||||
* alternate routines that unpack the data into a
|
|
||||||
* different format or, for example, unpack the data
|
|
||||||
* and draw the unpacked raster on the display.
|
|
||||||
*/
|
|
||||||
typedef void (*tileContigRoutine)
|
|
||||||
(TIFFRGBAImage*, uint32*, uint32, uint32, uint32, uint32, int32, int32,
|
|
||||||
unsigned char*);
|
|
||||||
typedef void (*tileSeparateRoutine)
|
|
||||||
(TIFFRGBAImage*, uint32*, uint32, uint32, uint32, uint32, int32, int32,
|
|
||||||
unsigned char*, unsigned char*, unsigned char*, unsigned char*);
|
|
||||||
/*
|
|
||||||
* RGBA-reader state.
|
|
||||||
*/
|
|
||||||
struct _TIFFRGBAImage {
|
|
||||||
TIFF* tif; /* image handle */
|
|
||||||
int stoponerr; /* stop on read error */
|
|
||||||
int isContig; /* data is packed/separate */
|
|
||||||
int alpha; /* type of alpha data present */
|
|
||||||
uint32 width; /* image width */
|
|
||||||
uint32 height; /* image height */
|
|
||||||
uint16 bitspersample; /* image bits/sample */
|
|
||||||
uint16 samplesperpixel; /* image samples/pixel */
|
|
||||||
uint16 orientation; /* image orientation */
|
|
||||||
uint16 req_orientation; /* requested orientation */
|
|
||||||
uint16 photometric; /* image photometric interp */
|
|
||||||
uint16* redcmap; /* colormap pallete */
|
|
||||||
uint16* greencmap;
|
|
||||||
uint16* bluecmap;
|
|
||||||
/* get image data routine */
|
|
||||||
int (*get)(TIFFRGBAImage*, uint32*, uint32, uint32);
|
|
||||||
/* put decoded strip/tile */
|
|
||||||
union {
|
|
||||||
void (*any)(TIFFRGBAImage*);
|
|
||||||
tileContigRoutine contig;
|
|
||||||
tileSeparateRoutine separate;
|
|
||||||
} put;
|
|
||||||
TIFFRGBValue* Map; /* sample mapping array */
|
|
||||||
uint32** BWmap; /* black&white map */
|
|
||||||
uint32** PALmap; /* palette image map */
|
|
||||||
TIFFYCbCrToRGB* ycbcr; /* YCbCr conversion state */
|
|
||||||
TIFFCIELabToRGB* cielab; /* CIE L*a*b conversion state */
|
|
||||||
|
|
||||||
int row_offset;
|
|
||||||
int col_offset;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Macros for extracting components from the
|
|
||||||
* packed ABGR form returned by TIFFReadRGBAImage.
|
|
||||||
*/
|
|
||||||
#define TIFFGetR(abgr) ((abgr) & 0xff)
|
|
||||||
#define TIFFGetG(abgr) (((abgr) >> 8) & 0xff)
|
|
||||||
#define TIFFGetB(abgr) (((abgr) >> 16) & 0xff)
|
|
||||||
#define TIFFGetA(abgr) (((abgr) >> 24) & 0xff)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* A CODEC is a software package that implements decoding,
|
|
||||||
* encoding, or decoding+encoding of a compression algorithm.
|
|
||||||
* The library provides a collection of builtin codecs.
|
|
||||||
* More codecs may be registered through calls to the library
|
|
||||||
* and/or the builtin implementations may be overridden.
|
|
||||||
*/
|
|
||||||
typedef int (*TIFFInitMethod)(TIFF*, int);
|
|
||||||
typedef struct {
|
|
||||||
char* name;
|
|
||||||
uint16 scheme;
|
|
||||||
TIFFInitMethod init;
|
|
||||||
} TIFFCodec;
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
/* share internal LogLuv conversion routines? */
|
|
||||||
#ifndef LOGLUV_PUBLIC
|
|
||||||
#define LOGLUV_PUBLIC 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(__GNUC__) && !defined(__attribute__)
|
|
||||||
# define __attribute__(x) /*nothing*/
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(c_plusplus) || defined(__cplusplus)
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
typedef void (*TIFFErrorHandler)(const char*, const char*, va_list);
|
|
||||||
typedef void (*TIFFErrorHandlerExt)(thandle_t, const char*, const char*, va_list);
|
|
||||||
typedef tsize_t (*TIFFReadWriteProc)(thandle_t, tdata_t, tsize_t);
|
|
||||||
typedef toff_t (*TIFFSeekProc)(thandle_t, toff_t, int);
|
|
||||||
typedef int (*TIFFCloseProc)(thandle_t);
|
|
||||||
typedef toff_t (*TIFFSizeProc)(thandle_t);
|
|
||||||
typedef int (*TIFFMapFileProc)(thandle_t, tdata_t*, toff_t*);
|
|
||||||
typedef void (*TIFFUnmapFileProc)(thandle_t, tdata_t, toff_t);
|
|
||||||
typedef void (*TIFFExtendProc)(TIFF*);
|
|
||||||
|
|
||||||
extern const char* TIFFGetVersion(void);
|
|
||||||
|
|
||||||
extern const TIFFCodec* TIFFFindCODEC(uint16);
|
|
||||||
extern TIFFCodec* TIFFRegisterCODEC(uint16, const char*, TIFFInitMethod);
|
|
||||||
extern void TIFFUnRegisterCODEC(TIFFCodec*);
|
|
||||||
extern int TIFFIsCODECConfigured(uint16);
|
|
||||||
extern TIFFCodec* TIFFGetConfiguredCODECs(void);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Auxiliary functions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern tdata_t _TIFFmalloc(tsize_t);
|
|
||||||
extern tdata_t _TIFFrealloc(tdata_t, tsize_t);
|
|
||||||
extern void _TIFFmemset(tdata_t, int, tsize_t);
|
|
||||||
extern void _TIFFmemcpy(tdata_t, const tdata_t, tsize_t);
|
|
||||||
extern int _TIFFmemcmp(const tdata_t, const tdata_t, tsize_t);
|
|
||||||
extern void _TIFFfree(tdata_t);
|
|
||||||
|
|
||||||
/*
|
|
||||||
** Stuff, related to tag handling and creating custom tags.
|
|
||||||
*/
|
|
||||||
extern int TIFFGetTagListCount( TIFF * );
|
|
||||||
extern ttag_t TIFFGetTagListEntry( TIFF *, int tag_index );
|
|
||||||
|
|
||||||
#define TIFF_ANY TIFF_NOTYPE /* for field descriptor searching */
|
|
||||||
#define TIFF_VARIABLE -1 /* marker for variable length tags */
|
|
||||||
#define TIFF_SPP -2 /* marker for SamplesPerPixel tags */
|
|
||||||
#define TIFF_VARIABLE2 -3 /* marker for uint32 var-length tags */
|
|
||||||
|
|
||||||
#define FIELD_CUSTOM 65
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
ttag_t field_tag; /* field's tag */
|
|
||||||
short field_readcount; /* read count/TIFF_VARIABLE/TIFF_SPP */
|
|
||||||
short field_writecount; /* write count/TIFF_VARIABLE */
|
|
||||||
TIFFDataType field_type; /* type of associated data */
|
|
||||||
unsigned short field_bit; /* bit in fieldsset bit vector */
|
|
||||||
unsigned char field_oktochange; /* if true, can change while writing */
|
|
||||||
unsigned char field_passcount; /* if true, pass dir count on set */
|
|
||||||
char *field_name; /* ASCII name */
|
|
||||||
} TIFFFieldInfo;
|
|
||||||
|
|
||||||
typedef struct _TIFFTagValue {
|
|
||||||
const TIFFFieldInfo *info;
|
|
||||||
int count;
|
|
||||||
void *value;
|
|
||||||
} TIFFTagValue;
|
|
||||||
|
|
||||||
extern void TIFFMergeFieldInfo(TIFF*, const TIFFFieldInfo[], int);
|
|
||||||
extern const TIFFFieldInfo* TIFFFindFieldInfo(TIFF*, ttag_t, TIFFDataType);
|
|
||||||
extern const TIFFFieldInfo* TIFFFindFieldInfoByName(TIFF* , const char *,
|
|
||||||
TIFFDataType);
|
|
||||||
extern const TIFFFieldInfo* TIFFFieldWithTag(TIFF*, ttag_t);
|
|
||||||
extern const TIFFFieldInfo* TIFFFieldWithName(TIFF*, const char *);
|
|
||||||
|
|
||||||
typedef int (*TIFFVSetMethod)(TIFF*, ttag_t, va_list);
|
|
||||||
typedef int (*TIFFVGetMethod)(TIFF*, ttag_t, va_list);
|
|
||||||
typedef void (*TIFFPrintMethod)(TIFF*, FILE*, long);
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
TIFFVSetMethod vsetfield; /* tag set routine */
|
|
||||||
TIFFVGetMethod vgetfield; /* tag get routine */
|
|
||||||
TIFFPrintMethod printdir; /* directory print routine */
|
|
||||||
} TIFFTagMethods;
|
|
||||||
|
|
||||||
extern TIFFTagMethods *TIFFAccessTagMethods( TIFF * );
|
|
||||||
extern void *TIFFGetClientInfo( TIFF *, const char * );
|
|
||||||
extern void TIFFSetClientInfo( TIFF *, void *, const char * );
|
|
||||||
|
|
||||||
extern void TIFFCleanup(TIFF*);
|
|
||||||
extern void TIFFClose(TIFF*);
|
|
||||||
extern int TIFFFlush(TIFF*);
|
|
||||||
extern int TIFFFlushData(TIFF*);
|
|
||||||
extern int TIFFGetField(TIFF*, ttag_t, ...);
|
|
||||||
extern int TIFFVGetField(TIFF*, ttag_t, va_list);
|
|
||||||
extern int TIFFGetFieldDefaulted(TIFF*, ttag_t, ...);
|
|
||||||
extern int TIFFVGetFieldDefaulted(TIFF*, ttag_t, va_list);
|
|
||||||
extern int TIFFReadDirectory(TIFF*);
|
|
||||||
extern int TIFFReadCustomDirectory(TIFF*, toff_t, const TIFFFieldInfo[],
|
|
||||||
size_t);
|
|
||||||
extern int TIFFReadEXIFDirectory(TIFF*, toff_t);
|
|
||||||
extern tsize_t TIFFScanlineSize(TIFF*);
|
|
||||||
extern tsize_t TIFFOldScanlineSize(TIFF*);
|
|
||||||
extern tsize_t TIFFNewScanlineSize(TIFF*);
|
|
||||||
extern tsize_t TIFFRasterScanlineSize(TIFF*);
|
|
||||||
extern tsize_t TIFFStripSize(TIFF*);
|
|
||||||
extern tsize_t TIFFRawStripSize(TIFF*, tstrip_t);
|
|
||||||
extern tsize_t TIFFVStripSize(TIFF*, uint32);
|
|
||||||
extern tsize_t TIFFTileRowSize(TIFF*);
|
|
||||||
extern tsize_t TIFFTileSize(TIFF*);
|
|
||||||
extern tsize_t TIFFVTileSize(TIFF*, uint32);
|
|
||||||
extern uint32 TIFFDefaultStripSize(TIFF*, uint32);
|
|
||||||
extern void TIFFDefaultTileSize(TIFF*, uint32*, uint32*);
|
|
||||||
extern int TIFFFileno(TIFF*);
|
|
||||||
extern int TIFFSetFileno(TIFF*, int);
|
|
||||||
extern thandle_t TIFFClientdata(TIFF*);
|
|
||||||
extern thandle_t TIFFSetClientdata(TIFF*, thandle_t);
|
|
||||||
extern int TIFFGetMode(TIFF*);
|
|
||||||
extern int TIFFSetMode(TIFF*, int);
|
|
||||||
extern int TIFFIsTiled(TIFF*);
|
|
||||||
extern int TIFFIsByteSwapped(TIFF*);
|
|
||||||
extern int TIFFIsUpSampled(TIFF*);
|
|
||||||
extern int TIFFIsMSB2LSB(TIFF*);
|
|
||||||
extern int TIFFIsBigEndian(TIFF*);
|
|
||||||
extern TIFFReadWriteProc TIFFGetReadProc(TIFF*);
|
|
||||||
extern TIFFReadWriteProc TIFFGetWriteProc(TIFF*);
|
|
||||||
extern TIFFSeekProc TIFFGetSeekProc(TIFF*);
|
|
||||||
extern TIFFCloseProc TIFFGetCloseProc(TIFF*);
|
|
||||||
extern TIFFSizeProc TIFFGetSizeProc(TIFF*);
|
|
||||||
extern TIFFMapFileProc TIFFGetMapFileProc(TIFF*);
|
|
||||||
extern TIFFUnmapFileProc TIFFGetUnmapFileProc(TIFF*);
|
|
||||||
extern uint32 TIFFCurrentRow(TIFF*);
|
|
||||||
extern tdir_t TIFFCurrentDirectory(TIFF*);
|
|
||||||
extern tdir_t TIFFNumberOfDirectories(TIFF*);
|
|
||||||
extern uint32 TIFFCurrentDirOffset(TIFF*);
|
|
||||||
extern tstrip_t TIFFCurrentStrip(TIFF*);
|
|
||||||
extern ttile_t TIFFCurrentTile(TIFF*);
|
|
||||||
extern int TIFFReadBufferSetup(TIFF*, tdata_t, tsize_t);
|
|
||||||
extern int TIFFWriteBufferSetup(TIFF*, tdata_t, tsize_t);
|
|
||||||
extern int TIFFSetupStrips(TIFF *);
|
|
||||||
extern int TIFFWriteCheck(TIFF*, int, const char *);
|
|
||||||
extern void TIFFFreeDirectory(TIFF*);
|
|
||||||
extern int TIFFCreateDirectory(TIFF*);
|
|
||||||
extern int TIFFLastDirectory(TIFF*);
|
|
||||||
extern int TIFFSetDirectory(TIFF*, tdir_t);
|
|
||||||
extern int TIFFSetSubDirectory(TIFF*, uint32);
|
|
||||||
extern int TIFFUnlinkDirectory(TIFF*, tdir_t);
|
|
||||||
extern int TIFFSetField(TIFF*, ttag_t, ...);
|
|
||||||
extern int TIFFVSetField(TIFF*, ttag_t, va_list);
|
|
||||||
extern int TIFFWriteDirectory(TIFF *);
|
|
||||||
extern int TIFFCheckpointDirectory(TIFF *);
|
|
||||||
extern int TIFFRewriteDirectory(TIFF *);
|
|
||||||
extern int TIFFReassignTagToIgnore(enum TIFFIgnoreSense, int);
|
|
||||||
|
|
||||||
#if defined(c_plusplus) || defined(__cplusplus)
|
|
||||||
extern void TIFFPrintDirectory(TIFF*, FILE*, long = 0);
|
|
||||||
extern int TIFFReadScanline(TIFF*, tdata_t, uint32, tsample_t = 0);
|
|
||||||
extern int TIFFWriteScanline(TIFF*, tdata_t, uint32, tsample_t = 0);
|
|
||||||
extern int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int = 0);
|
|
||||||
extern int TIFFReadRGBAImageOriented(TIFF*, uint32, uint32, uint32*,
|
|
||||||
int = ORIENTATION_BOTLEFT, int = 0);
|
|
||||||
#else
|
|
||||||
extern void TIFFPrintDirectory(TIFF*, FILE*, long);
|
|
||||||
extern int TIFFReadScanline(TIFF*, tdata_t, uint32, tsample_t);
|
|
||||||
extern int TIFFWriteScanline(TIFF*, tdata_t, uint32, tsample_t);
|
|
||||||
extern int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int);
|
|
||||||
extern int TIFFReadRGBAImageOriented(TIFF*, uint32, uint32, uint32*, int, int);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern int TIFFReadRGBAStrip(TIFF*, tstrip_t, uint32 * );
|
|
||||||
extern int TIFFReadRGBATile(TIFF*, uint32, uint32, uint32 * );
|
|
||||||
extern int TIFFRGBAImageOK(TIFF*, char [1024]);
|
|
||||||
extern int TIFFRGBAImageBegin(TIFFRGBAImage*, TIFF*, int, char [1024]);
|
|
||||||
extern int TIFFRGBAImageGet(TIFFRGBAImage*, uint32*, uint32, uint32);
|
|
||||||
extern void TIFFRGBAImageEnd(TIFFRGBAImage*);
|
|
||||||
extern TIFF* TIFFOpen(const char*, const char*);
|
|
||||||
# ifdef __WIN32__
|
|
||||||
extern TIFF* TIFFOpenW(const wchar_t*, const char*);
|
|
||||||
# endif /* __WIN32__ */
|
|
||||||
extern TIFF* TIFFFdOpen(int, const char*, const char*);
|
|
||||||
extern TIFF* TIFFClientOpen(const char*, const char*,
|
|
||||||
thandle_t,
|
|
||||||
TIFFReadWriteProc, TIFFReadWriteProc,
|
|
||||||
TIFFSeekProc, TIFFCloseProc,
|
|
||||||
TIFFSizeProc,
|
|
||||||
TIFFMapFileProc, TIFFUnmapFileProc);
|
|
||||||
extern const char* TIFFFileName(TIFF*);
|
|
||||||
extern const char* TIFFSetFileName(TIFF*, const char *);
|
|
||||||
extern void TIFFError(const char*, const char*, ...) __attribute__((format (printf,2,3)));
|
|
||||||
extern void TIFFErrorExt(thandle_t, const char*, const char*, ...) __attribute__((format (printf,3,4)));
|
|
||||||
extern void TIFFWarning(const char*, const char*, ...) __attribute__((format (printf,2,3)));
|
|
||||||
extern void TIFFWarningExt(thandle_t, const char*, const char*, ...) __attribute__((format (printf,3,4)));
|
|
||||||
extern TIFFErrorHandler TIFFSetErrorHandler(TIFFErrorHandler);
|
|
||||||
extern TIFFErrorHandlerExt TIFFSetErrorHandlerExt(TIFFErrorHandlerExt);
|
|
||||||
extern TIFFErrorHandler TIFFSetWarningHandler(TIFFErrorHandler);
|
|
||||||
extern TIFFErrorHandlerExt TIFFSetWarningHandlerExt(TIFFErrorHandlerExt);
|
|
||||||
extern TIFFExtendProc TIFFSetTagExtender(TIFFExtendProc);
|
|
||||||
extern ttile_t TIFFComputeTile(TIFF*, uint32, uint32, uint32, tsample_t);
|
|
||||||
extern int TIFFCheckTile(TIFF*, uint32, uint32, uint32, tsample_t);
|
|
||||||
extern ttile_t TIFFNumberOfTiles(TIFF*);
|
|
||||||
extern tsize_t TIFFReadTile(TIFF*,
|
|
||||||
tdata_t, uint32, uint32, uint32, tsample_t);
|
|
||||||
extern tsize_t TIFFWriteTile(TIFF*,
|
|
||||||
tdata_t, uint32, uint32, uint32, tsample_t);
|
|
||||||
extern tstrip_t TIFFComputeStrip(TIFF*, uint32, tsample_t);
|
|
||||||
extern tstrip_t TIFFNumberOfStrips(TIFF*);
|
|
||||||
extern tsize_t TIFFReadEncodedStrip(TIFF*, tstrip_t, tdata_t, tsize_t);
|
|
||||||
extern tsize_t TIFFReadRawStrip(TIFF*, tstrip_t, tdata_t, tsize_t);
|
|
||||||
extern tsize_t TIFFReadEncodedTile(TIFF*, ttile_t, tdata_t, tsize_t);
|
|
||||||
extern tsize_t TIFFReadRawTile(TIFF*, ttile_t, tdata_t, tsize_t);
|
|
||||||
extern tsize_t TIFFWriteEncodedStrip(TIFF*, tstrip_t, tdata_t, tsize_t);
|
|
||||||
extern tsize_t TIFFWriteRawStrip(TIFF*, tstrip_t, tdata_t, tsize_t);
|
|
||||||
extern tsize_t TIFFWriteEncodedTile(TIFF*, ttile_t, tdata_t, tsize_t);
|
|
||||||
extern tsize_t TIFFWriteRawTile(TIFF*, ttile_t, tdata_t, tsize_t);
|
|
||||||
extern int TIFFDataWidth(TIFFDataType); /* table of tag datatype widths */
|
|
||||||
extern void TIFFSetWriteOffset(TIFF*, toff_t);
|
|
||||||
extern void TIFFSwabShort(uint16*);
|
|
||||||
extern void TIFFSwabLong(uint32*);
|
|
||||||
extern void TIFFSwabDouble(double*);
|
|
||||||
extern void TIFFSwabArrayOfShort(uint16*, unsigned long);
|
|
||||||
extern void TIFFSwabArrayOfTriples(uint8*, unsigned long);
|
|
||||||
extern void TIFFSwabArrayOfLong(uint32*, unsigned long);
|
|
||||||
extern void TIFFSwabArrayOfDouble(double*, unsigned long);
|
|
||||||
extern void TIFFReverseBits(unsigned char *, unsigned long);
|
|
||||||
extern const unsigned char* TIFFGetBitRevTable(int);
|
|
||||||
|
|
||||||
#ifdef LOGLUV_PUBLIC
|
|
||||||
#define U_NEU 0.210526316
|
|
||||||
#define V_NEU 0.473684211
|
|
||||||
#define UVSCALE 410.
|
|
||||||
extern double LogL16toY(int);
|
|
||||||
extern double LogL10toY(int);
|
|
||||||
extern void XYZtoRGB24(float*, uint8*);
|
|
||||||
extern int uv_decode(double*, double*, int);
|
|
||||||
extern void LogLuv24toXYZ(uint32, float*);
|
|
||||||
extern void LogLuv32toXYZ(uint32, float*);
|
|
||||||
#if defined(c_plusplus) || defined(__cplusplus)
|
|
||||||
extern int LogL16fromY(double, int = SGILOGENCODE_NODITHER);
|
|
||||||
extern int LogL10fromY(double, int = SGILOGENCODE_NODITHER);
|
|
||||||
extern int uv_encode(double, double, int = SGILOGENCODE_NODITHER);
|
|
||||||
extern uint32 LogLuv24fromXYZ(float*, int = SGILOGENCODE_NODITHER);
|
|
||||||
extern uint32 LogLuv32fromXYZ(float*, int = SGILOGENCODE_NODITHER);
|
|
||||||
#else
|
|
||||||
extern int LogL16fromY(double, int);
|
|
||||||
extern int LogL10fromY(double, int);
|
|
||||||
extern int uv_encode(double, double, int);
|
|
||||||
extern uint32 LogLuv24fromXYZ(float*, int);
|
|
||||||
extern uint32 LogLuv32fromXYZ(float*, int);
|
|
||||||
#endif
|
|
||||||
#endif /* LOGLUV_PUBLIC */
|
|
||||||
|
|
||||||
extern int TIFFCIELabToRGBInit(TIFFCIELabToRGB*, TIFFDisplay *, float*);
|
|
||||||
extern void TIFFCIELabToXYZ(TIFFCIELabToRGB *, uint32, int32, int32,
|
|
||||||
float *, float *, float *);
|
|
||||||
extern void TIFFXYZToRGB(TIFFCIELabToRGB *, float, float, float,
|
|
||||||
uint32 *, uint32 *, uint32 *);
|
|
||||||
|
|
||||||
extern int TIFFYCbCrToRGBInit(TIFFYCbCrToRGB*, float*, float*);
|
|
||||||
extern void TIFFYCbCrtoRGB(TIFFYCbCrToRGB *, uint32, int32, int32,
|
|
||||||
uint32 *, uint32 *, uint32 *);
|
|
||||||
|
|
||||||
#if defined(c_plusplus) || defined(__cplusplus)
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _TIFFIO_ */
|
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
#define TIFFLIB_VERSION_STR "LIBTIFF, Version 3.9.4\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 20100615
|
|
||||||
@@ -1,69 +0,0 @@
|
|||||||
SubDir HAIKU_TOP src libs tiff ;
|
|
||||||
|
|
||||||
SubDirHdrs [ FDirName $(SUBDIR) $(DOTDOT) shared ] ;
|
|
||||||
|
|
||||||
local shared_files =
|
|
||||||
# libtiff
|
|
||||||
tif_aux.c
|
|
||||||
tif_close.c
|
|
||||||
tif_codec.c
|
|
||||||
tif_color.c
|
|
||||||
tif_compress.c
|
|
||||||
tif_dir.c
|
|
||||||
tif_dirinfo.c
|
|
||||||
tif_dirread.c
|
|
||||||
tif_dirwrite.c
|
|
||||||
tif_dumpmode.c
|
|
||||||
tif_error.c
|
|
||||||
tif_extension.c
|
|
||||||
tif_fax3.c
|
|
||||||
tif_fax3sm.c
|
|
||||||
tif_flush.c
|
|
||||||
tif_getimage.c
|
|
||||||
tif_jpeg.c
|
|
||||||
tif_luv.c
|
|
||||||
tif_lzw.c
|
|
||||||
tif_next.c
|
|
||||||
tif_ojpeg.c
|
|
||||||
tif_open.c
|
|
||||||
tif_packbits.c
|
|
||||||
tif_pixarlog.c
|
|
||||||
tif_predict.c
|
|
||||||
tif_print.c
|
|
||||||
tif_read.c
|
|
||||||
tif_strip.c
|
|
||||||
tif_swab.c
|
|
||||||
tif_thunder.c
|
|
||||||
tif_tile.c
|
|
||||||
tif_unix.c
|
|
||||||
tif_version.c
|
|
||||||
tif_warning.c
|
|
||||||
tif_write.c
|
|
||||||
tif_zip.c
|
|
||||||
;
|
|
||||||
|
|
||||||
local architectureObject ;
|
|
||||||
for architectureObject in [ MultiArchSubDirSetup ] {
|
|
||||||
on $(architectureObject) {
|
|
||||||
UseLibraryHeaders tiff ;
|
|
||||||
UseBuildFeatureHeaders jpeg ;
|
|
||||||
UseBuildFeatureHeaders zlib ;
|
|
||||||
|
|
||||||
Includes [ FGristFiles tif_jpeg.c tif_ojpeg.c ]
|
|
||||||
: [ BuildFeatureAttribute jpeg : headers ] ;
|
|
||||||
Includes [ FGristFiles tif_pixarlog.c tif_zip.c ]
|
|
||||||
: [ BuildFeatureAttribute zlib : headers ] ;
|
|
||||||
|
|
||||||
Objects $(shared_files) ;
|
|
||||||
|
|
||||||
SharedLibrary [ MultiArchDefaultGristFiles libtiff.so ]
|
|
||||||
: [ FGristFiles $(shared_files:S=.o) ]
|
|
||||||
:
|
|
||||||
[ BuildFeatureAttribute jpeg : library ]
|
|
||||||
[ BuildFeatureAttribute zlib : library ]
|
|
||||||
: 3.8 ;
|
|
||||||
|
|
||||||
StaticLibrary [ MultiArchDefaultGristFiles libtiff.a ]
|
|
||||||
: [ FGristFiles $(shared_files:S=.o) ] ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,451 +0,0 @@
|
|||||||
/* "$Id: mkg3states.c,v 1.10.2.1 2010-06-08 18:50:41 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 1991-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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Initialise fax decoder tables
|
|
||||||
* Decoder support is derived, with permission, from the code
|
|
||||||
* in Frank Cringle's viewfax program;
|
|
||||||
* Copyright (C) 1990, 1995 Frank D. Cringle.
|
|
||||||
*/
|
|
||||||
#include "tif_config.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#ifdef HAVE_UNISTD_H
|
|
||||||
# include <unistd.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "tif_fax3.h"
|
|
||||||
|
|
||||||
#ifndef HAVE_GETOPT
|
|
||||||
extern int getopt(int, char**, char*);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define streq(a,b) (strcmp(a,b) == 0)
|
|
||||||
|
|
||||||
/* NB: can't use names in tif_fax3.h 'cuz they are declared const */
|
|
||||||
TIFFFaxTabEnt MainTable[128];
|
|
||||||
TIFFFaxTabEnt WhiteTable[4096];
|
|
||||||
TIFFFaxTabEnt BlackTable[8192];
|
|
||||||
|
|
||||||
struct proto {
|
|
||||||
uint16 code; /* right justified, lsb-first, zero filled */
|
|
||||||
uint16 val; /* (pixel count)<<4 + code width */
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct proto Pass[] = {
|
|
||||||
{ 0x0008, 4 },
|
|
||||||
{ 0, 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct proto Horiz[] = {
|
|
||||||
{ 0x0004, 3 },
|
|
||||||
{ 0, 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct proto V0[] = {
|
|
||||||
{ 0x0001, 1 },
|
|
||||||
{ 0, 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct proto VR[] = {
|
|
||||||
{ 0x0006, (1<<4)+3 },
|
|
||||||
{ 0x0030, (2<<4)+6 },
|
|
||||||
{ 0x0060, (3<<4)+7 },
|
|
||||||
{ 0, 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct proto VL[] = {
|
|
||||||
{ 0x0002, (1<<4)+3 },
|
|
||||||
{ 0x0010, (2<<4)+6 },
|
|
||||||
{ 0x0020, (3<<4)+7 },
|
|
||||||
{ 0, 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct proto Ext[] = {
|
|
||||||
{ 0x0040, 7 },
|
|
||||||
{ 0, 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct proto EOLV[] = {
|
|
||||||
{ 0x0000, 7 },
|
|
||||||
{ 0, 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct proto MakeUpW[] = {
|
|
||||||
{ 0x001b, 1029 },
|
|
||||||
{ 0x0009, 2053 },
|
|
||||||
{ 0x003a, 3078 },
|
|
||||||
{ 0x0076, 4103 },
|
|
||||||
{ 0x006c, 5128 },
|
|
||||||
{ 0x00ec, 6152 },
|
|
||||||
{ 0x0026, 7176 },
|
|
||||||
{ 0x00a6, 8200 },
|
|
||||||
{ 0x0016, 9224 },
|
|
||||||
{ 0x00e6, 10248 },
|
|
||||||
{ 0x0066, 11273 },
|
|
||||||
{ 0x0166, 12297 },
|
|
||||||
{ 0x0096, 13321 },
|
|
||||||
{ 0x0196, 14345 },
|
|
||||||
{ 0x0056, 15369 },
|
|
||||||
{ 0x0156, 16393 },
|
|
||||||
{ 0x00d6, 17417 },
|
|
||||||
{ 0x01d6, 18441 },
|
|
||||||
{ 0x0036, 19465 },
|
|
||||||
{ 0x0136, 20489 },
|
|
||||||
{ 0x00b6, 21513 },
|
|
||||||
{ 0x01b6, 22537 },
|
|
||||||
{ 0x0032, 23561 },
|
|
||||||
{ 0x0132, 24585 },
|
|
||||||
{ 0x00b2, 25609 },
|
|
||||||
{ 0x0006, 26630 },
|
|
||||||
{ 0x01b2, 27657 },
|
|
||||||
{ 0, 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct proto MakeUpB[] = {
|
|
||||||
{ 0x03c0, 1034 },
|
|
||||||
{ 0x0130, 2060 },
|
|
||||||
{ 0x0930, 3084 },
|
|
||||||
{ 0x0da0, 4108 },
|
|
||||||
{ 0x0cc0, 5132 },
|
|
||||||
{ 0x02c0, 6156 },
|
|
||||||
{ 0x0ac0, 7180 },
|
|
||||||
{ 0x06c0, 8205 },
|
|
||||||
{ 0x16c0, 9229 },
|
|
||||||
{ 0x0a40, 10253 },
|
|
||||||
{ 0x1a40, 11277 },
|
|
||||||
{ 0x0640, 12301 },
|
|
||||||
{ 0x1640, 13325 },
|
|
||||||
{ 0x09c0, 14349 },
|
|
||||||
{ 0x19c0, 15373 },
|
|
||||||
{ 0x05c0, 16397 },
|
|
||||||
{ 0x15c0, 17421 },
|
|
||||||
{ 0x0dc0, 18445 },
|
|
||||||
{ 0x1dc0, 19469 },
|
|
||||||
{ 0x0940, 20493 },
|
|
||||||
{ 0x1940, 21517 },
|
|
||||||
{ 0x0540, 22541 },
|
|
||||||
{ 0x1540, 23565 },
|
|
||||||
{ 0x0b40, 24589 },
|
|
||||||
{ 0x1b40, 25613 },
|
|
||||||
{ 0x04c0, 26637 },
|
|
||||||
{ 0x14c0, 27661 },
|
|
||||||
{ 0, 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct proto MakeUp[] = {
|
|
||||||
{ 0x0080, 28683 },
|
|
||||||
{ 0x0180, 29707 },
|
|
||||||
{ 0x0580, 30731 },
|
|
||||||
{ 0x0480, 31756 },
|
|
||||||
{ 0x0c80, 32780 },
|
|
||||||
{ 0x0280, 33804 },
|
|
||||||
{ 0x0a80, 34828 },
|
|
||||||
{ 0x0680, 35852 },
|
|
||||||
{ 0x0e80, 36876 },
|
|
||||||
{ 0x0380, 37900 },
|
|
||||||
{ 0x0b80, 38924 },
|
|
||||||
{ 0x0780, 39948 },
|
|
||||||
{ 0x0f80, 40972 },
|
|
||||||
{ 0, 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct proto TermW[] = {
|
|
||||||
{ 0x00ac, 8 },
|
|
||||||
{ 0x0038, 22 },
|
|
||||||
{ 0x000e, 36 },
|
|
||||||
{ 0x0001, 52 },
|
|
||||||
{ 0x000d, 68 },
|
|
||||||
{ 0x0003, 84 },
|
|
||||||
{ 0x0007, 100 },
|
|
||||||
{ 0x000f, 116 },
|
|
||||||
{ 0x0019, 133 },
|
|
||||||
{ 0x0005, 149 },
|
|
||||||
{ 0x001c, 165 },
|
|
||||||
{ 0x0002, 181 },
|
|
||||||
{ 0x0004, 198 },
|
|
||||||
{ 0x0030, 214 },
|
|
||||||
{ 0x000b, 230 },
|
|
||||||
{ 0x002b, 246 },
|
|
||||||
{ 0x0015, 262 },
|
|
||||||
{ 0x0035, 278 },
|
|
||||||
{ 0x0072, 295 },
|
|
||||||
{ 0x0018, 311 },
|
|
||||||
{ 0x0008, 327 },
|
|
||||||
{ 0x0074, 343 },
|
|
||||||
{ 0x0060, 359 },
|
|
||||||
{ 0x0010, 375 },
|
|
||||||
{ 0x000a, 391 },
|
|
||||||
{ 0x006a, 407 },
|
|
||||||
{ 0x0064, 423 },
|
|
||||||
{ 0x0012, 439 },
|
|
||||||
{ 0x000c, 455 },
|
|
||||||
{ 0x0040, 472 },
|
|
||||||
{ 0x00c0, 488 },
|
|
||||||
{ 0x0058, 504 },
|
|
||||||
{ 0x00d8, 520 },
|
|
||||||
{ 0x0048, 536 },
|
|
||||||
{ 0x00c8, 552 },
|
|
||||||
{ 0x0028, 568 },
|
|
||||||
{ 0x00a8, 584 },
|
|
||||||
{ 0x0068, 600 },
|
|
||||||
{ 0x00e8, 616 },
|
|
||||||
{ 0x0014, 632 },
|
|
||||||
{ 0x0094, 648 },
|
|
||||||
{ 0x0054, 664 },
|
|
||||||
{ 0x00d4, 680 },
|
|
||||||
{ 0x0034, 696 },
|
|
||||||
{ 0x00b4, 712 },
|
|
||||||
{ 0x0020, 728 },
|
|
||||||
{ 0x00a0, 744 },
|
|
||||||
{ 0x0050, 760 },
|
|
||||||
{ 0x00d0, 776 },
|
|
||||||
{ 0x004a, 792 },
|
|
||||||
{ 0x00ca, 808 },
|
|
||||||
{ 0x002a, 824 },
|
|
||||||
{ 0x00aa, 840 },
|
|
||||||
{ 0x0024, 856 },
|
|
||||||
{ 0x00a4, 872 },
|
|
||||||
{ 0x001a, 888 },
|
|
||||||
{ 0x009a, 904 },
|
|
||||||
{ 0x005a, 920 },
|
|
||||||
{ 0x00da, 936 },
|
|
||||||
{ 0x0052, 952 },
|
|
||||||
{ 0x00d2, 968 },
|
|
||||||
{ 0x004c, 984 },
|
|
||||||
{ 0x00cc, 1000 },
|
|
||||||
{ 0x002c, 1016 },
|
|
||||||
{ 0, 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct proto TermB[] = {
|
|
||||||
{ 0x03b0, 10 },
|
|
||||||
{ 0x0002, 19 },
|
|
||||||
{ 0x0003, 34 },
|
|
||||||
{ 0x0001, 50 },
|
|
||||||
{ 0x0006, 67 },
|
|
||||||
{ 0x000c, 84 },
|
|
||||||
{ 0x0004, 100 },
|
|
||||||
{ 0x0018, 117 },
|
|
||||||
{ 0x0028, 134 },
|
|
||||||
{ 0x0008, 150 },
|
|
||||||
{ 0x0010, 167 },
|
|
||||||
{ 0x0050, 183 },
|
|
||||||
{ 0x0070, 199 },
|
|
||||||
{ 0x0020, 216 },
|
|
||||||
{ 0x00e0, 232 },
|
|
||||||
{ 0x0030, 249 },
|
|
||||||
{ 0x03a0, 266 },
|
|
||||||
{ 0x0060, 282 },
|
|
||||||
{ 0x0040, 298 },
|
|
||||||
{ 0x0730, 315 },
|
|
||||||
{ 0x00b0, 331 },
|
|
||||||
{ 0x01b0, 347 },
|
|
||||||
{ 0x0760, 363 },
|
|
||||||
{ 0x00a0, 379 },
|
|
||||||
{ 0x0740, 395 },
|
|
||||||
{ 0x00c0, 411 },
|
|
||||||
{ 0x0530, 428 },
|
|
||||||
{ 0x0d30, 444 },
|
|
||||||
{ 0x0330, 460 },
|
|
||||||
{ 0x0b30, 476 },
|
|
||||||
{ 0x0160, 492 },
|
|
||||||
{ 0x0960, 508 },
|
|
||||||
{ 0x0560, 524 },
|
|
||||||
{ 0x0d60, 540 },
|
|
||||||
{ 0x04b0, 556 },
|
|
||||||
{ 0x0cb0, 572 },
|
|
||||||
{ 0x02b0, 588 },
|
|
||||||
{ 0x0ab0, 604 },
|
|
||||||
{ 0x06b0, 620 },
|
|
||||||
{ 0x0eb0, 636 },
|
|
||||||
{ 0x0360, 652 },
|
|
||||||
{ 0x0b60, 668 },
|
|
||||||
{ 0x05b0, 684 },
|
|
||||||
{ 0x0db0, 700 },
|
|
||||||
{ 0x02a0, 716 },
|
|
||||||
{ 0x0aa0, 732 },
|
|
||||||
{ 0x06a0, 748 },
|
|
||||||
{ 0x0ea0, 764 },
|
|
||||||
{ 0x0260, 780 },
|
|
||||||
{ 0x0a60, 796 },
|
|
||||||
{ 0x04a0, 812 },
|
|
||||||
{ 0x0ca0, 828 },
|
|
||||||
{ 0x0240, 844 },
|
|
||||||
{ 0x0ec0, 860 },
|
|
||||||
{ 0x01c0, 876 },
|
|
||||||
{ 0x0e40, 892 },
|
|
||||||
{ 0x0140, 908 },
|
|
||||||
{ 0x01a0, 924 },
|
|
||||||
{ 0x09a0, 940 },
|
|
||||||
{ 0x0d40, 956 },
|
|
||||||
{ 0x0340, 972 },
|
|
||||||
{ 0x05a0, 988 },
|
|
||||||
{ 0x0660, 1004 },
|
|
||||||
{ 0x0e60, 1020 },
|
|
||||||
{ 0, 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct proto EOLH[] = {
|
|
||||||
{ 0x0000, 11 },
|
|
||||||
{ 0, 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
static void
|
|
||||||
FillTable(TIFFFaxTabEnt *T, int Size, struct proto *P, int State)
|
|
||||||
{
|
|
||||||
int limit = 1 << Size;
|
|
||||||
|
|
||||||
while (P->val) {
|
|
||||||
int width = P->val & 15;
|
|
||||||
int param = P->val >> 4;
|
|
||||||
int incr = 1 << width;
|
|
||||||
int code;
|
|
||||||
for (code = P->code; code < limit; code += incr) {
|
|
||||||
TIFFFaxTabEnt *E = T+code;
|
|
||||||
E->State = State;
|
|
||||||
E->Width = width;
|
|
||||||
E->Param = param;
|
|
||||||
}
|
|
||||||
P++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static char* storage_class = "";
|
|
||||||
static char* const_class = "";
|
|
||||||
static int packoutput = 1;
|
|
||||||
static char* prebrace = "";
|
|
||||||
static char* postbrace = "";
|
|
||||||
|
|
||||||
void
|
|
||||||
WriteTable(FILE* fd, const TIFFFaxTabEnt* T, int Size, const char* name)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
char* sep;
|
|
||||||
|
|
||||||
fprintf(fd, "%s %s TIFFFaxTabEnt %s[%d] = {",
|
|
||||||
storage_class, const_class, name, Size);
|
|
||||||
if (packoutput) {
|
|
||||||
sep = "\n";
|
|
||||||
for (i = 0; i < Size; i++) {
|
|
||||||
fprintf(fd, "%s%s%d,%d,%d%s",
|
|
||||||
sep, prebrace, T->State, T->Width, (int) T->Param, postbrace);
|
|
||||||
if (((i+1) % 10) == 0)
|
|
||||||
sep = ",\n";
|
|
||||||
else
|
|
||||||
sep = ",";
|
|
||||||
T++;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
sep = "\n ";
|
|
||||||
for (i = 0; i < Size; i++) {
|
|
||||||
fprintf(fd, "%s%s%3d,%3d,%4d%s",
|
|
||||||
sep, prebrace, T->State, T->Width, (int) T->Param, postbrace);
|
|
||||||
if (((i+1) % 6) == 0)
|
|
||||||
sep = ",\n ";
|
|
||||||
else
|
|
||||||
sep = ",";
|
|
||||||
T++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fprintf(fd, "\n};\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* initialise the huffman code tables */
|
|
||||||
int
|
|
||||||
main(int argc, char* argv[])
|
|
||||||
{
|
|
||||||
FILE* fd;
|
|
||||||
char* outputfile;
|
|
||||||
int c;
|
|
||||||
extern int optind;
|
|
||||||
extern char* optarg;
|
|
||||||
|
|
||||||
while ((c = getopt(argc, argv, "c:s:bp")) != -1)
|
|
||||||
switch (c) {
|
|
||||||
case 'c':
|
|
||||||
const_class = optarg;
|
|
||||||
break;
|
|
||||||
case 's':
|
|
||||||
storage_class = optarg;
|
|
||||||
break;
|
|
||||||
case 'p':
|
|
||||||
packoutput = 0;
|
|
||||||
break;
|
|
||||||
case 'b':
|
|
||||||
prebrace = "{";
|
|
||||||
postbrace = "}";
|
|
||||||
break;
|
|
||||||
case '?':
|
|
||||||
fprintf(stderr,
|
|
||||||
"usage: %s [-c const] [-s storage] [-p] [-b] file\n",
|
|
||||||
argv[0]);
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
outputfile = optind < argc ? argv[optind] : "g3states.h";
|
|
||||||
fd = fopen(outputfile, "w");
|
|
||||||
if (fd == NULL) {
|
|
||||||
fprintf(stderr, "%s: %s: Cannot create output file.\n",
|
|
||||||
argv[0], outputfile);
|
|
||||||
return (-2);
|
|
||||||
}
|
|
||||||
FillTable(MainTable, 7, Pass, S_Pass);
|
|
||||||
FillTable(MainTable, 7, Horiz, S_Horiz);
|
|
||||||
FillTable(MainTable, 7, V0, S_V0);
|
|
||||||
FillTable(MainTable, 7, VR, S_VR);
|
|
||||||
FillTable(MainTable, 7, VL, S_VL);
|
|
||||||
FillTable(MainTable, 7, Ext, S_Ext);
|
|
||||||
FillTable(MainTable, 7, EOLV, S_EOL);
|
|
||||||
FillTable(WhiteTable, 12, MakeUpW, S_MakeUpW);
|
|
||||||
FillTable(WhiteTable, 12, MakeUp, S_MakeUp);
|
|
||||||
FillTable(WhiteTable, 12, TermW, S_TermW);
|
|
||||||
FillTable(WhiteTable, 12, EOLH, S_EOL);
|
|
||||||
FillTable(BlackTable, 13, MakeUpB, S_MakeUpB);
|
|
||||||
FillTable(BlackTable, 13, MakeUp, S_MakeUp);
|
|
||||||
FillTable(BlackTable, 13, TermB, S_TermB);
|
|
||||||
FillTable(BlackTable, 13, EOLH, S_EOL);
|
|
||||||
|
|
||||||
fprintf(fd, "/* WARNING, this file was automatically generated by the\n");
|
|
||||||
fprintf(fd, " mkg3states program */\n");
|
|
||||||
fprintf(fd, "#include \"tiff.h\"\n");
|
|
||||||
fprintf(fd, "#include \"tif_fax3.h\"\n");
|
|
||||||
WriteTable(fd, MainTable, 128, "TIFFFaxMainTable");
|
|
||||||
WriteTable(fd, WhiteTable, 4096, "TIFFFaxWhiteTable");
|
|
||||||
WriteTable(fd, BlackTable, 8192, "TIFFFaxBlackTable");
|
|
||||||
fclose(fd);
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
@@ -1,292 +0,0 @@
|
|||||||
/* $Id: t4.h,v 1.1.1.1.2.1 2010-06-08 18:50:41 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _T4_
|
|
||||||
#define _T4_
|
|
||||||
/*
|
|
||||||
* CCITT T.4 1D Huffman runlength codes and
|
|
||||||
* related definitions. Given the small sizes
|
|
||||||
* of these tables it does not seem
|
|
||||||
* worthwhile to make code & length 8 bits.
|
|
||||||
*/
|
|
||||||
typedef struct tableentry {
|
|
||||||
unsigned short length; /* bit length of g3 code */
|
|
||||||
unsigned short code; /* g3 code */
|
|
||||||
short runlen; /* run length in bits */
|
|
||||||
} tableentry;
|
|
||||||
|
|
||||||
#define EOL 0x001 /* EOL code value - 0000 0000 0000 1 */
|
|
||||||
|
|
||||||
/* status values returned instead of a run length */
|
|
||||||
#define G3CODE_EOL -1 /* NB: ACT_EOL - ACT_WRUNT */
|
|
||||||
#define G3CODE_INVALID -2 /* NB: ACT_INVALID - ACT_WRUNT */
|
|
||||||
#define G3CODE_EOF -3 /* end of input data */
|
|
||||||
#define G3CODE_INCOMP -4 /* incomplete run code */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Note that these tables are ordered such that the
|
|
||||||
* index into the table is known to be either the
|
|
||||||
* run length, or (run length / 64) + a fixed offset.
|
|
||||||
*
|
|
||||||
* NB: The G3CODE_INVALID entries are only used
|
|
||||||
* during state generation (see mkg3states.c).
|
|
||||||
*/
|
|
||||||
#ifdef G3CODES
|
|
||||||
const tableentry TIFFFaxWhiteCodes[] = {
|
|
||||||
{ 8, 0x35, 0 }, /* 0011 0101 */
|
|
||||||
{ 6, 0x7, 1 }, /* 0001 11 */
|
|
||||||
{ 4, 0x7, 2 }, /* 0111 */
|
|
||||||
{ 4, 0x8, 3 }, /* 1000 */
|
|
||||||
{ 4, 0xB, 4 }, /* 1011 */
|
|
||||||
{ 4, 0xC, 5 }, /* 1100 */
|
|
||||||
{ 4, 0xE, 6 }, /* 1110 */
|
|
||||||
{ 4, 0xF, 7 }, /* 1111 */
|
|
||||||
{ 5, 0x13, 8 }, /* 1001 1 */
|
|
||||||
{ 5, 0x14, 9 }, /* 1010 0 */
|
|
||||||
{ 5, 0x7, 10 }, /* 0011 1 */
|
|
||||||
{ 5, 0x8, 11 }, /* 0100 0 */
|
|
||||||
{ 6, 0x8, 12 }, /* 0010 00 */
|
|
||||||
{ 6, 0x3, 13 }, /* 0000 11 */
|
|
||||||
{ 6, 0x34, 14 }, /* 1101 00 */
|
|
||||||
{ 6, 0x35, 15 }, /* 1101 01 */
|
|
||||||
{ 6, 0x2A, 16 }, /* 1010 10 */
|
|
||||||
{ 6, 0x2B, 17 }, /* 1010 11 */
|
|
||||||
{ 7, 0x27, 18 }, /* 0100 111 */
|
|
||||||
{ 7, 0xC, 19 }, /* 0001 100 */
|
|
||||||
{ 7, 0x8, 20 }, /* 0001 000 */
|
|
||||||
{ 7, 0x17, 21 }, /* 0010 111 */
|
|
||||||
{ 7, 0x3, 22 }, /* 0000 011 */
|
|
||||||
{ 7, 0x4, 23 }, /* 0000 100 */
|
|
||||||
{ 7, 0x28, 24 }, /* 0101 000 */
|
|
||||||
{ 7, 0x2B, 25 }, /* 0101 011 */
|
|
||||||
{ 7, 0x13, 26 }, /* 0010 011 */
|
|
||||||
{ 7, 0x24, 27 }, /* 0100 100 */
|
|
||||||
{ 7, 0x18, 28 }, /* 0011 000 */
|
|
||||||
{ 8, 0x2, 29 }, /* 0000 0010 */
|
|
||||||
{ 8, 0x3, 30 }, /* 0000 0011 */
|
|
||||||
{ 8, 0x1A, 31 }, /* 0001 1010 */
|
|
||||||
{ 8, 0x1B, 32 }, /* 0001 1011 */
|
|
||||||
{ 8, 0x12, 33 }, /* 0001 0010 */
|
|
||||||
{ 8, 0x13, 34 }, /* 0001 0011 */
|
|
||||||
{ 8, 0x14, 35 }, /* 0001 0100 */
|
|
||||||
{ 8, 0x15, 36 }, /* 0001 0101 */
|
|
||||||
{ 8, 0x16, 37 }, /* 0001 0110 */
|
|
||||||
{ 8, 0x17, 38 }, /* 0001 0111 */
|
|
||||||
{ 8, 0x28, 39 }, /* 0010 1000 */
|
|
||||||
{ 8, 0x29, 40 }, /* 0010 1001 */
|
|
||||||
{ 8, 0x2A, 41 }, /* 0010 1010 */
|
|
||||||
{ 8, 0x2B, 42 }, /* 0010 1011 */
|
|
||||||
{ 8, 0x2C, 43 }, /* 0010 1100 */
|
|
||||||
{ 8, 0x2D, 44 }, /* 0010 1101 */
|
|
||||||
{ 8, 0x4, 45 }, /* 0000 0100 */
|
|
||||||
{ 8, 0x5, 46 }, /* 0000 0101 */
|
|
||||||
{ 8, 0xA, 47 }, /* 0000 1010 */
|
|
||||||
{ 8, 0xB, 48 }, /* 0000 1011 */
|
|
||||||
{ 8, 0x52, 49 }, /* 0101 0010 */
|
|
||||||
{ 8, 0x53, 50 }, /* 0101 0011 */
|
|
||||||
{ 8, 0x54, 51 }, /* 0101 0100 */
|
|
||||||
{ 8, 0x55, 52 }, /* 0101 0101 */
|
|
||||||
{ 8, 0x24, 53 }, /* 0010 0100 */
|
|
||||||
{ 8, 0x25, 54 }, /* 0010 0101 */
|
|
||||||
{ 8, 0x58, 55 }, /* 0101 1000 */
|
|
||||||
{ 8, 0x59, 56 }, /* 0101 1001 */
|
|
||||||
{ 8, 0x5A, 57 }, /* 0101 1010 */
|
|
||||||
{ 8, 0x5B, 58 }, /* 0101 1011 */
|
|
||||||
{ 8, 0x4A, 59 }, /* 0100 1010 */
|
|
||||||
{ 8, 0x4B, 60 }, /* 0100 1011 */
|
|
||||||
{ 8, 0x32, 61 }, /* 0011 0010 */
|
|
||||||
{ 8, 0x33, 62 }, /* 0011 0011 */
|
|
||||||
{ 8, 0x34, 63 }, /* 0011 0100 */
|
|
||||||
{ 5, 0x1B, 64 }, /* 1101 1 */
|
|
||||||
{ 5, 0x12, 128 }, /* 1001 0 */
|
|
||||||
{ 6, 0x17, 192 }, /* 0101 11 */
|
|
||||||
{ 7, 0x37, 256 }, /* 0110 111 */
|
|
||||||
{ 8, 0x36, 320 }, /* 0011 0110 */
|
|
||||||
{ 8, 0x37, 384 }, /* 0011 0111 */
|
|
||||||
{ 8, 0x64, 448 }, /* 0110 0100 */
|
|
||||||
{ 8, 0x65, 512 }, /* 0110 0101 */
|
|
||||||
{ 8, 0x68, 576 }, /* 0110 1000 */
|
|
||||||
{ 8, 0x67, 640 }, /* 0110 0111 */
|
|
||||||
{ 9, 0xCC, 704 }, /* 0110 0110 0 */
|
|
||||||
{ 9, 0xCD, 768 }, /* 0110 0110 1 */
|
|
||||||
{ 9, 0xD2, 832 }, /* 0110 1001 0 */
|
|
||||||
{ 9, 0xD3, 896 }, /* 0110 1001 1 */
|
|
||||||
{ 9, 0xD4, 960 }, /* 0110 1010 0 */
|
|
||||||
{ 9, 0xD5, 1024 }, /* 0110 1010 1 */
|
|
||||||
{ 9, 0xD6, 1088 }, /* 0110 1011 0 */
|
|
||||||
{ 9, 0xD7, 1152 }, /* 0110 1011 1 */
|
|
||||||
{ 9, 0xD8, 1216 }, /* 0110 1100 0 */
|
|
||||||
{ 9, 0xD9, 1280 }, /* 0110 1100 1 */
|
|
||||||
{ 9, 0xDA, 1344 }, /* 0110 1101 0 */
|
|
||||||
{ 9, 0xDB, 1408 }, /* 0110 1101 1 */
|
|
||||||
{ 9, 0x98, 1472 }, /* 0100 1100 0 */
|
|
||||||
{ 9, 0x99, 1536 }, /* 0100 1100 1 */
|
|
||||||
{ 9, 0x9A, 1600 }, /* 0100 1101 0 */
|
|
||||||
{ 6, 0x18, 1664 }, /* 0110 00 */
|
|
||||||
{ 9, 0x9B, 1728 }, /* 0100 1101 1 */
|
|
||||||
{ 11, 0x8, 1792 }, /* 0000 0001 000 */
|
|
||||||
{ 11, 0xC, 1856 }, /* 0000 0001 100 */
|
|
||||||
{ 11, 0xD, 1920 }, /* 0000 0001 101 */
|
|
||||||
{ 12, 0x12, 1984 }, /* 0000 0001 0010 */
|
|
||||||
{ 12, 0x13, 2048 }, /* 0000 0001 0011 */
|
|
||||||
{ 12, 0x14, 2112 }, /* 0000 0001 0100 */
|
|
||||||
{ 12, 0x15, 2176 }, /* 0000 0001 0101 */
|
|
||||||
{ 12, 0x16, 2240 }, /* 0000 0001 0110 */
|
|
||||||
{ 12, 0x17, 2304 }, /* 0000 0001 0111 */
|
|
||||||
{ 12, 0x1C, 2368 }, /* 0000 0001 1100 */
|
|
||||||
{ 12, 0x1D, 2432 }, /* 0000 0001 1101 */
|
|
||||||
{ 12, 0x1E, 2496 }, /* 0000 0001 1110 */
|
|
||||||
{ 12, 0x1F, 2560 }, /* 0000 0001 1111 */
|
|
||||||
{ 12, 0x1, G3CODE_EOL }, /* 0000 0000 0001 */
|
|
||||||
{ 9, 0x1, G3CODE_INVALID }, /* 0000 0000 1 */
|
|
||||||
{ 10, 0x1, G3CODE_INVALID }, /* 0000 0000 01 */
|
|
||||||
{ 11, 0x1, G3CODE_INVALID }, /* 0000 0000 001 */
|
|
||||||
{ 12, 0x0, G3CODE_INVALID }, /* 0000 0000 0000 */
|
|
||||||
};
|
|
||||||
|
|
||||||
const tableentry TIFFFaxBlackCodes[] = {
|
|
||||||
{ 10, 0x37, 0 }, /* 0000 1101 11 */
|
|
||||||
{ 3, 0x2, 1 }, /* 010 */
|
|
||||||
{ 2, 0x3, 2 }, /* 11 */
|
|
||||||
{ 2, 0x2, 3 }, /* 10 */
|
|
||||||
{ 3, 0x3, 4 }, /* 011 */
|
|
||||||
{ 4, 0x3, 5 }, /* 0011 */
|
|
||||||
{ 4, 0x2, 6 }, /* 0010 */
|
|
||||||
{ 5, 0x3, 7 }, /* 0001 1 */
|
|
||||||
{ 6, 0x5, 8 }, /* 0001 01 */
|
|
||||||
{ 6, 0x4, 9 }, /* 0001 00 */
|
|
||||||
{ 7, 0x4, 10 }, /* 0000 100 */
|
|
||||||
{ 7, 0x5, 11 }, /* 0000 101 */
|
|
||||||
{ 7, 0x7, 12 }, /* 0000 111 */
|
|
||||||
{ 8, 0x4, 13 }, /* 0000 0100 */
|
|
||||||
{ 8, 0x7, 14 }, /* 0000 0111 */
|
|
||||||
{ 9, 0x18, 15 }, /* 0000 1100 0 */
|
|
||||||
{ 10, 0x17, 16 }, /* 0000 0101 11 */
|
|
||||||
{ 10, 0x18, 17 }, /* 0000 0110 00 */
|
|
||||||
{ 10, 0x8, 18 }, /* 0000 0010 00 */
|
|
||||||
{ 11, 0x67, 19 }, /* 0000 1100 111 */
|
|
||||||
{ 11, 0x68, 20 }, /* 0000 1101 000 */
|
|
||||||
{ 11, 0x6C, 21 }, /* 0000 1101 100 */
|
|
||||||
{ 11, 0x37, 22 }, /* 0000 0110 111 */
|
|
||||||
{ 11, 0x28, 23 }, /* 0000 0101 000 */
|
|
||||||
{ 11, 0x17, 24 }, /* 0000 0010 111 */
|
|
||||||
{ 11, 0x18, 25 }, /* 0000 0011 000 */
|
|
||||||
{ 12, 0xCA, 26 }, /* 0000 1100 1010 */
|
|
||||||
{ 12, 0xCB, 27 }, /* 0000 1100 1011 */
|
|
||||||
{ 12, 0xCC, 28 }, /* 0000 1100 1100 */
|
|
||||||
{ 12, 0xCD, 29 }, /* 0000 1100 1101 */
|
|
||||||
{ 12, 0x68, 30 }, /* 0000 0110 1000 */
|
|
||||||
{ 12, 0x69, 31 }, /* 0000 0110 1001 */
|
|
||||||
{ 12, 0x6A, 32 }, /* 0000 0110 1010 */
|
|
||||||
{ 12, 0x6B, 33 }, /* 0000 0110 1011 */
|
|
||||||
{ 12, 0xD2, 34 }, /* 0000 1101 0010 */
|
|
||||||
{ 12, 0xD3, 35 }, /* 0000 1101 0011 */
|
|
||||||
{ 12, 0xD4, 36 }, /* 0000 1101 0100 */
|
|
||||||
{ 12, 0xD5, 37 }, /* 0000 1101 0101 */
|
|
||||||
{ 12, 0xD6, 38 }, /* 0000 1101 0110 */
|
|
||||||
{ 12, 0xD7, 39 }, /* 0000 1101 0111 */
|
|
||||||
{ 12, 0x6C, 40 }, /* 0000 0110 1100 */
|
|
||||||
{ 12, 0x6D, 41 }, /* 0000 0110 1101 */
|
|
||||||
{ 12, 0xDA, 42 }, /* 0000 1101 1010 */
|
|
||||||
{ 12, 0xDB, 43 }, /* 0000 1101 1011 */
|
|
||||||
{ 12, 0x54, 44 }, /* 0000 0101 0100 */
|
|
||||||
{ 12, 0x55, 45 }, /* 0000 0101 0101 */
|
|
||||||
{ 12, 0x56, 46 }, /* 0000 0101 0110 */
|
|
||||||
{ 12, 0x57, 47 }, /* 0000 0101 0111 */
|
|
||||||
{ 12, 0x64, 48 }, /* 0000 0110 0100 */
|
|
||||||
{ 12, 0x65, 49 }, /* 0000 0110 0101 */
|
|
||||||
{ 12, 0x52, 50 }, /* 0000 0101 0010 */
|
|
||||||
{ 12, 0x53, 51 }, /* 0000 0101 0011 */
|
|
||||||
{ 12, 0x24, 52 }, /* 0000 0010 0100 */
|
|
||||||
{ 12, 0x37, 53 }, /* 0000 0011 0111 */
|
|
||||||
{ 12, 0x38, 54 }, /* 0000 0011 1000 */
|
|
||||||
{ 12, 0x27, 55 }, /* 0000 0010 0111 */
|
|
||||||
{ 12, 0x28, 56 }, /* 0000 0010 1000 */
|
|
||||||
{ 12, 0x58, 57 }, /* 0000 0101 1000 */
|
|
||||||
{ 12, 0x59, 58 }, /* 0000 0101 1001 */
|
|
||||||
{ 12, 0x2B, 59 }, /* 0000 0010 1011 */
|
|
||||||
{ 12, 0x2C, 60 }, /* 0000 0010 1100 */
|
|
||||||
{ 12, 0x5A, 61 }, /* 0000 0101 1010 */
|
|
||||||
{ 12, 0x66, 62 }, /* 0000 0110 0110 */
|
|
||||||
{ 12, 0x67, 63 }, /* 0000 0110 0111 */
|
|
||||||
{ 10, 0xF, 64 }, /* 0000 0011 11 */
|
|
||||||
{ 12, 0xC8, 128 }, /* 0000 1100 1000 */
|
|
||||||
{ 12, 0xC9, 192 }, /* 0000 1100 1001 */
|
|
||||||
{ 12, 0x5B, 256 }, /* 0000 0101 1011 */
|
|
||||||
{ 12, 0x33, 320 }, /* 0000 0011 0011 */
|
|
||||||
{ 12, 0x34, 384 }, /* 0000 0011 0100 */
|
|
||||||
{ 12, 0x35, 448 }, /* 0000 0011 0101 */
|
|
||||||
{ 13, 0x6C, 512 }, /* 0000 0011 0110 0 */
|
|
||||||
{ 13, 0x6D, 576 }, /* 0000 0011 0110 1 */
|
|
||||||
{ 13, 0x4A, 640 }, /* 0000 0010 0101 0 */
|
|
||||||
{ 13, 0x4B, 704 }, /* 0000 0010 0101 1 */
|
|
||||||
{ 13, 0x4C, 768 }, /* 0000 0010 0110 0 */
|
|
||||||
{ 13, 0x4D, 832 }, /* 0000 0010 0110 1 */
|
|
||||||
{ 13, 0x72, 896 }, /* 0000 0011 1001 0 */
|
|
||||||
{ 13, 0x73, 960 }, /* 0000 0011 1001 1 */
|
|
||||||
{ 13, 0x74, 1024 }, /* 0000 0011 1010 0 */
|
|
||||||
{ 13, 0x75, 1088 }, /* 0000 0011 1010 1 */
|
|
||||||
{ 13, 0x76, 1152 }, /* 0000 0011 1011 0 */
|
|
||||||
{ 13, 0x77, 1216 }, /* 0000 0011 1011 1 */
|
|
||||||
{ 13, 0x52, 1280 }, /* 0000 0010 1001 0 */
|
|
||||||
{ 13, 0x53, 1344 }, /* 0000 0010 1001 1 */
|
|
||||||
{ 13, 0x54, 1408 }, /* 0000 0010 1010 0 */
|
|
||||||
{ 13, 0x55, 1472 }, /* 0000 0010 1010 1 */
|
|
||||||
{ 13, 0x5A, 1536 }, /* 0000 0010 1101 0 */
|
|
||||||
{ 13, 0x5B, 1600 }, /* 0000 0010 1101 1 */
|
|
||||||
{ 13, 0x64, 1664 }, /* 0000 0011 0010 0 */
|
|
||||||
{ 13, 0x65, 1728 }, /* 0000 0011 0010 1 */
|
|
||||||
{ 11, 0x8, 1792 }, /* 0000 0001 000 */
|
|
||||||
{ 11, 0xC, 1856 }, /* 0000 0001 100 */
|
|
||||||
{ 11, 0xD, 1920 }, /* 0000 0001 101 */
|
|
||||||
{ 12, 0x12, 1984 }, /* 0000 0001 0010 */
|
|
||||||
{ 12, 0x13, 2048 }, /* 0000 0001 0011 */
|
|
||||||
{ 12, 0x14, 2112 }, /* 0000 0001 0100 */
|
|
||||||
{ 12, 0x15, 2176 }, /* 0000 0001 0101 */
|
|
||||||
{ 12, 0x16, 2240 }, /* 0000 0001 0110 */
|
|
||||||
{ 12, 0x17, 2304 }, /* 0000 0001 0111 */
|
|
||||||
{ 12, 0x1C, 2368 }, /* 0000 0001 1100 */
|
|
||||||
{ 12, 0x1D, 2432 }, /* 0000 0001 1101 */
|
|
||||||
{ 12, 0x1E, 2496 }, /* 0000 0001 1110 */
|
|
||||||
{ 12, 0x1F, 2560 }, /* 0000 0001 1111 */
|
|
||||||
{ 12, 0x1, G3CODE_EOL }, /* 0000 0000 0001 */
|
|
||||||
{ 9, 0x1, G3CODE_INVALID }, /* 0000 0000 1 */
|
|
||||||
{ 10, 0x1, G3CODE_INVALID }, /* 0000 0000 01 */
|
|
||||||
{ 11, 0x1, G3CODE_INVALID }, /* 0000 0000 001 */
|
|
||||||
{ 12, 0x0, G3CODE_INVALID }, /* 0000 0000 0000 */
|
|
||||||
};
|
|
||||||
#else
|
|
||||||
extern const tableentry TIFFFaxWhiteCodes[];
|
|
||||||
extern const tableentry TIFFFaxBlackCodes[];
|
|
||||||
#endif
|
|
||||||
#endif /* _T4_ */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
@@ -1,290 +0,0 @@
|
|||||||
/* $Id: tif_aux.c,v 1.20.2.3 2010-06-09 21:15:27 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 1991-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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF Library.
|
|
||||||
*
|
|
||||||
* Auxiliary Support Routines.
|
|
||||||
*/
|
|
||||||
#include "tiffiop.h"
|
|
||||||
#include "tif_predict.h"
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
tdata_t
|
|
||||||
_TIFFCheckRealloc(TIFF* tif, tdata_t buffer,
|
|
||||||
size_t nmemb, size_t elem_size, const char* what)
|
|
||||||
{
|
|
||||||
tdata_t cp = NULL;
|
|
||||||
tsize_t bytes = nmemb * elem_size;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* XXX: Check for integer overflow.
|
|
||||||
*/
|
|
||||||
if (nmemb && elem_size && bytes / elem_size == nmemb)
|
|
||||||
cp = _TIFFrealloc(buffer, bytes);
|
|
||||||
|
|
||||||
if (cp == NULL)
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
|
||||||
"Failed to allocate memory for %s "
|
|
||||||
"(%ld elements of %ld bytes each)",
|
|
||||||
what,(long) nmemb, (long) elem_size);
|
|
||||||
|
|
||||||
return cp;
|
|
||||||
}
|
|
||||||
|
|
||||||
tdata_t
|
|
||||||
_TIFFCheckMalloc(TIFF* tif, size_t nmemb, size_t elem_size, const char* what)
|
|
||||||
{
|
|
||||||
return _TIFFCheckRealloc(tif, NULL, nmemb, elem_size, what);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
TIFFDefaultTransferFunction(TIFFDirectory* td)
|
|
||||||
{
|
|
||||||
uint16 **tf = td->td_transferfunction;
|
|
||||||
tsize_t i, n, nbytes;
|
|
||||||
|
|
||||||
tf[0] = tf[1] = tf[2] = 0;
|
|
||||||
if (td->td_bitspersample >= sizeof(tsize_t) * 8 - 2)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
n = 1<<td->td_bitspersample;
|
|
||||||
nbytes = n * sizeof (uint16);
|
|
||||||
if (!(tf[0] = (uint16 *)_TIFFmalloc(nbytes)))
|
|
||||||
return 0;
|
|
||||||
tf[0][0] = 0;
|
|
||||||
for (i = 1; i < n; i++) {
|
|
||||||
double t = (double)i/((double) n-1.);
|
|
||||||
tf[0][i] = (uint16)floor(65535.*pow(t, 2.2) + .5);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (td->td_samplesperpixel - td->td_extrasamples > 1) {
|
|
||||||
if (!(tf[1] = (uint16 *)_TIFFmalloc(nbytes)))
|
|
||||||
goto bad;
|
|
||||||
_TIFFmemcpy(tf[1], tf[0], nbytes);
|
|
||||||
if (!(tf[2] = (uint16 *)_TIFFmalloc(nbytes)))
|
|
||||||
goto bad;
|
|
||||||
_TIFFmemcpy(tf[2], tf[0], nbytes);
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
bad:
|
|
||||||
if (tf[0])
|
|
||||||
_TIFFfree(tf[0]);
|
|
||||||
if (tf[1])
|
|
||||||
_TIFFfree(tf[1]);
|
|
||||||
if (tf[2])
|
|
||||||
_TIFFfree(tf[2]);
|
|
||||||
tf[0] = tf[1] = tf[2] = 0;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
TIFFDefaultRefBlackWhite(TIFFDirectory* td)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (!(td->td_refblackwhite = (float *)_TIFFmalloc(6*sizeof (float))))
|
|
||||||
return 0;
|
|
||||||
if (td->td_photometric == PHOTOMETRIC_YCBCR) {
|
|
||||||
/*
|
|
||||||
* YCbCr (Class Y) images must have the ReferenceBlackWhite
|
|
||||||
* tag set. Fix the broken images, which lacks that tag.
|
|
||||||
*/
|
|
||||||
td->td_refblackwhite[0] = 0.0F;
|
|
||||||
td->td_refblackwhite[1] = td->td_refblackwhite[3] =
|
|
||||||
td->td_refblackwhite[5] = 255.0F;
|
|
||||||
td->td_refblackwhite[2] = td->td_refblackwhite[4] = 128.0F;
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* Assume RGB (Class R)
|
|
||||||
*/
|
|
||||||
for (i = 0; i < 3; i++) {
|
|
||||||
td->td_refblackwhite[2*i+0] = 0;
|
|
||||||
td->td_refblackwhite[2*i+1] =
|
|
||||||
(float)((1L<<td->td_bitspersample)-1L);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Like TIFFGetField, but return any default
|
|
||||||
* value if the tag is not present in the directory.
|
|
||||||
*
|
|
||||||
* NB: We use the value in the directory, rather than
|
|
||||||
* explcit values so that defaults exist only one
|
|
||||||
* place in the library -- in TIFFDefaultDirectory.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
TIFFVGetFieldDefaulted(TIFF* tif, ttag_t tag, va_list ap)
|
|
||||||
{
|
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
|
||||||
|
|
||||||
if (TIFFVGetField(tif, tag, ap))
|
|
||||||
return (1);
|
|
||||||
switch (tag) {
|
|
||||||
case TIFFTAG_SUBFILETYPE:
|
|
||||||
*va_arg(ap, uint32 *) = td->td_subfiletype;
|
|
||||||
return (1);
|
|
||||||
case TIFFTAG_BITSPERSAMPLE:
|
|
||||||
*va_arg(ap, uint16 *) = td->td_bitspersample;
|
|
||||||
return (1);
|
|
||||||
case TIFFTAG_THRESHHOLDING:
|
|
||||||
*va_arg(ap, uint16 *) = td->td_threshholding;
|
|
||||||
return (1);
|
|
||||||
case TIFFTAG_FILLORDER:
|
|
||||||
*va_arg(ap, uint16 *) = td->td_fillorder;
|
|
||||||
return (1);
|
|
||||||
case TIFFTAG_ORIENTATION:
|
|
||||||
*va_arg(ap, uint16 *) = td->td_orientation;
|
|
||||||
return (1);
|
|
||||||
case TIFFTAG_SAMPLESPERPIXEL:
|
|
||||||
*va_arg(ap, uint16 *) = td->td_samplesperpixel;
|
|
||||||
return (1);
|
|
||||||
case TIFFTAG_ROWSPERSTRIP:
|
|
||||||
*va_arg(ap, uint32 *) = td->td_rowsperstrip;
|
|
||||||
return (1);
|
|
||||||
case TIFFTAG_MINSAMPLEVALUE:
|
|
||||||
*va_arg(ap, uint16 *) = td->td_minsamplevalue;
|
|
||||||
return (1);
|
|
||||||
case TIFFTAG_MAXSAMPLEVALUE:
|
|
||||||
*va_arg(ap, uint16 *) = td->td_maxsamplevalue;
|
|
||||||
return (1);
|
|
||||||
case TIFFTAG_PLANARCONFIG:
|
|
||||||
*va_arg(ap, uint16 *) = td->td_planarconfig;
|
|
||||||
return (1);
|
|
||||||
case TIFFTAG_RESOLUTIONUNIT:
|
|
||||||
*va_arg(ap, uint16 *) = td->td_resolutionunit;
|
|
||||||
return (1);
|
|
||||||
case TIFFTAG_PREDICTOR:
|
|
||||||
{
|
|
||||||
TIFFPredictorState* sp = (TIFFPredictorState*) tif->tif_data;
|
|
||||||
*va_arg(ap, uint16*) = (uint16) sp->predictor;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
case TIFFTAG_DOTRANGE:
|
|
||||||
*va_arg(ap, uint16 *) = 0;
|
|
||||||
*va_arg(ap, uint16 *) = (1<<td->td_bitspersample)-1;
|
|
||||||
return (1);
|
|
||||||
case TIFFTAG_INKSET:
|
|
||||||
*va_arg(ap, uint16 *) = INKSET_CMYK;
|
|
||||||
return 1;
|
|
||||||
case TIFFTAG_NUMBEROFINKS:
|
|
||||||
*va_arg(ap, uint16 *) = 4;
|
|
||||||
return (1);
|
|
||||||
case TIFFTAG_EXTRASAMPLES:
|
|
||||||
*va_arg(ap, uint16 *) = td->td_extrasamples;
|
|
||||||
*va_arg(ap, uint16 **) = td->td_sampleinfo;
|
|
||||||
return (1);
|
|
||||||
case TIFFTAG_MATTEING:
|
|
||||||
*va_arg(ap, uint16 *) =
|
|
||||||
(td->td_extrasamples == 1 &&
|
|
||||||
td->td_sampleinfo[0] == EXTRASAMPLE_ASSOCALPHA);
|
|
||||||
return (1);
|
|
||||||
case TIFFTAG_TILEDEPTH:
|
|
||||||
*va_arg(ap, uint32 *) = td->td_tiledepth;
|
|
||||||
return (1);
|
|
||||||
case TIFFTAG_DATATYPE:
|
|
||||||
*va_arg(ap, uint16 *) = td->td_sampleformat-1;
|
|
||||||
return (1);
|
|
||||||
case TIFFTAG_SAMPLEFORMAT:
|
|
||||||
*va_arg(ap, uint16 *) = td->td_sampleformat;
|
|
||||||
return(1);
|
|
||||||
case TIFFTAG_IMAGEDEPTH:
|
|
||||||
*va_arg(ap, uint32 *) = td->td_imagedepth;
|
|
||||||
return (1);
|
|
||||||
case TIFFTAG_YCBCRCOEFFICIENTS:
|
|
||||||
{
|
|
||||||
/* defaults are from CCIR Recommendation 601-1 */
|
|
||||||
static float ycbcrcoeffs[] = { 0.299f, 0.587f, 0.114f };
|
|
||||||
*va_arg(ap, float **) = ycbcrcoeffs;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
case TIFFTAG_YCBCRSUBSAMPLING:
|
|
||||||
*va_arg(ap, uint16 *) = td->td_ycbcrsubsampling[0];
|
|
||||||
*va_arg(ap, uint16 *) = td->td_ycbcrsubsampling[1];
|
|
||||||
return (1);
|
|
||||||
case TIFFTAG_YCBCRPOSITIONING:
|
|
||||||
*va_arg(ap, uint16 *) = td->td_ycbcrpositioning;
|
|
||||||
return (1);
|
|
||||||
case TIFFTAG_WHITEPOINT:
|
|
||||||
{
|
|
||||||
static float whitepoint[2];
|
|
||||||
|
|
||||||
/* TIFF 6.0 specification tells that it is no default
|
|
||||||
value for the WhitePoint, but AdobePhotoshop TIFF
|
|
||||||
Technical Note tells that it should be CIE D50. */
|
|
||||||
whitepoint[0] = D50_X0 / (D50_X0 + D50_Y0 + D50_Z0);
|
|
||||||
whitepoint[1] = D50_Y0 / (D50_X0 + D50_Y0 + D50_Z0);
|
|
||||||
*va_arg(ap, float **) = whitepoint;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
case TIFFTAG_TRANSFERFUNCTION:
|
|
||||||
if (!td->td_transferfunction[0] &&
|
|
||||||
!TIFFDefaultTransferFunction(td)) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "No space for \"TransferFunction\" tag");
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
*va_arg(ap, uint16 **) = td->td_transferfunction[0];
|
|
||||||
if (td->td_samplesperpixel - td->td_extrasamples > 1) {
|
|
||||||
*va_arg(ap, uint16 **) = td->td_transferfunction[1];
|
|
||||||
*va_arg(ap, uint16 **) = td->td_transferfunction[2];
|
|
||||||
}
|
|
||||||
return (1);
|
|
||||||
case TIFFTAG_REFERENCEBLACKWHITE:
|
|
||||||
if (!td->td_refblackwhite && !TIFFDefaultRefBlackWhite(td))
|
|
||||||
return (0);
|
|
||||||
*va_arg(ap, float **) = td->td_refblackwhite;
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Like TIFFGetField, but return any default
|
|
||||||
* value if the tag is not present in the directory.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
TIFFGetFieldDefaulted(TIFF* tif, ttag_t tag, ...)
|
|
||||||
{
|
|
||||||
int ok;
|
|
||||||
va_list ap;
|
|
||||||
|
|
||||||
va_start(ap, tag);
|
|
||||||
ok = TIFFVGetFieldDefaulted(tif, tag, ap);
|
|
||||||
va_end(ap);
|
|
||||||
return (ok);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
@@ -1,126 +0,0 @@
|
|||||||
/* $Id: tif_close.c,v 1.10.2.1 2010-06-08 18:50:41 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF Library.
|
|
||||||
*/
|
|
||||||
#include "tiffiop.h"
|
|
||||||
|
|
||||||
/************************************************************************/
|
|
||||||
/* TIFFCleanup() */
|
|
||||||
/************************************************************************/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Auxiliary function to free the TIFF structure. Given structure will be
|
|
||||||
* completetly freed, so you should save opened file handle and pointer
|
|
||||||
* to the close procedure in external variables before calling
|
|
||||||
* _TIFFCleanup(), if you will need these ones to close the file.
|
|
||||||
*
|
|
||||||
* @param tif A TIFF pointer.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
|
||||||
TIFFCleanup(TIFF* tif)
|
|
||||||
{
|
|
||||||
if (tif->tif_mode != O_RDONLY)
|
|
||||||
/*
|
|
||||||
* Flush buffered data and directory (if dirty).
|
|
||||||
*/
|
|
||||||
TIFFFlush(tif);
|
|
||||||
(*tif->tif_cleanup)(tif);
|
|
||||||
TIFFFreeDirectory(tif);
|
|
||||||
|
|
||||||
if (tif->tif_dirlist)
|
|
||||||
_TIFFfree(tif->tif_dirlist);
|
|
||||||
|
|
||||||
/* Clean up client info links */
|
|
||||||
while( tif->tif_clientinfo )
|
|
||||||
{
|
|
||||||
TIFFClientInfoLink *link = tif->tif_clientinfo;
|
|
||||||
|
|
||||||
tif->tif_clientinfo = link->next;
|
|
||||||
_TIFFfree( link->name );
|
|
||||||
_TIFFfree( link );
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tif->tif_rawdata && (tif->tif_flags&TIFF_MYBUFFER))
|
|
||||||
_TIFFfree(tif->tif_rawdata);
|
|
||||||
if (isMapped(tif))
|
|
||||||
TIFFUnmapFileContents(tif, tif->tif_base, tif->tif_size);
|
|
||||||
|
|
||||||
/* Clean up custom fields */
|
|
||||||
if (tif->tif_nfields > 0)
|
|
||||||
{
|
|
||||||
size_t i;
|
|
||||||
|
|
||||||
for (i = 0; i < tif->tif_nfields; i++)
|
|
||||||
{
|
|
||||||
TIFFFieldInfo *fld = tif->tif_fieldinfo[i];
|
|
||||||
if (fld->field_bit == FIELD_CUSTOM &&
|
|
||||||
strncmp("Tag ", fld->field_name, 4) == 0)
|
|
||||||
{
|
|
||||||
_TIFFfree(fld->field_name);
|
|
||||||
_TIFFfree(fld);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_TIFFfree(tif->tif_fieldinfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
_TIFFfree(tif);
|
|
||||||
}
|
|
||||||
|
|
||||||
/************************************************************************/
|
|
||||||
/* TIFFClose() */
|
|
||||||
/************************************************************************/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Close a previously opened TIFF file.
|
|
||||||
*
|
|
||||||
* TIFFClose closes a file that was previously opened with TIFFOpen().
|
|
||||||
* Any buffered data are flushed to the file, including the contents of
|
|
||||||
* the current directory (if modified); and all resources are reclaimed.
|
|
||||||
*
|
|
||||||
* @param tif A TIFF pointer.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
|
||||||
TIFFClose(TIFF* tif)
|
|
||||||
{
|
|
||||||
TIFFCloseProc closeproc = tif->tif_closeproc;
|
|
||||||
thandle_t fd = tif->tif_clientdata;
|
|
||||||
|
|
||||||
TIFFCleanup(tif);
|
|
||||||
(void) (*closeproc)(fd);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
@@ -1,160 +0,0 @@
|
|||||||
/* $Id: tif_codec.c,v 1.10.2.2 2010-06-08 18:50:41 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF Library
|
|
||||||
*
|
|
||||||
* Builtin Compression Scheme Configuration Support.
|
|
||||||
*/
|
|
||||||
#include "tiffiop.h"
|
|
||||||
|
|
||||||
static int NotConfigured(TIFF*, int);
|
|
||||||
|
|
||||||
#ifndef LZW_SUPPORT
|
|
||||||
#define TIFFInitLZW NotConfigured
|
|
||||||
#endif
|
|
||||||
#ifndef PACKBITS_SUPPORT
|
|
||||||
#define TIFFInitPackBits NotConfigured
|
|
||||||
#endif
|
|
||||||
#ifndef THUNDER_SUPPORT
|
|
||||||
#define TIFFInitThunderScan NotConfigured
|
|
||||||
#endif
|
|
||||||
#ifndef NEXT_SUPPORT
|
|
||||||
#define TIFFInitNeXT NotConfigured
|
|
||||||
#endif
|
|
||||||
#ifndef JPEG_SUPPORT
|
|
||||||
#define TIFFInitJPEG NotConfigured
|
|
||||||
#endif
|
|
||||||
#ifndef OJPEG_SUPPORT
|
|
||||||
#define TIFFInitOJPEG NotConfigured
|
|
||||||
#endif
|
|
||||||
#ifndef CCITT_SUPPORT
|
|
||||||
#define TIFFInitCCITTRLE NotConfigured
|
|
||||||
#define TIFFInitCCITTRLEW NotConfigured
|
|
||||||
#define TIFFInitCCITTFax3 NotConfigured
|
|
||||||
#define TIFFInitCCITTFax4 NotConfigured
|
|
||||||
#endif
|
|
||||||
#ifndef JBIG_SUPPORT
|
|
||||||
#define TIFFInitJBIG NotConfigured
|
|
||||||
#endif
|
|
||||||
#ifndef ZIP_SUPPORT
|
|
||||||
#define TIFFInitZIP NotConfigured
|
|
||||||
#endif
|
|
||||||
#ifndef PIXARLOG_SUPPORT
|
|
||||||
#define TIFFInitPixarLog NotConfigured
|
|
||||||
#endif
|
|
||||||
#ifndef LOGLUV_SUPPORT
|
|
||||||
#define TIFFInitSGILog NotConfigured
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Compression schemes statically built into the library.
|
|
||||||
*/
|
|
||||||
#ifdef VMS
|
|
||||||
const TIFFCodec _TIFFBuiltinCODECS[] = {
|
|
||||||
#else
|
|
||||||
TIFFCodec _TIFFBuiltinCODECS[] = {
|
|
||||||
#endif
|
|
||||||
{ "None", COMPRESSION_NONE, TIFFInitDumpMode },
|
|
||||||
{ "LZW", COMPRESSION_LZW, TIFFInitLZW },
|
|
||||||
{ "PackBits", COMPRESSION_PACKBITS, TIFFInitPackBits },
|
|
||||||
{ "ThunderScan", COMPRESSION_THUNDERSCAN,TIFFInitThunderScan },
|
|
||||||
{ "NeXT", COMPRESSION_NEXT, TIFFInitNeXT },
|
|
||||||
{ "JPEG", COMPRESSION_JPEG, TIFFInitJPEG },
|
|
||||||
{ "Old-style JPEG", COMPRESSION_OJPEG, TIFFInitOJPEG },
|
|
||||||
{ "CCITT RLE", COMPRESSION_CCITTRLE, TIFFInitCCITTRLE },
|
|
||||||
{ "CCITT RLE/W", COMPRESSION_CCITTRLEW, TIFFInitCCITTRLEW },
|
|
||||||
{ "CCITT Group 3", COMPRESSION_CCITTFAX3, TIFFInitCCITTFax3 },
|
|
||||||
{ "CCITT Group 4", COMPRESSION_CCITTFAX4, TIFFInitCCITTFax4 },
|
|
||||||
{ "ISO JBIG", COMPRESSION_JBIG, TIFFInitJBIG },
|
|
||||||
{ "Deflate", COMPRESSION_DEFLATE, TIFFInitZIP },
|
|
||||||
{ "AdobeDeflate", COMPRESSION_ADOBE_DEFLATE , TIFFInitZIP },
|
|
||||||
{ "PixarLog", COMPRESSION_PIXARLOG, TIFFInitPixarLog },
|
|
||||||
{ "SGILog", COMPRESSION_SGILOG, TIFFInitSGILog },
|
|
||||||
{ "SGILog24", COMPRESSION_SGILOG24, TIFFInitSGILog },
|
|
||||||
{ NULL, 0, NULL }
|
|
||||||
};
|
|
||||||
|
|
||||||
static int
|
|
||||||
_notConfigured(TIFF* tif)
|
|
||||||
{
|
|
||||||
const TIFFCodec* c = TIFFFindCODEC(tif->tif_dir.td_compression);
|
|
||||||
char compression_code[20];
|
|
||||||
|
|
||||||
sprintf( compression_code, "%d", tif->tif_dir.td_compression );
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
|
||||||
"%s compression support is not configured",
|
|
||||||
c ? c->name : compression_code );
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
NotConfigured(TIFF* tif, int scheme)
|
|
||||||
{
|
|
||||||
(void) scheme;
|
|
||||||
|
|
||||||
tif->tif_decodestatus = FALSE;
|
|
||||||
tif->tif_setupdecode = _notConfigured;
|
|
||||||
tif->tif_encodestatus = FALSE;
|
|
||||||
tif->tif_setupencode = _notConfigured;
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/************************************************************************/
|
|
||||||
/* TIFFIsCODECConfigured() */
|
|
||||||
/************************************************************************/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check whether we have working codec for the specific coding scheme.
|
|
||||||
*
|
|
||||||
* @return returns 1 if the codec is configured and working. Otherwise
|
|
||||||
* 0 will be returned.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int
|
|
||||||
TIFFIsCODECConfigured(uint16 scheme)
|
|
||||||
{
|
|
||||||
const TIFFCodec* codec = TIFFFindCODEC(scheme);
|
|
||||||
|
|
||||||
if(codec == NULL) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if(codec->init == NULL) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if(codec->init != NotConfigured){
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
@@ -1,282 +0,0 @@
|
|||||||
/* $Id: tif_color.c,v 1.12.2.1 2010-06-08 18:50:41 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* CIE L*a*b* to CIE XYZ and CIE XYZ to RGB conversion routines are taken
|
|
||||||
* from the VIPS library (http://www.vips.ecs.soton.ac.uk) with
|
|
||||||
* the permission of John Cupitt, the VIPS author.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF Library.
|
|
||||||
*
|
|
||||||
* Color space conversion routines.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "tiffiop.h"
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Convert color value from the CIE L*a*b* 1976 space to CIE XYZ.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
TIFFCIELabToXYZ(TIFFCIELabToRGB *cielab, uint32 l, int32 a, int32 b,
|
|
||||||
float *X, float *Y, float *Z)
|
|
||||||
{
|
|
||||||
float L = (float)l * 100.0F / 255.0F;
|
|
||||||
float cby, tmp;
|
|
||||||
|
|
||||||
if( L < 8.856F ) {
|
|
||||||
*Y = (L * cielab->Y0) / 903.292F;
|
|
||||||
cby = 7.787F * (*Y / cielab->Y0) + 16.0F / 116.0F;
|
|
||||||
} else {
|
|
||||||
cby = (L + 16.0F) / 116.0F;
|
|
||||||
*Y = cielab->Y0 * cby * cby * cby;
|
|
||||||
}
|
|
||||||
|
|
||||||
tmp = (float)a / 500.0F + cby;
|
|
||||||
if( tmp < 0.2069F )
|
|
||||||
*X = cielab->X0 * (tmp - 0.13793F) / 7.787F;
|
|
||||||
else
|
|
||||||
*X = cielab->X0 * tmp * tmp * tmp;
|
|
||||||
|
|
||||||
tmp = cby - (float)b / 200.0F;
|
|
||||||
if( tmp < 0.2069F )
|
|
||||||
*Z = cielab->Z0 * (tmp - 0.13793F) / 7.787F;
|
|
||||||
else
|
|
||||||
*Z = cielab->Z0 * tmp * tmp * tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define RINT(R) ((uint32)((R)>0?((R)+0.5):((R)-0.5)))
|
|
||||||
/*
|
|
||||||
* Convert color value from the XYZ space to RGB.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
TIFFXYZToRGB(TIFFCIELabToRGB *cielab, float X, float Y, float Z,
|
|
||||||
uint32 *r, uint32 *g, uint32 *b)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
float Yr, Yg, Yb;
|
|
||||||
float *matrix = &cielab->display.d_mat[0][0];
|
|
||||||
|
|
||||||
/* Multiply through the matrix to get luminosity values. */
|
|
||||||
Yr = matrix[0] * X + matrix[1] * Y + matrix[2] * Z;
|
|
||||||
Yg = matrix[3] * X + matrix[4] * Y + matrix[5] * Z;
|
|
||||||
Yb = matrix[6] * X + matrix[7] * Y + matrix[8] * Z;
|
|
||||||
|
|
||||||
/* Clip input */
|
|
||||||
Yr = TIFFmax(Yr, cielab->display.d_Y0R);
|
|
||||||
Yg = TIFFmax(Yg, cielab->display.d_Y0G);
|
|
||||||
Yb = TIFFmax(Yb, cielab->display.d_Y0B);
|
|
||||||
|
|
||||||
/* Avoid overflow in case of wrong input values */
|
|
||||||
Yr = TIFFmin(Yr, cielab->display.d_YCR);
|
|
||||||
Yg = TIFFmin(Yg, cielab->display.d_YCG);
|
|
||||||
Yb = TIFFmin(Yb, cielab->display.d_YCB);
|
|
||||||
|
|
||||||
/* Turn luminosity to colour value. */
|
|
||||||
i = (int)((Yr - cielab->display.d_Y0R) / cielab->rstep);
|
|
||||||
i = TIFFmin(cielab->range, i);
|
|
||||||
*r = RINT(cielab->Yr2r[i]);
|
|
||||||
|
|
||||||
i = (int)((Yg - cielab->display.d_Y0G) / cielab->gstep);
|
|
||||||
i = TIFFmin(cielab->range, i);
|
|
||||||
*g = RINT(cielab->Yg2g[i]);
|
|
||||||
|
|
||||||
i = (int)((Yb - cielab->display.d_Y0B) / cielab->bstep);
|
|
||||||
i = TIFFmin(cielab->range, i);
|
|
||||||
*b = RINT(cielab->Yb2b[i]);
|
|
||||||
|
|
||||||
/* Clip output. */
|
|
||||||
*r = TIFFmin(*r, cielab->display.d_Vrwr);
|
|
||||||
*g = TIFFmin(*g, cielab->display.d_Vrwg);
|
|
||||||
*b = TIFFmin(*b, cielab->display.d_Vrwb);
|
|
||||||
}
|
|
||||||
#undef RINT
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Allocate conversion state structures and make look_up tables for
|
|
||||||
* the Yr,Yb,Yg <=> r,g,b conversions.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
TIFFCIELabToRGBInit(TIFFCIELabToRGB* cielab,
|
|
||||||
TIFFDisplay *display, float *refWhite)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
double gamma;
|
|
||||||
|
|
||||||
cielab->range = CIELABTORGB_TABLE_RANGE;
|
|
||||||
|
|
||||||
_TIFFmemcpy(&cielab->display, display, sizeof(TIFFDisplay));
|
|
||||||
|
|
||||||
/* Red */
|
|
||||||
gamma = 1.0 / cielab->display.d_gammaR ;
|
|
||||||
cielab->rstep =
|
|
||||||
(cielab->display.d_YCR - cielab->display.d_Y0R) / cielab->range;
|
|
||||||
for(i = 0; i <= cielab->range; i++) {
|
|
||||||
cielab->Yr2r[i] = cielab->display.d_Vrwr
|
|
||||||
* ((float)pow((double)i / cielab->range, gamma));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Green */
|
|
||||||
gamma = 1.0 / cielab->display.d_gammaG ;
|
|
||||||
cielab->gstep =
|
|
||||||
(cielab->display.d_YCR - cielab->display.d_Y0R) / cielab->range;
|
|
||||||
for(i = 0; i <= cielab->range; i++) {
|
|
||||||
cielab->Yg2g[i] = cielab->display.d_Vrwg
|
|
||||||
* ((float)pow((double)i / cielab->range, gamma));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Blue */
|
|
||||||
gamma = 1.0 / cielab->display.d_gammaB ;
|
|
||||||
cielab->bstep =
|
|
||||||
(cielab->display.d_YCR - cielab->display.d_Y0R) / cielab->range;
|
|
||||||
for(i = 0; i <= cielab->range; i++) {
|
|
||||||
cielab->Yb2b[i] = cielab->display.d_Vrwb
|
|
||||||
* ((float)pow((double)i / cielab->range, gamma));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Init reference white point */
|
|
||||||
cielab->X0 = refWhite[0];
|
|
||||||
cielab->Y0 = refWhite[1];
|
|
||||||
cielab->Z0 = refWhite[2];
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Convert color value from the YCbCr space to CIE XYZ.
|
|
||||||
* The colorspace conversion algorithm comes from the IJG v5a code;
|
|
||||||
* see below for more information on how it works.
|
|
||||||
*/
|
|
||||||
#define SHIFT 16
|
|
||||||
#define FIX(x) ((int32)((x) * (1L<<SHIFT) + 0.5))
|
|
||||||
#define ONE_HALF ((int32)(1<<(SHIFT-1)))
|
|
||||||
#define Code2V(c, RB, RW, CR) ((((c)-(int32)(RB))*(float)(CR))/(float)(((RW)-(RB)) ? ((RW)-(RB)) : 1))
|
|
||||||
#define CLAMP(f,min,max) ((f)<(min)?(min):(f)>(max)?(max):(f))
|
|
||||||
#define HICLAMP(f,max) ((f)>(max)?(max):(f))
|
|
||||||
|
|
||||||
void
|
|
||||||
TIFFYCbCrtoRGB(TIFFYCbCrToRGB *ycbcr, uint32 Y, int32 Cb, int32 Cr,
|
|
||||||
uint32 *r, uint32 *g, uint32 *b)
|
|
||||||
{
|
|
||||||
/* XXX: Only 8-bit YCbCr input supported for now */
|
|
||||||
Y = HICLAMP(Y, 255), Cb = CLAMP(Cb, 0, 255), Cr = CLAMP(Cr, 0, 255);
|
|
||||||
|
|
||||||
*r = ycbcr->clamptab[ycbcr->Y_tab[Y] + ycbcr->Cr_r_tab[Cr]];
|
|
||||||
*g = ycbcr->clamptab[ycbcr->Y_tab[Y]
|
|
||||||
+ (int)((ycbcr->Cb_g_tab[Cb] + ycbcr->Cr_g_tab[Cr]) >> SHIFT)];
|
|
||||||
*b = ycbcr->clamptab[ycbcr->Y_tab[Y] + ycbcr->Cb_b_tab[Cb]];
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialize the YCbCr->RGB conversion tables. The conversion
|
|
||||||
* is done according to the 6.0 spec:
|
|
||||||
*
|
|
||||||
* R = Y + Cr*(2 - 2*LumaRed)
|
|
||||||
* B = Y + Cb*(2 - 2*LumaBlue)
|
|
||||||
* G = Y
|
|
||||||
* - LumaBlue*Cb*(2-2*LumaBlue)/LumaGreen
|
|
||||||
* - LumaRed*Cr*(2-2*LumaRed)/LumaGreen
|
|
||||||
*
|
|
||||||
* To avoid floating point arithmetic the fractional constants that
|
|
||||||
* come out of the equations are represented as fixed point values
|
|
||||||
* in the range 0...2^16. We also eliminate multiplications by
|
|
||||||
* pre-calculating possible values indexed by Cb and Cr (this code
|
|
||||||
* assumes conversion is being done for 8-bit samples).
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
TIFFYCbCrToRGBInit(TIFFYCbCrToRGB* ycbcr, float *luma, float *refBlackWhite)
|
|
||||||
{
|
|
||||||
TIFFRGBValue* clamptab;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
#define LumaRed luma[0]
|
|
||||||
#define LumaGreen luma[1]
|
|
||||||
#define LumaBlue luma[2]
|
|
||||||
|
|
||||||
clamptab = (TIFFRGBValue*)(
|
|
||||||
(tidata_t) ycbcr+TIFFroundup(sizeof (TIFFYCbCrToRGB), sizeof (long)));
|
|
||||||
_TIFFmemset(clamptab, 0, 256); /* v < 0 => 0 */
|
|
||||||
ycbcr->clamptab = (clamptab += 256);
|
|
||||||
for (i = 0; i < 256; i++)
|
|
||||||
clamptab[i] = (TIFFRGBValue) i;
|
|
||||||
_TIFFmemset(clamptab+256, 255, 2*256); /* v > 255 => 255 */
|
|
||||||
ycbcr->Cr_r_tab = (int*) (clamptab + 3*256);
|
|
||||||
ycbcr->Cb_b_tab = ycbcr->Cr_r_tab + 256;
|
|
||||||
ycbcr->Cr_g_tab = (int32*) (ycbcr->Cb_b_tab + 256);
|
|
||||||
ycbcr->Cb_g_tab = ycbcr->Cr_g_tab + 256;
|
|
||||||
ycbcr->Y_tab = ycbcr->Cb_g_tab + 256;
|
|
||||||
|
|
||||||
{ float f1 = 2-2*LumaRed; int32 D1 = FIX(f1);
|
|
||||||
float f2 = LumaRed*f1/LumaGreen; int32 D2 = -FIX(f2);
|
|
||||||
float f3 = 2-2*LumaBlue; int32 D3 = FIX(f3);
|
|
||||||
float f4 = LumaBlue*f3/LumaGreen; int32 D4 = -FIX(f4);
|
|
||||||
int x;
|
|
||||||
|
|
||||||
#undef LumaBlue
|
|
||||||
#undef LumaGreen
|
|
||||||
#undef LumaRed
|
|
||||||
|
|
||||||
/*
|
|
||||||
* i is the actual input pixel value in the range 0..255
|
|
||||||
* Cb and Cr values are in the range -128..127 (actually
|
|
||||||
* they are in a range defined by the ReferenceBlackWhite
|
|
||||||
* tag) so there is some range shifting to do here when
|
|
||||||
* constructing tables indexed by the raw pixel data.
|
|
||||||
*/
|
|
||||||
for (i = 0, x = -128; i < 256; i++, x++) {
|
|
||||||
int32 Cr = (int32)Code2V(x, refBlackWhite[4] - 128.0F,
|
|
||||||
refBlackWhite[5] - 128.0F, 127);
|
|
||||||
int32 Cb = (int32)Code2V(x, refBlackWhite[2] - 128.0F,
|
|
||||||
refBlackWhite[3] - 128.0F, 127);
|
|
||||||
|
|
||||||
ycbcr->Cr_r_tab[i] = (int32)((D1*Cr + ONE_HALF)>>SHIFT);
|
|
||||||
ycbcr->Cb_b_tab[i] = (int32)((D3*Cb + ONE_HALF)>>SHIFT);
|
|
||||||
ycbcr->Cr_g_tab[i] = D2*Cr;
|
|
||||||
ycbcr->Cb_g_tab[i] = D4*Cb + ONE_HALF;
|
|
||||||
ycbcr->Y_tab[i] =
|
|
||||||
(int32)Code2V(x + 128, refBlackWhite[0], refBlackWhite[1], 255);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#undef HICLAMP
|
|
||||||
#undef CLAMP
|
|
||||||
#undef Code2V
|
|
||||||
#undef SHIFT
|
|
||||||
#undef ONE_HALF
|
|
||||||
#undef FIX
|
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
@@ -1,295 +0,0 @@
|
|||||||
/* $Id: tif_compress.c,v 1.13.2.1 2010-06-08 18:50:41 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF Library
|
|
||||||
*
|
|
||||||
* Compression Scheme Configuration Support.
|
|
||||||
*/
|
|
||||||
#include "tiffiop.h"
|
|
||||||
|
|
||||||
static int
|
|
||||||
TIFFNoEncode(TIFF* tif, const char* method)
|
|
||||||
{
|
|
||||||
const TIFFCodec* c = TIFFFindCODEC(tif->tif_dir.td_compression);
|
|
||||||
|
|
||||||
if (c) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
|
||||||
"%s %s encoding is not implemented",
|
|
||||||
c->name, method);
|
|
||||||
} else {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
|
||||||
"Compression scheme %u %s encoding is not implemented",
|
|
||||||
tif->tif_dir.td_compression, method);
|
|
||||||
}
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
_TIFFNoRowEncode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s)
|
|
||||||
{
|
|
||||||
(void) pp; (void) cc; (void) s;
|
|
||||||
return (TIFFNoEncode(tif, "scanline"));
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
_TIFFNoStripEncode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s)
|
|
||||||
{
|
|
||||||
(void) pp; (void) cc; (void) s;
|
|
||||||
return (TIFFNoEncode(tif, "strip"));
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
_TIFFNoTileEncode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s)
|
|
||||||
{
|
|
||||||
(void) pp; (void) cc; (void) s;
|
|
||||||
return (TIFFNoEncode(tif, "tile"));
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
TIFFNoDecode(TIFF* tif, const char* method)
|
|
||||||
{
|
|
||||||
const TIFFCodec* c = TIFFFindCODEC(tif->tif_dir.td_compression);
|
|
||||||
|
|
||||||
if (c)
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
|
||||||
"%s %s decoding is not implemented",
|
|
||||||
c->name, method);
|
|
||||||
else
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
|
||||||
"Compression scheme %u %s decoding is not implemented",
|
|
||||||
tif->tif_dir.td_compression, method);
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
_TIFFNoRowDecode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s)
|
|
||||||
{
|
|
||||||
(void) pp; (void) cc; (void) s;
|
|
||||||
return (TIFFNoDecode(tif, "scanline"));
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
_TIFFNoStripDecode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s)
|
|
||||||
{
|
|
||||||
(void) pp; (void) cc; (void) s;
|
|
||||||
return (TIFFNoDecode(tif, "strip"));
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
_TIFFNoTileDecode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s)
|
|
||||||
{
|
|
||||||
(void) pp; (void) cc; (void) s;
|
|
||||||
return (TIFFNoDecode(tif, "tile"));
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
_TIFFNoSeek(TIFF* tif, uint32 off)
|
|
||||||
{
|
|
||||||
(void) off;
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
|
||||||
"Compression algorithm does not support random access");
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
_TIFFNoPreCode(TIFF* tif, tsample_t s)
|
|
||||||
{
|
|
||||||
(void) tif; (void) s;
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int _TIFFtrue(TIFF* tif) { (void) tif; return (1); }
|
|
||||||
static void _TIFFvoid(TIFF* tif) { (void) tif; }
|
|
||||||
|
|
||||||
void
|
|
||||||
_TIFFSetDefaultCompressionState(TIFF* tif)
|
|
||||||
{
|
|
||||||
tif->tif_decodestatus = TRUE;
|
|
||||||
tif->tif_setupdecode = _TIFFtrue;
|
|
||||||
tif->tif_predecode = _TIFFNoPreCode;
|
|
||||||
tif->tif_decoderow = _TIFFNoRowDecode;
|
|
||||||
tif->tif_decodestrip = _TIFFNoStripDecode;
|
|
||||||
tif->tif_decodetile = _TIFFNoTileDecode;
|
|
||||||
tif->tif_encodestatus = TRUE;
|
|
||||||
tif->tif_setupencode = _TIFFtrue;
|
|
||||||
tif->tif_preencode = _TIFFNoPreCode;
|
|
||||||
tif->tif_postencode = _TIFFtrue;
|
|
||||||
tif->tif_encoderow = _TIFFNoRowEncode;
|
|
||||||
tif->tif_encodestrip = _TIFFNoStripEncode;
|
|
||||||
tif->tif_encodetile = _TIFFNoTileEncode;
|
|
||||||
tif->tif_close = _TIFFvoid;
|
|
||||||
tif->tif_seek = _TIFFNoSeek;
|
|
||||||
tif->tif_cleanup = _TIFFvoid;
|
|
||||||
tif->tif_defstripsize = _TIFFDefaultStripSize;
|
|
||||||
tif->tif_deftilesize = _TIFFDefaultTileSize;
|
|
||||||
tif->tif_flags &= ~(TIFF_NOBITREV|TIFF_NOREADRAW);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
TIFFSetCompressionScheme(TIFF* tif, int scheme)
|
|
||||||
{
|
|
||||||
const TIFFCodec *c = TIFFFindCODEC((uint16) scheme);
|
|
||||||
|
|
||||||
_TIFFSetDefaultCompressionState(tif);
|
|
||||||
/*
|
|
||||||
* Don't treat an unknown compression scheme as an error.
|
|
||||||
* This permits applications to open files with data that
|
|
||||||
* the library does not have builtin support for, but which
|
|
||||||
* may still be meaningful.
|
|
||||||
*/
|
|
||||||
return (c ? (*c->init)(tif, scheme) : 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Other compression schemes may be registered. Registered
|
|
||||||
* schemes can also override the builtin versions provided
|
|
||||||
* by this library.
|
|
||||||
*/
|
|
||||||
typedef struct _codec {
|
|
||||||
struct _codec* next;
|
|
||||||
TIFFCodec* info;
|
|
||||||
} codec_t;
|
|
||||||
static codec_t* registeredCODECS = NULL;
|
|
||||||
|
|
||||||
const TIFFCodec*
|
|
||||||
TIFFFindCODEC(uint16 scheme)
|
|
||||||
{
|
|
||||||
const TIFFCodec* c;
|
|
||||||
codec_t* cd;
|
|
||||||
|
|
||||||
for (cd = registeredCODECS; cd; cd = cd->next)
|
|
||||||
if (cd->info->scheme == scheme)
|
|
||||||
return ((const TIFFCodec*) cd->info);
|
|
||||||
for (c = _TIFFBuiltinCODECS; c->name; c++)
|
|
||||||
if (c->scheme == scheme)
|
|
||||||
return (c);
|
|
||||||
return ((const TIFFCodec*) 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
TIFFCodec*
|
|
||||||
TIFFRegisterCODEC(uint16 scheme, const char* name, TIFFInitMethod init)
|
|
||||||
{
|
|
||||||
codec_t* cd = (codec_t*)
|
|
||||||
_TIFFmalloc(sizeof (codec_t) + sizeof (TIFFCodec) + strlen(name)+1);
|
|
||||||
|
|
||||||
if (cd != NULL) {
|
|
||||||
cd->info = (TIFFCodec*) ((tidata_t) cd + sizeof (codec_t));
|
|
||||||
cd->info->name = (char*)
|
|
||||||
((tidata_t) cd->info + sizeof (TIFFCodec));
|
|
||||||
strcpy(cd->info->name, name);
|
|
||||||
cd->info->scheme = scheme;
|
|
||||||
cd->info->init = init;
|
|
||||||
cd->next = registeredCODECS;
|
|
||||||
registeredCODECS = cd;
|
|
||||||
} else {
|
|
||||||
TIFFErrorExt(0, "TIFFRegisterCODEC",
|
|
||||||
"No space to register compression scheme %s", name);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return (cd->info);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
TIFFUnRegisterCODEC(TIFFCodec* c)
|
|
||||||
{
|
|
||||||
codec_t* cd;
|
|
||||||
codec_t** pcd;
|
|
||||||
|
|
||||||
for (pcd = ®isteredCODECS; (cd = *pcd); pcd = &cd->next)
|
|
||||||
if (cd->info == c) {
|
|
||||||
*pcd = cd->next;
|
|
||||||
_TIFFfree(cd);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
TIFFErrorExt(0, "TIFFUnRegisterCODEC",
|
|
||||||
"Cannot remove compression scheme %s; not registered", c->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
/************************************************************************/
|
|
||||||
/* TIFFGetConfisuredCODECs() */
|
|
||||||
/************************************************************************/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get list of configured codecs, both built-in and registered by user.
|
|
||||||
* Caller is responsible to free this structure.
|
|
||||||
*
|
|
||||||
* @return returns array of TIFFCodec records (the last record should be NULL)
|
|
||||||
* or NULL if function failed.
|
|
||||||
*/
|
|
||||||
|
|
||||||
TIFFCodec*
|
|
||||||
TIFFGetConfiguredCODECs()
|
|
||||||
{
|
|
||||||
int i = 1;
|
|
||||||
codec_t *cd;
|
|
||||||
const TIFFCodec *c;
|
|
||||||
TIFFCodec *codecs = NULL, *new_codecs;
|
|
||||||
|
|
||||||
for (cd = registeredCODECS; cd; cd = cd->next) {
|
|
||||||
new_codecs = (TIFFCodec *)
|
|
||||||
_TIFFrealloc(codecs, i * sizeof(TIFFCodec));
|
|
||||||
if (!new_codecs) {
|
|
||||||
_TIFFfree (codecs);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
codecs = new_codecs;
|
|
||||||
_TIFFmemcpy(codecs + i - 1, cd, sizeof(TIFFCodec));
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
for (c = _TIFFBuiltinCODECS; c->name; c++) {
|
|
||||||
if (TIFFIsCODECConfigured(c->scheme)) {
|
|
||||||
new_codecs = (TIFFCodec *)
|
|
||||||
_TIFFrealloc(codecs, i * sizeof(TIFFCodec));
|
|
||||||
if (!new_codecs) {
|
|
||||||
_TIFFfree (codecs);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
codecs = new_codecs;
|
|
||||||
_TIFFmemcpy(codecs + i - 1, (const tdata_t)c, sizeof(TIFFCodec));
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
new_codecs = (TIFFCodec *) _TIFFrealloc(codecs, i * sizeof(TIFFCodec));
|
|
||||||
if (!new_codecs) {
|
|
||||||
_TIFFfree (codecs);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
codecs = new_codecs;
|
|
||||||
_TIFFmemset(codecs + i - 1, 0, sizeof(TIFFCodec));
|
|
||||||
|
|
||||||
return codecs;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
@@ -1,310 +0,0 @@
|
|||||||
/* libtiff/tif_config.h. Generated from tif_config.h.in by configure. */
|
|
||||||
/* libtiff/tif_config.h.in. Generated from configure.ac by autoheader. */
|
|
||||||
|
|
||||||
/* Define if building universal (internal helper macro) */
|
|
||||||
/* #undef AC_APPLE_UNIVERSAL_BUILD */
|
|
||||||
|
|
||||||
/* Support CCITT Group 3 & 4 algorithms */
|
|
||||||
#define CCITT_SUPPORT 1
|
|
||||||
|
|
||||||
/* Pick up YCbCr subsampling info from the JPEG data stream to support files
|
|
||||||
lacking the tag (default enabled). */
|
|
||||||
#define CHECK_JPEG_YCBCR_SUBSAMPLING 1
|
|
||||||
|
|
||||||
/* Support C++ stream API (requires C++ compiler) */
|
|
||||||
#define CXX_SUPPORT 1
|
|
||||||
|
|
||||||
/* Treat extra sample as alpha (default enabled). The RGBA interface will
|
|
||||||
treat a fourth sample with no EXTRASAMPLE_ value as being ASSOCALPHA. Many
|
|
||||||
packages produce RGBA files but don't mark the alpha properly. */
|
|
||||||
#define DEFAULT_EXTRASAMPLE_AS_ALPHA 1
|
|
||||||
|
|
||||||
/* Use the Apple OpenGL framework. */
|
|
||||||
/* #undef HAVE_APPLE_OPENGL_FRAMEWORK */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <assert.h> header file. */
|
|
||||||
#define HAVE_ASSERT_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <dlfcn.h> header file. */
|
|
||||||
#define HAVE_DLFCN_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <fcntl.h> header file. */
|
|
||||||
#define HAVE_FCNTL_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `floor' function. */
|
|
||||||
#define HAVE_FLOOR 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `getopt' function. */
|
|
||||||
#define HAVE_GETOPT 1
|
|
||||||
|
|
||||||
/* Define as 0 or 1 according to the floating point format suported by the
|
|
||||||
machine */
|
|
||||||
#define HAVE_IEEEFP 1
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `int16'. */
|
|
||||||
/* #undef HAVE_INT16 */
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `int32'. */
|
|
||||||
/* #undef HAVE_INT32 */
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `int8'. */
|
|
||||||
/* #undef HAVE_INT8 */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
|
||||||
#define HAVE_INTTYPES_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <io.h> header file. */
|
|
||||||
/* #undef HAVE_IO_H */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `isascii' function. */
|
|
||||||
#define HAVE_ISASCII 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `jbg_newlen' function. */
|
|
||||||
/* #undef HAVE_JBG_NEWLEN */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `lfind' function. */
|
|
||||||
#define HAVE_LFIND 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `c' library (-lc). */
|
|
||||||
/* #undef HAVE_LIBC */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `m' library (-lm). */
|
|
||||||
/* #undef HAVE_LIBM */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <limits.h> header file. */
|
|
||||||
#define HAVE_LIMITS_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <malloc.h> header file. */
|
|
||||||
#define HAVE_MALLOC_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `memmove' function. */
|
|
||||||
#define HAVE_MEMMOVE 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <memory.h> header file. */
|
|
||||||
#define HAVE_MEMORY_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `memset' function. */
|
|
||||||
#define HAVE_MEMSET 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `mmap' function. */
|
|
||||||
#define HAVE_MMAP 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `pow' function. */
|
|
||||||
#define HAVE_POW 1
|
|
||||||
|
|
||||||
/* Define if you have POSIX threads libraries and header files. */
|
|
||||||
#define HAVE_PTHREAD 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <search.h> header file. */
|
|
||||||
#define HAVE_SEARCH_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `setmode' function. */
|
|
||||||
/* #undef HAVE_SETMODE */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `sqrt' function. */
|
|
||||||
#define HAVE_SQRT 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <stdint.h> header file. */
|
|
||||||
#define HAVE_STDINT_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
|
||||||
#define HAVE_STDLIB_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strcasecmp' function. */
|
|
||||||
#define HAVE_STRCASECMP 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strchr' function. */
|
|
||||||
#define HAVE_STRCHR 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <strings.h> header file. */
|
|
||||||
#define HAVE_STRINGS_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <string.h> header file. */
|
|
||||||
#define HAVE_STRING_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strrchr' function. */
|
|
||||||
#define HAVE_STRRCHR 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strstr' function. */
|
|
||||||
#define HAVE_STRSTR 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strtol' function. */
|
|
||||||
#define HAVE_STRTOL 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strtoul' function. */
|
|
||||||
#define HAVE_STRTOUL 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
|
||||||
#define HAVE_SYS_STAT_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/time.h> header file. */
|
|
||||||
#define HAVE_SYS_TIME_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
|
||||||
#define HAVE_SYS_TYPES_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <unistd.h> header file. */
|
|
||||||
#define HAVE_UNISTD_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <windows.h> header file. */
|
|
||||||
/* #undef HAVE_WINDOWS_H */
|
|
||||||
|
|
||||||
/* Native cpu byte order: 1 if big-endian (Motorola) or 0 if little-endian
|
|
||||||
(Intel) */
|
|
||||||
#define HOST_BIGENDIAN 0
|
|
||||||
|
|
||||||
/* Set the native cpu bit order (FILLORDER_LSB2MSB or FILLORDER_MSB2LSB) */
|
|
||||||
#define HOST_FILLORDER FILLORDER_LSB2MSB
|
|
||||||
|
|
||||||
/* Support ISO JBIG compression (requires JBIG-KIT library) */
|
|
||||||
/* #undef JBIG_SUPPORT */
|
|
||||||
|
|
||||||
/* Support JPEG compression (requires IJG JPEG library) */
|
|
||||||
#define JPEG_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support LogLuv high dynamic range encoding */
|
|
||||||
#define LOGLUV_SUPPORT 1
|
|
||||||
|
|
||||||
/* Define to the sub-directory in which libtool stores uninstalled libraries.
|
|
||||||
*/
|
|
||||||
#define LT_OBJDIR ".libs/"
|
|
||||||
|
|
||||||
/* Support LZW algorithm */
|
|
||||||
#define LZW_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support Microsoft Document Imaging format */
|
|
||||||
#define MDI_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support NeXT 2-bit RLE algorithm */
|
|
||||||
#define NEXT_SUPPORT 1
|
|
||||||
|
|
||||||
/* Define to 1 if your C compiler doesn't accept -c and -o together. */
|
|
||||||
/* #undef NO_MINUS_C_MINUS_O */
|
|
||||||
|
|
||||||
/* Support Old JPEG compresson (read-only) */
|
|
||||||
#define OJPEG_SUPPORT 1
|
|
||||||
|
|
||||||
/* Name of package */
|
|
||||||
#define PACKAGE "tiff"
|
|
||||||
|
|
||||||
/* Define to the address where bug reports for this package should be sent. */
|
|
||||||
#define PACKAGE_BUGREPORT "[email protected]"
|
|
||||||
|
|
||||||
/* Define to the full name of this package. */
|
|
||||||
#define PACKAGE_NAME "LibTIFF Software"
|
|
||||||
|
|
||||||
/* Define to the full name and version of this package. */
|
|
||||||
#define PACKAGE_STRING "LibTIFF Software 3.9.2"
|
|
||||||
|
|
||||||
/* Define to the one symbol short name of this package. */
|
|
||||||
#define PACKAGE_TARNAME "tiff"
|
|
||||||
|
|
||||||
/* Define to the home page for this package. */
|
|
||||||
#define PACKAGE_URL ""
|
|
||||||
|
|
||||||
/* Define to the version of this package. */
|
|
||||||
#define PACKAGE_VERSION "3.9.2"
|
|
||||||
|
|
||||||
/* Support Macintosh PackBits algorithm */
|
|
||||||
#define PACKBITS_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support Pixar log-format algorithm (requires Zlib) */
|
|
||||||
#define PIXARLOG_SUPPORT 1
|
|
||||||
|
|
||||||
/* Define to necessary symbol if this constant uses a non-standard name on
|
|
||||||
your system. */
|
|
||||||
/* #undef PTHREAD_CREATE_JOINABLE */
|
|
||||||
|
|
||||||
/* The size of `int', as computed by sizeof. */
|
|
||||||
#define SIZEOF_INT 4
|
|
||||||
|
|
||||||
/* The size of `long', as computed by sizeof. */
|
|
||||||
#define SIZEOF_LONG 4
|
|
||||||
|
|
||||||
/* The size of `signed long', as computed by sizeof. */
|
|
||||||
#define SIZEOF_SIGNED_LONG 4
|
|
||||||
|
|
||||||
/* The size of `signed long long', as computed by sizeof. */
|
|
||||||
#define SIZEOF_SIGNED_LONG_LONG 8
|
|
||||||
|
|
||||||
/* The size of `unsigned long', as computed by sizeof. */
|
|
||||||
#define SIZEOF_UNSIGNED_LONG 4
|
|
||||||
|
|
||||||
/* The size of `unsigned long long', as computed by sizeof. */
|
|
||||||
#define SIZEOF_UNSIGNED_LONG_LONG 8
|
|
||||||
|
|
||||||
/* Define to 1 if you have the ANSI C header files. */
|
|
||||||
#define STDC_HEADERS 1
|
|
||||||
|
|
||||||
/* Support strip chopping (whether or not to convert single-strip uncompressed
|
|
||||||
images to mutiple strips of specified size to reduce memory usage) */
|
|
||||||
#define STRIPCHOP_DEFAULT TIFF_STRIPCHOP
|
|
||||||
|
|
||||||
/* Default size of the strip in bytes (when strip chopping enabled) */
|
|
||||||
#define STRIP_SIZE_DEFAULT 8192
|
|
||||||
|
|
||||||
/* Enable SubIFD tag (330) support */
|
|
||||||
#define SUBIFD_SUPPORT 1
|
|
||||||
|
|
||||||
/* Support ThunderScan 4-bit RLE algorithm */
|
|
||||||
#define THUNDER_SUPPORT 1
|
|
||||||
|
|
||||||
/* Signed 64-bit type formatter */
|
|
||||||
#define TIFF_INT64_FORMAT "%lld"
|
|
||||||
|
|
||||||
/* Signed 64-bit type */
|
|
||||||
#define TIFF_INT64_T signed long long
|
|
||||||
|
|
||||||
/* Unsigned 64-bit type formatter */
|
|
||||||
#define TIFF_UINT64_FORMAT "%llu"
|
|
||||||
|
|
||||||
/* Unsigned 64-bit type */
|
|
||||||
#define TIFF_UINT64_T unsigned long long
|
|
||||||
|
|
||||||
/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
|
|
||||||
#define TIME_WITH_SYS_TIME 1
|
|
||||||
|
|
||||||
/* Define to 1 if your <sys/time.h> declares `struct tm'. */
|
|
||||||
/* #undef TM_IN_SYS_TIME */
|
|
||||||
|
|
||||||
/* Version number of package */
|
|
||||||
#define VERSION "3.9.2"
|
|
||||||
|
|
||||||
/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
|
|
||||||
significant byte first (like Motorola and SPARC, unlike Intel). */
|
|
||||||
#if defined AC_APPLE_UNIVERSAL_BUILD
|
|
||||||
# if defined __BIG_ENDIAN__
|
|
||||||
# define WORDS_BIGENDIAN 1
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# ifndef WORDS_BIGENDIAN
|
|
||||||
/* # undef WORDS_BIGENDIAN */
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Define to 1 if the X Window System is missing or not being used. */
|
|
||||||
#define X_DISPLAY_MISSING 1
|
|
||||||
|
|
||||||
/* Support Deflate compression */
|
|
||||||
#define ZIP_SUPPORT 1
|
|
||||||
|
|
||||||
/* Number of bits in a file offset, on hosts where this is settable. */
|
|
||||||
/* #undef _FILE_OFFSET_BITS */
|
|
||||||
|
|
||||||
/* Define for large files, on AIX-style hosts. */
|
|
||||||
/* #undef _LARGE_FILES */
|
|
||||||
|
|
||||||
/* Define to empty if `const' does not conform to ANSI C. */
|
|
||||||
/* #undef const */
|
|
||||||
|
|
||||||
/* Define to `__inline__' or `__inline' if that's what the C compiler
|
|
||||||
calls it, or to nothing if 'inline' is not supported under any name. */
|
|
||||||
#ifndef __cplusplus
|
|
||||||
/* #undef inline */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Define to `long int' if <sys/types.h> does not define. */
|
|
||||||
/* #undef off_t */
|
|
||||||
|
|
||||||
/* Define to `unsigned int' if <sys/types.h> does not define. */
|
|
||||||
/* #undef size_t */
|
|
||||||
@@ -1,309 +0,0 @@
|
|||||||
/* libtiff/tif_config.h.in. Generated from configure.ac by autoheader. */
|
|
||||||
|
|
||||||
/* Define if building universal (internal helper macro) */
|
|
||||||
#undef AC_APPLE_UNIVERSAL_BUILD
|
|
||||||
|
|
||||||
/* Support CCITT Group 3 & 4 algorithms */
|
|
||||||
#undef CCITT_SUPPORT
|
|
||||||
|
|
||||||
/* Pick up YCbCr subsampling info from the JPEG data stream to support files
|
|
||||||
lacking the tag (default enabled). */
|
|
||||||
#undef CHECK_JPEG_YCBCR_SUBSAMPLING
|
|
||||||
|
|
||||||
/* Support C++ stream API (requires C++ compiler) */
|
|
||||||
#undef CXX_SUPPORT
|
|
||||||
|
|
||||||
/* Treat extra sample as alpha (default enabled). The RGBA interface will
|
|
||||||
treat a fourth sample with no EXTRASAMPLE_ value as being ASSOCALPHA. Many
|
|
||||||
packages produce RGBA files but don't mark the alpha properly. */
|
|
||||||
#undef DEFAULT_EXTRASAMPLE_AS_ALPHA
|
|
||||||
|
|
||||||
/* Use the Apple OpenGL framework. */
|
|
||||||
#undef HAVE_APPLE_OPENGL_FRAMEWORK
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <assert.h> header file. */
|
|
||||||
#undef HAVE_ASSERT_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <dlfcn.h> header file. */
|
|
||||||
#undef HAVE_DLFCN_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <fcntl.h> header file. */
|
|
||||||
#undef HAVE_FCNTL_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `floor' function. */
|
|
||||||
#undef HAVE_FLOOR
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `getopt' function. */
|
|
||||||
#undef HAVE_GETOPT
|
|
||||||
|
|
||||||
/* Define as 0 or 1 according to the floating point format suported by the
|
|
||||||
machine */
|
|
||||||
#undef HAVE_IEEEFP
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `int16'. */
|
|
||||||
#undef HAVE_INT16
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `int32'. */
|
|
||||||
#undef HAVE_INT32
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `int8'. */
|
|
||||||
#undef HAVE_INT8
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
|
||||||
#undef HAVE_INTTYPES_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <io.h> header file. */
|
|
||||||
#undef HAVE_IO_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `isascii' function. */
|
|
||||||
#undef HAVE_ISASCII
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `jbg_newlen' function. */
|
|
||||||
#undef HAVE_JBG_NEWLEN
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `lfind' function. */
|
|
||||||
#undef HAVE_LFIND
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `c' library (-lc). */
|
|
||||||
#undef HAVE_LIBC
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `m' library (-lm). */
|
|
||||||
#undef HAVE_LIBM
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <limits.h> header file. */
|
|
||||||
#undef HAVE_LIMITS_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <malloc.h> header file. */
|
|
||||||
#undef HAVE_MALLOC_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `memmove' function. */
|
|
||||||
#undef HAVE_MEMMOVE
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <memory.h> header file. */
|
|
||||||
#undef HAVE_MEMORY_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `memset' function. */
|
|
||||||
#undef HAVE_MEMSET
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `mmap' function. */
|
|
||||||
#undef HAVE_MMAP
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `pow' function. */
|
|
||||||
#undef HAVE_POW
|
|
||||||
|
|
||||||
/* Define if you have POSIX threads libraries and header files. */
|
|
||||||
#undef HAVE_PTHREAD
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <search.h> header file. */
|
|
||||||
#undef HAVE_SEARCH_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `setmode' function. */
|
|
||||||
#undef HAVE_SETMODE
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `sqrt' function. */
|
|
||||||
#undef HAVE_SQRT
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <stdint.h> header file. */
|
|
||||||
#undef HAVE_STDINT_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
|
||||||
#undef HAVE_STDLIB_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strcasecmp' function. */
|
|
||||||
#undef HAVE_STRCASECMP
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strchr' function. */
|
|
||||||
#undef HAVE_STRCHR
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <strings.h> header file. */
|
|
||||||
#undef HAVE_STRINGS_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <string.h> header file. */
|
|
||||||
#undef HAVE_STRING_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strrchr' function. */
|
|
||||||
#undef HAVE_STRRCHR
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strstr' function. */
|
|
||||||
#undef HAVE_STRSTR
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strtol' function. */
|
|
||||||
#undef HAVE_STRTOL
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strtoul' function. */
|
|
||||||
#undef HAVE_STRTOUL
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
|
||||||
#undef HAVE_SYS_STAT_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/time.h> header file. */
|
|
||||||
#undef HAVE_SYS_TIME_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
|
||||||
#undef HAVE_SYS_TYPES_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <unistd.h> header file. */
|
|
||||||
#undef HAVE_UNISTD_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <windows.h> header file. */
|
|
||||||
#undef HAVE_WINDOWS_H
|
|
||||||
|
|
||||||
/* Native cpu byte order: 1 if big-endian (Motorola) or 0 if little-endian
|
|
||||||
(Intel) */
|
|
||||||
#undef HOST_BIGENDIAN
|
|
||||||
|
|
||||||
/* Set the native cpu bit order (FILLORDER_LSB2MSB or FILLORDER_MSB2LSB) */
|
|
||||||
#undef HOST_FILLORDER
|
|
||||||
|
|
||||||
/* Support ISO JBIG compression (requires JBIG-KIT library) */
|
|
||||||
#undef JBIG_SUPPORT
|
|
||||||
|
|
||||||
/* Support JPEG compression (requires IJG JPEG library) */
|
|
||||||
#undef JPEG_SUPPORT
|
|
||||||
|
|
||||||
/* Support LogLuv high dynamic range encoding */
|
|
||||||
#undef LOGLUV_SUPPORT
|
|
||||||
|
|
||||||
/* Define to the sub-directory in which libtool stores uninstalled libraries.
|
|
||||||
*/
|
|
||||||
#undef LT_OBJDIR
|
|
||||||
|
|
||||||
/* Support LZW algorithm */
|
|
||||||
#undef LZW_SUPPORT
|
|
||||||
|
|
||||||
/* Support Microsoft Document Imaging format */
|
|
||||||
#undef MDI_SUPPORT
|
|
||||||
|
|
||||||
/* Support NeXT 2-bit RLE algorithm */
|
|
||||||
#undef NEXT_SUPPORT
|
|
||||||
|
|
||||||
/* Define to 1 if your C compiler doesn't accept -c and -o together. */
|
|
||||||
#undef NO_MINUS_C_MINUS_O
|
|
||||||
|
|
||||||
/* Support Old JPEG compresson (read-only) */
|
|
||||||
#undef OJPEG_SUPPORT
|
|
||||||
|
|
||||||
/* Name of package */
|
|
||||||
#undef PACKAGE
|
|
||||||
|
|
||||||
/* Define to the address where bug reports for this package should be sent. */
|
|
||||||
#undef PACKAGE_BUGREPORT
|
|
||||||
|
|
||||||
/* Define to the full name of this package. */
|
|
||||||
#undef PACKAGE_NAME
|
|
||||||
|
|
||||||
/* Define to the full name and version of this package. */
|
|
||||||
#undef PACKAGE_STRING
|
|
||||||
|
|
||||||
/* Define to the one symbol short name of this package. */
|
|
||||||
#undef PACKAGE_TARNAME
|
|
||||||
|
|
||||||
/* Define to the home page for this package. */
|
|
||||||
#undef PACKAGE_URL
|
|
||||||
|
|
||||||
/* Define to the version of this package. */
|
|
||||||
#undef PACKAGE_VERSION
|
|
||||||
|
|
||||||
/* Support Macintosh PackBits algorithm */
|
|
||||||
#undef PACKBITS_SUPPORT
|
|
||||||
|
|
||||||
/* Support Pixar log-format algorithm (requires Zlib) */
|
|
||||||
#undef PIXARLOG_SUPPORT
|
|
||||||
|
|
||||||
/* Define to necessary symbol if this constant uses a non-standard name on
|
|
||||||
your system. */
|
|
||||||
#undef PTHREAD_CREATE_JOINABLE
|
|
||||||
|
|
||||||
/* The size of `int', as computed by sizeof. */
|
|
||||||
#undef SIZEOF_INT
|
|
||||||
|
|
||||||
/* The size of `long', as computed by sizeof. */
|
|
||||||
#undef SIZEOF_LONG
|
|
||||||
|
|
||||||
/* The size of `signed long', as computed by sizeof. */
|
|
||||||
#undef SIZEOF_SIGNED_LONG
|
|
||||||
|
|
||||||
/* The size of `signed long long', as computed by sizeof. */
|
|
||||||
#undef SIZEOF_SIGNED_LONG_LONG
|
|
||||||
|
|
||||||
/* The size of `unsigned long', as computed by sizeof. */
|
|
||||||
#undef SIZEOF_UNSIGNED_LONG
|
|
||||||
|
|
||||||
/* The size of `unsigned long long', as computed by sizeof. */
|
|
||||||
#undef SIZEOF_UNSIGNED_LONG_LONG
|
|
||||||
|
|
||||||
/* Define to 1 if you have the ANSI C header files. */
|
|
||||||
#undef STDC_HEADERS
|
|
||||||
|
|
||||||
/* Support strip chopping (whether or not to convert single-strip uncompressed
|
|
||||||
images to mutiple strips of specified size to reduce memory usage) */
|
|
||||||
#undef STRIPCHOP_DEFAULT
|
|
||||||
|
|
||||||
/* Default size of the strip in bytes (when strip chopping enabled) */
|
|
||||||
#undef STRIP_SIZE_DEFAULT
|
|
||||||
|
|
||||||
/* Enable SubIFD tag (330) support */
|
|
||||||
#undef SUBIFD_SUPPORT
|
|
||||||
|
|
||||||
/* Support ThunderScan 4-bit RLE algorithm */
|
|
||||||
#undef THUNDER_SUPPORT
|
|
||||||
|
|
||||||
/* Signed 64-bit type formatter */
|
|
||||||
#undef TIFF_INT64_FORMAT
|
|
||||||
|
|
||||||
/* Signed 64-bit type */
|
|
||||||
#undef TIFF_INT64_T
|
|
||||||
|
|
||||||
/* Unsigned 64-bit type formatter */
|
|
||||||
#undef TIFF_UINT64_FORMAT
|
|
||||||
|
|
||||||
/* Unsigned 64-bit type */
|
|
||||||
#undef TIFF_UINT64_T
|
|
||||||
|
|
||||||
/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
|
|
||||||
#undef TIME_WITH_SYS_TIME
|
|
||||||
|
|
||||||
/* Define to 1 if your <sys/time.h> declares `struct tm'. */
|
|
||||||
#undef TM_IN_SYS_TIME
|
|
||||||
|
|
||||||
/* Version number of package */
|
|
||||||
#undef VERSION
|
|
||||||
|
|
||||||
/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
|
|
||||||
significant byte first (like Motorola and SPARC, unlike Intel). */
|
|
||||||
#if defined AC_APPLE_UNIVERSAL_BUILD
|
|
||||||
# if defined __BIG_ENDIAN__
|
|
||||||
# define WORDS_BIGENDIAN 1
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# ifndef WORDS_BIGENDIAN
|
|
||||||
# undef WORDS_BIGENDIAN
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Define to 1 if the X Window System is missing or not being used. */
|
|
||||||
#undef X_DISPLAY_MISSING
|
|
||||||
|
|
||||||
/* Support Deflate compression */
|
|
||||||
#undef ZIP_SUPPORT
|
|
||||||
|
|
||||||
/* Number of bits in a file offset, on hosts where this is settable. */
|
|
||||||
#undef _FILE_OFFSET_BITS
|
|
||||||
|
|
||||||
/* Define for large files, on AIX-style hosts. */
|
|
||||||
#undef _LARGE_FILES
|
|
||||||
|
|
||||||
/* Define to empty if `const' does not conform to ANSI C. */
|
|
||||||
#undef const
|
|
||||||
|
|
||||||
/* Define to `__inline__' or `__inline' if that's what the C compiler
|
|
||||||
calls it, or to nothing if 'inline' is not supported under any name. */
|
|
||||||
#ifndef __cplusplus
|
|
||||||
#undef inline
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Define to `long int' if <sys/types.h> does not define. */
|
|
||||||
#undef off_t
|
|
||||||
|
|
||||||
/* Define to `unsigned int' if <sys/types.h> does not define. */
|
|
||||||
#undef size_t
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,211 +0,0 @@
|
|||||||
/* $Id: tif_dir.h,v 1.30.2.3 2010-06-09 21:15:27 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _TIFFDIR_
|
|
||||||
#define _TIFFDIR_
|
|
||||||
/*
|
|
||||||
* ``Library-private'' Directory-related Definitions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Internal format of a TIFF directory entry.
|
|
||||||
*/
|
|
||||||
typedef struct {
|
|
||||||
#define FIELD_SETLONGS 4
|
|
||||||
/* bit vector of fields that are set */
|
|
||||||
unsigned long td_fieldsset[FIELD_SETLONGS];
|
|
||||||
|
|
||||||
uint32 td_imagewidth, td_imagelength, td_imagedepth;
|
|
||||||
uint32 td_tilewidth, td_tilelength, td_tiledepth;
|
|
||||||
uint32 td_subfiletype;
|
|
||||||
uint16 td_bitspersample;
|
|
||||||
uint16 td_sampleformat;
|
|
||||||
uint16 td_compression;
|
|
||||||
uint16 td_photometric;
|
|
||||||
uint16 td_threshholding;
|
|
||||||
uint16 td_fillorder;
|
|
||||||
uint16 td_orientation;
|
|
||||||
uint16 td_samplesperpixel;
|
|
||||||
uint32 td_rowsperstrip;
|
|
||||||
uint16 td_minsamplevalue, td_maxsamplevalue;
|
|
||||||
double td_sminsamplevalue, td_smaxsamplevalue;
|
|
||||||
float td_xresolution, td_yresolution;
|
|
||||||
uint16 td_resolutionunit;
|
|
||||||
uint16 td_planarconfig;
|
|
||||||
float td_xposition, td_yposition;
|
|
||||||
uint16 td_pagenumber[2];
|
|
||||||
uint16* td_colormap[3];
|
|
||||||
uint16 td_halftonehints[2];
|
|
||||||
uint16 td_extrasamples;
|
|
||||||
uint16* td_sampleinfo;
|
|
||||||
/* even though the name is misleading, td_stripsperimage is the number
|
|
||||||
* of striles (=strips or tiles) per plane, and td_nstrips the total
|
|
||||||
* number of striles */
|
|
||||||
tstrile_t td_stripsperimage;
|
|
||||||
tstrile_t td_nstrips; /* size of offset & bytecount arrays */
|
|
||||||
toff_t* td_stripoffset;
|
|
||||||
toff_t* td_stripbytecount; /* FIXME: it should be tsize_t array */
|
|
||||||
int td_stripbytecountsorted; /* is the bytecount array sorted ascending? */
|
|
||||||
uint16 td_nsubifd;
|
|
||||||
uint32* td_subifd;
|
|
||||||
/* YCbCr parameters */
|
|
||||||
uint16 td_ycbcrsubsampling[2];
|
|
||||||
uint16 td_ycbcrpositioning;
|
|
||||||
/* Colorimetry parameters */
|
|
||||||
float* td_refblackwhite;
|
|
||||||
uint16* td_transferfunction[3];
|
|
||||||
/* CMYK parameters */
|
|
||||||
int td_inknameslen;
|
|
||||||
char* td_inknames;
|
|
||||||
|
|
||||||
int td_customValueCount;
|
|
||||||
TIFFTagValue *td_customValues;
|
|
||||||
} TIFFDirectory;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Field flags used to indicate fields that have
|
|
||||||
* been set in a directory, and to reference fields
|
|
||||||
* when manipulating a directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* FIELD_IGNORE is used to signify tags that are to
|
|
||||||
* be processed but otherwise ignored. This permits
|
|
||||||
* antiquated tags to be quietly read and discarded.
|
|
||||||
* Note that a bit *is* allocated for ignored tags;
|
|
||||||
* this is understood by the directory reading logic
|
|
||||||
* which uses this fact to avoid special-case handling
|
|
||||||
*/
|
|
||||||
#define FIELD_IGNORE 0
|
|
||||||
|
|
||||||
/* multi-item fields */
|
|
||||||
#define FIELD_IMAGEDIMENSIONS 1
|
|
||||||
#define FIELD_TILEDIMENSIONS 2
|
|
||||||
#define FIELD_RESOLUTION 3
|
|
||||||
#define FIELD_POSITION 4
|
|
||||||
|
|
||||||
/* single-item fields */
|
|
||||||
#define FIELD_SUBFILETYPE 5
|
|
||||||
#define FIELD_BITSPERSAMPLE 6
|
|
||||||
#define FIELD_COMPRESSION 7
|
|
||||||
#define FIELD_PHOTOMETRIC 8
|
|
||||||
#define FIELD_THRESHHOLDING 9
|
|
||||||
#define FIELD_FILLORDER 10
|
|
||||||
#define FIELD_ORIENTATION 15
|
|
||||||
#define FIELD_SAMPLESPERPIXEL 16
|
|
||||||
#define FIELD_ROWSPERSTRIP 17
|
|
||||||
#define FIELD_MINSAMPLEVALUE 18
|
|
||||||
#define FIELD_MAXSAMPLEVALUE 19
|
|
||||||
#define FIELD_PLANARCONFIG 20
|
|
||||||
#define FIELD_RESOLUTIONUNIT 22
|
|
||||||
#define FIELD_PAGENUMBER 23
|
|
||||||
#define FIELD_STRIPBYTECOUNTS 24
|
|
||||||
#define FIELD_STRIPOFFSETS 25
|
|
||||||
#define FIELD_COLORMAP 26
|
|
||||||
#define FIELD_EXTRASAMPLES 31
|
|
||||||
#define FIELD_SAMPLEFORMAT 32
|
|
||||||
#define FIELD_SMINSAMPLEVALUE 33
|
|
||||||
#define FIELD_SMAXSAMPLEVALUE 34
|
|
||||||
#define FIELD_IMAGEDEPTH 35
|
|
||||||
#define FIELD_TILEDEPTH 36
|
|
||||||
#define FIELD_HALFTONEHINTS 37
|
|
||||||
#define FIELD_YCBCRSUBSAMPLING 39
|
|
||||||
#define FIELD_YCBCRPOSITIONING 40
|
|
||||||
#define FIELD_REFBLACKWHITE 41
|
|
||||||
#define FIELD_TRANSFERFUNCTION 44
|
|
||||||
#define FIELD_INKNAMES 46
|
|
||||||
#define FIELD_SUBIFD 49
|
|
||||||
/* FIELD_CUSTOM (see tiffio.h) 65 */
|
|
||||||
/* end of support for well-known tags; codec-private tags follow */
|
|
||||||
#define FIELD_CODEC 66 /* base of codec-private tags */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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 query a
|
|
||||||
* codec for a pseudo-tag so allocating a field bit for
|
|
||||||
* one is a waste. If codec wants to promote the notion
|
|
||||||
* of a pseudo-tag being ``set'' or ``unset'' then it can
|
|
||||||
* do using internal state flags without polluting the
|
|
||||||
* field bit space defined for real tags.
|
|
||||||
*/
|
|
||||||
#define FIELD_PSEUDO 0
|
|
||||||
|
|
||||||
#define FIELD_LAST (32*FIELD_SETLONGS-1)
|
|
||||||
|
|
||||||
#define TIFFExtractData(tif, type, v) \
|
|
||||||
((uint32) ((tif)->tif_header.tiff_magic == TIFF_BIGENDIAN ? \
|
|
||||||
((v) >> (tif)->tif_typeshift[type]) & (tif)->tif_typemask[type] : \
|
|
||||||
(v) & (tif)->tif_typemask[type]))
|
|
||||||
#define TIFFInsertData(tif, type, v) \
|
|
||||||
((uint32) ((tif)->tif_header.tiff_magic == TIFF_BIGENDIAN ? \
|
|
||||||
((v) & (tif)->tif_typemask[type]) << (tif)->tif_typeshift[type] : \
|
|
||||||
(v) & (tif)->tif_typemask[type]))
|
|
||||||
|
|
||||||
|
|
||||||
#define BITn(n) (((unsigned long)1L)<<((n)&0x1f))
|
|
||||||
#define BITFIELDn(tif, n) ((tif)->tif_dir.td_fieldsset[(n)/32])
|
|
||||||
#define TIFFFieldSet(tif, field) (BITFIELDn(tif, field) & BITn(field))
|
|
||||||
#define TIFFSetFieldBit(tif, field) (BITFIELDn(tif, field) |= BITn(field))
|
|
||||||
#define TIFFClrFieldBit(tif, field) (BITFIELDn(tif, field) &= ~BITn(field))
|
|
||||||
|
|
||||||
#define FieldSet(fields, f) (fields[(f)/32] & BITn(f))
|
|
||||||
#define ResetFieldBit(fields, f) (fields[(f)/32] &= ~BITn(f))
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
extern const TIFFFieldInfo *_TIFFGetFieldInfo(size_t *);
|
|
||||||
extern const TIFFFieldInfo *_TIFFGetExifFieldInfo(size_t *);
|
|
||||||
extern void _TIFFSetupFieldInfo(TIFF*, const TIFFFieldInfo[], size_t);
|
|
||||||
extern int _TIFFMergeFieldInfo(TIFF*, const TIFFFieldInfo[], int);
|
|
||||||
extern void _TIFFPrintFieldInfo(TIFF*, FILE*);
|
|
||||||
extern TIFFDataType _TIFFSampleToTagType(TIFF*);
|
|
||||||
extern const TIFFFieldInfo* _TIFFFindOrRegisterFieldInfo( TIFF *tif,
|
|
||||||
ttag_t tag,
|
|
||||||
TIFFDataType dt );
|
|
||||||
extern TIFFFieldInfo* _TIFFCreateAnonFieldInfo( TIFF *tif, ttag_t tag,
|
|
||||||
TIFFDataType dt );
|
|
||||||
|
|
||||||
#define _TIFFFindFieldInfo TIFFFindFieldInfo
|
|
||||||
#define _TIFFFindFieldInfoByName TIFFFindFieldInfoByName
|
|
||||||
#define _TIFFFieldWithTag TIFFFieldWithTag
|
|
||||||
#define _TIFFFieldWithName TIFFFieldWithName
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif /* _TIFFDIR_ */
|
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
@@ -1,888 +0,0 @@
|
|||||||
/* $Id: tif_dirinfo.c,v 1.65.2.9 2010-06-09 21:15:27 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF Library.
|
|
||||||
*
|
|
||||||
* Core Directory Tag Support.
|
|
||||||
*/
|
|
||||||
#include "tiffiop.h"
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* NB: NB: THIS ARRAY IS ASSUMED TO BE SORTED BY TAG.
|
|
||||||
* If a tag can have both LONG and SHORT types then the LONG must be
|
|
||||||
* placed before the SHORT for writing to work properly.
|
|
||||||
*
|
|
||||||
* NOTE: The second field (field_readcount) and third field (field_writecount)
|
|
||||||
* sometimes use the values TIFF_VARIABLE (-1), TIFF_VARIABLE2 (-3)
|
|
||||||
* and TIFFTAG_SPP (-2). The macros should be used but would throw off
|
|
||||||
* the formatting of the code, so please interprete the -1, -2 and -3
|
|
||||||
* values accordingly.
|
|
||||||
*/
|
|
||||||
static const TIFFFieldInfo
|
|
||||||
tiffFieldInfo[] = {
|
|
||||||
{ TIFFTAG_SUBFILETYPE, 1, 1, TIFF_LONG, FIELD_SUBFILETYPE,
|
|
||||||
1, 0, "SubfileType" },
|
|
||||||
/* XXX SHORT for compatibility w/ old versions of the library */
|
|
||||||
{ TIFFTAG_SUBFILETYPE, 1, 1, TIFF_SHORT, FIELD_SUBFILETYPE,
|
|
||||||
1, 0, "SubfileType" },
|
|
||||||
{ TIFFTAG_OSUBFILETYPE, 1, 1, TIFF_SHORT, FIELD_SUBFILETYPE,
|
|
||||||
1, 0, "OldSubfileType" },
|
|
||||||
{ TIFFTAG_IMAGEWIDTH, 1, 1, TIFF_LONG, FIELD_IMAGEDIMENSIONS,
|
|
||||||
0, 0, "ImageWidth" },
|
|
||||||
{ TIFFTAG_IMAGEWIDTH, 1, 1, TIFF_SHORT, FIELD_IMAGEDIMENSIONS,
|
|
||||||
0, 0, "ImageWidth" },
|
|
||||||
{ TIFFTAG_IMAGELENGTH, 1, 1, TIFF_LONG, FIELD_IMAGEDIMENSIONS,
|
|
||||||
1, 0, "ImageLength" },
|
|
||||||
{ TIFFTAG_IMAGELENGTH, 1, 1, TIFF_SHORT, FIELD_IMAGEDIMENSIONS,
|
|
||||||
1, 0, "ImageLength" },
|
|
||||||
{ TIFFTAG_BITSPERSAMPLE, -1,-1, TIFF_SHORT, FIELD_BITSPERSAMPLE,
|
|
||||||
0, 0, "BitsPerSample" },
|
|
||||||
/* XXX LONG for compatibility with some broken TIFF writers */
|
|
||||||
{ TIFFTAG_BITSPERSAMPLE, -1,-1, TIFF_LONG, FIELD_BITSPERSAMPLE,
|
|
||||||
0, 0, "BitsPerSample" },
|
|
||||||
{ TIFFTAG_COMPRESSION, -1, 1, TIFF_SHORT, FIELD_COMPRESSION,
|
|
||||||
0, 0, "Compression" },
|
|
||||||
/* XXX LONG for compatibility with some broken TIFF writers */
|
|
||||||
{ TIFFTAG_COMPRESSION, -1, 1, TIFF_LONG, FIELD_COMPRESSION,
|
|
||||||
0, 0, "Compression" },
|
|
||||||
{ TIFFTAG_PHOTOMETRIC, 1, 1, TIFF_SHORT, FIELD_PHOTOMETRIC,
|
|
||||||
0, 0, "PhotometricInterpretation" },
|
|
||||||
/* XXX LONG for compatibility with some broken TIFF writers */
|
|
||||||
{ TIFFTAG_PHOTOMETRIC, 1, 1, TIFF_LONG, FIELD_PHOTOMETRIC,
|
|
||||||
0, 0, "PhotometricInterpretation" },
|
|
||||||
{ TIFFTAG_THRESHHOLDING, 1, 1, TIFF_SHORT, FIELD_THRESHHOLDING,
|
|
||||||
1, 0, "Threshholding" },
|
|
||||||
{ TIFFTAG_CELLWIDTH, 1, 1, TIFF_SHORT, FIELD_IGNORE,
|
|
||||||
1, 0, "CellWidth" },
|
|
||||||
{ TIFFTAG_CELLLENGTH, 1, 1, TIFF_SHORT, FIELD_IGNORE,
|
|
||||||
1, 0, "CellLength" },
|
|
||||||
{ TIFFTAG_FILLORDER, 1, 1, TIFF_SHORT, FIELD_FILLORDER,
|
|
||||||
0, 0, "FillOrder" },
|
|
||||||
{ TIFFTAG_DOCUMENTNAME, -1,-1, TIFF_ASCII, FIELD_CUSTOM,
|
|
||||||
1, 0, "DocumentName" },
|
|
||||||
{ TIFFTAG_IMAGEDESCRIPTION, -1,-1, TIFF_ASCII, FIELD_CUSTOM,
|
|
||||||
1, 0, "ImageDescription" },
|
|
||||||
{ TIFFTAG_MAKE, -1,-1, TIFF_ASCII, FIELD_CUSTOM,
|
|
||||||
1, 0, "Make" },
|
|
||||||
{ TIFFTAG_MODEL, -1,-1, TIFF_ASCII, FIELD_CUSTOM,
|
|
||||||
1, 0, "Model" },
|
|
||||||
{ TIFFTAG_STRIPOFFSETS, -1,-1, TIFF_LONG, FIELD_STRIPOFFSETS,
|
|
||||||
0, 0, "StripOffsets" },
|
|
||||||
{ TIFFTAG_STRIPOFFSETS, -1,-1, TIFF_SHORT, FIELD_STRIPOFFSETS,
|
|
||||||
0, 0, "StripOffsets" },
|
|
||||||
{ TIFFTAG_ORIENTATION, 1, 1, TIFF_SHORT, FIELD_ORIENTATION,
|
|
||||||
0, 0, "Orientation" },
|
|
||||||
{ TIFFTAG_SAMPLESPERPIXEL, 1, 1, TIFF_SHORT, FIELD_SAMPLESPERPIXEL,
|
|
||||||
0, 0, "SamplesPerPixel" },
|
|
||||||
{ TIFFTAG_ROWSPERSTRIP, 1, 1, TIFF_LONG, FIELD_ROWSPERSTRIP,
|
|
||||||
0, 0, "RowsPerStrip" },
|
|
||||||
{ TIFFTAG_ROWSPERSTRIP, 1, 1, TIFF_SHORT, FIELD_ROWSPERSTRIP,
|
|
||||||
0, 0, "RowsPerStrip" },
|
|
||||||
{ TIFFTAG_STRIPBYTECOUNTS, -1,-1, TIFF_LONG, FIELD_STRIPBYTECOUNTS,
|
|
||||||
0, 0, "StripByteCounts" },
|
|
||||||
{ TIFFTAG_STRIPBYTECOUNTS, -1,-1, TIFF_SHORT, FIELD_STRIPBYTECOUNTS,
|
|
||||||
0, 0, "StripByteCounts" },
|
|
||||||
{ TIFFTAG_MINSAMPLEVALUE, -2,-1, TIFF_SHORT, FIELD_MINSAMPLEVALUE,
|
|
||||||
1, 0, "MinSampleValue" },
|
|
||||||
{ TIFFTAG_MAXSAMPLEVALUE, -2,-1, TIFF_SHORT, FIELD_MAXSAMPLEVALUE,
|
|
||||||
1, 0, "MaxSampleValue" },
|
|
||||||
{ TIFFTAG_XRESOLUTION, 1, 1, TIFF_RATIONAL, FIELD_RESOLUTION,
|
|
||||||
1, 0, "XResolution" },
|
|
||||||
{ TIFFTAG_YRESOLUTION, 1, 1, TIFF_RATIONAL, FIELD_RESOLUTION,
|
|
||||||
1, 0, "YResolution" },
|
|
||||||
{ TIFFTAG_PLANARCONFIG, 1, 1, TIFF_SHORT, FIELD_PLANARCONFIG,
|
|
||||||
0, 0, "PlanarConfiguration" },
|
|
||||||
{ TIFFTAG_PAGENAME, -1,-1, TIFF_ASCII, FIELD_CUSTOM,
|
|
||||||
1, 0, "PageName" },
|
|
||||||
{ TIFFTAG_XPOSITION, 1, 1, TIFF_RATIONAL, FIELD_POSITION,
|
|
||||||
1, 0, "XPosition" },
|
|
||||||
{ TIFFTAG_YPOSITION, 1, 1, TIFF_RATIONAL, FIELD_POSITION,
|
|
||||||
1, 0, "YPosition" },
|
|
||||||
{ TIFFTAG_FREEOFFSETS, -1,-1, TIFF_LONG, FIELD_IGNORE,
|
|
||||||
0, 0, "FreeOffsets" },
|
|
||||||
{ TIFFTAG_FREEBYTECOUNTS, -1,-1, TIFF_LONG, FIELD_IGNORE,
|
|
||||||
0, 0, "FreeByteCounts" },
|
|
||||||
{ TIFFTAG_GRAYRESPONSEUNIT, 1, 1, TIFF_SHORT, FIELD_IGNORE,
|
|
||||||
1, 0, "GrayResponseUnit" },
|
|
||||||
{ TIFFTAG_GRAYRESPONSECURVE,-1,-1, TIFF_SHORT, FIELD_IGNORE,
|
|
||||||
1, 0, "GrayResponseCurve" },
|
|
||||||
{ TIFFTAG_RESOLUTIONUNIT, 1, 1, TIFF_SHORT, FIELD_RESOLUTIONUNIT,
|
|
||||||
1, 0, "ResolutionUnit" },
|
|
||||||
{ TIFFTAG_PAGENUMBER, 2, 2, TIFF_SHORT, FIELD_PAGENUMBER,
|
|
||||||
1, 0, "PageNumber" },
|
|
||||||
{ TIFFTAG_COLORRESPONSEUNIT, 1, 1, TIFF_SHORT, FIELD_IGNORE,
|
|
||||||
1, 0, "ColorResponseUnit" },
|
|
||||||
{ TIFFTAG_TRANSFERFUNCTION, -1,-1, TIFF_SHORT, FIELD_TRANSFERFUNCTION,
|
|
||||||
1, 0, "TransferFunction" },
|
|
||||||
{ TIFFTAG_SOFTWARE, -1,-1, TIFF_ASCII, FIELD_CUSTOM,
|
|
||||||
1, 0, "Software" },
|
|
||||||
{ TIFFTAG_DATETIME, 20,20, TIFF_ASCII, FIELD_CUSTOM,
|
|
||||||
1, 0, "DateTime" },
|
|
||||||
{ TIFFTAG_ARTIST, -1,-1, TIFF_ASCII, FIELD_CUSTOM,
|
|
||||||
1, 0, "Artist" },
|
|
||||||
{ TIFFTAG_HOSTCOMPUTER, -1,-1, TIFF_ASCII, FIELD_CUSTOM,
|
|
||||||
1, 0, "HostComputer" },
|
|
||||||
{ TIFFTAG_WHITEPOINT, 2, 2, TIFF_RATIONAL, FIELD_CUSTOM,
|
|
||||||
1, 0, "WhitePoint" },
|
|
||||||
{ TIFFTAG_PRIMARYCHROMATICITIES,6,6,TIFF_RATIONAL, FIELD_CUSTOM,
|
|
||||||
1, 0, "PrimaryChromaticities" },
|
|
||||||
{ TIFFTAG_COLORMAP, -1,-1, TIFF_SHORT, FIELD_COLORMAP,
|
|
||||||
1, 0, "ColorMap" },
|
|
||||||
{ TIFFTAG_HALFTONEHINTS, 2, 2, TIFF_SHORT, FIELD_HALFTONEHINTS,
|
|
||||||
1, 0, "HalftoneHints" },
|
|
||||||
{ TIFFTAG_TILEWIDTH, 1, 1, TIFF_LONG, FIELD_TILEDIMENSIONS,
|
|
||||||
0, 0, "TileWidth" },
|
|
||||||
{ TIFFTAG_TILEWIDTH, 1, 1, TIFF_SHORT, FIELD_TILEDIMENSIONS,
|
|
||||||
0, 0, "TileWidth" },
|
|
||||||
{ TIFFTAG_TILELENGTH, 1, 1, TIFF_LONG, FIELD_TILEDIMENSIONS,
|
|
||||||
0, 0, "TileLength" },
|
|
||||||
{ TIFFTAG_TILELENGTH, 1, 1, TIFF_SHORT, FIELD_TILEDIMENSIONS,
|
|
||||||
0, 0, "TileLength" },
|
|
||||||
{ TIFFTAG_TILEOFFSETS, -1, 1, TIFF_LONG, FIELD_STRIPOFFSETS,
|
|
||||||
0, 0, "TileOffsets" },
|
|
||||||
{ TIFFTAG_TILEBYTECOUNTS, -1, 1, TIFF_LONG, FIELD_STRIPBYTECOUNTS,
|
|
||||||
0, 0, "TileByteCounts" },
|
|
||||||
{ TIFFTAG_TILEBYTECOUNTS, -1, 1, TIFF_SHORT, FIELD_STRIPBYTECOUNTS,
|
|
||||||
0, 0, "TileByteCounts" },
|
|
||||||
{ TIFFTAG_SUBIFD, -1,-1, TIFF_IFD, FIELD_SUBIFD,
|
|
||||||
1, 1, "SubIFD" },
|
|
||||||
{ TIFFTAG_SUBIFD, -1,-1, TIFF_LONG, FIELD_SUBIFD,
|
|
||||||
1, 1, "SubIFD" },
|
|
||||||
{ TIFFTAG_INKSET, 1, 1, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
0, 0, "InkSet" },
|
|
||||||
{ TIFFTAG_INKNAMES, -1,-1, TIFF_ASCII, FIELD_INKNAMES,
|
|
||||||
1, 1, "InkNames" },
|
|
||||||
{ TIFFTAG_NUMBEROFINKS, 1, 1, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
1, 0, "NumberOfInks" },
|
|
||||||
{ TIFFTAG_DOTRANGE, 2, 2, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
0, 0, "DotRange" },
|
|
||||||
{ TIFFTAG_DOTRANGE, 2, 2, TIFF_BYTE, FIELD_CUSTOM,
|
|
||||||
0, 0, "DotRange" },
|
|
||||||
{ TIFFTAG_TARGETPRINTER, -1,-1, TIFF_ASCII, FIELD_CUSTOM,
|
|
||||||
1, 0, "TargetPrinter" },
|
|
||||||
{ TIFFTAG_EXTRASAMPLES, -1,-1, TIFF_SHORT, FIELD_EXTRASAMPLES,
|
|
||||||
0, 1, "ExtraSamples" },
|
|
||||||
/* XXX for bogus Adobe Photoshop v2.5 files */
|
|
||||||
{ TIFFTAG_EXTRASAMPLES, -1,-1, TIFF_BYTE, FIELD_EXTRASAMPLES,
|
|
||||||
0, 1, "ExtraSamples" },
|
|
||||||
{ TIFFTAG_SAMPLEFORMAT, -1,-1, TIFF_SHORT, FIELD_SAMPLEFORMAT,
|
|
||||||
0, 0, "SampleFormat" },
|
|
||||||
{ TIFFTAG_SMINSAMPLEVALUE, -2,-1, TIFF_ANY, FIELD_SMINSAMPLEVALUE,
|
|
||||||
1, 0, "SMinSampleValue" },
|
|
||||||
{ TIFFTAG_SMAXSAMPLEVALUE, -2,-1, TIFF_ANY, FIELD_SMAXSAMPLEVALUE,
|
|
||||||
1, 0, "SMaxSampleValue" },
|
|
||||||
{ TIFFTAG_CLIPPATH, -1, -3, TIFF_BYTE, FIELD_CUSTOM,
|
|
||||||
0, 1, "ClipPath" },
|
|
||||||
{ TIFFTAG_XCLIPPATHUNITS, 1, 1, TIFF_SLONG, FIELD_CUSTOM,
|
|
||||||
0, 0, "XClipPathUnits" },
|
|
||||||
{ TIFFTAG_XCLIPPATHUNITS, 1, 1, TIFF_SSHORT, FIELD_CUSTOM,
|
|
||||||
0, 0, "XClipPathUnits" },
|
|
||||||
{ TIFFTAG_XCLIPPATHUNITS, 1, 1, TIFF_SBYTE, FIELD_CUSTOM,
|
|
||||||
0, 0, "XClipPathUnits" },
|
|
||||||
{ TIFFTAG_YCLIPPATHUNITS, 1, 1, TIFF_SLONG, FIELD_CUSTOM,
|
|
||||||
0, 0, "YClipPathUnits" },
|
|
||||||
{ TIFFTAG_YCLIPPATHUNITS, 1, 1, TIFF_SSHORT, FIELD_CUSTOM,
|
|
||||||
0, 0, "YClipPathUnits" },
|
|
||||||
{ TIFFTAG_YCLIPPATHUNITS, 1, 1, TIFF_SBYTE, FIELD_CUSTOM,
|
|
||||||
0, 0, "YClipPathUnits" },
|
|
||||||
{ TIFFTAG_YCBCRCOEFFICIENTS, 3, 3, TIFF_RATIONAL, FIELD_CUSTOM,
|
|
||||||
0, 0, "YCbCrCoefficients" },
|
|
||||||
{ TIFFTAG_YCBCRSUBSAMPLING, 2, 2, TIFF_SHORT, FIELD_YCBCRSUBSAMPLING,
|
|
||||||
0, 0, "YCbCrSubsampling" },
|
|
||||||
{ TIFFTAG_YCBCRPOSITIONING, 1, 1, TIFF_SHORT, FIELD_YCBCRPOSITIONING,
|
|
||||||
0, 0, "YCbCrPositioning" },
|
|
||||||
{ TIFFTAG_REFERENCEBLACKWHITE, 6, 6, TIFF_RATIONAL, FIELD_REFBLACKWHITE,
|
|
||||||
1, 0, "ReferenceBlackWhite" },
|
|
||||||
/* XXX temporarily accept LONG for backwards compatibility */
|
|
||||||
{ TIFFTAG_REFERENCEBLACKWHITE, 6, 6, TIFF_LONG, FIELD_REFBLACKWHITE,
|
|
||||||
1, 0, "ReferenceBlackWhite" },
|
|
||||||
{ TIFFTAG_XMLPACKET, -3,-3, TIFF_BYTE, FIELD_CUSTOM,
|
|
||||||
0, 1, "XMLPacket" },
|
|
||||||
/* begin SGI tags */
|
|
||||||
{ TIFFTAG_MATTEING, 1, 1, TIFF_SHORT, FIELD_EXTRASAMPLES,
|
|
||||||
0, 0, "Matteing" },
|
|
||||||
{ TIFFTAG_DATATYPE, -2,-1, TIFF_SHORT, FIELD_SAMPLEFORMAT,
|
|
||||||
0, 0, "DataType" },
|
|
||||||
{ TIFFTAG_IMAGEDEPTH, 1, 1, TIFF_LONG, FIELD_IMAGEDEPTH,
|
|
||||||
0, 0, "ImageDepth" },
|
|
||||||
{ TIFFTAG_IMAGEDEPTH, 1, 1, TIFF_SHORT, FIELD_IMAGEDEPTH,
|
|
||||||
0, 0, "ImageDepth" },
|
|
||||||
{ TIFFTAG_TILEDEPTH, 1, 1, TIFF_LONG, FIELD_TILEDEPTH,
|
|
||||||
0, 0, "TileDepth" },
|
|
||||||
{ TIFFTAG_TILEDEPTH, 1, 1, TIFF_SHORT, FIELD_TILEDEPTH,
|
|
||||||
0, 0, "TileDepth" },
|
|
||||||
/* end SGI tags */
|
|
||||||
/* begin Pixar tags */
|
|
||||||
{ TIFFTAG_PIXAR_IMAGEFULLWIDTH, 1, 1, TIFF_LONG, FIELD_CUSTOM,
|
|
||||||
1, 0, "ImageFullWidth" },
|
|
||||||
{ TIFFTAG_PIXAR_IMAGEFULLLENGTH, 1, 1, TIFF_LONG, FIELD_CUSTOM,
|
|
||||||
1, 0, "ImageFullLength" },
|
|
||||||
{ TIFFTAG_PIXAR_TEXTUREFORMAT, -1, -1, TIFF_ASCII, FIELD_CUSTOM,
|
|
||||||
1, 0, "TextureFormat" },
|
|
||||||
{ TIFFTAG_PIXAR_WRAPMODES, -1, -1, TIFF_ASCII, FIELD_CUSTOM,
|
|
||||||
1, 0, "TextureWrapModes" },
|
|
||||||
{ TIFFTAG_PIXAR_FOVCOT, 1, 1, TIFF_FLOAT, FIELD_CUSTOM,
|
|
||||||
1, 0, "FieldOfViewCotangent" },
|
|
||||||
{ TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN, 16,16, TIFF_FLOAT,
|
|
||||||
FIELD_CUSTOM, 1, 0, "MatrixWorldToScreen" },
|
|
||||||
{ TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA, 16,16, TIFF_FLOAT,
|
|
||||||
FIELD_CUSTOM, 1, 0, "MatrixWorldToCamera" },
|
|
||||||
{ TIFFTAG_COPYRIGHT, -1, -1, TIFF_ASCII, FIELD_CUSTOM,
|
|
||||||
1, 0, "Copyright" },
|
|
||||||
/* end Pixar tags */
|
|
||||||
{ TIFFTAG_RICHTIFFIPTC, -3, -3, TIFF_LONG, FIELD_CUSTOM,
|
|
||||||
0, 1, "RichTIFFIPTC" },
|
|
||||||
{ TIFFTAG_PHOTOSHOP, -3, -3, TIFF_BYTE, FIELD_CUSTOM,
|
|
||||||
0, 1, "Photoshop" },
|
|
||||||
{ TIFFTAG_EXIFIFD, 1, 1, TIFF_LONG, FIELD_CUSTOM,
|
|
||||||
0, 0, "EXIFIFDOffset" },
|
|
||||||
{ TIFFTAG_ICCPROFILE, -3, -3, TIFF_UNDEFINED, FIELD_CUSTOM,
|
|
||||||
0, 1, "ICC Profile" },
|
|
||||||
{ TIFFTAG_GPSIFD, 1, 1, TIFF_LONG, FIELD_CUSTOM,
|
|
||||||
0, 0, "GPSIFDOffset" },
|
|
||||||
{ TIFFTAG_STONITS, 1, 1, TIFF_DOUBLE, FIELD_CUSTOM,
|
|
||||||
0, 0, "StoNits" },
|
|
||||||
{ TIFFTAG_INTEROPERABILITYIFD, 1, 1, TIFF_LONG, FIELD_CUSTOM,
|
|
||||||
0, 0, "InteroperabilityIFDOffset" },
|
|
||||||
/* begin DNG tags */
|
|
||||||
{ TIFFTAG_DNGVERSION, 4, 4, TIFF_BYTE, FIELD_CUSTOM,
|
|
||||||
0, 0, "DNGVersion" },
|
|
||||||
{ TIFFTAG_DNGBACKWARDVERSION, 4, 4, TIFF_BYTE, FIELD_CUSTOM,
|
|
||||||
0, 0, "DNGBackwardVersion" },
|
|
||||||
{ TIFFTAG_UNIQUECAMERAMODEL, -1, -1, TIFF_ASCII, FIELD_CUSTOM,
|
|
||||||
1, 0, "UniqueCameraModel" },
|
|
||||||
{ TIFFTAG_LOCALIZEDCAMERAMODEL, -1, -1, TIFF_ASCII, FIELD_CUSTOM,
|
|
||||||
1, 0, "LocalizedCameraModel" },
|
|
||||||
{ TIFFTAG_LOCALIZEDCAMERAMODEL, -1, -1, TIFF_BYTE, FIELD_CUSTOM,
|
|
||||||
1, 1, "LocalizedCameraModel" },
|
|
||||||
{ TIFFTAG_CFAPLANECOLOR, -1, -1, TIFF_BYTE, FIELD_CUSTOM,
|
|
||||||
0, 1, "CFAPlaneColor" },
|
|
||||||
{ TIFFTAG_CFALAYOUT, 1, 1, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
0, 0, "CFALayout" },
|
|
||||||
{ TIFFTAG_LINEARIZATIONTABLE, -1, -1, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
0, 1, "LinearizationTable" },
|
|
||||||
{ TIFFTAG_BLACKLEVELREPEATDIM, 2, 2, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
0, 0, "BlackLevelRepeatDim" },
|
|
||||||
{ TIFFTAG_BLACKLEVEL, -1, -1, TIFF_LONG, FIELD_CUSTOM,
|
|
||||||
0, 1, "BlackLevel" },
|
|
||||||
{ TIFFTAG_BLACKLEVEL, -1, -1, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
0, 1, "BlackLevel" },
|
|
||||||
{ TIFFTAG_BLACKLEVEL, -1, -1, TIFF_RATIONAL, FIELD_CUSTOM,
|
|
||||||
0, 1, "BlackLevel" },
|
|
||||||
{ TIFFTAG_BLACKLEVELDELTAH, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM,
|
|
||||||
0, 1, "BlackLevelDeltaH" },
|
|
||||||
{ TIFFTAG_BLACKLEVELDELTAV, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM,
|
|
||||||
0, 1, "BlackLevelDeltaV" },
|
|
||||||
{ TIFFTAG_WHITELEVEL, -2, -2, TIFF_LONG, FIELD_CUSTOM,
|
|
||||||
0, 0, "WhiteLevel" },
|
|
||||||
{ TIFFTAG_WHITELEVEL, -2, -2, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
0, 0, "WhiteLevel" },
|
|
||||||
{ TIFFTAG_DEFAULTSCALE, 2, 2, TIFF_RATIONAL, FIELD_CUSTOM,
|
|
||||||
0, 0, "DefaultScale" },
|
|
||||||
{ TIFFTAG_BESTQUALITYSCALE, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM,
|
|
||||||
0, 0, "BestQualityScale" },
|
|
||||||
{ TIFFTAG_DEFAULTCROPORIGIN, 2, 2, TIFF_LONG, FIELD_CUSTOM,
|
|
||||||
0, 0, "DefaultCropOrigin" },
|
|
||||||
{ TIFFTAG_DEFAULTCROPORIGIN, 2, 2, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
0, 0, "DefaultCropOrigin" },
|
|
||||||
{ TIFFTAG_DEFAULTCROPORIGIN, 2, 2, TIFF_RATIONAL, FIELD_CUSTOM,
|
|
||||||
0, 0, "DefaultCropOrigin" },
|
|
||||||
{ TIFFTAG_DEFAULTCROPSIZE, 2, 2, TIFF_LONG, FIELD_CUSTOM,
|
|
||||||
0, 0, "DefaultCropSize" },
|
|
||||||
{ TIFFTAG_DEFAULTCROPSIZE, 2, 2, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
0, 0, "DefaultCropSize" },
|
|
||||||
{ TIFFTAG_DEFAULTCROPSIZE, 2, 2, TIFF_RATIONAL, FIELD_CUSTOM,
|
|
||||||
0, 0, "DefaultCropSize" },
|
|
||||||
{ TIFFTAG_COLORMATRIX1, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM,
|
|
||||||
0, 1, "ColorMatrix1" },
|
|
||||||
{ TIFFTAG_COLORMATRIX2, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM,
|
|
||||||
0, 1, "ColorMatrix2" },
|
|
||||||
{ TIFFTAG_CAMERACALIBRATION1, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM,
|
|
||||||
0, 1, "CameraCalibration1" },
|
|
||||||
{ TIFFTAG_CAMERACALIBRATION2, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM,
|
|
||||||
0, 1, "CameraCalibration2" },
|
|
||||||
{ TIFFTAG_REDUCTIONMATRIX1, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM,
|
|
||||||
0, 1, "ReductionMatrix1" },
|
|
||||||
{ TIFFTAG_REDUCTIONMATRIX2, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM,
|
|
||||||
0, 1, "ReductionMatrix2" },
|
|
||||||
{ TIFFTAG_ANALOGBALANCE, -1, -1, TIFF_RATIONAL, FIELD_CUSTOM,
|
|
||||||
0, 1, "AnalogBalance" },
|
|
||||||
{ TIFFTAG_ASSHOTNEUTRAL, -1, -1, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
0, 1, "AsShotNeutral" },
|
|
||||||
{ TIFFTAG_ASSHOTNEUTRAL, -1, -1, TIFF_RATIONAL, FIELD_CUSTOM,
|
|
||||||
0, 1, "AsShotNeutral" },
|
|
||||||
{ TIFFTAG_ASSHOTWHITEXY, 2, 2, TIFF_RATIONAL, FIELD_CUSTOM,
|
|
||||||
0, 0, "AsShotWhiteXY" },
|
|
||||||
{ TIFFTAG_BASELINEEXPOSURE, 1, 1, TIFF_SRATIONAL, FIELD_CUSTOM,
|
|
||||||
0, 0, "BaselineExposure" },
|
|
||||||
{ TIFFTAG_BASELINENOISE, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM,
|
|
||||||
0, 0, "BaselineNoise" },
|
|
||||||
{ TIFFTAG_BASELINESHARPNESS, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM,
|
|
||||||
0, 0, "BaselineSharpness" },
|
|
||||||
{ TIFFTAG_BAYERGREENSPLIT, 1, 1, TIFF_LONG, FIELD_CUSTOM,
|
|
||||||
0, 0, "BayerGreenSplit" },
|
|
||||||
{ TIFFTAG_LINEARRESPONSELIMIT, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM,
|
|
||||||
0, 0, "LinearResponseLimit" },
|
|
||||||
{ TIFFTAG_CAMERASERIALNUMBER, -1, -1, TIFF_ASCII, FIELD_CUSTOM,
|
|
||||||
1, 0, "CameraSerialNumber" },
|
|
||||||
{ TIFFTAG_LENSINFO, 4, 4, TIFF_RATIONAL, FIELD_CUSTOM,
|
|
||||||
0, 0, "LensInfo" },
|
|
||||||
{ TIFFTAG_CHROMABLURRADIUS, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM,
|
|
||||||
0, 0, "ChromaBlurRadius" },
|
|
||||||
{ TIFFTAG_ANTIALIASSTRENGTH, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM,
|
|
||||||
0, 0, "AntiAliasStrength" },
|
|
||||||
{ TIFFTAG_SHADOWSCALE, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM,
|
|
||||||
0, 0, "ShadowScale" },
|
|
||||||
{ TIFFTAG_DNGPRIVATEDATA, -1, -1, TIFF_BYTE, FIELD_CUSTOM,
|
|
||||||
0, 1, "DNGPrivateData" },
|
|
||||||
{ TIFFTAG_MAKERNOTESAFETY, 1, 1, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
0, 0, "MakerNoteSafety" },
|
|
||||||
{ TIFFTAG_CALIBRATIONILLUMINANT1, 1, 1, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
0, 0, "CalibrationIlluminant1" },
|
|
||||||
{ TIFFTAG_CALIBRATIONILLUMINANT2, 1, 1, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
0, 0, "CalibrationIlluminant2" },
|
|
||||||
{ TIFFTAG_RAWDATAUNIQUEID, 16, 16, TIFF_BYTE, FIELD_CUSTOM,
|
|
||||||
0, 0, "RawDataUniqueID" },
|
|
||||||
{ TIFFTAG_ORIGINALRAWFILENAME, -1, -1, TIFF_ASCII, FIELD_CUSTOM,
|
|
||||||
1, 0, "OriginalRawFileName" },
|
|
||||||
{ TIFFTAG_ORIGINALRAWFILENAME, -1, -1, TIFF_BYTE, FIELD_CUSTOM,
|
|
||||||
1, 1, "OriginalRawFileName" },
|
|
||||||
{ TIFFTAG_ORIGINALRAWFILEDATA, -1, -1, TIFF_UNDEFINED, FIELD_CUSTOM,
|
|
||||||
0, 1, "OriginalRawFileData" },
|
|
||||||
{ TIFFTAG_ACTIVEAREA, 4, 4, TIFF_LONG, FIELD_CUSTOM,
|
|
||||||
0, 0, "ActiveArea" },
|
|
||||||
{ TIFFTAG_ACTIVEAREA, 4, 4, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
0, 0, "ActiveArea" },
|
|
||||||
{ TIFFTAG_MASKEDAREAS, -1, -1, TIFF_LONG, FIELD_CUSTOM,
|
|
||||||
0, 1, "MaskedAreas" },
|
|
||||||
{ TIFFTAG_ASSHOTICCPROFILE, -1, -1, TIFF_UNDEFINED, FIELD_CUSTOM,
|
|
||||||
0, 1, "AsShotICCProfile" },
|
|
||||||
{ TIFFTAG_ASSHOTPREPROFILEMATRIX, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM,
|
|
||||||
0, 1, "AsShotPreProfileMatrix" },
|
|
||||||
{ TIFFTAG_CURRENTICCPROFILE, -1, -1, TIFF_UNDEFINED, FIELD_CUSTOM,
|
|
||||||
0, 1, "CurrentICCProfile" },
|
|
||||||
{ TIFFTAG_CURRENTPREPROFILEMATRIX, -1, -1, TIFF_SRATIONAL, FIELD_CUSTOM,
|
|
||||||
0, 1, "CurrentPreProfileMatrix" },
|
|
||||||
/* end DNG tags */
|
|
||||||
};
|
|
||||||
|
|
||||||
static const TIFFFieldInfo
|
|
||||||
exifFieldInfo[] = {
|
|
||||||
{ EXIFTAG_EXPOSURETIME, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM,
|
|
||||||
1, 0, "ExposureTime" },
|
|
||||||
{ EXIFTAG_FNUMBER, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM,
|
|
||||||
1, 0, "FNumber" },
|
|
||||||
{ EXIFTAG_EXPOSUREPROGRAM, 1, 1, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
1, 0, "ExposureProgram" },
|
|
||||||
{ EXIFTAG_SPECTRALSENSITIVITY, -1, -1, TIFF_ASCII, FIELD_CUSTOM,
|
|
||||||
1, 0, "SpectralSensitivity" },
|
|
||||||
{ EXIFTAG_ISOSPEEDRATINGS, -1, -1, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
1, 1, "ISOSpeedRatings" },
|
|
||||||
{ EXIFTAG_OECF, -1, -1, TIFF_UNDEFINED, FIELD_CUSTOM,
|
|
||||||
1, 1, "OptoelectricConversionFactor" },
|
|
||||||
{ EXIFTAG_EXIFVERSION, 4, 4, TIFF_UNDEFINED, FIELD_CUSTOM,
|
|
||||||
1, 0, "ExifVersion" },
|
|
||||||
{ EXIFTAG_DATETIMEORIGINAL, 20, 20, TIFF_ASCII, FIELD_CUSTOM,
|
|
||||||
1, 0, "DateTimeOriginal" },
|
|
||||||
{ EXIFTAG_DATETIMEDIGITIZED, 20, 20, TIFF_ASCII, FIELD_CUSTOM,
|
|
||||||
1, 0, "DateTimeDigitized" },
|
|
||||||
{ EXIFTAG_COMPONENTSCONFIGURATION, 4, 4, TIFF_UNDEFINED, FIELD_CUSTOM,
|
|
||||||
1, 0, "ComponentsConfiguration" },
|
|
||||||
{ EXIFTAG_COMPRESSEDBITSPERPIXEL, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM,
|
|
||||||
1, 0, "CompressedBitsPerPixel" },
|
|
||||||
{ EXIFTAG_SHUTTERSPEEDVALUE, 1, 1, TIFF_SRATIONAL, FIELD_CUSTOM,
|
|
||||||
1, 0, "ShutterSpeedValue" },
|
|
||||||
{ EXIFTAG_APERTUREVALUE, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM,
|
|
||||||
1, 0, "ApertureValue" },
|
|
||||||
{ EXIFTAG_BRIGHTNESSVALUE, 1, 1, TIFF_SRATIONAL, FIELD_CUSTOM,
|
|
||||||
1, 0, "BrightnessValue" },
|
|
||||||
{ EXIFTAG_EXPOSUREBIASVALUE, 1, 1, TIFF_SRATIONAL, FIELD_CUSTOM,
|
|
||||||
1, 0, "ExposureBiasValue" },
|
|
||||||
{ EXIFTAG_MAXAPERTUREVALUE, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM,
|
|
||||||
1, 0, "MaxApertureValue" },
|
|
||||||
{ EXIFTAG_SUBJECTDISTANCE, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM,
|
|
||||||
1, 0, "SubjectDistance" },
|
|
||||||
{ EXIFTAG_METERINGMODE, 1, 1, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
1, 0, "MeteringMode" },
|
|
||||||
{ EXIFTAG_LIGHTSOURCE, 1, 1, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
1, 0, "LightSource" },
|
|
||||||
{ EXIFTAG_FLASH, 1, 1, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
1, 0, "Flash" },
|
|
||||||
{ EXIFTAG_FOCALLENGTH, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM,
|
|
||||||
1, 0, "FocalLength" },
|
|
||||||
{ EXIFTAG_SUBJECTAREA, -1, -1, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
1, 1, "SubjectArea" },
|
|
||||||
{ EXIFTAG_MAKERNOTE, -1, -1, TIFF_UNDEFINED, FIELD_CUSTOM,
|
|
||||||
1, 1, "MakerNote" },
|
|
||||||
{ EXIFTAG_USERCOMMENT, -1, -1, TIFF_UNDEFINED, FIELD_CUSTOM,
|
|
||||||
1, 1, "UserComment" },
|
|
||||||
{ EXIFTAG_SUBSECTIME, -1, -1, TIFF_ASCII, FIELD_CUSTOM,
|
|
||||||
1, 0, "SubSecTime" },
|
|
||||||
{ EXIFTAG_SUBSECTIMEORIGINAL, -1, -1, TIFF_ASCII, FIELD_CUSTOM,
|
|
||||||
1, 0, "SubSecTimeOriginal" },
|
|
||||||
{ EXIFTAG_SUBSECTIMEDIGITIZED,-1, -1, TIFF_ASCII, FIELD_CUSTOM,
|
|
||||||
1, 0, "SubSecTimeDigitized" },
|
|
||||||
{ EXIFTAG_FLASHPIXVERSION, 4, 4, TIFF_UNDEFINED, FIELD_CUSTOM,
|
|
||||||
1, 0, "FlashpixVersion" },
|
|
||||||
{ EXIFTAG_COLORSPACE, 1, 1, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
1, 0, "ColorSpace" },
|
|
||||||
{ EXIFTAG_PIXELXDIMENSION, 1, 1, TIFF_LONG, FIELD_CUSTOM,
|
|
||||||
1, 0, "PixelXDimension" },
|
|
||||||
{ EXIFTAG_PIXELXDIMENSION, 1, 1, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
1, 0, "PixelXDimension" },
|
|
||||||
{ EXIFTAG_PIXELYDIMENSION, 1, 1, TIFF_LONG, FIELD_CUSTOM,
|
|
||||||
1, 0, "PixelYDimension" },
|
|
||||||
{ EXIFTAG_PIXELYDIMENSION, 1, 1, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
1, 0, "PixelYDimension" },
|
|
||||||
{ EXIFTAG_RELATEDSOUNDFILE, 13, 13, TIFF_ASCII, FIELD_CUSTOM,
|
|
||||||
1, 0, "RelatedSoundFile" },
|
|
||||||
{ EXIFTAG_FLASHENERGY, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM,
|
|
||||||
1, 0, "FlashEnergy" },
|
|
||||||
{ EXIFTAG_SPATIALFREQUENCYRESPONSE, -1, -1, TIFF_UNDEFINED, FIELD_CUSTOM,
|
|
||||||
1, 1, "SpatialFrequencyResponse" },
|
|
||||||
{ EXIFTAG_FOCALPLANEXRESOLUTION, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM,
|
|
||||||
1, 0, "FocalPlaneXResolution" },
|
|
||||||
{ EXIFTAG_FOCALPLANEYRESOLUTION, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM,
|
|
||||||
1, 0, "FocalPlaneYResolution" },
|
|
||||||
{ EXIFTAG_FOCALPLANERESOLUTIONUNIT, 1, 1, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
1, 0, "FocalPlaneResolutionUnit" },
|
|
||||||
{ EXIFTAG_SUBJECTLOCATION, 2, 2, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
1, 0, "SubjectLocation" },
|
|
||||||
{ EXIFTAG_EXPOSUREINDEX, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM,
|
|
||||||
1, 0, "ExposureIndex" },
|
|
||||||
{ EXIFTAG_SENSINGMETHOD, 1, 1, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
1, 0, "SensingMethod" },
|
|
||||||
{ EXIFTAG_FILESOURCE, 1, 1, TIFF_UNDEFINED, FIELD_CUSTOM,
|
|
||||||
1, 0, "FileSource" },
|
|
||||||
{ EXIFTAG_SCENETYPE, 1, 1, TIFF_UNDEFINED, FIELD_CUSTOM,
|
|
||||||
1, 0, "SceneType" },
|
|
||||||
{ EXIFTAG_CFAPATTERN, -1, -1, TIFF_UNDEFINED, FIELD_CUSTOM,
|
|
||||||
1, 1, "CFAPattern" },
|
|
||||||
{ EXIFTAG_CUSTOMRENDERED, 1, 1, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
1, 0, "CustomRendered" },
|
|
||||||
{ EXIFTAG_EXPOSUREMODE, 1, 1, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
1, 0, "ExposureMode" },
|
|
||||||
{ EXIFTAG_WHITEBALANCE, 1, 1, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
1, 0, "WhiteBalance" },
|
|
||||||
{ EXIFTAG_DIGITALZOOMRATIO, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM,
|
|
||||||
1, 0, "DigitalZoomRatio" },
|
|
||||||
{ EXIFTAG_FOCALLENGTHIN35MMFILM, 1, 1, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
1, 0, "FocalLengthIn35mmFilm" },
|
|
||||||
{ EXIFTAG_SCENECAPTURETYPE, 1, 1, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
1, 0, "SceneCaptureType" },
|
|
||||||
{ EXIFTAG_GAINCONTROL, 1, 1, TIFF_RATIONAL, FIELD_CUSTOM,
|
|
||||||
1, 0, "GainControl" },
|
|
||||||
{ EXIFTAG_CONTRAST, 1, 1, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
1, 0, "Contrast" },
|
|
||||||
{ EXIFTAG_SATURATION, 1, 1, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
1, 0, "Saturation" },
|
|
||||||
{ EXIFTAG_SHARPNESS, 1, 1, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
1, 0, "Sharpness" },
|
|
||||||
{ EXIFTAG_DEVICESETTINGDESCRIPTION, -1, -1, TIFF_UNDEFINED, FIELD_CUSTOM,
|
|
||||||
1, 1, "DeviceSettingDescription" },
|
|
||||||
{ EXIFTAG_SUBJECTDISTANCERANGE, 1, 1, TIFF_SHORT, FIELD_CUSTOM,
|
|
||||||
1, 0, "SubjectDistanceRange" },
|
|
||||||
{ EXIFTAG_IMAGEUNIQUEID, 33, 33, TIFF_ASCII, FIELD_CUSTOM,
|
|
||||||
1, 0, "ImageUniqueID" }
|
|
||||||
};
|
|
||||||
|
|
||||||
const TIFFFieldInfo *
|
|
||||||
_TIFFGetFieldInfo(size_t *size)
|
|
||||||
{
|
|
||||||
*size = TIFFArrayCount(tiffFieldInfo);
|
|
||||||
return tiffFieldInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
const TIFFFieldInfo *
|
|
||||||
_TIFFGetExifFieldInfo(size_t *size)
|
|
||||||
{
|
|
||||||
*size = TIFFArrayCount(exifFieldInfo);
|
|
||||||
return exifFieldInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
_TIFFSetupFieldInfo(TIFF* tif, const TIFFFieldInfo info[], size_t n)
|
|
||||||
{
|
|
||||||
if (tif->tif_fieldinfo) {
|
|
||||||
size_t i;
|
|
||||||
|
|
||||||
for (i = 0; i < tif->tif_nfields; i++)
|
|
||||||
{
|
|
||||||
TIFFFieldInfo *fld = tif->tif_fieldinfo[i];
|
|
||||||
if (fld->field_bit == FIELD_CUSTOM &&
|
|
||||||
strncmp("Tag ", fld->field_name, 4) == 0) {
|
|
||||||
_TIFFfree(fld->field_name);
|
|
||||||
_TIFFfree(fld);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_TIFFfree(tif->tif_fieldinfo);
|
|
||||||
tif->tif_nfields = 0;
|
|
||||||
}
|
|
||||||
if (!_TIFFMergeFieldInfo(tif, info, n))
|
|
||||||
{
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, "_TIFFSetupFieldInfo",
|
|
||||||
"Setting up field info failed");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
tagCompare(const void* a, const void* b)
|
|
||||||
{
|
|
||||||
const TIFFFieldInfo* ta = *(const TIFFFieldInfo**) a;
|
|
||||||
const TIFFFieldInfo* tb = *(const TIFFFieldInfo**) b;
|
|
||||||
/* NB: be careful of return values for 16-bit platforms */
|
|
||||||
if (ta->field_tag != tb->field_tag)
|
|
||||||
return (int)ta->field_tag - (int)tb->field_tag;
|
|
||||||
else
|
|
||||||
return (ta->field_type == TIFF_ANY) ?
|
|
||||||
0 : ((int)tb->field_type - (int)ta->field_type);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
tagNameCompare(const void* a, const void* b)
|
|
||||||
{
|
|
||||||
const TIFFFieldInfo* ta = *(const TIFFFieldInfo**) a;
|
|
||||||
const TIFFFieldInfo* tb = *(const TIFFFieldInfo**) b;
|
|
||||||
int ret = strcmp(ta->field_name, tb->field_name);
|
|
||||||
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
else
|
|
||||||
return (ta->field_type == TIFF_ANY) ?
|
|
||||||
0 : ((int)tb->field_type - (int)ta->field_type);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
TIFFMergeFieldInfo(TIFF* tif, const TIFFFieldInfo info[], int n)
|
|
||||||
{
|
|
||||||
if (_TIFFMergeFieldInfo(tif, info, n) < 0)
|
|
||||||
{
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, "TIFFMergeFieldInfo",
|
|
||||||
"Merging block of %d fields failed", n);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
_TIFFMergeFieldInfo(TIFF* tif, const TIFFFieldInfo info[], int n)
|
|
||||||
{
|
|
||||||
static const char module[] = "_TIFFMergeFieldInfo";
|
|
||||||
static const char reason[] = "for field info array";
|
|
||||||
TIFFFieldInfo** tp;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
tif->tif_foundfield = NULL;
|
|
||||||
|
|
||||||
if (tif->tif_nfields > 0) {
|
|
||||||
tif->tif_fieldinfo = (TIFFFieldInfo**)
|
|
||||||
_TIFFCheckRealloc(tif, tif->tif_fieldinfo,
|
|
||||||
(tif->tif_nfields + n),
|
|
||||||
sizeof (TIFFFieldInfo*), reason);
|
|
||||||
} else {
|
|
||||||
tif->tif_fieldinfo = (TIFFFieldInfo**)
|
|
||||||
_TIFFCheckMalloc(tif, n, sizeof (TIFFFieldInfo*),
|
|
||||||
reason);
|
|
||||||
}
|
|
||||||
if (!tif->tif_fieldinfo) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
|
||||||
"Failed to allocate field info array");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
tp = tif->tif_fieldinfo + tif->tif_nfields;
|
|
||||||
for (i = 0; i < n; i++)
|
|
||||||
{
|
|
||||||
const TIFFFieldInfo *fip =
|
|
||||||
_TIFFFindFieldInfo(tif, info[i].field_tag, info[i].field_type);
|
|
||||||
|
|
||||||
/* only add definitions that aren't already present */
|
|
||||||
if (!fip) {
|
|
||||||
*tp++ = (TIFFFieldInfo*) (info + i);
|
|
||||||
tif->tif_nfields++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Sort the field info by tag number */
|
|
||||||
qsort(tif->tif_fieldinfo, tif->tif_nfields,
|
|
||||||
sizeof (TIFFFieldInfo*), tagCompare);
|
|
||||||
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
_TIFFPrintFieldInfo(TIFF* tif, FILE* fd)
|
|
||||||
{
|
|
||||||
size_t i;
|
|
||||||
|
|
||||||
fprintf(fd, "%s: \n", tif->tif_name);
|
|
||||||
for (i = 0; i < tif->tif_nfields; i++) {
|
|
||||||
const TIFFFieldInfo* fip = tif->tif_fieldinfo[i];
|
|
||||||
fprintf(fd, "field[%2d] %5lu, %2d, %2d, %d, %2d, %5s, %5s, %s\n"
|
|
||||||
, (int)i
|
|
||||||
, (unsigned long) fip->field_tag
|
|
||||||
, fip->field_readcount, fip->field_writecount
|
|
||||||
, fip->field_type
|
|
||||||
, fip->field_bit
|
|
||||||
, fip->field_oktochange ? "TRUE" : "FALSE"
|
|
||||||
, fip->field_passcount ? "TRUE" : "FALSE"
|
|
||||||
, fip->field_name
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return size of TIFFDataType in bytes
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
TIFFDataWidth(TIFFDataType type)
|
|
||||||
{
|
|
||||||
switch(type)
|
|
||||||
{
|
|
||||||
case 0: /* nothing */
|
|
||||||
case 1: /* TIFF_BYTE */
|
|
||||||
case 2: /* TIFF_ASCII */
|
|
||||||
case 6: /* TIFF_SBYTE */
|
|
||||||
case 7: /* TIFF_UNDEFINED */
|
|
||||||
return 1;
|
|
||||||
case 3: /* TIFF_SHORT */
|
|
||||||
case 8: /* TIFF_SSHORT */
|
|
||||||
return 2;
|
|
||||||
case 4: /* TIFF_LONG */
|
|
||||||
case 9: /* TIFF_SLONG */
|
|
||||||
case 11: /* TIFF_FLOAT */
|
|
||||||
case 13: /* TIFF_IFD */
|
|
||||||
return 4;
|
|
||||||
case 5: /* TIFF_RATIONAL */
|
|
||||||
case 10: /* TIFF_SRATIONAL */
|
|
||||||
case 12: /* TIFF_DOUBLE */
|
|
||||||
return 8;
|
|
||||||
default:
|
|
||||||
return 0; /* will return 0 for unknown types */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return size of TIFFDataType in bytes.
|
|
||||||
*
|
|
||||||
* XXX: We need a separate function to determine the space needed
|
|
||||||
* to store the value. For TIFF_RATIONAL values TIFFDataWidth() returns 8,
|
|
||||||
* but we use 4-byte float to represent rationals.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
_TIFFDataSize(TIFFDataType type)
|
|
||||||
{
|
|
||||||
switch (type) {
|
|
||||||
case TIFF_BYTE:
|
|
||||||
case TIFF_SBYTE:
|
|
||||||
case TIFF_ASCII:
|
|
||||||
case TIFF_UNDEFINED:
|
|
||||||
return 1;
|
|
||||||
case TIFF_SHORT:
|
|
||||||
case TIFF_SSHORT:
|
|
||||||
return 2;
|
|
||||||
case TIFF_LONG:
|
|
||||||
case TIFF_SLONG:
|
|
||||||
case TIFF_FLOAT:
|
|
||||||
case TIFF_IFD:
|
|
||||||
case TIFF_RATIONAL:
|
|
||||||
case TIFF_SRATIONAL:
|
|
||||||
return 4;
|
|
||||||
case TIFF_DOUBLE:
|
|
||||||
return 8;
|
|
||||||
default:
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return nearest TIFFDataType to the sample type of an image.
|
|
||||||
*/
|
|
||||||
TIFFDataType
|
|
||||||
_TIFFSampleToTagType(TIFF* tif)
|
|
||||||
{
|
|
||||||
uint32 bps = TIFFhowmany8(tif->tif_dir.td_bitspersample);
|
|
||||||
|
|
||||||
switch (tif->tif_dir.td_sampleformat) {
|
|
||||||
case SAMPLEFORMAT_IEEEFP:
|
|
||||||
return (bps == 4 ? TIFF_FLOAT : TIFF_DOUBLE);
|
|
||||||
case SAMPLEFORMAT_INT:
|
|
||||||
return (bps <= 1 ? TIFF_SBYTE :
|
|
||||||
bps <= 2 ? TIFF_SSHORT : TIFF_SLONG);
|
|
||||||
case SAMPLEFORMAT_UINT:
|
|
||||||
return (bps <= 1 ? TIFF_BYTE :
|
|
||||||
bps <= 2 ? TIFF_SHORT : TIFF_LONG);
|
|
||||||
case SAMPLEFORMAT_VOID:
|
|
||||||
return (TIFF_UNDEFINED);
|
|
||||||
}
|
|
||||||
/*NOTREACHED*/
|
|
||||||
return (TIFF_UNDEFINED);
|
|
||||||
}
|
|
||||||
|
|
||||||
const TIFFFieldInfo*
|
|
||||||
_TIFFFindFieldInfo(TIFF* tif, ttag_t tag, TIFFDataType dt)
|
|
||||||
{
|
|
||||||
TIFFFieldInfo key = {0, 0, 0, TIFF_NOTYPE, 0, 0, 0, 0};
|
|
||||||
TIFFFieldInfo* pkey = &key;
|
|
||||||
const TIFFFieldInfo **ret;
|
|
||||||
|
|
||||||
if (tif->tif_foundfield && tif->tif_foundfield->field_tag == tag &&
|
|
||||||
(dt == TIFF_ANY || dt == tif->tif_foundfield->field_type))
|
|
||||||
return tif->tif_foundfield;
|
|
||||||
|
|
||||||
/* If we are invoked with no field information, then just return. */
|
|
||||||
if ( !tif->tif_fieldinfo ) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* NB: use sorted search (e.g. binary search) */
|
|
||||||
key.field_tag = tag;
|
|
||||||
key.field_type = dt;
|
|
||||||
|
|
||||||
ret = (const TIFFFieldInfo **) bsearch(&pkey,
|
|
||||||
tif->tif_fieldinfo,
|
|
||||||
tif->tif_nfields,
|
|
||||||
sizeof(TIFFFieldInfo *),
|
|
||||||
tagCompare);
|
|
||||||
return tif->tif_foundfield = (ret ? *ret : NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
const TIFFFieldInfo*
|
|
||||||
_TIFFFindFieldInfoByName(TIFF* tif, const char *field_name, TIFFDataType dt)
|
|
||||||
{
|
|
||||||
TIFFFieldInfo key = {0, 0, 0, TIFF_NOTYPE, 0, 0, 0, 0};
|
|
||||||
TIFFFieldInfo* pkey = &key;
|
|
||||||
const TIFFFieldInfo **ret;
|
|
||||||
|
|
||||||
if (tif->tif_foundfield
|
|
||||||
&& streq(tif->tif_foundfield->field_name, field_name)
|
|
||||||
&& (dt == TIFF_ANY || dt == tif->tif_foundfield->field_type))
|
|
||||||
return (tif->tif_foundfield);
|
|
||||||
|
|
||||||
/* If we are invoked with no field information, then just return. */
|
|
||||||
if ( !tif->tif_fieldinfo ) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* NB: use sorted search (e.g. binary search) */
|
|
||||||
key.field_name = (char *)field_name;
|
|
||||||
key.field_type = dt;
|
|
||||||
|
|
||||||
ret = (const TIFFFieldInfo **) lfind(&pkey,
|
|
||||||
tif->tif_fieldinfo,
|
|
||||||
&tif->tif_nfields,
|
|
||||||
sizeof(TIFFFieldInfo *),
|
|
||||||
tagNameCompare);
|
|
||||||
return tif->tif_foundfield = (ret ? *ret : NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
const TIFFFieldInfo*
|
|
||||||
_TIFFFieldWithTag(TIFF* tif, ttag_t tag)
|
|
||||||
{
|
|
||||||
const TIFFFieldInfo* fip = _TIFFFindFieldInfo(tif, tag, TIFF_ANY);
|
|
||||||
if (!fip) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, "TIFFFieldWithTag",
|
|
||||||
"Internal error, unknown tag 0x%x",
|
|
||||||
(unsigned int) tag);
|
|
||||||
assert(fip != NULL);
|
|
||||||
/*NOTREACHED*/
|
|
||||||
}
|
|
||||||
return (fip);
|
|
||||||
}
|
|
||||||
|
|
||||||
const TIFFFieldInfo*
|
|
||||||
_TIFFFieldWithName(TIFF* tif, const char *field_name)
|
|
||||||
{
|
|
||||||
const TIFFFieldInfo* fip =
|
|
||||||
_TIFFFindFieldInfoByName(tif, field_name, TIFF_ANY);
|
|
||||||
if (!fip) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, "TIFFFieldWithName",
|
|
||||||
"Internal error, unknown tag %s", field_name);
|
|
||||||
assert(fip != NULL);
|
|
||||||
/*NOTREACHED*/
|
|
||||||
}
|
|
||||||
return (fip);
|
|
||||||
}
|
|
||||||
|
|
||||||
const TIFFFieldInfo*
|
|
||||||
_TIFFFindOrRegisterFieldInfo( TIFF *tif, ttag_t tag, TIFFDataType dt )
|
|
||||||
|
|
||||||
{
|
|
||||||
const TIFFFieldInfo *fld;
|
|
||||||
|
|
||||||
fld = _TIFFFindFieldInfo( tif, tag, dt );
|
|
||||||
if( fld == NULL )
|
|
||||||
{
|
|
||||||
fld = _TIFFCreateAnonFieldInfo( tif, tag, dt );
|
|
||||||
if (!_TIFFMergeFieldInfo(tif, fld, 1))
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return fld;
|
|
||||||
}
|
|
||||||
|
|
||||||
TIFFFieldInfo*
|
|
||||||
_TIFFCreateAnonFieldInfo(TIFF *tif, ttag_t tag, TIFFDataType field_type)
|
|
||||||
{
|
|
||||||
TIFFFieldInfo *fld;
|
|
||||||
(void) tif;
|
|
||||||
|
|
||||||
fld = (TIFFFieldInfo *) _TIFFmalloc(sizeof (TIFFFieldInfo));
|
|
||||||
if (fld == NULL)
|
|
||||||
return NULL;
|
|
||||||
_TIFFmemset( fld, 0, sizeof(TIFFFieldInfo) );
|
|
||||||
|
|
||||||
fld->field_tag = tag;
|
|
||||||
fld->field_readcount = TIFF_VARIABLE2;
|
|
||||||
fld->field_writecount = TIFF_VARIABLE2;
|
|
||||||
fld->field_type = field_type;
|
|
||||||
fld->field_bit = FIELD_CUSTOM;
|
|
||||||
fld->field_oktochange = TRUE;
|
|
||||||
fld->field_passcount = TRUE;
|
|
||||||
fld->field_name = (char *) _TIFFmalloc(32);
|
|
||||||
if (fld->field_name == NULL) {
|
|
||||||
_TIFFfree(fld);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* note that this name is a special sign to TIFFClose() and
|
|
||||||
* _TIFFSetupFieldInfo() to free the field
|
|
||||||
*/
|
|
||||||
sprintf(fld->field_name, "Tag %d", (int) tag);
|
|
||||||
|
|
||||||
return fld;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,126 +0,0 @@
|
|||||||
/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_dumpmode.c,v 1.5.2.2 2010-06-08 18:50:42 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF Library.
|
|
||||||
*
|
|
||||||
* "Null" Compression Algorithm Support.
|
|
||||||
*/
|
|
||||||
#include "tiffiop.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Encode a hunk of pixels.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
DumpModeEncode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s)
|
|
||||||
{
|
|
||||||
(void) s;
|
|
||||||
while (cc > 0) {
|
|
||||||
tsize_t n;
|
|
||||||
|
|
||||||
n = cc;
|
|
||||||
if (tif->tif_rawcc + n > tif->tif_rawdatasize)
|
|
||||||
n = tif->tif_rawdatasize - tif->tif_rawcc;
|
|
||||||
|
|
||||||
assert( n > 0 );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Avoid copy if client has setup raw
|
|
||||||
* data buffer to avoid extra copy.
|
|
||||||
*/
|
|
||||||
if (tif->tif_rawcp != pp)
|
|
||||||
_TIFFmemcpy(tif->tif_rawcp, pp, n);
|
|
||||||
tif->tif_rawcp += n;
|
|
||||||
tif->tif_rawcc += n;
|
|
||||||
pp += n;
|
|
||||||
cc -= n;
|
|
||||||
if (tif->tif_rawcc >= tif->tif_rawdatasize &&
|
|
||||||
!TIFFFlushData1(tif))
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Decode a hunk of pixels.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
DumpModeDecode(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s)
|
|
||||||
{
|
|
||||||
(void) s;
|
|
||||||
/* fprintf(stderr,"DumpModeDecode: scanline %ld, expected %ld bytes, got %ld bytes\n", */
|
|
||||||
/* (long) tif->tif_row, (long) tif->tif_rawcc, (long) cc); */
|
|
||||||
if (tif->tif_rawcc < cc) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
|
||||||
"DumpModeDecode: Not enough data for scanline %d",
|
|
||||||
tif->tif_row);
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Avoid copy if client has setup raw
|
|
||||||
* data buffer to avoid extra copy.
|
|
||||||
*/
|
|
||||||
if (tif->tif_rawcp != buf)
|
|
||||||
_TIFFmemcpy(buf, tif->tif_rawcp, cc);
|
|
||||||
tif->tif_rawcp += cc;
|
|
||||||
tif->tif_rawcc -= cc;
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Seek forwards nrows in the current strip.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
DumpModeSeek(TIFF* tif, uint32 nrows)
|
|
||||||
{
|
|
||||||
tif->tif_rawcp += nrows * tif->tif_scanlinesize;
|
|
||||||
tif->tif_rawcc -= nrows * tif->tif_scanlinesize;
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialize dump mode.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
TIFFInitDumpMode(TIFF* tif, int scheme)
|
|
||||||
{
|
|
||||||
(void) scheme;
|
|
||||||
tif->tif_decoderow = DumpModeDecode;
|
|
||||||
tif->tif_decodestrip = DumpModeDecode;
|
|
||||||
tif->tif_decodetile = DumpModeDecode;
|
|
||||||
tif->tif_encoderow = DumpModeEncode;
|
|
||||||
tif->tif_encodestrip = DumpModeEncode;
|
|
||||||
tif->tif_encodetile = DumpModeEncode;
|
|
||||||
tif->tif_seek = DumpModeSeek;
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_error.c,v 1.4.2.1 2010-06-08 18:50:42 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF Library.
|
|
||||||
*/
|
|
||||||
#include "tiffiop.h"
|
|
||||||
|
|
||||||
TIFFErrorHandlerExt _TIFFerrorHandlerExt = NULL;
|
|
||||||
|
|
||||||
TIFFErrorHandler
|
|
||||||
TIFFSetErrorHandler(TIFFErrorHandler handler)
|
|
||||||
{
|
|
||||||
TIFFErrorHandler prev = _TIFFerrorHandler;
|
|
||||||
_TIFFerrorHandler = handler;
|
|
||||||
return (prev);
|
|
||||||
}
|
|
||||||
|
|
||||||
TIFFErrorHandlerExt
|
|
||||||
TIFFSetErrorHandlerExt(TIFFErrorHandlerExt handler)
|
|
||||||
{
|
|
||||||
TIFFErrorHandlerExt prev = _TIFFerrorHandlerExt;
|
|
||||||
_TIFFerrorHandlerExt = handler;
|
|
||||||
return (prev);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
TIFFError(const char* module, const char* fmt, ...)
|
|
||||||
{
|
|
||||||
va_list ap;
|
|
||||||
va_start(ap, fmt);
|
|
||||||
if (_TIFFerrorHandler)
|
|
||||||
(*_TIFFerrorHandler)(module, fmt, ap);
|
|
||||||
if (_TIFFerrorHandlerExt)
|
|
||||||
(*_TIFFerrorHandlerExt)(0, module, fmt, ap);
|
|
||||||
va_end(ap);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
TIFFErrorExt(thandle_t fd, const char* module, const char* fmt, ...)
|
|
||||||
{
|
|
||||||
va_list ap;
|
|
||||||
va_start(ap, fmt);
|
|
||||||
if (_TIFFerrorHandler)
|
|
||||||
(*_TIFFerrorHandler)(module, fmt, ap);
|
|
||||||
if (_TIFFerrorHandlerExt)
|
|
||||||
(*_TIFFerrorHandlerExt)(fd, module, fmt, ap);
|
|
||||||
va_end(ap);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
@@ -1,118 +0,0 @@
|
|||||||
/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_extension.c,v 1.4.2.1 2010-06-08 18:50:42 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF Library.
|
|
||||||
*
|
|
||||||
* Various routines support external extension of the tag set, and other
|
|
||||||
* application extension capabilities.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "tiffiop.h"
|
|
||||||
|
|
||||||
int TIFFGetTagListCount( TIFF *tif )
|
|
||||||
|
|
||||||
{
|
|
||||||
TIFFDirectory* td = &tif->tif_dir;
|
|
||||||
|
|
||||||
return td->td_customValueCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
ttag_t TIFFGetTagListEntry( TIFF *tif, int tag_index )
|
|
||||||
|
|
||||||
{
|
|
||||||
TIFFDirectory* td = &tif->tif_dir;
|
|
||||||
|
|
||||||
if( tag_index < 0 || tag_index >= td->td_customValueCount )
|
|
||||||
return (ttag_t) -1;
|
|
||||||
else
|
|
||||||
return td->td_customValues[tag_index].info->field_tag;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
** This provides read/write access to the TIFFTagMethods within the TIFF
|
|
||||||
** structure to application code without giving access to the private
|
|
||||||
** TIFF structure.
|
|
||||||
*/
|
|
||||||
TIFFTagMethods *TIFFAccessTagMethods( TIFF *tif )
|
|
||||||
|
|
||||||
{
|
|
||||||
return &(tif->tif_tagmethods);
|
|
||||||
}
|
|
||||||
|
|
||||||
void *TIFFGetClientInfo( TIFF *tif, const char *name )
|
|
||||||
|
|
||||||
{
|
|
||||||
TIFFClientInfoLink *link = tif->tif_clientinfo;
|
|
||||||
|
|
||||||
while( link != NULL && strcmp(link->name,name) != 0 )
|
|
||||||
link = link->next;
|
|
||||||
|
|
||||||
if( link != NULL )
|
|
||||||
return link->data;
|
|
||||||
else
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void TIFFSetClientInfo( TIFF *tif, void *data, const char *name )
|
|
||||||
|
|
||||||
{
|
|
||||||
TIFFClientInfoLink *link = tif->tif_clientinfo;
|
|
||||||
|
|
||||||
/*
|
|
||||||
** Do we have an existing link with this name? If so, just
|
|
||||||
** set it.
|
|
||||||
*/
|
|
||||||
while( link != NULL && strcmp(link->name,name) != 0 )
|
|
||||||
link = link->next;
|
|
||||||
|
|
||||||
if( link != NULL )
|
|
||||||
{
|
|
||||||
link->data = data;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
** Create a new link.
|
|
||||||
*/
|
|
||||||
|
|
||||||
link = (TIFFClientInfoLink *) _TIFFmalloc(sizeof(TIFFClientInfoLink));
|
|
||||||
assert (link != NULL);
|
|
||||||
link->next = tif->tif_clientinfo;
|
|
||||||
link->name = (char *) _TIFFmalloc(strlen(name)+1);
|
|
||||||
assert (link->name != NULL);
|
|
||||||
strcpy(link->name, name);
|
|
||||||
link->data = data;
|
|
||||||
|
|
||||||
tif->tif_clientinfo = link;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,532 +0,0 @@
|
|||||||
/* $Id: tif_fax3.h,v 1.5.2.1 2010-06-08 18:50:42 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 1990-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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _FAX3_
|
|
||||||
#define _FAX3_
|
|
||||||
/*
|
|
||||||
* TIFF Library.
|
|
||||||
*
|
|
||||||
* CCITT Group 3 (T.4) and Group 4 (T.6) Decompression Support.
|
|
||||||
*
|
|
||||||
* Decoder support is derived, with permission, from the code
|
|
||||||
* in Frank Cringle's viewfax program;
|
|
||||||
* Copyright (C) 1990, 1995 Frank D. Cringle.
|
|
||||||
*/
|
|
||||||
#include "tiff.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* To override the default routine used to image decoded
|
|
||||||
* spans one can use the pseduo tag TIFFTAG_FAXFILLFUNC.
|
|
||||||
* The routine must have the type signature given below;
|
|
||||||
* for example:
|
|
||||||
*
|
|
||||||
* fillruns(unsigned char* buf, uint32* runs, uint32* erun, uint32 lastx)
|
|
||||||
*
|
|
||||||
* where buf is place to set the bits, runs is the array of b&w run
|
|
||||||
* lengths (white then black), erun is the last run in the array, and
|
|
||||||
* lastx is the width of the row in pixels. Fill routines can assume
|
|
||||||
* the run array has room for at least lastx runs and can overwrite
|
|
||||||
* data in the run array as needed (e.g. to append zero runs to bring
|
|
||||||
* the count up to a nice multiple).
|
|
||||||
*/
|
|
||||||
typedef void (*TIFFFaxFillFunc)(unsigned char*, uint32*, uint32*, uint32);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The default run filler; made external for other decoders.
|
|
||||||
*/
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
extern void _TIFFFax3fillruns(unsigned char*, uint32*, uint32*, uint32);
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* finite state machine codes */
|
|
||||||
#define S_Null 0
|
|
||||||
#define S_Pass 1
|
|
||||||
#define S_Horiz 2
|
|
||||||
#define S_V0 3
|
|
||||||
#define S_VR 4
|
|
||||||
#define S_VL 5
|
|
||||||
#define S_Ext 6
|
|
||||||
#define S_TermW 7
|
|
||||||
#define S_TermB 8
|
|
||||||
#define S_MakeUpW 9
|
|
||||||
#define S_MakeUpB 10
|
|
||||||
#define S_MakeUp 11
|
|
||||||
#define S_EOL 12
|
|
||||||
|
|
||||||
typedef struct { /* state table entry */
|
|
||||||
unsigned char State; /* see above */
|
|
||||||
unsigned char Width; /* width of code in bits */
|
|
||||||
uint32 Param; /* unsigned 32-bit run length in bits */
|
|
||||||
} TIFFFaxTabEnt;
|
|
||||||
|
|
||||||
extern const TIFFFaxTabEnt TIFFFaxMainTable[];
|
|
||||||
extern const TIFFFaxTabEnt TIFFFaxWhiteTable[];
|
|
||||||
extern const TIFFFaxTabEnt TIFFFaxBlackTable[];
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The following macros define the majority of the G3/G4 decoder
|
|
||||||
* algorithm using the state tables defined elsewhere. To build
|
|
||||||
* a decoder you need some setup code and some glue code. Note
|
|
||||||
* that you may also need/want to change the way the NeedBits*
|
|
||||||
* macros get input data if, for example, you know the data to be
|
|
||||||
* decoded is properly aligned and oriented (doing so before running
|
|
||||||
* the decoder can be a big performance win).
|
|
||||||
*
|
|
||||||
* Consult the decoder in the TIFF library for an idea of what you
|
|
||||||
* need to define and setup to make use of these definitions.
|
|
||||||
*
|
|
||||||
* NB: to enable a debugging version of these macros define FAX3_DEBUG
|
|
||||||
* before including this file. Trace output goes to stdout.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef EndOfData
|
|
||||||
#define EndOfData() (cp >= ep)
|
|
||||||
#endif
|
|
||||||
/*
|
|
||||||
* Need <=8 or <=16 bits of input data. Unlike viewfax we
|
|
||||||
* cannot use/assume a word-aligned, properly bit swizzled
|
|
||||||
* input data set because data may come from an arbitrarily
|
|
||||||
* aligned, read-only source such as a memory-mapped file.
|
|
||||||
* Note also that the viewfax decoder does not check for
|
|
||||||
* running off the end of the input data buffer. This is
|
|
||||||
* possible for G3-encoded data because it prescans the input
|
|
||||||
* data to count EOL markers, but can cause problems for G4
|
|
||||||
* data. In any event, we don't prescan and must watch for
|
|
||||||
* running out of data since we can't permit the library to
|
|
||||||
* scan past the end of the input data buffer.
|
|
||||||
*
|
|
||||||
* Finally, note that we must handle remaindered data at the end
|
|
||||||
* of a strip specially. The coder asks for a fixed number of
|
|
||||||
* bits when scanning for the next code. This may be more bits
|
|
||||||
* than are actually present in the data stream. If we appear
|
|
||||||
* to run out of data but still have some number of valid bits
|
|
||||||
* remaining then we makeup the requested amount with zeros and
|
|
||||||
* return successfully. If the returned data is incorrect then
|
|
||||||
* we should be called again and get a premature EOF error;
|
|
||||||
* otherwise we should get the right answer.
|
|
||||||
*/
|
|
||||||
#ifndef NeedBits8
|
|
||||||
#define NeedBits8(n,eoflab) do { \
|
|
||||||
if (BitsAvail < (n)) { \
|
|
||||||
if (EndOfData()) { \
|
|
||||||
if (BitsAvail == 0) /* no valid bits */ \
|
|
||||||
goto eoflab; \
|
|
||||||
BitsAvail = (n); /* pad with zeros */ \
|
|
||||||
} else { \
|
|
||||||
BitAcc |= ((uint32) bitmap[*cp++])<<BitsAvail; \
|
|
||||||
BitsAvail += 8; \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
#endif
|
|
||||||
#ifndef NeedBits16
|
|
||||||
#define NeedBits16(n,eoflab) do { \
|
|
||||||
if (BitsAvail < (n)) { \
|
|
||||||
if (EndOfData()) { \
|
|
||||||
if (BitsAvail == 0) /* no valid bits */ \
|
|
||||||
goto eoflab; \
|
|
||||||
BitsAvail = (n); /* pad with zeros */ \
|
|
||||||
} else { \
|
|
||||||
BitAcc |= ((uint32) bitmap[*cp++])<<BitsAvail; \
|
|
||||||
if ((BitsAvail += 8) < (n)) { \
|
|
||||||
if (EndOfData()) { \
|
|
||||||
/* NB: we know BitsAvail is non-zero here */ \
|
|
||||||
BitsAvail = (n); /* pad with zeros */ \
|
|
||||||
} else { \
|
|
||||||
BitAcc |= ((uint32) bitmap[*cp++])<<BitsAvail; \
|
|
||||||
BitsAvail += 8; \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
#endif
|
|
||||||
#define GetBits(n) (BitAcc & ((1<<(n))-1))
|
|
||||||
#define ClrBits(n) do { \
|
|
||||||
BitsAvail -= (n); \
|
|
||||||
BitAcc >>= (n); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#ifdef FAX3_DEBUG
|
|
||||||
static const char* StateNames[] = {
|
|
||||||
"Null ",
|
|
||||||
"Pass ",
|
|
||||||
"Horiz ",
|
|
||||||
"V0 ",
|
|
||||||
"VR ",
|
|
||||||
"VL ",
|
|
||||||
"Ext ",
|
|
||||||
"TermW ",
|
|
||||||
"TermB ",
|
|
||||||
"MakeUpW",
|
|
||||||
"MakeUpB",
|
|
||||||
"MakeUp ",
|
|
||||||
"EOL ",
|
|
||||||
};
|
|
||||||
#define DEBUG_SHOW putchar(BitAcc & (1 << t) ? '1' : '0')
|
|
||||||
#define LOOKUP8(wid,tab,eoflab) do { \
|
|
||||||
int t; \
|
|
||||||
NeedBits8(wid,eoflab); \
|
|
||||||
TabEnt = tab + GetBits(wid); \
|
|
||||||
printf("%08lX/%d: %s%5d\t", (long) BitAcc, BitsAvail, \
|
|
||||||
StateNames[TabEnt->State], TabEnt->Param); \
|
|
||||||
for (t = 0; t < TabEnt->Width; t++) \
|
|
||||||
DEBUG_SHOW; \
|
|
||||||
putchar('\n'); \
|
|
||||||
fflush(stdout); \
|
|
||||||
ClrBits(TabEnt->Width); \
|
|
||||||
} while (0)
|
|
||||||
#define LOOKUP16(wid,tab,eoflab) do { \
|
|
||||||
int t; \
|
|
||||||
NeedBits16(wid,eoflab); \
|
|
||||||
TabEnt = tab + GetBits(wid); \
|
|
||||||
printf("%08lX/%d: %s%5d\t", (long) BitAcc, BitsAvail, \
|
|
||||||
StateNames[TabEnt->State], TabEnt->Param); \
|
|
||||||
for (t = 0; t < TabEnt->Width; t++) \
|
|
||||||
DEBUG_SHOW; \
|
|
||||||
putchar('\n'); \
|
|
||||||
fflush(stdout); \
|
|
||||||
ClrBits(TabEnt->Width); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define SETVALUE(x) do { \
|
|
||||||
*pa++ = RunLength + (x); \
|
|
||||||
printf("SETVALUE: %d\t%d\n", RunLength + (x), a0); \
|
|
||||||
a0 += x; \
|
|
||||||
RunLength = 0; \
|
|
||||||
} while (0)
|
|
||||||
#else
|
|
||||||
#define LOOKUP8(wid,tab,eoflab) do { \
|
|
||||||
NeedBits8(wid,eoflab); \
|
|
||||||
TabEnt = tab + GetBits(wid); \
|
|
||||||
ClrBits(TabEnt->Width); \
|
|
||||||
} while (0)
|
|
||||||
#define LOOKUP16(wid,tab,eoflab) do { \
|
|
||||||
NeedBits16(wid,eoflab); \
|
|
||||||
TabEnt = tab + GetBits(wid); \
|
|
||||||
ClrBits(TabEnt->Width); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Append a run to the run length array for the
|
|
||||||
* current row and reset decoding state.
|
|
||||||
*/
|
|
||||||
#define SETVALUE(x) do { \
|
|
||||||
*pa++ = RunLength + (x); \
|
|
||||||
a0 += (x); \
|
|
||||||
RunLength = 0; \
|
|
||||||
} while (0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Synchronize input decoding at the start of each
|
|
||||||
* row by scanning for an EOL (if appropriate) and
|
|
||||||
* skipping any trash data that might be present
|
|
||||||
* after a decoding error. Note that the decoding
|
|
||||||
* done elsewhere that recognizes an EOL only consumes
|
|
||||||
* 11 consecutive zero bits. This means that if EOLcnt
|
|
||||||
* is non-zero then we still need to scan for the final flag
|
|
||||||
* bit that is part of the EOL code.
|
|
||||||
*/
|
|
||||||
#define SYNC_EOL(eoflab) do { \
|
|
||||||
if (EOLcnt == 0) { \
|
|
||||||
for (;;) { \
|
|
||||||
NeedBits16(11,eoflab); \
|
|
||||||
if (GetBits(11) == 0) \
|
|
||||||
break; \
|
|
||||||
ClrBits(1); \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
for (;;) { \
|
|
||||||
NeedBits8(8,eoflab); \
|
|
||||||
if (GetBits(8)) \
|
|
||||||
break; \
|
|
||||||
ClrBits(8); \
|
|
||||||
} \
|
|
||||||
while (GetBits(1) == 0) \
|
|
||||||
ClrBits(1); \
|
|
||||||
ClrBits(1); /* EOL bit */ \
|
|
||||||
EOLcnt = 0; /* reset EOL counter/flag */ \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Cleanup the array of runs after decoding a row.
|
|
||||||
* We adjust final runs to insure the user buffer is not
|
|
||||||
* overwritten and/or undecoded area is white filled.
|
|
||||||
*/
|
|
||||||
#define CLEANUP_RUNS() do { \
|
|
||||||
if (RunLength) \
|
|
||||||
SETVALUE(0); \
|
|
||||||
if (a0 != lastx) { \
|
|
||||||
badlength(a0, lastx); \
|
|
||||||
while (a0 > lastx && pa > thisrun) \
|
|
||||||
a0 -= *--pa; \
|
|
||||||
if (a0 < lastx) { \
|
|
||||||
if (a0 < 0) \
|
|
||||||
a0 = 0; \
|
|
||||||
if ((pa-thisrun)&1) \
|
|
||||||
SETVALUE(0); \
|
|
||||||
SETVALUE(lastx - a0); \
|
|
||||||
} else if (a0 > lastx) { \
|
|
||||||
SETVALUE(lastx); \
|
|
||||||
SETVALUE(0); \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Decode a line of 1D-encoded data.
|
|
||||||
*
|
|
||||||
* The line expanders are written as macros so that they can be reused
|
|
||||||
* but still have direct access to the local variables of the "calling"
|
|
||||||
* function.
|
|
||||||
*
|
|
||||||
* Note that unlike the original version we have to explicitly test for
|
|
||||||
* a0 >= lastx after each black/white run is decoded. This is because
|
|
||||||
* the original code depended on the input data being zero-padded to
|
|
||||||
* insure the decoder recognized an EOL before running out of data.
|
|
||||||
*/
|
|
||||||
#define EXPAND1D(eoflab) do { \
|
|
||||||
for (;;) { \
|
|
||||||
for (;;) { \
|
|
||||||
LOOKUP16(12, TIFFFaxWhiteTable, eof1d); \
|
|
||||||
switch (TabEnt->State) { \
|
|
||||||
case S_EOL: \
|
|
||||||
EOLcnt = 1; \
|
|
||||||
goto done1d; \
|
|
||||||
case S_TermW: \
|
|
||||||
SETVALUE(TabEnt->Param); \
|
|
||||||
goto doneWhite1d; \
|
|
||||||
case S_MakeUpW: \
|
|
||||||
case S_MakeUp: \
|
|
||||||
a0 += TabEnt->Param; \
|
|
||||||
RunLength += TabEnt->Param; \
|
|
||||||
break; \
|
|
||||||
default: \
|
|
||||||
unexpected("WhiteTable", a0); \
|
|
||||||
goto done1d; \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
doneWhite1d: \
|
|
||||||
if (a0 >= lastx) \
|
|
||||||
goto done1d; \
|
|
||||||
for (;;) { \
|
|
||||||
LOOKUP16(13, TIFFFaxBlackTable, eof1d); \
|
|
||||||
switch (TabEnt->State) { \
|
|
||||||
case S_EOL: \
|
|
||||||
EOLcnt = 1; \
|
|
||||||
goto done1d; \
|
|
||||||
case S_TermB: \
|
|
||||||
SETVALUE(TabEnt->Param); \
|
|
||||||
goto doneBlack1d; \
|
|
||||||
case S_MakeUpB: \
|
|
||||||
case S_MakeUp: \
|
|
||||||
a0 += TabEnt->Param; \
|
|
||||||
RunLength += TabEnt->Param; \
|
|
||||||
break; \
|
|
||||||
default: \
|
|
||||||
unexpected("BlackTable", a0); \
|
|
||||||
goto done1d; \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
doneBlack1d: \
|
|
||||||
if (a0 >= lastx) \
|
|
||||||
goto done1d; \
|
|
||||||
if( *(pa-1) == 0 && *(pa-2) == 0 ) \
|
|
||||||
pa -= 2; \
|
|
||||||
} \
|
|
||||||
eof1d: \
|
|
||||||
prematureEOF(a0); \
|
|
||||||
CLEANUP_RUNS(); \
|
|
||||||
goto eoflab; \
|
|
||||||
done1d: \
|
|
||||||
CLEANUP_RUNS(); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Update the value of b1 using the array
|
|
||||||
* of runs for the reference line.
|
|
||||||
*/
|
|
||||||
#define CHECK_b1 do { \
|
|
||||||
if (pa != thisrun) while (b1 <= a0 && b1 < lastx) { \
|
|
||||||
b1 += pb[0] + pb[1]; \
|
|
||||||
pb += 2; \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Expand a row of 2D-encoded data.
|
|
||||||
*/
|
|
||||||
#define EXPAND2D(eoflab) do { \
|
|
||||||
while (a0 < lastx) { \
|
|
||||||
LOOKUP8(7, TIFFFaxMainTable, eof2d); \
|
|
||||||
switch (TabEnt->State) { \
|
|
||||||
case S_Pass: \
|
|
||||||
CHECK_b1; \
|
|
||||||
b1 += *pb++; \
|
|
||||||
RunLength += b1 - a0; \
|
|
||||||
a0 = b1; \
|
|
||||||
b1 += *pb++; \
|
|
||||||
break; \
|
|
||||||
case S_Horiz: \
|
|
||||||
if ((pa-thisrun)&1) { \
|
|
||||||
for (;;) { /* black first */ \
|
|
||||||
LOOKUP16(13, TIFFFaxBlackTable, eof2d); \
|
|
||||||
switch (TabEnt->State) { \
|
|
||||||
case S_TermB: \
|
|
||||||
SETVALUE(TabEnt->Param); \
|
|
||||||
goto doneWhite2da; \
|
|
||||||
case S_MakeUpB: \
|
|
||||||
case S_MakeUp: \
|
|
||||||
a0 += TabEnt->Param; \
|
|
||||||
RunLength += TabEnt->Param; \
|
|
||||||
break; \
|
|
||||||
default: \
|
|
||||||
goto badBlack2d; \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
doneWhite2da:; \
|
|
||||||
for (;;) { /* then white */ \
|
|
||||||
LOOKUP16(12, TIFFFaxWhiteTable, eof2d); \
|
|
||||||
switch (TabEnt->State) { \
|
|
||||||
case S_TermW: \
|
|
||||||
SETVALUE(TabEnt->Param); \
|
|
||||||
goto doneBlack2da; \
|
|
||||||
case S_MakeUpW: \
|
|
||||||
case S_MakeUp: \
|
|
||||||
a0 += TabEnt->Param; \
|
|
||||||
RunLength += TabEnt->Param; \
|
|
||||||
break; \
|
|
||||||
default: \
|
|
||||||
goto badWhite2d; \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
doneBlack2da:; \
|
|
||||||
} else { \
|
|
||||||
for (;;) { /* white first */ \
|
|
||||||
LOOKUP16(12, TIFFFaxWhiteTable, eof2d); \
|
|
||||||
switch (TabEnt->State) { \
|
|
||||||
case S_TermW: \
|
|
||||||
SETVALUE(TabEnt->Param); \
|
|
||||||
goto doneWhite2db; \
|
|
||||||
case S_MakeUpW: \
|
|
||||||
case S_MakeUp: \
|
|
||||||
a0 += TabEnt->Param; \
|
|
||||||
RunLength += TabEnt->Param; \
|
|
||||||
break; \
|
|
||||||
default: \
|
|
||||||
goto badWhite2d; \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
doneWhite2db:; \
|
|
||||||
for (;;) { /* then black */ \
|
|
||||||
LOOKUP16(13, TIFFFaxBlackTable, eof2d); \
|
|
||||||
switch (TabEnt->State) { \
|
|
||||||
case S_TermB: \
|
|
||||||
SETVALUE(TabEnt->Param); \
|
|
||||||
goto doneBlack2db; \
|
|
||||||
case S_MakeUpB: \
|
|
||||||
case S_MakeUp: \
|
|
||||||
a0 += TabEnt->Param; \
|
|
||||||
RunLength += TabEnt->Param; \
|
|
||||||
break; \
|
|
||||||
default: \
|
|
||||||
goto badBlack2d; \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
doneBlack2db:; \
|
|
||||||
} \
|
|
||||||
CHECK_b1; \
|
|
||||||
break; \
|
|
||||||
case S_V0: \
|
|
||||||
CHECK_b1; \
|
|
||||||
SETVALUE(b1 - a0); \
|
|
||||||
b1 += *pb++; \
|
|
||||||
break; \
|
|
||||||
case S_VR: \
|
|
||||||
CHECK_b1; \
|
|
||||||
SETVALUE(b1 - a0 + TabEnt->Param); \
|
|
||||||
b1 += *pb++; \
|
|
||||||
break; \
|
|
||||||
case S_VL: \
|
|
||||||
CHECK_b1; \
|
|
||||||
SETVALUE(b1 - a0 - TabEnt->Param); \
|
|
||||||
b1 -= *--pb; \
|
|
||||||
break; \
|
|
||||||
case S_Ext: \
|
|
||||||
*pa++ = lastx - a0; \
|
|
||||||
extension(a0); \
|
|
||||||
goto eol2d; \
|
|
||||||
case S_EOL: \
|
|
||||||
*pa++ = lastx - a0; \
|
|
||||||
NeedBits8(4,eof2d); \
|
|
||||||
if (GetBits(4)) \
|
|
||||||
unexpected("EOL", a0); \
|
|
||||||
ClrBits(4); \
|
|
||||||
EOLcnt = 1; \
|
|
||||||
goto eol2d; \
|
|
||||||
default: \
|
|
||||||
badMain2d: \
|
|
||||||
unexpected("MainTable", a0); \
|
|
||||||
goto eol2d; \
|
|
||||||
badBlack2d: \
|
|
||||||
unexpected("BlackTable", a0); \
|
|
||||||
goto eol2d; \
|
|
||||||
badWhite2d: \
|
|
||||||
unexpected("WhiteTable", a0); \
|
|
||||||
goto eol2d; \
|
|
||||||
eof2d: \
|
|
||||||
prematureEOF(a0); \
|
|
||||||
CLEANUP_RUNS(); \
|
|
||||||
goto eoflab; \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
if (RunLength) { \
|
|
||||||
if (RunLength + a0 < lastx) { \
|
|
||||||
/* expect a final V0 */ \
|
|
||||||
NeedBits8(1,eof2d); \
|
|
||||||
if (!GetBits(1)) \
|
|
||||||
goto badMain2d; \
|
|
||||||
ClrBits(1); \
|
|
||||||
} \
|
|
||||||
SETVALUE(0); \
|
|
||||||
} \
|
|
||||||
eol2d: \
|
|
||||||
CLEANUP_RUNS(); \
|
|
||||||
} while (0)
|
|
||||||
#endif /* _FAX3_ */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,74 +0,0 @@
|
|||||||
/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_flush.c,v 1.3.2.1 2010-06-08 18:50:42 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF Library.
|
|
||||||
*/
|
|
||||||
#include "tiffiop.h"
|
|
||||||
|
|
||||||
int
|
|
||||||
TIFFFlush(TIFF* tif)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (tif->tif_mode != O_RDONLY) {
|
|
||||||
if (!TIFFFlushData(tif))
|
|
||||||
return (0);
|
|
||||||
if ((tif->tif_flags & TIFF_DIRTYDIRECT) &&
|
|
||||||
!TIFFWriteDirectory(tif))
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Flush buffered data to the file.
|
|
||||||
*
|
|
||||||
* Frank Warmerdam'2000: I modified this to return 1 if TIFF_BEENWRITING
|
|
||||||
* is not set, so that TIFFFlush() will proceed to write out the directory.
|
|
||||||
* The documentation says returning 1 is an error indicator, but not having
|
|
||||||
* been writing isn't exactly a an error. Hopefully this doesn't cause
|
|
||||||
* problems for other people.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
TIFFFlushData(TIFF* tif)
|
|
||||||
{
|
|
||||||
if ((tif->tif_flags & TIFF_BEENWRITING) == 0)
|
|
||||||
return (0);
|
|
||||||
if (tif->tif_flags & TIFF_POSTENCODE) {
|
|
||||||
tif->tif_flags &= ~TIFF_POSTENCODE;
|
|
||||||
if (!(*tif->tif_postencode)(tif))
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
return (TIFFFlushData1(tif));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,385 +0,0 @@
|
|||||||
/* $Id: tif_jbig.c,v 1.2.2.3 2010-06-08 18:50:42 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF Library.
|
|
||||||
*
|
|
||||||
* JBIG Compression Algorithm Support.
|
|
||||||
* Contributed by Lee Howard <faxguy@deanox.com>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "tiffiop.h"
|
|
||||||
|
|
||||||
#ifdef JBIG_SUPPORT
|
|
||||||
#include "jbig.h"
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
uint32 recvparams; /* encoded Class 2 session params */
|
|
||||||
char* subaddress; /* subaddress string */
|
|
||||||
uint32 recvtime; /* time spend receiving in seconds */
|
|
||||||
char* faxdcs; /* encoded fax parameters (DCS, Table 2/T.30) */
|
|
||||||
|
|
||||||
TIFFVGetMethod vgetparent;
|
|
||||||
TIFFVSetMethod vsetparent;
|
|
||||||
} JBIGState;
|
|
||||||
|
|
||||||
#define GetJBIGState(tif) ((JBIGState*)(tif)->tif_data)
|
|
||||||
|
|
||||||
#define FIELD_RECVPARAMS (FIELD_CODEC+0)
|
|
||||||
#define FIELD_SUBADDRESS (FIELD_CODEC+1)
|
|
||||||
#define FIELD_RECVTIME (FIELD_CODEC+2)
|
|
||||||
#define FIELD_FAXDCS (FIELD_CODEC+3)
|
|
||||||
|
|
||||||
static const TIFFFieldInfo jbigFieldInfo[] =
|
|
||||||
{
|
|
||||||
{TIFFTAG_FAXRECVPARAMS, 1, 1, TIFF_LONG, FIELD_RECVPARAMS, TRUE, FALSE, "FaxRecvParams"},
|
|
||||||
{TIFFTAG_FAXSUBADDRESS, -1, -1, TIFF_ASCII, FIELD_SUBADDRESS, TRUE, FALSE, "FaxSubAddress"},
|
|
||||||
{TIFFTAG_FAXRECVTIME, 1, 1, TIFF_LONG, FIELD_RECVTIME, TRUE, FALSE, "FaxRecvTime"},
|
|
||||||
{TIFFTAG_FAXDCS, -1, -1, TIFF_ASCII, FIELD_FAXDCS, TRUE, FALSE, "FaxDcs"},
|
|
||||||
};
|
|
||||||
|
|
||||||
static int JBIGSetupDecode(TIFF* tif)
|
|
||||||
{
|
|
||||||
if (TIFFNumberOfStrips(tif) != 1)
|
|
||||||
{
|
|
||||||
TIFFError("JBIG", "Multistrip images not supported in decoder");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int JBIGDecode(TIFF* tif, tidata_t buffer, tsize_t size, tsample_t s)
|
|
||||||
{
|
|
||||||
struct jbg_dec_state decoder;
|
|
||||||
int decodeStatus = 0;
|
|
||||||
unsigned char* pImage = NULL;
|
|
||||||
(void) size, (void) s;
|
|
||||||
|
|
||||||
if (isFillOrder(tif, tif->tif_dir.td_fillorder))
|
|
||||||
{
|
|
||||||
TIFFReverseBits(tif->tif_rawdata, tif->tif_rawdatasize);
|
|
||||||
}
|
|
||||||
|
|
||||||
jbg_dec_init(&decoder);
|
|
||||||
|
|
||||||
#if defined(HAVE_JBG_NEWLEN)
|
|
||||||
jbg_newlen(tif->tif_rawdata, tif->tif_rawdatasize);
|
|
||||||
/*
|
|
||||||
* I do not check the return status of jbg_newlen because even if this
|
|
||||||
* function fails it does not necessarily mean that decoding the image
|
|
||||||
* will fail. It is generally only needed for received fax images
|
|
||||||
* that do not contain the actual length of the image in the BIE
|
|
||||||
* header. I do not log when an error occurs because that will cause
|
|
||||||
* problems when converting JBIG encoded TIFF's to
|
|
||||||
* PostScript. As long as the actual image length is contained in the
|
|
||||||
* BIE header jbg_dec_in should succeed.
|
|
||||||
*/
|
|
||||||
#endif /* HAVE_JBG_NEWLEN */
|
|
||||||
|
|
||||||
decodeStatus = jbg_dec_in(&decoder, tif->tif_rawdata,
|
|
||||||
tif->tif_rawdatasize, NULL);
|
|
||||||
if (JBG_EOK != decodeStatus)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* XXX: JBG_EN constant was defined in pre-2.0 releases of the
|
|
||||||
* JBIG-KIT. Since the 2.0 the error reporting functions were
|
|
||||||
* changed. We will handle both cases here.
|
|
||||||
*/
|
|
||||||
TIFFError("JBIG", "Error (%d) decoding: %s", decodeStatus,
|
|
||||||
#if defined(JBG_EN)
|
|
||||||
jbg_strerror(decodeStatus, JBG_EN)
|
|
||||||
#else
|
|
||||||
jbg_strerror(decodeStatus)
|
|
||||||
#endif
|
|
||||||
);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
pImage = jbg_dec_getimage(&decoder, 0);
|
|
||||||
_TIFFmemcpy(buffer, pImage, jbg_dec_getsize(&decoder));
|
|
||||||
jbg_dec_free(&decoder);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int JBIGSetupEncode(TIFF* tif)
|
|
||||||
{
|
|
||||||
if (TIFFNumberOfStrips(tif) != 1)
|
|
||||||
{
|
|
||||||
TIFFError("JBIG", "Multistrip images not supported in encoder");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int JBIGCopyEncodedData(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s)
|
|
||||||
{
|
|
||||||
(void) s;
|
|
||||||
while (cc > 0)
|
|
||||||
{
|
|
||||||
tsize_t n = cc;
|
|
||||||
|
|
||||||
if (tif->tif_rawcc + n > tif->tif_rawdatasize)
|
|
||||||
{
|
|
||||||
n = tif->tif_rawdatasize - tif->tif_rawcc;
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(n > 0);
|
|
||||||
_TIFFmemcpy(tif->tif_rawcp, pp, n);
|
|
||||||
tif->tif_rawcp += n;
|
|
||||||
tif->tif_rawcc += n;
|
|
||||||
pp += n;
|
|
||||||
cc -= n;
|
|
||||||
if (tif->tif_rawcc >= tif->tif_rawdatasize &&
|
|
||||||
!TIFFFlushData1(tif))
|
|
||||||
{
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void JBIGOutputBie(unsigned char* buffer, size_t len, void *userData)
|
|
||||||
{
|
|
||||||
TIFF* tif = (TIFF*)userData;
|
|
||||||
|
|
||||||
if (isFillOrder(tif, tif->tif_dir.td_fillorder))
|
|
||||||
{
|
|
||||||
TIFFReverseBits(buffer, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
JBIGCopyEncodedData(tif, buffer, len, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int JBIGEncode(TIFF* tif, tidata_t buffer, tsize_t size, tsample_t s)
|
|
||||||
{
|
|
||||||
TIFFDirectory* dir = &tif->tif_dir;
|
|
||||||
struct jbg_enc_state encoder;
|
|
||||||
|
|
||||||
(void) size, (void) s;
|
|
||||||
|
|
||||||
jbg_enc_init(&encoder,
|
|
||||||
dir->td_imagewidth,
|
|
||||||
dir->td_imagelength,
|
|
||||||
1,
|
|
||||||
&buffer,
|
|
||||||
JBIGOutputBie,
|
|
||||||
tif);
|
|
||||||
/*
|
|
||||||
* jbg_enc_out does the "real" encoding. As data is encoded,
|
|
||||||
* JBIGOutputBie is called, which writes the data to the directory.
|
|
||||||
*/
|
|
||||||
jbg_enc_out(&encoder);
|
|
||||||
jbg_enc_free(&encoder);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void JBIGCleanup(TIFF* tif)
|
|
||||||
{
|
|
||||||
JBIGState *sp = GetJBIGState(tif);
|
|
||||||
|
|
||||||
assert(sp != 0);
|
|
||||||
|
|
||||||
tif->tif_tagmethods.vgetfield = sp->vgetparent;
|
|
||||||
tif->tif_tagmethods.vsetfield = sp->vsetparent;
|
|
||||||
|
|
||||||
_TIFFfree(tif->tif_data);
|
|
||||||
tif->tif_data = NULL;
|
|
||||||
|
|
||||||
_TIFFSetDefaultCompressionState(tif);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void JBIGPrintDir(TIFF* tif, FILE* fd, long flags)
|
|
||||||
{
|
|
||||||
JBIGState* codec = GetJBIGState(tif);
|
|
||||||
(void)flags;
|
|
||||||
|
|
||||||
if (TIFFFieldSet(tif, FIELD_RECVPARAMS))
|
|
||||||
{
|
|
||||||
fprintf(fd,
|
|
||||||
" Fax Receive Parameters: %08lx\n",
|
|
||||||
(unsigned long)codec->recvparams);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (TIFFFieldSet(tif, FIELD_SUBADDRESS))
|
|
||||||
{
|
|
||||||
fprintf(fd,
|
|
||||||
" Fax SubAddress: %s\n",
|
|
||||||
codec->subaddress);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (TIFFFieldSet(tif, FIELD_RECVTIME))
|
|
||||||
{
|
|
||||||
fprintf(fd,
|
|
||||||
" Fax Receive Time: %lu secs\n",
|
|
||||||
(unsigned long)codec->recvtime);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (TIFFFieldSet(tif, FIELD_FAXDCS))
|
|
||||||
{
|
|
||||||
fprintf(fd,
|
|
||||||
" Fax DCS: %s\n",
|
|
||||||
codec->faxdcs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int JBIGVGetField(TIFF* tif, ttag_t tag, va_list ap)
|
|
||||||
{
|
|
||||||
JBIGState* codec = GetJBIGState(tif);
|
|
||||||
|
|
||||||
switch (tag)
|
|
||||||
{
|
|
||||||
case TIFFTAG_FAXRECVPARAMS:
|
|
||||||
*va_arg(ap, uint32*) = codec->recvparams;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TIFFTAG_FAXSUBADDRESS:
|
|
||||||
*va_arg(ap, char**) = codec->subaddress;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TIFFTAG_FAXRECVTIME:
|
|
||||||
*va_arg(ap, uint32*) = codec->recvtime;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TIFFTAG_FAXDCS:
|
|
||||||
*va_arg(ap, char**) = codec->faxdcs;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return (*codec->vgetparent)(tif, tag, ap);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int JBIGVSetField(TIFF* tif, ttag_t tag, va_list ap)
|
|
||||||
{
|
|
||||||
JBIGState* codec = GetJBIGState(tif);
|
|
||||||
|
|
||||||
switch (tag)
|
|
||||||
{
|
|
||||||
case TIFFTAG_FAXRECVPARAMS:
|
|
||||||
codec->recvparams = va_arg(ap, uint32);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TIFFTAG_FAXSUBADDRESS:
|
|
||||||
_TIFFsetString(&codec->subaddress, va_arg(ap, char*));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TIFFTAG_FAXRECVTIME:
|
|
||||||
codec->recvtime = va_arg(ap, uint32);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TIFFTAG_FAXDCS:
|
|
||||||
_TIFFsetString(&codec->faxdcs, va_arg(ap, char*));
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return (*codec->vsetparent)(tif, tag, ap);
|
|
||||||
}
|
|
||||||
|
|
||||||
TIFFSetFieldBit(tif, _TIFFFieldWithTag(tif, tag)->field_bit);
|
|
||||||
tif->tif_flags |= TIFF_DIRTYDIRECT;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int TIFFInitJBIG(TIFF* tif, int scheme)
|
|
||||||
{
|
|
||||||
JBIGState* codec = NULL;
|
|
||||||
|
|
||||||
assert(scheme == COMPRESSION_JBIG);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Merge codec-specific tag information.
|
|
||||||
*/
|
|
||||||
if (!_TIFFMergeFieldInfo(tif, jbigFieldInfo,
|
|
||||||
TIFFArrayCount(jbigFieldInfo))) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, "TIFFInitJBIG",
|
|
||||||
"Merging JBIG codec-specific tags failed");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Allocate memory for the JBIGState structure.*/
|
|
||||||
tif->tif_data = (tdata_t)_TIFFmalloc(sizeof(JBIGState));
|
|
||||||
if (tif->tif_data == NULL)
|
|
||||||
{
|
|
||||||
TIFFError("TIFFInitJBIG", "Not enough memory for JBIGState");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
_TIFFmemset(tif->tif_data, 0, sizeof(JBIGState));
|
|
||||||
codec = GetJBIGState(tif);
|
|
||||||
|
|
||||||
/* Initialize codec private fields */
|
|
||||||
codec->recvparams = 0;
|
|
||||||
codec->subaddress = NULL;
|
|
||||||
codec->faxdcs = NULL;
|
|
||||||
codec->recvtime = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Override parent get/set field methods.
|
|
||||||
*/
|
|
||||||
codec->vgetparent = tif->tif_tagmethods.vgetfield;
|
|
||||||
codec->vsetparent = tif->tif_tagmethods.vsetfield;
|
|
||||||
tif->tif_tagmethods.vgetfield = JBIGVGetField;
|
|
||||||
tif->tif_tagmethods.vsetfield = JBIGVSetField;
|
|
||||||
tif->tif_tagmethods.printdir = JBIGPrintDir;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* These flags are set so the JBIG Codec can control when to reverse
|
|
||||||
* bits and when not to and to allow the jbig decoder and bit reverser
|
|
||||||
* to write to memory when necessary.
|
|
||||||
*/
|
|
||||||
tif->tif_flags |= TIFF_NOBITREV;
|
|
||||||
tif->tif_flags &= ~TIFF_MAPPED;
|
|
||||||
|
|
||||||
/* Setup the function pointers for encode, decode, and cleanup. */
|
|
||||||
tif->tif_setupdecode = JBIGSetupDecode;
|
|
||||||
tif->tif_decodestrip = JBIGDecode;
|
|
||||||
|
|
||||||
tif->tif_setupencode = JBIGSetupEncode;
|
|
||||||
tif->tif_encodestrip = JBIGEncode;
|
|
||||||
|
|
||||||
tif->tif_cleanup = JBIGCleanup;
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* JBIG_SUPPORT */
|
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,154 +0,0 @@
|
|||||||
/* $Id: tif_next.c,v 1.8.2.1 2010-06-08 18:50:42 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "tiffiop.h"
|
|
||||||
#ifdef NEXT_SUPPORT
|
|
||||||
/*
|
|
||||||
* TIFF Library.
|
|
||||||
*
|
|
||||||
* NeXT 2-bit Grey Scale Compression Algorithm Support
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define SETPIXEL(op, v) { \
|
|
||||||
switch (npixels++ & 3) { \
|
|
||||||
case 0: op[0] = (unsigned char) ((v) << 6); break; \
|
|
||||||
case 1: op[0] |= (v) << 4; break; \
|
|
||||||
case 2: op[0] |= (v) << 2; break; \
|
|
||||||
case 3: *op++ |= (v); break; \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define LITERALROW 0x00
|
|
||||||
#define LITERALSPAN 0x40
|
|
||||||
#define WHITE ((1<<2)-1)
|
|
||||||
|
|
||||||
static int
|
|
||||||
NeXTDecode(TIFF* tif, tidata_t buf, tsize_t occ, tsample_t s)
|
|
||||||
{
|
|
||||||
unsigned char *bp, *op;
|
|
||||||
tsize_t cc;
|
|
||||||
tidata_t row;
|
|
||||||
tsize_t scanline, n;
|
|
||||||
|
|
||||||
(void) s;
|
|
||||||
/*
|
|
||||||
* Each scanline is assumed to start off as all
|
|
||||||
* white (we assume a PhotometricInterpretation
|
|
||||||
* of ``min-is-black'').
|
|
||||||
*/
|
|
||||||
for (op = buf, cc = occ; cc-- > 0;)
|
|
||||||
*op++ = 0xff;
|
|
||||||
|
|
||||||
bp = (unsigned char *)tif->tif_rawcp;
|
|
||||||
cc = tif->tif_rawcc;
|
|
||||||
scanline = tif->tif_scanlinesize;
|
|
||||||
for (row = buf; occ > 0; occ -= scanline, row += scanline) {
|
|
||||||
n = *bp++, cc--;
|
|
||||||
switch (n) {
|
|
||||||
case LITERALROW:
|
|
||||||
/*
|
|
||||||
* The entire scanline is given as literal values.
|
|
||||||
*/
|
|
||||||
if (cc < scanline)
|
|
||||||
goto bad;
|
|
||||||
_TIFFmemcpy(row, bp, scanline);
|
|
||||||
bp += scanline;
|
|
||||||
cc -= scanline;
|
|
||||||
break;
|
|
||||||
case LITERALSPAN: {
|
|
||||||
tsize_t off;
|
|
||||||
/*
|
|
||||||
* The scanline has a literal span that begins at some
|
|
||||||
* offset.
|
|
||||||
*/
|
|
||||||
off = (bp[0] * 256) + bp[1];
|
|
||||||
n = (bp[2] * 256) + bp[3];
|
|
||||||
if (cc < 4+n || off+n > scanline)
|
|
||||||
goto bad;
|
|
||||||
_TIFFmemcpy(row+off, bp+4, n);
|
|
||||||
bp += 4+n;
|
|
||||||
cc -= 4+n;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default: {
|
|
||||||
uint32 npixels = 0, grey;
|
|
||||||
uint32 imagewidth = tif->tif_dir.td_imagewidth;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The scanline is composed of a sequence of constant
|
|
||||||
* color ``runs''. We shift into ``run mode'' and
|
|
||||||
* interpret bytes as codes of the form
|
|
||||||
* <color><npixels> until we've filled the scanline.
|
|
||||||
*/
|
|
||||||
op = row;
|
|
||||||
for (;;) {
|
|
||||||
grey = (n>>6) & 0x3;
|
|
||||||
n &= 0x3f;
|
|
||||||
/*
|
|
||||||
* Ensure the run does not exceed the scanline
|
|
||||||
* bounds, potentially resulting in a security
|
|
||||||
* issue.
|
|
||||||
*/
|
|
||||||
while (n-- > 0 && npixels < imagewidth)
|
|
||||||
SETPIXEL(op, grey);
|
|
||||||
if (npixels >= imagewidth)
|
|
||||||
break;
|
|
||||||
if (cc == 0)
|
|
||||||
goto bad;
|
|
||||||
n = *bp++, cc--;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
tif->tif_rawcp = (tidata_t) bp;
|
|
||||||
tif->tif_rawcc = cc;
|
|
||||||
return (1);
|
|
||||||
bad:
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "NeXTDecode: Not enough data for scanline %ld",
|
|
||||||
(long) tif->tif_row);
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
TIFFInitNeXT(TIFF* tif, int scheme)
|
|
||||||
{
|
|
||||||
(void) scheme;
|
|
||||||
tif->tif_decoderow = NeXTDecode;
|
|
||||||
tif->tif_decodestrip = NeXTDecode;
|
|
||||||
tif->tif_decodetile = NeXTDecode;
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
#endif /* NEXT_SUPPORT */
|
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,695 +0,0 @@
|
|||||||
/* $Id: tif_open.c,v 1.33.2.1 2010-06-08 18:50:42 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF Library.
|
|
||||||
*/
|
|
||||||
#include "tiffiop.h"
|
|
||||||
|
|
||||||
static const long typemask[13] = {
|
|
||||||
(long)0L, /* TIFF_NOTYPE */
|
|
||||||
(long)0x000000ffL, /* TIFF_BYTE */
|
|
||||||
(long)0xffffffffL, /* TIFF_ASCII */
|
|
||||||
(long)0x0000ffffL, /* TIFF_SHORT */
|
|
||||||
(long)0xffffffffL, /* TIFF_LONG */
|
|
||||||
(long)0xffffffffL, /* TIFF_RATIONAL */
|
|
||||||
(long)0x000000ffL, /* TIFF_SBYTE */
|
|
||||||
(long)0x000000ffL, /* TIFF_UNDEFINED */
|
|
||||||
(long)0x0000ffffL, /* TIFF_SSHORT */
|
|
||||||
(long)0xffffffffL, /* TIFF_SLONG */
|
|
||||||
(long)0xffffffffL, /* TIFF_SRATIONAL */
|
|
||||||
(long)0xffffffffL, /* TIFF_FLOAT */
|
|
||||||
(long)0xffffffffL, /* TIFF_DOUBLE */
|
|
||||||
};
|
|
||||||
static const int bigTypeshift[13] = {
|
|
||||||
0, /* TIFF_NOTYPE */
|
|
||||||
24, /* TIFF_BYTE */
|
|
||||||
0, /* TIFF_ASCII */
|
|
||||||
16, /* TIFF_SHORT */
|
|
||||||
0, /* TIFF_LONG */
|
|
||||||
0, /* TIFF_RATIONAL */
|
|
||||||
24, /* TIFF_SBYTE */
|
|
||||||
24, /* TIFF_UNDEFINED */
|
|
||||||
16, /* TIFF_SSHORT */
|
|
||||||
0, /* TIFF_SLONG */
|
|
||||||
0, /* TIFF_SRATIONAL */
|
|
||||||
0, /* TIFF_FLOAT */
|
|
||||||
0, /* TIFF_DOUBLE */
|
|
||||||
};
|
|
||||||
static const int litTypeshift[13] = {
|
|
||||||
0, /* TIFF_NOTYPE */
|
|
||||||
0, /* TIFF_BYTE */
|
|
||||||
0, /* TIFF_ASCII */
|
|
||||||
0, /* TIFF_SHORT */
|
|
||||||
0, /* TIFF_LONG */
|
|
||||||
0, /* TIFF_RATIONAL */
|
|
||||||
0, /* TIFF_SBYTE */
|
|
||||||
0, /* TIFF_UNDEFINED */
|
|
||||||
0, /* TIFF_SSHORT */
|
|
||||||
0, /* TIFF_SLONG */
|
|
||||||
0, /* TIFF_SRATIONAL */
|
|
||||||
0, /* TIFF_FLOAT */
|
|
||||||
0, /* TIFF_DOUBLE */
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Dummy functions to fill the omitted client procedures.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
_tiffDummyMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize)
|
|
||||||
{
|
|
||||||
(void) fd; (void) pbase; (void) psize;
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_tiffDummyUnmapProc(thandle_t fd, tdata_t base, toff_t size)
|
|
||||||
{
|
|
||||||
(void) fd; (void) base; (void) size;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialize the shift & mask tables, and the
|
|
||||||
* byte swapping state according to the file
|
|
||||||
* contents and the machine architecture.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
TIFFInitOrder(TIFF* tif, int magic)
|
|
||||||
{
|
|
||||||
tif->tif_typemask = typemask;
|
|
||||||
if (magic == TIFF_BIGENDIAN) {
|
|
||||||
tif->tif_typeshift = bigTypeshift;
|
|
||||||
#ifndef WORDS_BIGENDIAN
|
|
||||||
tif->tif_flags |= TIFF_SWAB;
|
|
||||||
#endif
|
|
||||||
} else {
|
|
||||||
tif->tif_typeshift = litTypeshift;
|
|
||||||
#ifdef WORDS_BIGENDIAN
|
|
||||||
tif->tif_flags |= TIFF_SWAB;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
_TIFFgetMode(const char* mode, const char* module)
|
|
||||||
{
|
|
||||||
int m = -1;
|
|
||||||
|
|
||||||
switch (mode[0]) {
|
|
||||||
case 'r':
|
|
||||||
m = O_RDONLY;
|
|
||||||
if (mode[1] == '+')
|
|
||||||
m = O_RDWR;
|
|
||||||
break;
|
|
||||||
case 'w':
|
|
||||||
case 'a':
|
|
||||||
m = O_RDWR|O_CREAT;
|
|
||||||
if (mode[0] == 'w')
|
|
||||||
m |= O_TRUNC;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
TIFFErrorExt(0, module, "\"%s\": Bad mode", mode);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return (m);
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
)
|
|
||||||
{
|
|
||||||
static const char module[] = "TIFFClientOpen";
|
|
||||||
TIFF *tif;
|
|
||||||
int m;
|
|
||||||
const char* cp;
|
|
||||||
|
|
||||||
m = _TIFFgetMode(mode, module);
|
|
||||||
if (m == -1)
|
|
||||||
goto bad2;
|
|
||||||
tif = (TIFF *)_TIFFmalloc(sizeof (TIFF) + strlen(name) + 1);
|
|
||||||
if (tif == NULL) {
|
|
||||||
TIFFErrorExt(clientdata, module, "%s: Out of memory (TIFF structure)", name);
|
|
||||||
goto bad2;
|
|
||||||
}
|
|
||||||
_TIFFmemset(tif, 0, sizeof (*tif));
|
|
||||||
tif->tif_name = (char *)tif + sizeof (TIFF);
|
|
||||||
strcpy(tif->tif_name, name);
|
|
||||||
tif->tif_mode = m &~ (O_CREAT|O_TRUNC);
|
|
||||||
tif->tif_curdir = (tdir_t) -1; /* non-existent directory */
|
|
||||||
tif->tif_curoff = 0;
|
|
||||||
tif->tif_curstrip = (tstrip_t) -1; /* invalid strip */
|
|
||||||
tif->tif_row = (uint32) -1; /* read/write pre-increment */
|
|
||||||
tif->tif_clientdata = clientdata;
|
|
||||||
if (!readproc || !writeproc || !seekproc || !closeproc || !sizeproc) {
|
|
||||||
TIFFErrorExt(clientdata, module,
|
|
||||||
"One of the client procedures is NULL pointer.");
|
|
||||||
goto bad2;
|
|
||||||
}
|
|
||||||
tif->tif_readproc = readproc;
|
|
||||||
tif->tif_writeproc = writeproc;
|
|
||||||
tif->tif_seekproc = seekproc;
|
|
||||||
tif->tif_closeproc = closeproc;
|
|
||||||
tif->tif_sizeproc = sizeproc;
|
|
||||||
if (mapproc)
|
|
||||||
tif->tif_mapproc = mapproc;
|
|
||||||
else
|
|
||||||
tif->tif_mapproc = _tiffDummyMapProc;
|
|
||||||
if (unmapproc)
|
|
||||||
tif->tif_unmapproc = unmapproc;
|
|
||||||
else
|
|
||||||
tif->tif_unmapproc = _tiffDummyUnmapProc;
|
|
||||||
_TIFFSetDefaultCompressionState(tif); /* setup default state */
|
|
||||||
/*
|
|
||||||
* Default is to return data MSB2LSB and enable the
|
|
||||||
* use of memory-mapped files and strip chopping when
|
|
||||||
* a file is opened read-only.
|
|
||||||
*/
|
|
||||||
tif->tif_flags = FILLORDER_MSB2LSB;
|
|
||||||
if (m == O_RDONLY )
|
|
||||||
tif->tif_flags |= TIFF_MAPPED;
|
|
||||||
|
|
||||||
#ifdef STRIPCHOP_DEFAULT
|
|
||||||
if (m == O_RDONLY || m == O_RDWR)
|
|
||||||
tif->tif_flags |= STRIPCHOP_DEFAULT;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Process library-specific flags in the open mode string.
|
|
||||||
* The following flags may be used to control intrinsic library
|
|
||||||
* behaviour that may or may not be desirable (usually for
|
|
||||||
* compatibility with some application that claims to support
|
|
||||||
* TIFF but only supports some braindead idea of what the
|
|
||||||
* vendor thinks TIFF is):
|
|
||||||
*
|
|
||||||
* 'l' use little-endian byte order for creating a file
|
|
||||||
* 'b' use big-endian byte order for creating a file
|
|
||||||
* 'L' read/write information using LSB2MSB bit order
|
|
||||||
* 'B' read/write information using MSB2LSB bit order
|
|
||||||
* 'H' read/write information using host bit order
|
|
||||||
* 'M' enable use of memory-mapped files when supported
|
|
||||||
* 'm' disable use of memory-mapped files
|
|
||||||
* 'C' enable strip chopping support when reading
|
|
||||||
* 'c' disable strip chopping support
|
|
||||||
* 'h' read TIFF header only, do not load the first IFD
|
|
||||||
*
|
|
||||||
* The use of the 'l' and 'b' flags is strongly discouraged.
|
|
||||||
* These flags are provided solely because numerous vendors,
|
|
||||||
* typically on the PC, do not correctly support TIFF; they
|
|
||||||
* only support the Intel little-endian byte order. This
|
|
||||||
* support is not configured by default because it supports
|
|
||||||
* the violation of the TIFF spec that says that readers *MUST*
|
|
||||||
* support both byte orders. It is strongly recommended that
|
|
||||||
* you not use this feature except to deal with busted apps
|
|
||||||
* that write invalid TIFF. And even in those cases you should
|
|
||||||
* bang on the vendors to fix their software.
|
|
||||||
*
|
|
||||||
* The 'L', 'B', and 'H' flags are intended for applications
|
|
||||||
* that can optimize operations on data by using a particular
|
|
||||||
* bit order. By default the library returns data in MSB2LSB
|
|
||||||
* bit order for compatibiltiy with older versions of this
|
|
||||||
* library. Returning data in the bit order of the native cpu
|
|
||||||
* makes the most sense but also requires applications to check
|
|
||||||
* the value of the FillOrder tag; something they probably do
|
|
||||||
* not do right now.
|
|
||||||
*
|
|
||||||
* The 'M' and 'm' flags are provided because some virtual memory
|
|
||||||
* systems exhibit poor behaviour when large images are mapped.
|
|
||||||
* These options permit clients to control the use of memory-mapped
|
|
||||||
* files on a per-file basis.
|
|
||||||
*
|
|
||||||
* The 'C' and 'c' flags are provided because the library support
|
|
||||||
* for chopping up large strips into multiple smaller strips is not
|
|
||||||
* application-transparent and as such can cause problems. The 'c'
|
|
||||||
* option permits applications that only want to look at the tags,
|
|
||||||
* for example, to get the unadulterated TIFF tag information.
|
|
||||||
*/
|
|
||||||
for (cp = mode; *cp; cp++)
|
|
||||||
switch (*cp) {
|
|
||||||
case 'b':
|
|
||||||
#ifndef WORDS_BIGENDIAN
|
|
||||||
if (m&O_CREAT)
|
|
||||||
tif->tif_flags |= TIFF_SWAB;
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
case 'l':
|
|
||||||
#ifdef WORDS_BIGENDIAN
|
|
||||||
if ((m&O_CREAT))
|
|
||||||
tif->tif_flags |= TIFF_SWAB;
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
case 'B':
|
|
||||||
tif->tif_flags = (tif->tif_flags &~ TIFF_FILLORDER) |
|
|
||||||
FILLORDER_MSB2LSB;
|
|
||||||
break;
|
|
||||||
case 'L':
|
|
||||||
tif->tif_flags = (tif->tif_flags &~ TIFF_FILLORDER) |
|
|
||||||
FILLORDER_LSB2MSB;
|
|
||||||
break;
|
|
||||||
case 'H':
|
|
||||||
tif->tif_flags = (tif->tif_flags &~ TIFF_FILLORDER) |
|
|
||||||
HOST_FILLORDER;
|
|
||||||
break;
|
|
||||||
case 'M':
|
|
||||||
if (m == O_RDONLY)
|
|
||||||
tif->tif_flags |= TIFF_MAPPED;
|
|
||||||
break;
|
|
||||||
case 'm':
|
|
||||||
if (m == O_RDONLY)
|
|
||||||
tif->tif_flags &= ~TIFF_MAPPED;
|
|
||||||
break;
|
|
||||||
case 'C':
|
|
||||||
if (m == O_RDONLY)
|
|
||||||
tif->tif_flags |= TIFF_STRIPCHOP;
|
|
||||||
break;
|
|
||||||
case 'c':
|
|
||||||
if (m == O_RDONLY)
|
|
||||||
tif->tif_flags &= ~TIFF_STRIPCHOP;
|
|
||||||
break;
|
|
||||||
case 'h':
|
|
||||||
tif->tif_flags |= TIFF_HEADERONLY;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Read in TIFF header.
|
|
||||||
*/
|
|
||||||
if (tif->tif_mode & O_TRUNC ||
|
|
||||||
!ReadOK(tif, &tif->tif_header, sizeof (TIFFHeader))) {
|
|
||||||
if (tif->tif_mode == O_RDONLY) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, name,
|
|
||||||
"Cannot read TIFF header");
|
|
||||||
goto bad;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Setup header and write.
|
|
||||||
*/
|
|
||||||
#ifdef WORDS_BIGENDIAN
|
|
||||||
tif->tif_header.tiff_magic = tif->tif_flags & TIFF_SWAB
|
|
||||||
? TIFF_LITTLEENDIAN : TIFF_BIGENDIAN;
|
|
||||||
#else
|
|
||||||
tif->tif_header.tiff_magic = tif->tif_flags & TIFF_SWAB
|
|
||||||
? TIFF_BIGENDIAN : TIFF_LITTLEENDIAN;
|
|
||||||
#endif
|
|
||||||
tif->tif_header.tiff_version = TIFF_VERSION;
|
|
||||||
if (tif->tif_flags & TIFF_SWAB)
|
|
||||||
TIFFSwabShort(&tif->tif_header.tiff_version);
|
|
||||||
tif->tif_header.tiff_diroff = 0; /* filled in later */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The doc for "fopen" for some STD_C_LIBs says that if you
|
|
||||||
* open a file for modify ("+"), then you must fseek (or
|
|
||||||
* fflush?) between any freads and fwrites. This is not
|
|
||||||
* necessary on most systems, but has been shown to be needed
|
|
||||||
* on Solaris.
|
|
||||||
*/
|
|
||||||
TIFFSeekFile( tif, 0, SEEK_SET );
|
|
||||||
|
|
||||||
if (!WriteOK(tif, &tif->tif_header, sizeof (TIFFHeader))) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, name,
|
|
||||||
"Error writing TIFF header");
|
|
||||||
goto bad;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Setup the byte order handling.
|
|
||||||
*/
|
|
||||||
TIFFInitOrder(tif, tif->tif_header.tiff_magic);
|
|
||||||
/*
|
|
||||||
* Setup default directory.
|
|
||||||
*/
|
|
||||||
if (!TIFFDefaultDirectory(tif))
|
|
||||||
goto bad;
|
|
||||||
tif->tif_diroff = 0;
|
|
||||||
tif->tif_dirlist = NULL;
|
|
||||||
tif->tif_dirlistsize = 0;
|
|
||||||
tif->tif_dirnumber = 0;
|
|
||||||
return (tif);
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Setup the byte order handling.
|
|
||||||
*/
|
|
||||||
if (tif->tif_header.tiff_magic != TIFF_BIGENDIAN &&
|
|
||||||
tif->tif_header.tiff_magic != TIFF_LITTLEENDIAN
|
|
||||||
#if MDI_SUPPORT
|
|
||||||
&&
|
|
||||||
#if HOST_BIGENDIAN
|
|
||||||
tif->tif_header.tiff_magic != MDI_BIGENDIAN
|
|
||||||
#else
|
|
||||||
tif->tif_header.tiff_magic != MDI_LITTLEENDIAN
|
|
||||||
#endif
|
|
||||||
) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, name,
|
|
||||||
"Not a TIFF or MDI file, bad magic number %d (0x%x)",
|
|
||||||
#else
|
|
||||||
) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, name,
|
|
||||||
"Not a TIFF file, bad magic number %d (0x%x)",
|
|
||||||
#endif
|
|
||||||
tif->tif_header.tiff_magic,
|
|
||||||
tif->tif_header.tiff_magic);
|
|
||||||
goto bad;
|
|
||||||
}
|
|
||||||
TIFFInitOrder(tif, tif->tif_header.tiff_magic);
|
|
||||||
/*
|
|
||||||
* Swap header if required.
|
|
||||||
*/
|
|
||||||
if (tif->tif_flags & TIFF_SWAB) {
|
|
||||||
TIFFSwabShort(&tif->tif_header.tiff_version);
|
|
||||||
TIFFSwabLong(&tif->tif_header.tiff_diroff);
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Now check version (if needed, it's been byte-swapped).
|
|
||||||
* Note that this isn't actually a version number, it's a
|
|
||||||
* magic number that doesn't change (stupid).
|
|
||||||
*/
|
|
||||||
if (tif->tif_header.tiff_version == TIFF_BIGTIFF_VERSION) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, name,
|
|
||||||
"This is a BigTIFF file. This format not supported\n"
|
|
||||||
"by this version of libtiff." );
|
|
||||||
goto bad;
|
|
||||||
}
|
|
||||||
if (tif->tif_header.tiff_version != TIFF_VERSION) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, name,
|
|
||||||
"Not a TIFF file, bad version number %d (0x%x)",
|
|
||||||
tif->tif_header.tiff_version,
|
|
||||||
tif->tif_header.tiff_version);
|
|
||||||
goto bad;
|
|
||||||
}
|
|
||||||
tif->tif_flags |= TIFF_MYBUFFER;
|
|
||||||
tif->tif_rawcp = tif->tif_rawdata = 0;
|
|
||||||
tif->tif_rawdatasize = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Sometimes we do not want to read the first directory (for example,
|
|
||||||
* it may be broken) and want to proceed to other directories. I this
|
|
||||||
* case we use the TIFF_HEADERONLY flag to open file and return
|
|
||||||
* immediately after reading TIFF header.
|
|
||||||
*/
|
|
||||||
if (tif->tif_flags & TIFF_HEADERONLY)
|
|
||||||
return (tif);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Setup initial directory.
|
|
||||||
*/
|
|
||||||
switch (mode[0]) {
|
|
||||||
case 'r':
|
|
||||||
tif->tif_nextdiroff = tif->tif_header.tiff_diroff;
|
|
||||||
/*
|
|
||||||
* Try to use a memory-mapped file if the client
|
|
||||||
* has not explicitly suppressed usage with the
|
|
||||||
* 'm' flag in the open mode (see above).
|
|
||||||
*/
|
|
||||||
if ((tif->tif_flags & TIFF_MAPPED) &&
|
|
||||||
!TIFFMapFileContents(tif, (tdata_t*) &tif->tif_base, &tif->tif_size))
|
|
||||||
tif->tif_flags &= ~TIFF_MAPPED;
|
|
||||||
if (TIFFReadDirectory(tif)) {
|
|
||||||
tif->tif_rawcc = -1;
|
|
||||||
tif->tif_flags |= TIFF_BUFFERSETUP;
|
|
||||||
return (tif);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'a':
|
|
||||||
/*
|
|
||||||
* New directories are automatically append
|
|
||||||
* to the end of the directory chain when they
|
|
||||||
* are written out (see TIFFWriteDirectory).
|
|
||||||
*/
|
|
||||||
if (!TIFFDefaultDirectory(tif))
|
|
||||||
goto bad;
|
|
||||||
return (tif);
|
|
||||||
}
|
|
||||||
bad:
|
|
||||||
tif->tif_mode = O_RDONLY; /* XXX avoid flush */
|
|
||||||
TIFFCleanup(tif);
|
|
||||||
bad2:
|
|
||||||
return ((TIFF*)0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Query functions to access private data.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return open file's name.
|
|
||||||
*/
|
|
||||||
const char *
|
|
||||||
TIFFFileName(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (tif->tif_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set the file name.
|
|
||||||
*/
|
|
||||||
const char *
|
|
||||||
TIFFSetFileName(TIFF* tif, const char *name)
|
|
||||||
{
|
|
||||||
const char* old_name = tif->tif_name;
|
|
||||||
tif->tif_name = (char *)name;
|
|
||||||
return (old_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return open file's I/O descriptor.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
TIFFFileno(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (tif->tif_fd);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set open file's I/O descriptor, and return previous value.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
TIFFSetFileno(TIFF* tif, int fd)
|
|
||||||
{
|
|
||||||
int old_fd = tif->tif_fd;
|
|
||||||
tif->tif_fd = fd;
|
|
||||||
return old_fd;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return open file's clientdata.
|
|
||||||
*/
|
|
||||||
thandle_t
|
|
||||||
TIFFClientdata(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (tif->tif_clientdata);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set open file's clientdata, and return previous value.
|
|
||||||
*/
|
|
||||||
thandle_t
|
|
||||||
TIFFSetClientdata(TIFF* tif, thandle_t newvalue)
|
|
||||||
{
|
|
||||||
thandle_t m = tif->tif_clientdata;
|
|
||||||
tif->tif_clientdata = newvalue;
|
|
||||||
return m;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return read/write mode.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
TIFFGetMode(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (tif->tif_mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return read/write mode.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
TIFFSetMode(TIFF* tif, int mode)
|
|
||||||
{
|
|
||||||
int old_mode = tif->tif_mode;
|
|
||||||
tif->tif_mode = mode;
|
|
||||||
return (old_mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return nonzero if file is organized in
|
|
||||||
* tiles; zero if organized as strips.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
TIFFIsTiled(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (isTiled(tif));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return current row being read/written.
|
|
||||||
*/
|
|
||||||
uint32
|
|
||||||
TIFFCurrentRow(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (tif->tif_row);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return index of the current directory.
|
|
||||||
*/
|
|
||||||
tdir_t
|
|
||||||
TIFFCurrentDirectory(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (tif->tif_curdir);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return current strip.
|
|
||||||
*/
|
|
||||||
tstrip_t
|
|
||||||
TIFFCurrentStrip(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (tif->tif_curstrip);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return current tile.
|
|
||||||
*/
|
|
||||||
ttile_t
|
|
||||||
TIFFCurrentTile(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (tif->tif_curtile);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return nonzero if the file has byte-swapped data.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
TIFFIsByteSwapped(TIFF* tif)
|
|
||||||
{
|
|
||||||
return ((tif->tif_flags & TIFF_SWAB) != 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return nonzero if the data is returned up-sampled.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
TIFFIsUpSampled(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (isUpSampled(tif));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return nonzero if the data is returned in MSB-to-LSB bit order.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
TIFFIsMSB2LSB(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (isFillOrder(tif, FILLORDER_MSB2LSB));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return nonzero if given file was written in big-endian order.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
TIFFIsBigEndian(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (tif->tif_header.tiff_magic == TIFF_BIGENDIAN);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return pointer to file read method.
|
|
||||||
*/
|
|
||||||
TIFFReadWriteProc
|
|
||||||
TIFFGetReadProc(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (tif->tif_readproc);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return pointer to file write method.
|
|
||||||
*/
|
|
||||||
TIFFReadWriteProc
|
|
||||||
TIFFGetWriteProc(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (tif->tif_writeproc);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return pointer to file seek method.
|
|
||||||
*/
|
|
||||||
TIFFSeekProc
|
|
||||||
TIFFGetSeekProc(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (tif->tif_seekproc);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return pointer to file close method.
|
|
||||||
*/
|
|
||||||
TIFFCloseProc
|
|
||||||
TIFFGetCloseProc(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (tif->tif_closeproc);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return pointer to file size requesting method.
|
|
||||||
*/
|
|
||||||
TIFFSizeProc
|
|
||||||
TIFFGetSizeProc(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (tif->tif_sizeproc);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return pointer to memory mapping method.
|
|
||||||
*/
|
|
||||||
TIFFMapFileProc
|
|
||||||
TIFFGetMapFileProc(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (tif->tif_mapproc);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return pointer to memory unmapping method.
|
|
||||||
*/
|
|
||||||
TIFFUnmapFileProc
|
|
||||||
TIFFGetUnmapFileProc(TIFF* tif)
|
|
||||||
{
|
|
||||||
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:
|
|
||||||
*/
|
|
||||||
@@ -1,300 +0,0 @@
|
|||||||
/* $Id: tif_packbits.c,v 1.13.2.2 2010-06-08 18:50:42 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "tiffiop.h"
|
|
||||||
#ifdef PACKBITS_SUPPORT
|
|
||||||
/*
|
|
||||||
* TIFF Library.
|
|
||||||
*
|
|
||||||
* PackBits Compression Algorithm Support
|
|
||||||
*/
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
static int
|
|
||||||
PackBitsPreEncode(TIFF* tif, tsample_t s)
|
|
||||||
{
|
|
||||||
(void) s;
|
|
||||||
|
|
||||||
if (!(tif->tif_data = (tidata_t)_TIFFmalloc(sizeof(tsize_t))))
|
|
||||||
return (0);
|
|
||||||
/*
|
|
||||||
* Calculate the scanline/tile-width size in bytes.
|
|
||||||
*/
|
|
||||||
if (isTiled(tif))
|
|
||||||
*(tsize_t*)tif->tif_data = TIFFTileRowSize(tif);
|
|
||||||
else
|
|
||||||
*(tsize_t*)tif->tif_data = TIFFScanlineSize(tif);
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
PackBitsPostEncode(TIFF* tif)
|
|
||||||
{
|
|
||||||
if (tif->tif_data)
|
|
||||||
_TIFFfree(tif->tif_data);
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* NB: tidata is the type representing *(tidata_t);
|
|
||||||
* if tidata_t is made signed then this type must
|
|
||||||
* be adjusted accordingly.
|
|
||||||
*/
|
|
||||||
typedef unsigned char tidata;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Encode a run of pixels.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
PackBitsEncode(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s)
|
|
||||||
{
|
|
||||||
unsigned char* bp = (unsigned char*) buf;
|
|
||||||
tidata_t op, ep, lastliteral;
|
|
||||||
long n, slop;
|
|
||||||
int b;
|
|
||||||
enum { BASE, LITERAL, RUN, LITERAL_RUN } state;
|
|
||||||
|
|
||||||
(void) s;
|
|
||||||
op = tif->tif_rawcp;
|
|
||||||
ep = tif->tif_rawdata + tif->tif_rawdatasize;
|
|
||||||
state = BASE;
|
|
||||||
lastliteral = 0;
|
|
||||||
while (cc > 0) {
|
|
||||||
/*
|
|
||||||
* Find the longest string of identical bytes.
|
|
||||||
*/
|
|
||||||
b = *bp++, cc--, n = 1;
|
|
||||||
for (; cc > 0 && b == *bp; cc--, bp++)
|
|
||||||
n++;
|
|
||||||
again:
|
|
||||||
if (op + 2 >= ep) { /* insure space for new data */
|
|
||||||
/*
|
|
||||||
* Be careful about writing the last
|
|
||||||
* literal. Must write up to that point
|
|
||||||
* and then copy the remainder to the
|
|
||||||
* front of the buffer.
|
|
||||||
*/
|
|
||||||
if (state == LITERAL || state == LITERAL_RUN) {
|
|
||||||
slop = op - lastliteral;
|
|
||||||
tif->tif_rawcc += lastliteral - tif->tif_rawcp;
|
|
||||||
if (!TIFFFlushData1(tif))
|
|
||||||
return (-1);
|
|
||||||
op = tif->tif_rawcp;
|
|
||||||
while (slop-- > 0)
|
|
||||||
*op++ = *lastliteral++;
|
|
||||||
lastliteral = tif->tif_rawcp;
|
|
||||||
} else {
|
|
||||||
tif->tif_rawcc += op - tif->tif_rawcp;
|
|
||||||
if (!TIFFFlushData1(tif))
|
|
||||||
return (-1);
|
|
||||||
op = tif->tif_rawcp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
switch (state) {
|
|
||||||
case BASE: /* initial state, set run/literal */
|
|
||||||
if (n > 1) {
|
|
||||||
state = RUN;
|
|
||||||
if (n > 128) {
|
|
||||||
*op++ = (tidata) -127;
|
|
||||||
*op++ = (tidataval_t) b;
|
|
||||||
n -= 128;
|
|
||||||
goto again;
|
|
||||||
}
|
|
||||||
*op++ = (tidataval_t)(-(n-1));
|
|
||||||
*op++ = (tidataval_t) b;
|
|
||||||
} else {
|
|
||||||
lastliteral = op;
|
|
||||||
*op++ = 0;
|
|
||||||
*op++ = (tidataval_t) b;
|
|
||||||
state = LITERAL;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case LITERAL: /* last object was literal string */
|
|
||||||
if (n > 1) {
|
|
||||||
state = LITERAL_RUN;
|
|
||||||
if (n > 128) {
|
|
||||||
*op++ = (tidata) -127;
|
|
||||||
*op++ = (tidataval_t) b;
|
|
||||||
n -= 128;
|
|
||||||
goto again;
|
|
||||||
}
|
|
||||||
*op++ = (tidataval_t)(-(n-1)); /* encode run */
|
|
||||||
*op++ = (tidataval_t) b;
|
|
||||||
} else { /* extend literal */
|
|
||||||
if (++(*lastliteral) == 127)
|
|
||||||
state = BASE;
|
|
||||||
*op++ = (tidataval_t) b;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RUN: /* last object was run */
|
|
||||||
if (n > 1) {
|
|
||||||
if (n > 128) {
|
|
||||||
*op++ = (tidata) -127;
|
|
||||||
*op++ = (tidataval_t) b;
|
|
||||||
n -= 128;
|
|
||||||
goto again;
|
|
||||||
}
|
|
||||||
*op++ = (tidataval_t)(-(n-1));
|
|
||||||
*op++ = (tidataval_t) b;
|
|
||||||
} else {
|
|
||||||
lastliteral = op;
|
|
||||||
*op++ = 0;
|
|
||||||
*op++ = (tidataval_t) b;
|
|
||||||
state = LITERAL;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case LITERAL_RUN: /* literal followed by a run */
|
|
||||||
/*
|
|
||||||
* Check to see if previous run should
|
|
||||||
* be converted to a literal, in which
|
|
||||||
* case we convert literal-run-literal
|
|
||||||
* to a single literal.
|
|
||||||
*/
|
|
||||||
if (n == 1 && op[-2] == (tidata) -1 &&
|
|
||||||
*lastliteral < 126) {
|
|
||||||
state = (((*lastliteral) += 2) == 127 ?
|
|
||||||
BASE : LITERAL);
|
|
||||||
op[-2] = op[-1]; /* replicate */
|
|
||||||
} else
|
|
||||||
state = RUN;
|
|
||||||
goto again;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
tif->tif_rawcc += op - tif->tif_rawcp;
|
|
||||||
tif->tif_rawcp = op;
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Encode a rectangular chunk of pixels. We break it up
|
|
||||||
* into row-sized pieces to insure that encoded runs do
|
|
||||||
* not span rows. Otherwise, there can be problems with
|
|
||||||
* the decoder if data is read, for example, by scanlines
|
|
||||||
* when it was encoded by strips.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
PackBitsEncodeChunk(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s)
|
|
||||||
{
|
|
||||||
tsize_t rowsize = *(tsize_t*)tif->tif_data;
|
|
||||||
|
|
||||||
while ((long)cc > 0) {
|
|
||||||
int chunk = rowsize;
|
|
||||||
|
|
||||||
if( cc < chunk )
|
|
||||||
chunk = cc;
|
|
||||||
|
|
||||||
if (PackBitsEncode(tif, bp, chunk, s) < 0)
|
|
||||||
return (-1);
|
|
||||||
bp += chunk;
|
|
||||||
cc -= chunk;
|
|
||||||
}
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
PackBitsDecode(TIFF* tif, tidata_t op, tsize_t occ, tsample_t s)
|
|
||||||
{
|
|
||||||
char *bp;
|
|
||||||
tsize_t cc;
|
|
||||||
long n;
|
|
||||||
int b;
|
|
||||||
|
|
||||||
(void) s;
|
|
||||||
bp = (char*) tif->tif_rawcp;
|
|
||||||
cc = tif->tif_rawcc;
|
|
||||||
while (cc > 0 && (long)occ > 0) {
|
|
||||||
n = (long) *bp++, cc--;
|
|
||||||
/*
|
|
||||||
* Watch out for compilers that
|
|
||||||
* don't sign extend chars...
|
|
||||||
*/
|
|
||||||
if (n >= 128)
|
|
||||||
n -= 256;
|
|
||||||
if (n < 0) { /* replicate next byte -n+1 times */
|
|
||||||
if (n == -128) /* nop */
|
|
||||||
continue;
|
|
||||||
n = -n + 1;
|
|
||||||
if( occ < n )
|
|
||||||
{
|
|
||||||
TIFFWarningExt(tif->tif_clientdata, tif->tif_name,
|
|
||||||
"PackBitsDecode: discarding %ld bytes "
|
|
||||||
"to avoid buffer overrun",
|
|
||||||
n - occ);
|
|
||||||
n = occ;
|
|
||||||
}
|
|
||||||
occ -= n;
|
|
||||||
b = *bp++, cc--;
|
|
||||||
while (n-- > 0)
|
|
||||||
*op++ = (tidataval_t) b;
|
|
||||||
} else { /* copy next n+1 bytes literally */
|
|
||||||
if (occ < n + 1)
|
|
||||||
{
|
|
||||||
TIFFWarningExt(tif->tif_clientdata, tif->tif_name,
|
|
||||||
"PackBitsDecode: discarding %ld bytes "
|
|
||||||
"to avoid buffer overrun",
|
|
||||||
n - occ + 1);
|
|
||||||
n = occ - 1;
|
|
||||||
}
|
|
||||||
_TIFFmemcpy(op, bp, ++n);
|
|
||||||
op += n; occ -= n;
|
|
||||||
bp += n; cc -= n;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
tif->tif_rawcp = (tidata_t) bp;
|
|
||||||
tif->tif_rawcc = cc;
|
|
||||||
if (occ > 0) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
|
||||||
"PackBitsDecode: Not enough data for scanline %ld",
|
|
||||||
(long) tif->tif_row);
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
TIFFInitPackBits(TIFF* tif, int scheme)
|
|
||||||
{
|
|
||||||
(void) scheme;
|
|
||||||
tif->tif_decoderow = PackBitsDecode;
|
|
||||||
tif->tif_decodestrip = PackBitsDecode;
|
|
||||||
tif->tif_decodetile = PackBitsDecode;
|
|
||||||
tif->tif_preencode = PackBitsPreEncode;
|
|
||||||
tif->tif_postencode = PackBitsPostEncode;
|
|
||||||
tif->tif_encoderow = PackBitsEncode;
|
|
||||||
tif->tif_encodestrip = PackBitsEncodeChunk;
|
|
||||||
tif->tif_encodetile = PackBitsEncodeChunk;
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
#endif /* PACKBITS_SUPPORT */
|
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,736 +0,0 @@
|
|||||||
/* $Id: tif_predict.c,v 1.11.2.4 2010-06-08 18:50:42 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF Library.
|
|
||||||
*
|
|
||||||
* Predictor Tag Support (used by multiple codecs).
|
|
||||||
*/
|
|
||||||
#include "tiffiop.h"
|
|
||||||
#include "tif_predict.h"
|
|
||||||
|
|
||||||
#define PredictorState(tif) ((TIFFPredictorState*) (tif)->tif_data)
|
|
||||||
|
|
||||||
static void horAcc8(TIFF*, tidata_t, tsize_t);
|
|
||||||
static void horAcc16(TIFF*, tidata_t, tsize_t);
|
|
||||||
static void horAcc32(TIFF*, tidata_t, tsize_t);
|
|
||||||
static void swabHorAcc16(TIFF*, tidata_t, tsize_t);
|
|
||||||
static void swabHorAcc32(TIFF*, tidata_t, tsize_t);
|
|
||||||
static void horDiff8(TIFF*, tidata_t, tsize_t);
|
|
||||||
static void horDiff16(TIFF*, tidata_t, tsize_t);
|
|
||||||
static void horDiff32(TIFF*, tidata_t, tsize_t);
|
|
||||||
static void fpAcc(TIFF*, tidata_t, tsize_t);
|
|
||||||
static void fpDiff(TIFF*, tidata_t, tsize_t);
|
|
||||||
static int PredictorDecodeRow(TIFF*, tidata_t, tsize_t, tsample_t);
|
|
||||||
static int PredictorDecodeTile(TIFF*, tidata_t, tsize_t, tsample_t);
|
|
||||||
static int PredictorEncodeRow(TIFF*, tidata_t, tsize_t, tsample_t);
|
|
||||||
static int PredictorEncodeTile(TIFF*, tidata_t, tsize_t, tsample_t);
|
|
||||||
|
|
||||||
static int
|
|
||||||
PredictorSetup(TIFF* tif)
|
|
||||||
{
|
|
||||||
static const char module[] = "PredictorSetup";
|
|
||||||
|
|
||||||
TIFFPredictorState* sp = PredictorState(tif);
|
|
||||||
TIFFDirectory* td = &tif->tif_dir;
|
|
||||||
|
|
||||||
switch (sp->predictor) /* no differencing */
|
|
||||||
{
|
|
||||||
case PREDICTOR_NONE:
|
|
||||||
return 1;
|
|
||||||
case PREDICTOR_HORIZONTAL:
|
|
||||||
if (td->td_bitspersample != 8
|
|
||||||
&& td->td_bitspersample != 16
|
|
||||||
&& td->td_bitspersample != 32) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
|
||||||
"Horizontal differencing \"Predictor\" not supported with %d-bit samples",
|
|
||||||
td->td_bitspersample);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case PREDICTOR_FLOATINGPOINT:
|
|
||||||
if (td->td_sampleformat != SAMPLEFORMAT_IEEEFP) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
|
||||||
"Floating point \"Predictor\" not supported with %d data format",
|
|
||||||
td->td_sampleformat);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
|
||||||
"\"Predictor\" value %d not supported",
|
|
||||||
sp->predictor);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
sp->stride = (td->td_planarconfig == PLANARCONFIG_CONTIG ?
|
|
||||||
td->td_samplesperpixel : 1);
|
|
||||||
/*
|
|
||||||
* Calculate the scanline/tile-width size in bytes.
|
|
||||||
*/
|
|
||||||
if (isTiled(tif))
|
|
||||||
sp->rowsize = TIFFTileRowSize(tif);
|
|
||||||
else
|
|
||||||
sp->rowsize = TIFFScanlineSize(tif);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
PredictorSetupDecode(TIFF* tif)
|
|
||||||
{
|
|
||||||
TIFFPredictorState* sp = PredictorState(tif);
|
|
||||||
TIFFDirectory* td = &tif->tif_dir;
|
|
||||||
|
|
||||||
if (!(*sp->setupdecode)(tif) || !PredictorSetup(tif))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (sp->predictor == 2) {
|
|
||||||
switch (td->td_bitspersample) {
|
|
||||||
case 8: sp->decodepfunc = horAcc8; break;
|
|
||||||
case 16: sp->decodepfunc = horAcc16; break;
|
|
||||||
case 32: sp->decodepfunc = horAcc32; break;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Override default decoding method with one that does the
|
|
||||||
* predictor stuff.
|
|
||||||
*/
|
|
||||||
if( tif->tif_decoderow != PredictorDecodeRow )
|
|
||||||
{
|
|
||||||
sp->decoderow = tif->tif_decoderow;
|
|
||||||
tif->tif_decoderow = PredictorDecodeRow;
|
|
||||||
sp->decodestrip = tif->tif_decodestrip;
|
|
||||||
tif->tif_decodestrip = PredictorDecodeTile;
|
|
||||||
sp->decodetile = tif->tif_decodetile;
|
|
||||||
tif->tif_decodetile = PredictorDecodeTile;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* If the data is horizontally differenced 16-bit data that
|
|
||||||
* requires byte-swapping, then it must be byte swapped before
|
|
||||||
* the accumulation step. We do this with a special-purpose
|
|
||||||
* routine and override the normal post decoding logic that
|
|
||||||
* the library setup when the directory was read.
|
|
||||||
*/
|
|
||||||
if (tif->tif_flags & TIFF_SWAB) {
|
|
||||||
if (sp->decodepfunc == horAcc16) {
|
|
||||||
sp->decodepfunc = swabHorAcc16;
|
|
||||||
tif->tif_postdecode = _TIFFNoPostDecode;
|
|
||||||
} else if (sp->decodepfunc == horAcc32) {
|
|
||||||
sp->decodepfunc = swabHorAcc32;
|
|
||||||
tif->tif_postdecode = _TIFFNoPostDecode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (sp->predictor == 3) {
|
|
||||||
sp->decodepfunc = fpAcc;
|
|
||||||
/*
|
|
||||||
* Override default decoding method with one that does the
|
|
||||||
* predictor stuff.
|
|
||||||
*/
|
|
||||||
if( tif->tif_decoderow != PredictorDecodeRow )
|
|
||||||
{
|
|
||||||
sp->decoderow = tif->tif_decoderow;
|
|
||||||
tif->tif_decoderow = PredictorDecodeRow;
|
|
||||||
sp->decodestrip = tif->tif_decodestrip;
|
|
||||||
tif->tif_decodestrip = PredictorDecodeTile;
|
|
||||||
sp->decodetile = tif->tif_decodetile;
|
|
||||||
tif->tif_decodetile = PredictorDecodeTile;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* The data should not be swapped outside of the floating
|
|
||||||
* point predictor, the accumulation routine should return
|
|
||||||
* byres in the native order.
|
|
||||||
*/
|
|
||||||
if (tif->tif_flags & TIFF_SWAB) {
|
|
||||||
tif->tif_postdecode = _TIFFNoPostDecode;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Allocate buffer to keep the decoded bytes before
|
|
||||||
* rearranging in the ight order
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
PredictorSetupEncode(TIFF* tif)
|
|
||||||
{
|
|
||||||
TIFFPredictorState* sp = PredictorState(tif);
|
|
||||||
TIFFDirectory* td = &tif->tif_dir;
|
|
||||||
|
|
||||||
if (!(*sp->setupencode)(tif) || !PredictorSetup(tif))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (sp->predictor == 2) {
|
|
||||||
switch (td->td_bitspersample) {
|
|
||||||
case 8: sp->encodepfunc = horDiff8; break;
|
|
||||||
case 16: sp->encodepfunc = horDiff16; break;
|
|
||||||
case 32: sp->encodepfunc = horDiff32; break;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Override default encoding method with one that does the
|
|
||||||
* predictor stuff.
|
|
||||||
*/
|
|
||||||
if( tif->tif_encoderow != PredictorEncodeRow )
|
|
||||||
{
|
|
||||||
sp->encoderow = tif->tif_encoderow;
|
|
||||||
tif->tif_encoderow = PredictorEncodeRow;
|
|
||||||
sp->encodestrip = tif->tif_encodestrip;
|
|
||||||
tif->tif_encodestrip = PredictorEncodeTile;
|
|
||||||
sp->encodetile = tif->tif_encodetile;
|
|
||||||
tif->tif_encodetile = PredictorEncodeTile;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (sp->predictor == 3) {
|
|
||||||
sp->encodepfunc = fpDiff;
|
|
||||||
/*
|
|
||||||
* Override default encoding method with one that does the
|
|
||||||
* predictor stuff.
|
|
||||||
*/
|
|
||||||
if( tif->tif_encoderow != PredictorEncodeRow )
|
|
||||||
{
|
|
||||||
sp->encoderow = tif->tif_encoderow;
|
|
||||||
tif->tif_encoderow = PredictorEncodeRow;
|
|
||||||
sp->encodestrip = tif->tif_encodestrip;
|
|
||||||
tif->tif_encodestrip = PredictorEncodeTile;
|
|
||||||
sp->encodetile = tif->tif_encodetile;
|
|
||||||
tif->tif_encodetile = PredictorEncodeTile;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define REPEAT4(n, op) \
|
|
||||||
switch (n) { \
|
|
||||||
default: { int i; for (i = n-4; i > 0; i--) { op; } } \
|
|
||||||
case 4: op; \
|
|
||||||
case 3: op; \
|
|
||||||
case 2: op; \
|
|
||||||
case 1: op; \
|
|
||||||
case 0: ; \
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
horAcc8(TIFF* tif, tidata_t cp0, tsize_t cc)
|
|
||||||
{
|
|
||||||
tsize_t stride = PredictorState(tif)->stride;
|
|
||||||
|
|
||||||
char* cp = (char*) cp0;
|
|
||||||
if (cc > stride) {
|
|
||||||
cc -= stride;
|
|
||||||
/*
|
|
||||||
* Pipeline the most common cases.
|
|
||||||
*/
|
|
||||||
if (stride == 3) {
|
|
||||||
unsigned int cr = cp[0];
|
|
||||||
unsigned int cg = cp[1];
|
|
||||||
unsigned int cb = cp[2];
|
|
||||||
do {
|
|
||||||
cc -= 3, cp += 3;
|
|
||||||
cp[0] = (char) (cr += cp[0]);
|
|
||||||
cp[1] = (char) (cg += cp[1]);
|
|
||||||
cp[2] = (char) (cb += cp[2]);
|
|
||||||
} while ((int32) cc > 0);
|
|
||||||
} else if (stride == 4) {
|
|
||||||
unsigned int cr = cp[0];
|
|
||||||
unsigned int cg = cp[1];
|
|
||||||
unsigned int cb = cp[2];
|
|
||||||
unsigned int ca = cp[3];
|
|
||||||
do {
|
|
||||||
cc -= 4, cp += 4;
|
|
||||||
cp[0] = (char) (cr += cp[0]);
|
|
||||||
cp[1] = (char) (cg += cp[1]);
|
|
||||||
cp[2] = (char) (cb += cp[2]);
|
|
||||||
cp[3] = (char) (ca += cp[3]);
|
|
||||||
} while ((int32) cc > 0);
|
|
||||||
} else {
|
|
||||||
do {
|
|
||||||
REPEAT4(stride, cp[stride] =
|
|
||||||
(char) (cp[stride] + *cp); cp++)
|
|
||||||
cc -= stride;
|
|
||||||
} while ((int32) cc > 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
swabHorAcc16(TIFF* tif, tidata_t cp0, tsize_t cc)
|
|
||||||
{
|
|
||||||
tsize_t stride = PredictorState(tif)->stride;
|
|
||||||
uint16* wp = (uint16*) cp0;
|
|
||||||
tsize_t wc = cc / 2;
|
|
||||||
|
|
||||||
if (wc > stride) {
|
|
||||||
TIFFSwabArrayOfShort(wp, wc);
|
|
||||||
wc -= stride;
|
|
||||||
do {
|
|
||||||
REPEAT4(stride, wp[stride] += wp[0]; wp++)
|
|
||||||
wc -= stride;
|
|
||||||
} while ((int32) wc > 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
horAcc16(TIFF* tif, tidata_t cp0, tsize_t cc)
|
|
||||||
{
|
|
||||||
tsize_t stride = PredictorState(tif)->stride;
|
|
||||||
uint16* wp = (uint16*) cp0;
|
|
||||||
tsize_t wc = cc / 2;
|
|
||||||
|
|
||||||
if (wc > stride) {
|
|
||||||
wc -= stride;
|
|
||||||
do {
|
|
||||||
REPEAT4(stride, wp[stride] += wp[0]; wp++)
|
|
||||||
wc -= stride;
|
|
||||||
} while ((int32) wc > 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
swabHorAcc32(TIFF* tif, tidata_t cp0, tsize_t cc)
|
|
||||||
{
|
|
||||||
tsize_t stride = PredictorState(tif)->stride;
|
|
||||||
uint32* wp = (uint32*) cp0;
|
|
||||||
tsize_t wc = cc / 4;
|
|
||||||
|
|
||||||
if (wc > stride) {
|
|
||||||
TIFFSwabArrayOfLong(wp, wc);
|
|
||||||
wc -= stride;
|
|
||||||
do {
|
|
||||||
REPEAT4(stride, wp[stride] += wp[0]; wp++)
|
|
||||||
wc -= stride;
|
|
||||||
} while ((int32) wc > 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
horAcc32(TIFF* tif, tidata_t cp0, tsize_t cc)
|
|
||||||
{
|
|
||||||
tsize_t stride = PredictorState(tif)->stride;
|
|
||||||
uint32* wp = (uint32*) cp0;
|
|
||||||
tsize_t wc = cc / 4;
|
|
||||||
|
|
||||||
if (wc > stride) {
|
|
||||||
wc -= stride;
|
|
||||||
do {
|
|
||||||
REPEAT4(stride, wp[stride] += wp[0]; wp++)
|
|
||||||
wc -= stride;
|
|
||||||
} while ((int32) wc > 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Floating point predictor accumulation routine.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
fpAcc(TIFF* tif, tidata_t cp0, tsize_t cc)
|
|
||||||
{
|
|
||||||
tsize_t stride = PredictorState(tif)->stride;
|
|
||||||
uint32 bps = tif->tif_dir.td_bitspersample / 8;
|
|
||||||
tsize_t wc = cc / bps;
|
|
||||||
tsize_t count = cc;
|
|
||||||
uint8 *cp = (uint8 *) cp0;
|
|
||||||
uint8 *tmp = (uint8 *)_TIFFmalloc(cc);
|
|
||||||
|
|
||||||
if (!tmp)
|
|
||||||
return;
|
|
||||||
|
|
||||||
while (count > stride) {
|
|
||||||
REPEAT4(stride, cp[stride] += cp[0]; cp++)
|
|
||||||
count -= stride;
|
|
||||||
}
|
|
||||||
|
|
||||||
_TIFFmemcpy(tmp, cp0, cc);
|
|
||||||
cp = (uint8 *) cp0;
|
|
||||||
for (count = 0; count < wc; count++) {
|
|
||||||
uint32 byte;
|
|
||||||
for (byte = 0; byte < bps; byte++) {
|
|
||||||
#if WORDS_BIGENDIAN
|
|
||||||
cp[bps * count + byte] = tmp[byte * wc + count];
|
|
||||||
#else
|
|
||||||
cp[bps * count + byte] =
|
|
||||||
tmp[(bps - byte - 1) * wc + count];
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_TIFFfree(tmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Decode a scanline and apply the predictor routine.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
PredictorDecodeRow(TIFF* tif, tidata_t op0, tsize_t occ0, tsample_t s)
|
|
||||||
{
|
|
||||||
TIFFPredictorState *sp = PredictorState(tif);
|
|
||||||
|
|
||||||
assert(sp != NULL);
|
|
||||||
assert(sp->decoderow != NULL);
|
|
||||||
assert(sp->decodepfunc != NULL);
|
|
||||||
|
|
||||||
if ((*sp->decoderow)(tif, op0, occ0, s)) {
|
|
||||||
(*sp->decodepfunc)(tif, op0, occ0);
|
|
||||||
return 1;
|
|
||||||
} else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Decode a tile/strip and apply the predictor routine.
|
|
||||||
* Note that horizontal differencing must be done on a
|
|
||||||
* row-by-row basis. The width of a "row" has already
|
|
||||||
* been calculated at pre-decode time according to the
|
|
||||||
* strip/tile dimensions.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
PredictorDecodeTile(TIFF* tif, tidata_t op0, tsize_t occ0, tsample_t s)
|
|
||||||
{
|
|
||||||
TIFFPredictorState *sp = PredictorState(tif);
|
|
||||||
|
|
||||||
assert(sp != NULL);
|
|
||||||
assert(sp->decodetile != NULL);
|
|
||||||
|
|
||||||
if ((*sp->decodetile)(tif, op0, occ0, s)) {
|
|
||||||
tsize_t rowsize = sp->rowsize;
|
|
||||||
assert(rowsize > 0);
|
|
||||||
assert(sp->decodepfunc != NULL);
|
|
||||||
while ((long)occ0 > 0) {
|
|
||||||
(*sp->decodepfunc)(tif, op0, (tsize_t) rowsize);
|
|
||||||
occ0 -= rowsize;
|
|
||||||
op0 += rowsize;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
} else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
horDiff8(TIFF* tif, tidata_t cp0, tsize_t cc)
|
|
||||||
{
|
|
||||||
TIFFPredictorState* sp = PredictorState(tif);
|
|
||||||
tsize_t stride = sp->stride;
|
|
||||||
char* cp = (char*) cp0;
|
|
||||||
|
|
||||||
if (cc > stride) {
|
|
||||||
cc -= stride;
|
|
||||||
/*
|
|
||||||
* Pipeline the most common cases.
|
|
||||||
*/
|
|
||||||
if (stride == 3) {
|
|
||||||
int r1, g1, b1;
|
|
||||||
int r2 = cp[0];
|
|
||||||
int g2 = cp[1];
|
|
||||||
int b2 = cp[2];
|
|
||||||
do {
|
|
||||||
r1 = cp[3]; cp[3] = r1-r2; r2 = r1;
|
|
||||||
g1 = cp[4]; cp[4] = g1-g2; g2 = g1;
|
|
||||||
b1 = cp[5]; cp[5] = b1-b2; b2 = b1;
|
|
||||||
cp += 3;
|
|
||||||
} while ((int32)(cc -= 3) > 0);
|
|
||||||
} else if (stride == 4) {
|
|
||||||
int r1, g1, b1, a1;
|
|
||||||
int r2 = cp[0];
|
|
||||||
int g2 = cp[1];
|
|
||||||
int b2 = cp[2];
|
|
||||||
int a2 = cp[3];
|
|
||||||
do {
|
|
||||||
r1 = cp[4]; cp[4] = r1-r2; r2 = r1;
|
|
||||||
g1 = cp[5]; cp[5] = g1-g2; g2 = g1;
|
|
||||||
b1 = cp[6]; cp[6] = b1-b2; b2 = b1;
|
|
||||||
a1 = cp[7]; cp[7] = a1-a2; a2 = a1;
|
|
||||||
cp += 4;
|
|
||||||
} while ((int32)(cc -= 4) > 0);
|
|
||||||
} else {
|
|
||||||
cp += cc - 1;
|
|
||||||
do {
|
|
||||||
REPEAT4(stride, cp[stride] -= cp[0]; cp--)
|
|
||||||
} while ((int32)(cc -= stride) > 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
horDiff16(TIFF* tif, tidata_t cp0, tsize_t cc)
|
|
||||||
{
|
|
||||||
TIFFPredictorState* sp = PredictorState(tif);
|
|
||||||
tsize_t stride = sp->stride;
|
|
||||||
int16 *wp = (int16*) cp0;
|
|
||||||
tsize_t wc = cc/2;
|
|
||||||
|
|
||||||
if (wc > stride) {
|
|
||||||
wc -= stride;
|
|
||||||
wp += wc - 1;
|
|
||||||
do {
|
|
||||||
REPEAT4(stride, wp[stride] -= wp[0]; wp--)
|
|
||||||
wc -= stride;
|
|
||||||
} while ((int32) wc > 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
horDiff32(TIFF* tif, tidata_t cp0, tsize_t cc)
|
|
||||||
{
|
|
||||||
TIFFPredictorState* sp = PredictorState(tif);
|
|
||||||
tsize_t stride = sp->stride;
|
|
||||||
int32 *wp = (int32*) cp0;
|
|
||||||
tsize_t wc = cc/4;
|
|
||||||
|
|
||||||
if (wc > stride) {
|
|
||||||
wc -= stride;
|
|
||||||
wp += wc - 1;
|
|
||||||
do {
|
|
||||||
REPEAT4(stride, wp[stride] -= wp[0]; wp--)
|
|
||||||
wc -= stride;
|
|
||||||
} while ((int32) wc > 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Floating point predictor differencing routine.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
fpDiff(TIFF* tif, tidata_t cp0, tsize_t cc)
|
|
||||||
{
|
|
||||||
tsize_t stride = PredictorState(tif)->stride;
|
|
||||||
uint32 bps = tif->tif_dir.td_bitspersample / 8;
|
|
||||||
tsize_t wc = cc / bps;
|
|
||||||
tsize_t count;
|
|
||||||
uint8 *cp = (uint8 *) cp0;
|
|
||||||
uint8 *tmp = (uint8 *)_TIFFmalloc(cc);
|
|
||||||
|
|
||||||
if (!tmp)
|
|
||||||
return;
|
|
||||||
|
|
||||||
_TIFFmemcpy(tmp, cp0, cc);
|
|
||||||
for (count = 0; count < wc; count++) {
|
|
||||||
uint32 byte;
|
|
||||||
for (byte = 0; byte < bps; byte++) {
|
|
||||||
#if WORDS_BIGENDIAN
|
|
||||||
cp[byte * wc + count] = tmp[bps * count + byte];
|
|
||||||
#else
|
|
||||||
cp[(bps - byte - 1) * wc + count] =
|
|
||||||
tmp[bps * count + byte];
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_TIFFfree(tmp);
|
|
||||||
|
|
||||||
cp = (uint8 *) cp0;
|
|
||||||
cp += cc - stride - 1;
|
|
||||||
for (count = cc; count > stride; count -= stride)
|
|
||||||
REPEAT4(stride, cp[stride] -= cp[0]; cp--)
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
PredictorEncodeRow(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s)
|
|
||||||
{
|
|
||||||
TIFFPredictorState *sp = PredictorState(tif);
|
|
||||||
|
|
||||||
assert(sp != NULL);
|
|
||||||
assert(sp->encodepfunc != NULL);
|
|
||||||
assert(sp->encoderow != NULL);
|
|
||||||
|
|
||||||
/* XXX horizontal differencing alters user's data XXX */
|
|
||||||
(*sp->encodepfunc)(tif, bp, cc);
|
|
||||||
return (*sp->encoderow)(tif, bp, cc, s);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
PredictorEncodeTile(TIFF* tif, tidata_t bp0, tsize_t cc0, tsample_t s)
|
|
||||||
{
|
|
||||||
static const char module[] = "PredictorEncodeTile";
|
|
||||||
TIFFPredictorState *sp = PredictorState(tif);
|
|
||||||
uint8 *working_copy;
|
|
||||||
tsize_t cc = cc0, rowsize;
|
|
||||||
unsigned char* bp;
|
|
||||||
int result_code;
|
|
||||||
|
|
||||||
assert(sp != NULL);
|
|
||||||
assert(sp->encodepfunc != NULL);
|
|
||||||
assert(sp->encodetile != NULL);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Do predictor manipulation in a working buffer to avoid altering
|
|
||||||
* the callers buffer. http://trac.osgeo.org/gdal/ticket/1965
|
|
||||||
*/
|
|
||||||
working_copy = (uint8*) _TIFFmalloc(cc0);
|
|
||||||
if( working_copy == NULL )
|
|
||||||
{
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
|
||||||
"Out of memory allocating %d byte temp buffer.",
|
|
||||||
cc0 );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
memcpy( working_copy, bp0, cc0 );
|
|
||||||
bp = working_copy;
|
|
||||||
|
|
||||||
rowsize = sp->rowsize;
|
|
||||||
assert(rowsize > 0);
|
|
||||||
assert((cc0%rowsize)==0);
|
|
||||||
while (cc > 0) {
|
|
||||||
(*sp->encodepfunc)(tif, bp, rowsize);
|
|
||||||
cc -= rowsize;
|
|
||||||
bp += rowsize;
|
|
||||||
}
|
|
||||||
result_code = (*sp->encodetile)(tif, working_copy, cc0, s);
|
|
||||||
|
|
||||||
_TIFFfree( working_copy );
|
|
||||||
|
|
||||||
return result_code;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define FIELD_PREDICTOR (FIELD_CODEC+0) /* XXX */
|
|
||||||
|
|
||||||
static const TIFFFieldInfo predictFieldInfo[] = {
|
|
||||||
{ TIFFTAG_PREDICTOR, 1, 1, TIFF_SHORT, FIELD_PREDICTOR,
|
|
||||||
FALSE, FALSE, "Predictor" },
|
|
||||||
};
|
|
||||||
|
|
||||||
static int
|
|
||||||
PredictorVSetField(TIFF* tif, ttag_t tag, va_list ap)
|
|
||||||
{
|
|
||||||
TIFFPredictorState *sp = PredictorState(tif);
|
|
||||||
|
|
||||||
assert(sp != NULL);
|
|
||||||
assert(sp->vsetparent != NULL);
|
|
||||||
|
|
||||||
switch (tag) {
|
|
||||||
case TIFFTAG_PREDICTOR:
|
|
||||||
sp->predictor = (uint16) va_arg(ap, int);
|
|
||||||
TIFFSetFieldBit(tif, FIELD_PREDICTOR);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return (*sp->vsetparent)(tif, tag, ap);
|
|
||||||
}
|
|
||||||
tif->tif_flags |= TIFF_DIRTYDIRECT;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
PredictorVGetField(TIFF* tif, ttag_t tag, va_list ap)
|
|
||||||
{
|
|
||||||
TIFFPredictorState *sp = PredictorState(tif);
|
|
||||||
|
|
||||||
assert(sp != NULL);
|
|
||||||
assert(sp->vgetparent != NULL);
|
|
||||||
|
|
||||||
switch (tag) {
|
|
||||||
case TIFFTAG_PREDICTOR:
|
|
||||||
*va_arg(ap, uint16*) = sp->predictor;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return (*sp->vgetparent)(tif, tag, ap);
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
PredictorPrintDir(TIFF* tif, FILE* fd, long flags)
|
|
||||||
{
|
|
||||||
TIFFPredictorState* sp = PredictorState(tif);
|
|
||||||
|
|
||||||
(void) flags;
|
|
||||||
if (TIFFFieldSet(tif,FIELD_PREDICTOR)) {
|
|
||||||
fprintf(fd, " Predictor: ");
|
|
||||||
switch (sp->predictor) {
|
|
||||||
case 1: fprintf(fd, "none "); break;
|
|
||||||
case 2: fprintf(fd, "horizontal differencing "); break;
|
|
||||||
case 3: fprintf(fd, "floating point predictor "); break;
|
|
||||||
}
|
|
||||||
fprintf(fd, "%u (0x%x)\n", sp->predictor, sp->predictor);
|
|
||||||
}
|
|
||||||
if (sp->printdir)
|
|
||||||
(*sp->printdir)(tif, fd, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
TIFFPredictorInit(TIFF* tif)
|
|
||||||
{
|
|
||||||
TIFFPredictorState* sp = PredictorState(tif);
|
|
||||||
|
|
||||||
assert(sp != 0);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Merge codec-specific tag information.
|
|
||||||
*/
|
|
||||||
if (!_TIFFMergeFieldInfo(tif, predictFieldInfo,
|
|
||||||
TIFFArrayCount(predictFieldInfo))) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, "TIFFPredictorInit",
|
|
||||||
"Merging Predictor codec-specific tags failed");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Override parent get/set field methods.
|
|
||||||
*/
|
|
||||||
sp->vgetparent = tif->tif_tagmethods.vgetfield;
|
|
||||||
tif->tif_tagmethods.vgetfield =
|
|
||||||
PredictorVGetField;/* hook for predictor tag */
|
|
||||||
sp->vsetparent = tif->tif_tagmethods.vsetfield;
|
|
||||||
tif->tif_tagmethods.vsetfield =
|
|
||||||
PredictorVSetField;/* hook for predictor tag */
|
|
||||||
sp->printdir = tif->tif_tagmethods.printdir;
|
|
||||||
tif->tif_tagmethods.printdir =
|
|
||||||
PredictorPrintDir; /* hook for predictor tag */
|
|
||||||
|
|
||||||
sp->setupdecode = tif->tif_setupdecode;
|
|
||||||
tif->tif_setupdecode = PredictorSetupDecode;
|
|
||||||
sp->setupencode = tif->tif_setupencode;
|
|
||||||
tif->tif_setupencode = PredictorSetupEncode;
|
|
||||||
|
|
||||||
sp->predictor = 1; /* default value */
|
|
||||||
sp->encodepfunc = NULL; /* no predictor routine */
|
|
||||||
sp->decodepfunc = NULL; /* no predictor routine */
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
TIFFPredictorCleanup(TIFF* tif)
|
|
||||||
{
|
|
||||||
TIFFPredictorState* sp = PredictorState(tif);
|
|
||||||
|
|
||||||
assert(sp != 0);
|
|
||||||
|
|
||||||
tif->tif_tagmethods.vgetfield = sp->vgetparent;
|
|
||||||
tif->tif_tagmethods.vsetfield = sp->vsetparent;
|
|
||||||
tif->tif_tagmethods.printdir = sp->printdir;
|
|
||||||
tif->tif_setupdecode = sp->setupdecode;
|
|
||||||
tif->tif_setupencode = sp->setupencode;
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
/* $Id: tif_predict.h,v 1.3.2.2 2010-06-08 18:50:42 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 1995-1997 Sam Leffler
|
|
||||||
* Copyright (c) 1995-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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _TIFFPREDICT_
|
|
||||||
#define _TIFFPREDICT_
|
|
||||||
/*
|
|
||||||
* ``Library-private'' Support for the Predictor Tag
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Codecs that want to support the Predictor tag must place
|
|
||||||
* this structure first in their private state block so that
|
|
||||||
* the predictor code can cast tif_data to find its state.
|
|
||||||
*/
|
|
||||||
typedef struct {
|
|
||||||
int predictor; /* predictor tag value */
|
|
||||||
int stride; /* sample stride over data */
|
|
||||||
tsize_t rowsize; /* tile/strip row size */
|
|
||||||
|
|
||||||
TIFFCodeMethod encoderow; /* parent codec encode/decode row */
|
|
||||||
TIFFCodeMethod encodestrip; /* parent codec encode/decode strip */
|
|
||||||
TIFFCodeMethod encodetile; /* parent codec encode/decode tile */
|
|
||||||
TIFFPostMethod encodepfunc; /* horizontal differencer */
|
|
||||||
|
|
||||||
TIFFCodeMethod decoderow; /* parent codec encode/decode row */
|
|
||||||
TIFFCodeMethod decodestrip; /* parent codec encode/decode strip */
|
|
||||||
TIFFCodeMethod decodetile; /* parent codec encode/decode tile */
|
|
||||||
TIFFPostMethod decodepfunc; /* horizontal accumulator */
|
|
||||||
|
|
||||||
TIFFVGetMethod vgetparent; /* super-class method */
|
|
||||||
TIFFVSetMethod vsetparent; /* super-class method */
|
|
||||||
TIFFPrintMethod printdir; /* super-class method */
|
|
||||||
TIFFBoolMethod setupdecode; /* super-class method */
|
|
||||||
TIFFBoolMethod setupencode; /* super-class method */
|
|
||||||
} TIFFPredictorState;
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
extern int TIFFPredictorInit(TIFF*);
|
|
||||||
extern int TIFFPredictorCleanup(TIFF*);
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif /* _TIFFPREDICT_ */
|
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
@@ -1,646 +0,0 @@
|
|||||||
/* $Id: tif_print.c,v 1.36.2.4 2010-06-08 18:50:42 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF Library.
|
|
||||||
*
|
|
||||||
* Directory Printing Support
|
|
||||||
*/
|
|
||||||
#include "tiffiop.h"
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
|
|
||||||
static const char *photoNames[] = {
|
|
||||||
"min-is-white", /* PHOTOMETRIC_MINISWHITE */
|
|
||||||
"min-is-black", /* PHOTOMETRIC_MINISBLACK */
|
|
||||||
"RGB color", /* PHOTOMETRIC_RGB */
|
|
||||||
"palette color (RGB from colormap)", /* PHOTOMETRIC_PALETTE */
|
|
||||||
"transparency mask", /* PHOTOMETRIC_MASK */
|
|
||||||
"separated", /* PHOTOMETRIC_SEPARATED */
|
|
||||||
"YCbCr", /* PHOTOMETRIC_YCBCR */
|
|
||||||
"7 (0x7)",
|
|
||||||
"CIE L*a*b*", /* PHOTOMETRIC_CIELAB */
|
|
||||||
};
|
|
||||||
#define NPHOTONAMES (sizeof (photoNames) / sizeof (photoNames[0]))
|
|
||||||
|
|
||||||
static const char *orientNames[] = {
|
|
||||||
"0 (0x0)",
|
|
||||||
"row 0 top, col 0 lhs", /* ORIENTATION_TOPLEFT */
|
|
||||||
"row 0 top, col 0 rhs", /* ORIENTATION_TOPRIGHT */
|
|
||||||
"row 0 bottom, col 0 rhs", /* ORIENTATION_BOTRIGHT */
|
|
||||||
"row 0 bottom, col 0 lhs", /* ORIENTATION_BOTLEFT */
|
|
||||||
"row 0 lhs, col 0 top", /* ORIENTATION_LEFTTOP */
|
|
||||||
"row 0 rhs, col 0 top", /* ORIENTATION_RIGHTTOP */
|
|
||||||
"row 0 rhs, col 0 bottom", /* ORIENTATION_RIGHTBOT */
|
|
||||||
"row 0 lhs, col 0 bottom", /* ORIENTATION_LEFTBOT */
|
|
||||||
};
|
|
||||||
#define NORIENTNAMES (sizeof (orientNames) / sizeof (orientNames[0]))
|
|
||||||
|
|
||||||
static void
|
|
||||||
_TIFFPrintField(FILE* fd, const TIFFFieldInfo *fip,
|
|
||||||
uint32 value_count, void *raw_data)
|
|
||||||
{
|
|
||||||
uint32 j;
|
|
||||||
|
|
||||||
fprintf(fd, " %s: ", fip->field_name);
|
|
||||||
|
|
||||||
for(j = 0; j < value_count; j++) {
|
|
||||||
if(fip->field_type == TIFF_BYTE)
|
|
||||||
fprintf(fd, "%u", ((uint8 *) raw_data)[j]);
|
|
||||||
else if(fip->field_type == TIFF_UNDEFINED)
|
|
||||||
fprintf(fd, "0x%x",
|
|
||||||
(unsigned int) ((unsigned char *) raw_data)[j]);
|
|
||||||
else if(fip->field_type == TIFF_SBYTE)
|
|
||||||
fprintf(fd, "%d", ((int8 *) raw_data)[j]);
|
|
||||||
else if(fip->field_type == TIFF_SHORT)
|
|
||||||
fprintf(fd, "%u", ((uint16 *) raw_data)[j]);
|
|
||||||
else if(fip->field_type == TIFF_SSHORT)
|
|
||||||
fprintf(fd, "%d", ((int16 *) raw_data)[j]);
|
|
||||||
else if(fip->field_type == TIFF_LONG)
|
|
||||||
fprintf(fd, "%lu",
|
|
||||||
(unsigned long)((uint32 *) raw_data)[j]);
|
|
||||||
else if(fip->field_type == TIFF_SLONG)
|
|
||||||
fprintf(fd, "%ld", (long)((int32 *) raw_data)[j]);
|
|
||||||
else if(fip->field_type == TIFF_RATIONAL
|
|
||||||
|| fip->field_type == TIFF_SRATIONAL
|
|
||||||
|| fip->field_type == TIFF_FLOAT)
|
|
||||||
fprintf(fd, "%f", ((float *) raw_data)[j]);
|
|
||||||
else if(fip->field_type == TIFF_IFD)
|
|
||||||
fprintf(fd, "0x%ulx", ((uint32 *) raw_data)[j]);
|
|
||||||
else if(fip->field_type == TIFF_ASCII) {
|
|
||||||
fprintf(fd, "%s", (char *) raw_data);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if(fip->field_type == TIFF_DOUBLE)
|
|
||||||
fprintf(fd, "%f", ((double *) raw_data)[j]);
|
|
||||||
else if(fip->field_type == TIFF_FLOAT)
|
|
||||||
fprintf(fd, "%f", ((float *)raw_data)[j]);
|
|
||||||
else {
|
|
||||||
fprintf(fd, "<unsupported data type in TIFFPrint>");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(j < value_count - 1)
|
|
||||||
fprintf(fd, ",");
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(fd, "\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
_TIFFPrettyPrintField(TIFF* tif, FILE* fd, ttag_t tag,
|
|
||||||
uint32 value_count, void *raw_data)
|
|
||||||
{
|
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
|
||||||
|
|
||||||
switch (tag)
|
|
||||||
{
|
|
||||||
case TIFFTAG_INKSET:
|
|
||||||
fprintf(fd, " Ink Set: ");
|
|
||||||
switch (*((uint16*)raw_data)) {
|
|
||||||
case INKSET_CMYK:
|
|
||||||
fprintf(fd, "CMYK\n");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fprintf(fd, "%u (0x%x)\n",
|
|
||||||
*((uint16*)raw_data),
|
|
||||||
*((uint16*)raw_data));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
case TIFFTAG_DOTRANGE:
|
|
||||||
fprintf(fd, " Dot Range: %u-%u\n",
|
|
||||||
((uint16*)raw_data)[0], ((uint16*)raw_data)[1]);
|
|
||||||
return 1;
|
|
||||||
case TIFFTAG_WHITEPOINT:
|
|
||||||
fprintf(fd, " White Point: %g-%g\n",
|
|
||||||
((float *)raw_data)[0], ((float *)raw_data)[1]); return 1;
|
|
||||||
case TIFFTAG_REFERENCEBLACKWHITE:
|
|
||||||
{
|
|
||||||
uint16 i;
|
|
||||||
|
|
||||||
fprintf(fd, " Reference Black/White:\n");
|
|
||||||
for (i = 0; i < 3; i++)
|
|
||||||
fprintf(fd, " %2d: %5g %5g\n", i,
|
|
||||||
((float *)raw_data)[2*i+0],
|
|
||||||
((float *)raw_data)[2*i+1]);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
case TIFFTAG_XMLPACKET:
|
|
||||||
{
|
|
||||||
uint32 i;
|
|
||||||
|
|
||||||
fprintf(fd, " XMLPacket (XMP Metadata):\n" );
|
|
||||||
for(i = 0; i < value_count; i++)
|
|
||||||
fputc(((char *)raw_data)[i], fd);
|
|
||||||
fprintf( fd, "\n" );
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
case TIFFTAG_RICHTIFFIPTC:
|
|
||||||
/*
|
|
||||||
* XXX: for some weird reason RichTIFFIPTC tag
|
|
||||||
* defined as array of LONG values.
|
|
||||||
*/
|
|
||||||
fprintf(fd,
|
|
||||||
" RichTIFFIPTC Data: <present>, %lu bytes\n",
|
|
||||||
(unsigned long) value_count * 4);
|
|
||||||
return 1;
|
|
||||||
case TIFFTAG_PHOTOSHOP:
|
|
||||||
fprintf(fd, " Photoshop Data: <present>, %lu bytes\n",
|
|
||||||
(unsigned long) value_count);
|
|
||||||
return 1;
|
|
||||||
case TIFFTAG_ICCPROFILE:
|
|
||||||
fprintf(fd, " ICC Profile: <present>, %lu bytes\n",
|
|
||||||
(unsigned long) value_count);
|
|
||||||
return 1;
|
|
||||||
case TIFFTAG_STONITS:
|
|
||||||
fprintf(fd,
|
|
||||||
" Sample to Nits conversion factor: %.4e\n",
|
|
||||||
*((double*)raw_data));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Print the contents of the current directory
|
|
||||||
* to the specified stdio file stream.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
TIFFPrintDirectory(TIFF* tif, FILE* fd, long flags)
|
|
||||||
{
|
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
|
||||||
char *sep;
|
|
||||||
uint16 i;
|
|
||||||
long l, n;
|
|
||||||
|
|
||||||
fprintf(fd, "TIFF Directory at offset 0x%lx (%lu)\n",
|
|
||||||
(unsigned long)tif->tif_diroff, (unsigned long)tif->tif_diroff);
|
|
||||||
if (TIFFFieldSet(tif,FIELD_SUBFILETYPE)) {
|
|
||||||
fprintf(fd, " Subfile Type:");
|
|
||||||
sep = " ";
|
|
||||||
if (td->td_subfiletype & FILETYPE_REDUCEDIMAGE) {
|
|
||||||
fprintf(fd, "%sreduced-resolution image", sep);
|
|
||||||
sep = "/";
|
|
||||||
}
|
|
||||||
if (td->td_subfiletype & FILETYPE_PAGE) {
|
|
||||||
fprintf(fd, "%smulti-page document", sep);
|
|
||||||
sep = "/";
|
|
||||||
}
|
|
||||||
if (td->td_subfiletype & FILETYPE_MASK)
|
|
||||||
fprintf(fd, "%stransparency mask", sep);
|
|
||||||
fprintf(fd, " (%lu = 0x%lx)\n",
|
|
||||||
(long) td->td_subfiletype, (long) td->td_subfiletype);
|
|
||||||
}
|
|
||||||
if (TIFFFieldSet(tif,FIELD_IMAGEDIMENSIONS)) {
|
|
||||||
fprintf(fd, " Image Width: %lu Image Length: %lu",
|
|
||||||
(unsigned long) td->td_imagewidth, (unsigned long) td->td_imagelength);
|
|
||||||
if (TIFFFieldSet(tif,FIELD_IMAGEDEPTH))
|
|
||||||
fprintf(fd, " Image Depth: %lu",
|
|
||||||
(unsigned long) td->td_imagedepth);
|
|
||||||
fprintf(fd, "\n");
|
|
||||||
}
|
|
||||||
if (TIFFFieldSet(tif,FIELD_TILEDIMENSIONS)) {
|
|
||||||
fprintf(fd, " Tile Width: %lu Tile Length: %lu",
|
|
||||||
(unsigned long) td->td_tilewidth, (unsigned long) td->td_tilelength);
|
|
||||||
if (TIFFFieldSet(tif,FIELD_TILEDEPTH))
|
|
||||||
fprintf(fd, " Tile Depth: %lu",
|
|
||||||
(unsigned long) td->td_tiledepth);
|
|
||||||
fprintf(fd, "\n");
|
|
||||||
}
|
|
||||||
if (TIFFFieldSet(tif,FIELD_RESOLUTION)) {
|
|
||||||
fprintf(fd, " Resolution: %g, %g",
|
|
||||||
td->td_xresolution, td->td_yresolution);
|
|
||||||
if (TIFFFieldSet(tif,FIELD_RESOLUTIONUNIT)) {
|
|
||||||
switch (td->td_resolutionunit) {
|
|
||||||
case RESUNIT_NONE:
|
|
||||||
fprintf(fd, " (unitless)");
|
|
||||||
break;
|
|
||||||
case RESUNIT_INCH:
|
|
||||||
fprintf(fd, " pixels/inch");
|
|
||||||
break;
|
|
||||||
case RESUNIT_CENTIMETER:
|
|
||||||
fprintf(fd, " pixels/cm");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fprintf(fd, " (unit %u = 0x%x)",
|
|
||||||
td->td_resolutionunit,
|
|
||||||
td->td_resolutionunit);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fprintf(fd, "\n");
|
|
||||||
}
|
|
||||||
if (TIFFFieldSet(tif,FIELD_POSITION))
|
|
||||||
fprintf(fd, " Position: %g, %g\n",
|
|
||||||
td->td_xposition, td->td_yposition);
|
|
||||||
if (TIFFFieldSet(tif,FIELD_BITSPERSAMPLE))
|
|
||||||
fprintf(fd, " Bits/Sample: %u\n", td->td_bitspersample);
|
|
||||||
if (TIFFFieldSet(tif,FIELD_SAMPLEFORMAT)) {
|
|
||||||
fprintf(fd, " Sample Format: ");
|
|
||||||
switch (td->td_sampleformat) {
|
|
||||||
case SAMPLEFORMAT_VOID:
|
|
||||||
fprintf(fd, "void\n");
|
|
||||||
break;
|
|
||||||
case SAMPLEFORMAT_INT:
|
|
||||||
fprintf(fd, "signed integer\n");
|
|
||||||
break;
|
|
||||||
case SAMPLEFORMAT_UINT:
|
|
||||||
fprintf(fd, "unsigned integer\n");
|
|
||||||
break;
|
|
||||||
case SAMPLEFORMAT_IEEEFP:
|
|
||||||
fprintf(fd, "IEEE floating point\n");
|
|
||||||
break;
|
|
||||||
case SAMPLEFORMAT_COMPLEXINT:
|
|
||||||
fprintf(fd, "complex signed integer\n");
|
|
||||||
break;
|
|
||||||
case SAMPLEFORMAT_COMPLEXIEEEFP:
|
|
||||||
fprintf(fd, "complex IEEE floating point\n");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fprintf(fd, "%u (0x%x)\n",
|
|
||||||
td->td_sampleformat, td->td_sampleformat);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (TIFFFieldSet(tif,FIELD_COMPRESSION)) {
|
|
||||||
const TIFFCodec* c = TIFFFindCODEC(td->td_compression);
|
|
||||||
fprintf(fd, " Compression Scheme: ");
|
|
||||||
if (c)
|
|
||||||
fprintf(fd, "%s\n", c->name);
|
|
||||||
else
|
|
||||||
fprintf(fd, "%u (0x%x)\n",
|
|
||||||
td->td_compression, td->td_compression);
|
|
||||||
}
|
|
||||||
if (TIFFFieldSet(tif,FIELD_PHOTOMETRIC)) {
|
|
||||||
fprintf(fd, " Photometric Interpretation: ");
|
|
||||||
if (td->td_photometric < NPHOTONAMES)
|
|
||||||
fprintf(fd, "%s\n", photoNames[td->td_photometric]);
|
|
||||||
else {
|
|
||||||
switch (td->td_photometric) {
|
|
||||||
case PHOTOMETRIC_LOGL:
|
|
||||||
fprintf(fd, "CIE Log2(L)\n");
|
|
||||||
break;
|
|
||||||
case PHOTOMETRIC_LOGLUV:
|
|
||||||
fprintf(fd, "CIE Log2(L) (u',v')\n");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fprintf(fd, "%u (0x%x)\n",
|
|
||||||
td->td_photometric, td->td_photometric);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (TIFFFieldSet(tif,FIELD_EXTRASAMPLES) && td->td_extrasamples) {
|
|
||||||
fprintf(fd, " Extra Samples: %u<", td->td_extrasamples);
|
|
||||||
sep = "";
|
|
||||||
for (i = 0; i < td->td_extrasamples; i++) {
|
|
||||||
switch (td->td_sampleinfo[i]) {
|
|
||||||
case EXTRASAMPLE_UNSPECIFIED:
|
|
||||||
fprintf(fd, "%sunspecified", sep);
|
|
||||||
break;
|
|
||||||
case EXTRASAMPLE_ASSOCALPHA:
|
|
||||||
fprintf(fd, "%sassoc-alpha", sep);
|
|
||||||
break;
|
|
||||||
case EXTRASAMPLE_UNASSALPHA:
|
|
||||||
fprintf(fd, "%sunassoc-alpha", sep);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fprintf(fd, "%s%u (0x%x)", sep,
|
|
||||||
td->td_sampleinfo[i], td->td_sampleinfo[i]);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
sep = ", ";
|
|
||||||
}
|
|
||||||
fprintf(fd, ">\n");
|
|
||||||
}
|
|
||||||
if (TIFFFieldSet(tif,FIELD_INKNAMES)) {
|
|
||||||
char* cp;
|
|
||||||
fprintf(fd, " Ink Names: ");
|
|
||||||
i = td->td_samplesperpixel;
|
|
||||||
sep = "";
|
|
||||||
for (cp = td->td_inknames; i > 0; cp = strchr(cp,'\0')+1, i--) {
|
|
||||||
fputs(sep, fd);
|
|
||||||
_TIFFprintAscii(fd, cp);
|
|
||||||
sep = ", ";
|
|
||||||
}
|
|
||||||
fputs("\n", fd);
|
|
||||||
}
|
|
||||||
if (TIFFFieldSet(tif,FIELD_THRESHHOLDING)) {
|
|
||||||
fprintf(fd, " Thresholding: ");
|
|
||||||
switch (td->td_threshholding) {
|
|
||||||
case THRESHHOLD_BILEVEL:
|
|
||||||
fprintf(fd, "bilevel art scan\n");
|
|
||||||
break;
|
|
||||||
case THRESHHOLD_HALFTONE:
|
|
||||||
fprintf(fd, "halftone or dithered scan\n");
|
|
||||||
break;
|
|
||||||
case THRESHHOLD_ERRORDIFFUSE:
|
|
||||||
fprintf(fd, "error diffused\n");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fprintf(fd, "%u (0x%x)\n",
|
|
||||||
td->td_threshholding, td->td_threshholding);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (TIFFFieldSet(tif,FIELD_FILLORDER)) {
|
|
||||||
fprintf(fd, " FillOrder: ");
|
|
||||||
switch (td->td_fillorder) {
|
|
||||||
case FILLORDER_MSB2LSB:
|
|
||||||
fprintf(fd, "msb-to-lsb\n");
|
|
||||||
break;
|
|
||||||
case FILLORDER_LSB2MSB:
|
|
||||||
fprintf(fd, "lsb-to-msb\n");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fprintf(fd, "%u (0x%x)\n",
|
|
||||||
td->td_fillorder, td->td_fillorder);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (TIFFFieldSet(tif,FIELD_YCBCRSUBSAMPLING))
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* For hacky reasons (see tif_jpeg.c - JPEGFixupTestSubsampling),
|
|
||||||
* we need to fetch this rather than trust what is in our
|
|
||||||
* structures.
|
|
||||||
*/
|
|
||||||
uint16 subsampling[2];
|
|
||||||
|
|
||||||
TIFFGetField( tif, TIFFTAG_YCBCRSUBSAMPLING,
|
|
||||||
subsampling + 0, subsampling + 1 );
|
|
||||||
fprintf(fd, " YCbCr Subsampling: %u, %u\n",
|
|
||||||
subsampling[0], subsampling[1] );
|
|
||||||
}
|
|
||||||
if (TIFFFieldSet(tif,FIELD_YCBCRPOSITIONING)) {
|
|
||||||
fprintf(fd, " YCbCr Positioning: ");
|
|
||||||
switch (td->td_ycbcrpositioning) {
|
|
||||||
case YCBCRPOSITION_CENTERED:
|
|
||||||
fprintf(fd, "centered\n");
|
|
||||||
break;
|
|
||||||
case YCBCRPOSITION_COSITED:
|
|
||||||
fprintf(fd, "cosited\n");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fprintf(fd, "%u (0x%x)\n",
|
|
||||||
td->td_ycbcrpositioning, td->td_ycbcrpositioning);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (TIFFFieldSet(tif,FIELD_HALFTONEHINTS))
|
|
||||||
fprintf(fd, " Halftone Hints: light %u dark %u\n",
|
|
||||||
td->td_halftonehints[0], td->td_halftonehints[1]);
|
|
||||||
if (TIFFFieldSet(tif,FIELD_ORIENTATION)) {
|
|
||||||
fprintf(fd, " Orientation: ");
|
|
||||||
if (td->td_orientation < NORIENTNAMES)
|
|
||||||
fprintf(fd, "%s\n", orientNames[td->td_orientation]);
|
|
||||||
else
|
|
||||||
fprintf(fd, "%u (0x%x)\n",
|
|
||||||
td->td_orientation, td->td_orientation);
|
|
||||||
}
|
|
||||||
if (TIFFFieldSet(tif,FIELD_SAMPLESPERPIXEL))
|
|
||||||
fprintf(fd, " Samples/Pixel: %u\n", td->td_samplesperpixel);
|
|
||||||
if (TIFFFieldSet(tif,FIELD_ROWSPERSTRIP)) {
|
|
||||||
fprintf(fd, " Rows/Strip: ");
|
|
||||||
if (td->td_rowsperstrip == (uint32) -1)
|
|
||||||
fprintf(fd, "(infinite)\n");
|
|
||||||
else
|
|
||||||
fprintf(fd, "%lu\n", (unsigned long) td->td_rowsperstrip);
|
|
||||||
}
|
|
||||||
if (TIFFFieldSet(tif,FIELD_MINSAMPLEVALUE))
|
|
||||||
fprintf(fd, " Min Sample Value: %u\n", td->td_minsamplevalue);
|
|
||||||
if (TIFFFieldSet(tif,FIELD_MAXSAMPLEVALUE))
|
|
||||||
fprintf(fd, " Max Sample Value: %u\n", td->td_maxsamplevalue);
|
|
||||||
if (TIFFFieldSet(tif,FIELD_SMINSAMPLEVALUE))
|
|
||||||
fprintf(fd, " SMin Sample Value: %g\n",
|
|
||||||
td->td_sminsamplevalue);
|
|
||||||
if (TIFFFieldSet(tif,FIELD_SMAXSAMPLEVALUE))
|
|
||||||
fprintf(fd, " SMax Sample Value: %g\n",
|
|
||||||
td->td_smaxsamplevalue);
|
|
||||||
if (TIFFFieldSet(tif,FIELD_PLANARCONFIG)) {
|
|
||||||
fprintf(fd, " Planar Configuration: ");
|
|
||||||
switch (td->td_planarconfig) {
|
|
||||||
case PLANARCONFIG_CONTIG:
|
|
||||||
fprintf(fd, "single image plane\n");
|
|
||||||
break;
|
|
||||||
case PLANARCONFIG_SEPARATE:
|
|
||||||
fprintf(fd, "separate image planes\n");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fprintf(fd, "%u (0x%x)\n",
|
|
||||||
td->td_planarconfig, td->td_planarconfig);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (TIFFFieldSet(tif,FIELD_PAGENUMBER))
|
|
||||||
fprintf(fd, " Page Number: %u-%u\n",
|
|
||||||
td->td_pagenumber[0], td->td_pagenumber[1]);
|
|
||||||
if (TIFFFieldSet(tif,FIELD_COLORMAP)) {
|
|
||||||
fprintf(fd, " Color Map: ");
|
|
||||||
if (flags & TIFFPRINT_COLORMAP) {
|
|
||||||
fprintf(fd, "\n");
|
|
||||||
n = 1L<<td->td_bitspersample;
|
|
||||||
for (l = 0; l < n; l++)
|
|
||||||
fprintf(fd, " %5lu: %5u %5u %5u\n",
|
|
||||||
l,
|
|
||||||
td->td_colormap[0][l],
|
|
||||||
td->td_colormap[1][l],
|
|
||||||
td->td_colormap[2][l]);
|
|
||||||
} else
|
|
||||||
fprintf(fd, "(present)\n");
|
|
||||||
}
|
|
||||||
if (TIFFFieldSet(tif,FIELD_TRANSFERFUNCTION)) {
|
|
||||||
fprintf(fd, " Transfer Function: ");
|
|
||||||
if (flags & TIFFPRINT_CURVES) {
|
|
||||||
fprintf(fd, "\n");
|
|
||||||
n = 1L<<td->td_bitspersample;
|
|
||||||
for (l = 0; l < n; l++) {
|
|
||||||
fprintf(fd, " %2lu: %5u",
|
|
||||||
l, td->td_transferfunction[0][l]);
|
|
||||||
for (i = 1; i < td->td_samplesperpixel; i++)
|
|
||||||
fprintf(fd, " %5u",
|
|
||||||
td->td_transferfunction[i][l]);
|
|
||||||
fputc('\n', fd);
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
fprintf(fd, "(present)\n");
|
|
||||||
}
|
|
||||||
if (TIFFFieldSet(tif, FIELD_SUBIFD) && (td->td_subifd)) {
|
|
||||||
fprintf(fd, " SubIFD Offsets:");
|
|
||||||
for (i = 0; i < td->td_nsubifd; i++)
|
|
||||||
fprintf(fd, " %5lu", (long) td->td_subifd[i]);
|
|
||||||
fputc('\n', fd);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
** Custom tag support.
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
short count;
|
|
||||||
|
|
||||||
count = (short) TIFFGetTagListCount(tif);
|
|
||||||
for(i = 0; i < count; i++) {
|
|
||||||
ttag_t tag = TIFFGetTagListEntry(tif, i);
|
|
||||||
const TIFFFieldInfo *fip;
|
|
||||||
uint32 value_count;
|
|
||||||
int mem_alloc = 0;
|
|
||||||
void *raw_data;
|
|
||||||
|
|
||||||
fip = TIFFFieldWithTag(tif, tag);
|
|
||||||
if(fip == NULL)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if(fip->field_passcount) {
|
|
||||||
if(TIFFGetField(tif, tag, &value_count, &raw_data) != 1)
|
|
||||||
continue;
|
|
||||||
} else {
|
|
||||||
if (fip->field_readcount == TIFF_VARIABLE
|
|
||||||
|| fip->field_readcount == TIFF_VARIABLE2)
|
|
||||||
value_count = 1;
|
|
||||||
else if (fip->field_readcount == TIFF_SPP)
|
|
||||||
value_count = td->td_samplesperpixel;
|
|
||||||
else
|
|
||||||
value_count = fip->field_readcount;
|
|
||||||
if ((fip->field_type == TIFF_ASCII
|
|
||||||
|| fip->field_readcount == TIFF_VARIABLE
|
|
||||||
|| fip->field_readcount == TIFF_VARIABLE2
|
|
||||||
|| fip->field_readcount == TIFF_SPP
|
|
||||||
|| value_count > 1)
|
|
||||||
&& fip->field_tag != TIFFTAG_PAGENUMBER
|
|
||||||
&& fip->field_tag != TIFFTAG_HALFTONEHINTS
|
|
||||||
&& fip->field_tag != TIFFTAG_YCBCRSUBSAMPLING
|
|
||||||
&& fip->field_tag != TIFFTAG_DOTRANGE) {
|
|
||||||
if(TIFFGetField(tif, tag, &raw_data) != 1)
|
|
||||||
continue;
|
|
||||||
} else if (fip->field_tag != TIFFTAG_PAGENUMBER
|
|
||||||
&& fip->field_tag != TIFFTAG_HALFTONEHINTS
|
|
||||||
&& fip->field_tag != TIFFTAG_YCBCRSUBSAMPLING
|
|
||||||
&& fip->field_tag != TIFFTAG_DOTRANGE) {
|
|
||||||
raw_data = _TIFFmalloc(
|
|
||||||
_TIFFDataSize(fip->field_type)
|
|
||||||
* value_count);
|
|
||||||
mem_alloc = 1;
|
|
||||||
if(TIFFGetField(tif, tag, raw_data) != 1) {
|
|
||||||
_TIFFfree(raw_data);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* XXX: Should be fixed and removed, see the
|
|
||||||
* notes related to TIFFTAG_PAGENUMBER,
|
|
||||||
* TIFFTAG_HALFTONEHINTS,
|
|
||||||
* TIFFTAG_YCBCRSUBSAMPLING and
|
|
||||||
* TIFFTAG_DOTRANGE tags in tif_dir.c. */
|
|
||||||
char *tmp;
|
|
||||||
raw_data = _TIFFmalloc(
|
|
||||||
_TIFFDataSize(fip->field_type)
|
|
||||||
* value_count);
|
|
||||||
tmp = raw_data;
|
|
||||||
mem_alloc = 1;
|
|
||||||
if(TIFFGetField(tif, tag, tmp,
|
|
||||||
tmp + _TIFFDataSize(fip->field_type)) != 1) {
|
|
||||||
_TIFFfree(raw_data);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Catch the tags which needs to be specially handled and
|
|
||||||
* pretty print them. If tag not handled in
|
|
||||||
* _TIFFPrettyPrintField() fall down and print it as any other
|
|
||||||
* tag.
|
|
||||||
*/
|
|
||||||
if (_TIFFPrettyPrintField(tif, fd, tag, value_count, raw_data)) {
|
|
||||||
if(mem_alloc)
|
|
||||||
_TIFFfree(raw_data);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
_TIFFPrintField(fd, fip, value_count, raw_data);
|
|
||||||
|
|
||||||
if(mem_alloc)
|
|
||||||
_TIFFfree(raw_data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tif->tif_tagmethods.printdir)
|
|
||||||
(*tif->tif_tagmethods.printdir)(tif, fd, flags);
|
|
||||||
if ((flags & TIFFPRINT_STRIPS) &&
|
|
||||||
TIFFFieldSet(tif,FIELD_STRIPOFFSETS)) {
|
|
||||||
tstrip_t s;
|
|
||||||
|
|
||||||
fprintf(fd, " %lu %s:\n",
|
|
||||||
(long) td->td_nstrips,
|
|
||||||
isTiled(tif) ? "Tiles" : "Strips");
|
|
||||||
for (s = 0; s < td->td_nstrips; s++)
|
|
||||||
fprintf(fd, " %3lu: [%8lu, %8lu]\n",
|
|
||||||
(unsigned long) s,
|
|
||||||
(unsigned long) td->td_stripoffset[s],
|
|
||||||
(unsigned long) td->td_stripbytecount[s]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
_TIFFprintAscii(FILE* fd, const char* cp)
|
|
||||||
{
|
|
||||||
for (; *cp != '\0'; cp++) {
|
|
||||||
const char* tp;
|
|
||||||
|
|
||||||
if (isprint((int)*cp)) {
|
|
||||||
fputc(*cp, fd);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
for (tp = "\tt\bb\rr\nn\vv"; *tp; tp++)
|
|
||||||
if (*tp++ == *cp)
|
|
||||||
break;
|
|
||||||
if (*tp)
|
|
||||||
fprintf(fd, "\\%c", *tp);
|
|
||||||
else
|
|
||||||
fprintf(fd, "\\%03o", *cp & 0xff);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
_TIFFprintAsciiTag(FILE* fd, const char* name, const char* value)
|
|
||||||
{
|
|
||||||
fprintf(fd, " %s: \"", name);
|
|
||||||
_TIFFprintAscii(fd, value);
|
|
||||||
fprintf(fd, "\"\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
@@ -1,750 +0,0 @@
|
|||||||
/* $Id: tif_read.c,v 1.16.2.3 2010-06-09 14:32:47 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF Library.
|
|
||||||
* Scanline-oriented Read Support
|
|
||||||
*/
|
|
||||||
#include "tiffiop.h"
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
int TIFFFillStrip(TIFF*, tstrip_t);
|
|
||||||
int TIFFFillTile(TIFF*, ttile_t);
|
|
||||||
static int TIFFStartStrip(TIFF*, tstrip_t);
|
|
||||||
static int TIFFStartTile(TIFF*, ttile_t);
|
|
||||||
static int TIFFCheckRead(TIFF*, int);
|
|
||||||
|
|
||||||
#define NOSTRIP ((tstrip_t) -1) /* undefined state */
|
|
||||||
#define NOTILE ((ttile_t) -1) /* undefined state */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Seek to a random row+sample in a file.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
TIFFSeek(TIFF* tif, uint32 row, tsample_t sample)
|
|
||||||
{
|
|
||||||
register TIFFDirectory *td = &tif->tif_dir;
|
|
||||||
tstrip_t strip;
|
|
||||||
|
|
||||||
if (row >= td->td_imagelength) { /* out of range */
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
|
||||||
"%lu: Row out of range, max %lu",
|
|
||||||
(unsigned long) row,
|
|
||||||
(unsigned long) td->td_imagelength);
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
if (td->td_planarconfig == PLANARCONFIG_SEPARATE) {
|
|
||||||
if (sample >= td->td_samplesperpixel) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
|
||||||
"%lu: Sample out of range, max %lu",
|
|
||||||
(unsigned long) sample, (unsigned long) td->td_samplesperpixel);
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
strip = sample*td->td_stripsperimage + row/td->td_rowsperstrip;
|
|
||||||
} else
|
|
||||||
strip = row / td->td_rowsperstrip;
|
|
||||||
if (strip != tif->tif_curstrip) { /* different strip, refill */
|
|
||||||
if (!TIFFFillStrip(tif, strip))
|
|
||||||
return (0);
|
|
||||||
} else if (row < tif->tif_row) {
|
|
||||||
/*
|
|
||||||
* Moving backwards within the same strip: backup
|
|
||||||
* to the start and then decode forward (below).
|
|
||||||
*
|
|
||||||
* NB: If you're planning on lots of random access within a
|
|
||||||
* strip, it's better to just read and decode the entire
|
|
||||||
* strip, and then access the decoded data in a random fashion.
|
|
||||||
*/
|
|
||||||
if (!TIFFStartStrip(tif, strip))
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
if (row != tif->tif_row) {
|
|
||||||
/*
|
|
||||||
* Seek forward to the desired row.
|
|
||||||
*/
|
|
||||||
if (!(*tif->tif_seek)(tif, row - tif->tif_row))
|
|
||||||
return (0);
|
|
||||||
tif->tif_row = row;
|
|
||||||
}
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
TIFFReadScanline(TIFF* tif, tdata_t buf, uint32 row, tsample_t sample)
|
|
||||||
{
|
|
||||||
int e;
|
|
||||||
|
|
||||||
if (!TIFFCheckRead(tif, 0))
|
|
||||||
return (-1);
|
|
||||||
if( (e = TIFFSeek(tif, row, sample)) != 0) {
|
|
||||||
/*
|
|
||||||
* Decompress desired row into user buffer.
|
|
||||||
*/
|
|
||||||
e = (*tif->tif_decoderow)
|
|
||||||
(tif, (tidata_t) buf, tif->tif_scanlinesize, sample);
|
|
||||||
|
|
||||||
/* we are now poised at the beginning of the next row */
|
|
||||||
tif->tif_row = row + 1;
|
|
||||||
|
|
||||||
if (e)
|
|
||||||
(*tif->tif_postdecode)(tif, (tidata_t) buf,
|
|
||||||
tif->tif_scanlinesize);
|
|
||||||
}
|
|
||||||
return (e > 0 ? 1 : -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Read a strip of data and decompress the specified
|
|
||||||
* amount into the user-supplied buffer.
|
|
||||||
*/
|
|
||||||
tsize_t
|
|
||||||
TIFFReadEncodedStrip(TIFF* tif, tstrip_t strip, tdata_t buf, tsize_t size)
|
|
||||||
{
|
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
|
||||||
uint32 nrows;
|
|
||||||
tsize_t stripsize;
|
|
||||||
tstrip_t sep_strip, strips_per_sep;
|
|
||||||
|
|
||||||
if (!TIFFCheckRead(tif, 0))
|
|
||||||
return (-1);
|
|
||||||
if (strip >= td->td_nstrips) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
|
||||||
"%ld: Strip out of range, max %ld",
|
|
||||||
(long) strip, (long) td->td_nstrips);
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Calculate the strip size according to the number of
|
|
||||||
* rows in the strip (check for truncated last strip on any
|
|
||||||
* of the separations).
|
|
||||||
*/
|
|
||||||
if( td->td_rowsperstrip >= td->td_imagelength )
|
|
||||||
strips_per_sep = 1;
|
|
||||||
else
|
|
||||||
strips_per_sep = (td->td_imagelength+td->td_rowsperstrip-1)
|
|
||||||
/ td->td_rowsperstrip;
|
|
||||||
|
|
||||||
sep_strip = strip % strips_per_sep;
|
|
||||||
|
|
||||||
if (sep_strip != strips_per_sep-1 ||
|
|
||||||
(nrows = td->td_imagelength % td->td_rowsperstrip) == 0)
|
|
||||||
nrows = td->td_rowsperstrip;
|
|
||||||
|
|
||||||
stripsize = TIFFVStripSize(tif, nrows);
|
|
||||||
if (size == (tsize_t) -1)
|
|
||||||
size = stripsize;
|
|
||||||
else if (size > stripsize)
|
|
||||||
size = stripsize;
|
|
||||||
if (TIFFFillStrip(tif, strip)
|
|
||||||
&& (*tif->tif_decodestrip)(tif, (tidata_t) buf, size,
|
|
||||||
(tsample_t)(strip / td->td_stripsperimage)) > 0 ) {
|
|
||||||
(*tif->tif_postdecode)(tif, (tidata_t) buf, size);
|
|
||||||
return (size);
|
|
||||||
} else
|
|
||||||
return ((tsize_t) -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static tsize_t
|
|
||||||
TIFFReadRawStrip1(TIFF* tif,
|
|
||||||
tstrip_t strip, tdata_t buf, tsize_t size, const char* module)
|
|
||||||
{
|
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
|
||||||
|
|
||||||
assert((tif->tif_flags&TIFF_NOREADRAW)==0);
|
|
||||||
if (!isMapped(tif)) {
|
|
||||||
tsize_t cc;
|
|
||||||
|
|
||||||
if (!SeekOK(tif, td->td_stripoffset[strip])) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
|
||||||
"%s: Seek error at scanline %lu, strip %lu",
|
|
||||||
tif->tif_name,
|
|
||||||
(unsigned long) tif->tif_row, (unsigned long) strip);
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
cc = TIFFReadFile(tif, buf, size);
|
|
||||||
if (cc != size) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
|
||||||
"%s: Read error at scanline %lu; got %lu bytes, expected %lu",
|
|
||||||
tif->tif_name,
|
|
||||||
(unsigned long) tif->tif_row,
|
|
||||||
(unsigned long) cc,
|
|
||||||
(unsigned long) size);
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (td->td_stripoffset[strip] + size > tif->tif_size) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
|
||||||
"%s: Read error at scanline %lu, strip %lu; got %lu bytes, expected %lu",
|
|
||||||
tif->tif_name,
|
|
||||||
(unsigned long) tif->tif_row,
|
|
||||||
(unsigned long) strip,
|
|
||||||
(unsigned long) tif->tif_size - td->td_stripoffset[strip],
|
|
||||||
(unsigned long) size);
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
_TIFFmemcpy(buf, tif->tif_base + td->td_stripoffset[strip],
|
|
||||||
size);
|
|
||||||
}
|
|
||||||
return (size);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Read a strip of data from the file.
|
|
||||||
*/
|
|
||||||
tsize_t
|
|
||||||
TIFFReadRawStrip(TIFF* tif, tstrip_t strip, tdata_t buf, tsize_t size)
|
|
||||||
{
|
|
||||||
static const char module[] = "TIFFReadRawStrip";
|
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
|
||||||
/*
|
|
||||||
* FIXME: butecount should have tsize_t type, but for now libtiff
|
|
||||||
* defines tsize_t as a signed 32-bit integer and we are losing
|
|
||||||
* ability to read arrays larger than 2^31 bytes. So we are using
|
|
||||||
* uint32 instead of tsize_t here.
|
|
||||||
*/
|
|
||||||
uint32 bytecount;
|
|
||||||
|
|
||||||
if (!TIFFCheckRead(tif, 0))
|
|
||||||
return ((tsize_t) -1);
|
|
||||||
if (strip >= td->td_nstrips) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
|
||||||
"%lu: Strip out of range, max %lu",
|
|
||||||
(unsigned long) strip,
|
|
||||||
(unsigned long) td->td_nstrips);
|
|
||||||
return ((tsize_t) -1);
|
|
||||||
}
|
|
||||||
if (tif->tif_flags&TIFF_NOREADRAW)
|
|
||||||
{
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
|
||||||
"Compression scheme does not support access to raw uncompressed data");
|
|
||||||
return ((tsize_t) -1);
|
|
||||||
}
|
|
||||||
bytecount = td->td_stripbytecount[strip];
|
|
||||||
if (bytecount <= 0) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
|
||||||
"%lu: Invalid strip byte count, strip %lu",
|
|
||||||
(unsigned long) bytecount, (unsigned long) strip);
|
|
||||||
return ((tsize_t) -1);
|
|
||||||
}
|
|
||||||
if (size != (tsize_t)-1 && (uint32)size < bytecount)
|
|
||||||
bytecount = size;
|
|
||||||
return (TIFFReadRawStrip1(tif, strip, buf, bytecount, module));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Read the specified strip and setup for decoding. The data buffer is
|
|
||||||
* expanded, as necessary, to hold the strip's data.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
TIFFFillStrip(TIFF* tif, tstrip_t strip)
|
|
||||||
{
|
|
||||||
static const char module[] = "TIFFFillStrip";
|
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
|
||||||
|
|
||||||
if ((tif->tif_flags&TIFF_NOREADRAW)==0)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* FIXME: butecount should have tsize_t type, but for now
|
|
||||||
* libtiff defines tsize_t as a signed 32-bit integer and we
|
|
||||||
* are losing ability to read arrays larger than 2^31 bytes.
|
|
||||||
* So we are using uint32 instead of tsize_t here.
|
|
||||||
*/
|
|
||||||
uint32 bytecount = td->td_stripbytecount[strip];
|
|
||||||
if (bytecount <= 0) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
|
||||||
"%s: Invalid strip byte count %lu, strip %lu",
|
|
||||||
tif->tif_name, (unsigned long) bytecount,
|
|
||||||
(unsigned long) strip);
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
if (isMapped(tif) &&
|
|
||||||
(isFillOrder(tif, td->td_fillorder)
|
|
||||||
|| (tif->tif_flags & TIFF_NOBITREV))) {
|
|
||||||
/*
|
|
||||||
* The image is mapped into memory and we either don't
|
|
||||||
* need to flip bits or the compression routine is
|
|
||||||
* going to handle this operation itself. In this
|
|
||||||
* case, avoid copying the raw data and instead just
|
|
||||||
* reference the data from the memory mapped file
|
|
||||||
* image. This assumes that the decompression
|
|
||||||
* routines do not modify the contents of the raw data
|
|
||||||
* buffer (if they try to, the application will get a
|
|
||||||
* fault since the file is mapped read-only).
|
|
||||||
*/
|
|
||||||
if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata)
|
|
||||||
_TIFFfree(tif->tif_rawdata);
|
|
||||||
tif->tif_flags &= ~TIFF_MYBUFFER;
|
|
||||||
/*
|
|
||||||
* We must check for overflow, potentially causing
|
|
||||||
* an OOB read. Instead of simple
|
|
||||||
*
|
|
||||||
* td->td_stripoffset[strip]+bytecount > tif->tif_size
|
|
||||||
*
|
|
||||||
* comparison (which can overflow) we do the following
|
|
||||||
* two comparisons:
|
|
||||||
*/
|
|
||||||
if (bytecount > tif->tif_size ||
|
|
||||||
td->td_stripoffset[strip] > tif->tif_size - bytecount) {
|
|
||||||
/*
|
|
||||||
* This error message might seem strange, but
|
|
||||||
* it's what would happen if a read were done
|
|
||||||
* instead.
|
|
||||||
*/
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
|
||||||
|
|
||||||
"%s: Read error on strip %lu; "
|
|
||||||
"got %lu bytes, expected %lu",
|
|
||||||
tif->tif_name, (unsigned long) strip,
|
|
||||||
(unsigned long) tif->tif_size - td->td_stripoffset[strip],
|
|
||||||
(unsigned long) bytecount);
|
|
||||||
tif->tif_curstrip = NOSTRIP;
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
tif->tif_rawdatasize = bytecount;
|
|
||||||
tif->tif_rawdata = tif->tif_base + td->td_stripoffset[strip];
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* Expand raw data buffer, if needed, to hold data
|
|
||||||
* strip coming from file (perhaps should set upper
|
|
||||||
* bound on the size of a buffer we'll use?).
|
|
||||||
*/
|
|
||||||
if (bytecount > (uint32)tif->tif_rawdatasize) {
|
|
||||||
tif->tif_curstrip = NOSTRIP;
|
|
||||||
if ((tif->tif_flags & TIFF_MYBUFFER) == 0) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata,
|
|
||||||
module,
|
|
||||||
"%s: Data buffer too small to hold strip %lu",
|
|
||||||
tif->tif_name,
|
|
||||||
(unsigned long) strip);
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
if (!TIFFReadBufferSetup(tif, 0,
|
|
||||||
TIFFroundup(bytecount, 1024)))
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
if ((uint32)TIFFReadRawStrip1(tif, strip,
|
|
||||||
(unsigned char *)tif->tif_rawdata,
|
|
||||||
bytecount, module) != bytecount)
|
|
||||||
return (0);
|
|
||||||
if (!isFillOrder(tif, td->td_fillorder) &&
|
|
||||||
(tif->tif_flags & TIFF_NOBITREV) == 0)
|
|
||||||
TIFFReverseBits(tif->tif_rawdata, bytecount);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return (TIFFStartStrip(tif, strip));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Tile-oriented Read Support
|
|
||||||
* Contributed by Nancy Cam (Silicon Graphics).
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Read and decompress a tile of data. The
|
|
||||||
* tile is selected by the (x,y,z,s) coordinates.
|
|
||||||
*/
|
|
||||||
tsize_t
|
|
||||||
TIFFReadTile(TIFF* tif,
|
|
||||||
tdata_t buf, uint32 x, uint32 y, uint32 z, tsample_t s)
|
|
||||||
{
|
|
||||||
if (!TIFFCheckRead(tif, 1) || !TIFFCheckTile(tif, x, y, z, s))
|
|
||||||
return (-1);
|
|
||||||
return (TIFFReadEncodedTile(tif,
|
|
||||||
TIFFComputeTile(tif, x, y, z, s), buf, (tsize_t) -1));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Read a tile of data and decompress the specified
|
|
||||||
* amount into the user-supplied buffer.
|
|
||||||
*/
|
|
||||||
tsize_t
|
|
||||||
TIFFReadEncodedTile(TIFF* tif, ttile_t tile, tdata_t buf, tsize_t size)
|
|
||||||
{
|
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
|
||||||
tsize_t tilesize = tif->tif_tilesize;
|
|
||||||
|
|
||||||
if (!TIFFCheckRead(tif, 1))
|
|
||||||
return (-1);
|
|
||||||
if (tile >= td->td_nstrips) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
|
||||||
"%ld: Tile out of range, max %ld",
|
|
||||||
(long) tile, (unsigned long) td->td_nstrips);
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
if (size == (tsize_t) -1)
|
|
||||||
size = tilesize;
|
|
||||||
else if (size > tilesize)
|
|
||||||
size = tilesize;
|
|
||||||
if (TIFFFillTile(tif, tile) && (*tif->tif_decodetile)(tif,
|
|
||||||
(tidata_t) buf, size, (tsample_t)(tile/td->td_stripsperimage))) {
|
|
||||||
(*tif->tif_postdecode)(tif, (tidata_t) buf, size);
|
|
||||||
return (size);
|
|
||||||
} else
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static tsize_t
|
|
||||||
TIFFReadRawTile1(TIFF* tif,
|
|
||||||
ttile_t tile, tdata_t buf, tsize_t size, const char* module)
|
|
||||||
{
|
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
|
||||||
|
|
||||||
assert((tif->tif_flags&TIFF_NOREADRAW)==0);
|
|
||||||
if (!isMapped(tif)) {
|
|
||||||
tsize_t cc;
|
|
||||||
|
|
||||||
if (!SeekOK(tif, td->td_stripoffset[tile])) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
|
||||||
"%s: Seek error at row %ld, col %ld, tile %ld",
|
|
||||||
tif->tif_name,
|
|
||||||
(long) tif->tif_row,
|
|
||||||
(long) tif->tif_col,
|
|
||||||
(long) tile);
|
|
||||||
return ((tsize_t) -1);
|
|
||||||
}
|
|
||||||
cc = TIFFReadFile(tif, buf, size);
|
|
||||||
if (cc != size) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
|
||||||
"%s: Read error at row %ld, col %ld; got %lu bytes, expected %lu",
|
|
||||||
tif->tif_name,
|
|
||||||
(long) tif->tif_row,
|
|
||||||
(long) tif->tif_col,
|
|
||||||
(unsigned long) cc,
|
|
||||||
(unsigned long) size);
|
|
||||||
return ((tsize_t) -1);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (td->td_stripoffset[tile] + size > tif->tif_size) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
|
||||||
"%s: Read error at row %ld, col %ld, tile %ld; got %lu bytes, expected %lu",
|
|
||||||
tif->tif_name,
|
|
||||||
(long) tif->tif_row,
|
|
||||||
(long) tif->tif_col,
|
|
||||||
(long) tile,
|
|
||||||
(unsigned long) tif->tif_size - td->td_stripoffset[tile],
|
|
||||||
(unsigned long) size);
|
|
||||||
return ((tsize_t) -1);
|
|
||||||
}
|
|
||||||
_TIFFmemcpy(buf, tif->tif_base + td->td_stripoffset[tile], size);
|
|
||||||
}
|
|
||||||
return (size);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Read a tile of data from the file.
|
|
||||||
*/
|
|
||||||
tsize_t
|
|
||||||
TIFFReadRawTile(TIFF* tif, ttile_t tile, tdata_t buf, tsize_t size)
|
|
||||||
{
|
|
||||||
static const char module[] = "TIFFReadRawTile";
|
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
|
||||||
/*
|
|
||||||
* FIXME: butecount should have tsize_t type, but for now libtiff
|
|
||||||
* defines tsize_t as a signed 32-bit integer and we are losing
|
|
||||||
* ability to read arrays larger than 2^31 bytes. So we are using
|
|
||||||
* uint32 instead of tsize_t here.
|
|
||||||
*/
|
|
||||||
uint32 bytecount;
|
|
||||||
|
|
||||||
if (!TIFFCheckRead(tif, 1))
|
|
||||||
return ((tsize_t) -1);
|
|
||||||
if (tile >= td->td_nstrips) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
|
||||||
"%lu: Tile out of range, max %lu",
|
|
||||||
(unsigned long) tile, (unsigned long) td->td_nstrips);
|
|
||||||
return ((tsize_t) -1);
|
|
||||||
}
|
|
||||||
if (tif->tif_flags&TIFF_NOREADRAW)
|
|
||||||
{
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
|
||||||
"Compression scheme does not support access to raw uncompressed data");
|
|
||||||
return ((tsize_t) -1);
|
|
||||||
}
|
|
||||||
bytecount = td->td_stripbytecount[tile];
|
|
||||||
if (size != (tsize_t) -1 && (uint32)size < bytecount)
|
|
||||||
bytecount = size;
|
|
||||||
return (TIFFReadRawTile1(tif, tile, buf, bytecount, module));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Read the specified tile and setup for decoding. The data buffer is
|
|
||||||
* expanded, as necessary, to hold the tile's data.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
TIFFFillTile(TIFF* tif, ttile_t tile)
|
|
||||||
{
|
|
||||||
static const char module[] = "TIFFFillTile";
|
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
|
||||||
|
|
||||||
if ((tif->tif_flags&TIFF_NOREADRAW)==0)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* FIXME: butecount should have tsize_t type, but for now
|
|
||||||
* libtiff defines tsize_t as a signed 32-bit integer and we
|
|
||||||
* are losing ability to read arrays larger than 2^31 bytes.
|
|
||||||
* So we are using uint32 instead of tsize_t here.
|
|
||||||
*/
|
|
||||||
uint32 bytecount = td->td_stripbytecount[tile];
|
|
||||||
if (bytecount <= 0) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
|
||||||
"%lu: Invalid tile byte count, tile %lu",
|
|
||||||
(unsigned long) bytecount, (unsigned long) tile);
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
if (isMapped(tif) &&
|
|
||||||
(isFillOrder(tif, td->td_fillorder)
|
|
||||||
|| (tif->tif_flags & TIFF_NOBITREV))) {
|
|
||||||
/*
|
|
||||||
* The image is mapped into memory and we either don't
|
|
||||||
* need to flip bits or the compression routine is
|
|
||||||
* going to handle this operation itself. In this
|
|
||||||
* case, avoid copying the raw data and instead just
|
|
||||||
* reference the data from the memory mapped file
|
|
||||||
* image. This assumes that the decompression
|
|
||||||
* routines do not modify the contents of the raw data
|
|
||||||
* buffer (if they try to, the application will get a
|
|
||||||
* fault since the file is mapped read-only).
|
|
||||||
*/
|
|
||||||
if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata)
|
|
||||||
_TIFFfree(tif->tif_rawdata);
|
|
||||||
tif->tif_flags &= ~TIFF_MYBUFFER;
|
|
||||||
/*
|
|
||||||
* We must check for overflow, potentially causing
|
|
||||||
* an OOB read. Instead of simple
|
|
||||||
*
|
|
||||||
* td->td_stripoffset[tile]+bytecount > tif->tif_size
|
|
||||||
*
|
|
||||||
* comparison (which can overflow) we do the following
|
|
||||||
* two comparisons:
|
|
||||||
*/
|
|
||||||
if (bytecount > tif->tif_size ||
|
|
||||||
td->td_stripoffset[tile] > tif->tif_size - bytecount) {
|
|
||||||
tif->tif_curtile = NOTILE;
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
tif->tif_rawdatasize = bytecount;
|
|
||||||
tif->tif_rawdata =
|
|
||||||
tif->tif_base + td->td_stripoffset[tile];
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* Expand raw data buffer, if needed, to hold data
|
|
||||||
* tile coming from file (perhaps should set upper
|
|
||||||
* bound on the size of a buffer we'll use?).
|
|
||||||
*/
|
|
||||||
if (bytecount > (uint32)tif->tif_rawdatasize) {
|
|
||||||
tif->tif_curtile = NOTILE;
|
|
||||||
if ((tif->tif_flags & TIFF_MYBUFFER) == 0) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata,
|
|
||||||
module,
|
|
||||||
"%s: Data buffer too small to hold tile %ld",
|
|
||||||
tif->tif_name,
|
|
||||||
(long) tile);
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
if (!TIFFReadBufferSetup(tif, 0,
|
|
||||||
TIFFroundup(bytecount, 1024)))
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
if ((uint32)TIFFReadRawTile1(tif, tile,
|
|
||||||
(unsigned char *)tif->tif_rawdata,
|
|
||||||
bytecount, module) != bytecount)
|
|
||||||
return (0);
|
|
||||||
if (!isFillOrder(tif, td->td_fillorder) &&
|
|
||||||
(tif->tif_flags & TIFF_NOBITREV) == 0)
|
|
||||||
TIFFReverseBits(tif->tif_rawdata, bytecount);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return (TIFFStartTile(tif, tile));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Setup the raw data buffer in preparation for
|
|
||||||
* reading a strip of raw data. If the buffer
|
|
||||||
* is specified as zero, then a buffer of appropriate
|
|
||||||
* size is allocated by the library. Otherwise,
|
|
||||||
* the client must guarantee that the buffer is
|
|
||||||
* large enough to hold any individual strip of
|
|
||||||
* raw data.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
TIFFReadBufferSetup(TIFF* tif, tdata_t bp, tsize_t size)
|
|
||||||
{
|
|
||||||
static const char module[] = "TIFFReadBufferSetup";
|
|
||||||
|
|
||||||
assert((tif->tif_flags&TIFF_NOREADRAW)==0);
|
|
||||||
if (tif->tif_rawdata) {
|
|
||||||
if (tif->tif_flags & TIFF_MYBUFFER)
|
|
||||||
_TIFFfree(tif->tif_rawdata);
|
|
||||||
tif->tif_rawdata = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bp) {
|
|
||||||
tif->tif_rawdatasize = size;
|
|
||||||
tif->tif_rawdata = (tidata_t) bp;
|
|
||||||
tif->tif_flags &= ~TIFF_MYBUFFER;
|
|
||||||
} else {
|
|
||||||
tif->tif_rawdatasize = TIFFroundup(size, 1024);
|
|
||||||
if (tif->tif_rawdatasize > 0)
|
|
||||||
tif->tif_rawdata = (tidata_t) _TIFFmalloc(tif->tif_rawdatasize);
|
|
||||||
tif->tif_flags |= TIFF_MYBUFFER;
|
|
||||||
}
|
|
||||||
if ((tif->tif_rawdata == NULL) || (tif->tif_rawdatasize == 0)) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
|
||||||
"%s: No space for data buffer at scanline %ld",
|
|
||||||
tif->tif_name, (long) tif->tif_row);
|
|
||||||
tif->tif_rawdatasize = 0;
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set state to appear as if a
|
|
||||||
* strip has just been read in.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
TIFFStartStrip(TIFF* tif, tstrip_t strip)
|
|
||||||
{
|
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
|
||||||
|
|
||||||
if ((tif->tif_flags & TIFF_CODERSETUP) == 0) {
|
|
||||||
if (!(*tif->tif_setupdecode)(tif))
|
|
||||||
return (0);
|
|
||||||
tif->tif_flags |= TIFF_CODERSETUP;
|
|
||||||
}
|
|
||||||
tif->tif_curstrip = strip;
|
|
||||||
tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip;
|
|
||||||
if (tif->tif_flags&TIFF_NOREADRAW)
|
|
||||||
{
|
|
||||||
tif->tif_rawcp = NULL;
|
|
||||||
tif->tif_rawcc = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
tif->tif_rawcp = tif->tif_rawdata;
|
|
||||||
tif->tif_rawcc = td->td_stripbytecount[strip];
|
|
||||||
}
|
|
||||||
return ((*tif->tif_predecode)(tif,
|
|
||||||
(tsample_t)(strip / td->td_stripsperimage)));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set state to appear as if a
|
|
||||||
* tile has just been read in.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
TIFFStartTile(TIFF* tif, ttile_t tile)
|
|
||||||
{
|
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
|
||||||
|
|
||||||
if ((tif->tif_flags & TIFF_CODERSETUP) == 0) {
|
|
||||||
if (!(*tif->tif_setupdecode)(tif))
|
|
||||||
return (0);
|
|
||||||
tif->tif_flags |= TIFF_CODERSETUP;
|
|
||||||
}
|
|
||||||
tif->tif_curtile = tile;
|
|
||||||
tif->tif_row =
|
|
||||||
(tile % TIFFhowmany(td->td_imagewidth, td->td_tilewidth)) *
|
|
||||||
td->td_tilelength;
|
|
||||||
tif->tif_col =
|
|
||||||
(tile % TIFFhowmany(td->td_imagelength, td->td_tilelength)) *
|
|
||||||
td->td_tilewidth;
|
|
||||||
if (tif->tif_flags&TIFF_NOREADRAW)
|
|
||||||
{
|
|
||||||
tif->tif_rawcp = NULL;
|
|
||||||
tif->tif_rawcc = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
tif->tif_rawcp = tif->tif_rawdata;
|
|
||||||
tif->tif_rawcc = td->td_stripbytecount[tile];
|
|
||||||
}
|
|
||||||
return ((*tif->tif_predecode)(tif,
|
|
||||||
(tsample_t)(tile/td->td_stripsperimage)));
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
TIFFCheckRead(TIFF* tif, int tiles)
|
|
||||||
{
|
|
||||||
if (tif->tif_mode == O_WRONLY) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "File not open for reading");
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
if (tiles ^ isTiled(tif)) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name, tiles ?
|
|
||||||
"Can not read tiles from a stripped image" :
|
|
||||||
"Can not read scanlines from a tiled image");
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
_TIFFNoPostDecode(TIFF* tif, tidata_t buf, tsize_t cc)
|
|
||||||
{
|
|
||||||
(void) tif; (void) buf; (void) cc;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
_TIFFSwab16BitData(TIFF* tif, tidata_t buf, tsize_t cc)
|
|
||||||
{
|
|
||||||
(void) tif;
|
|
||||||
assert((cc & 1) == 0);
|
|
||||||
TIFFSwabArrayOfShort((uint16*) buf, cc/2);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
_TIFFSwab24BitData(TIFF* tif, tidata_t buf, tsize_t cc)
|
|
||||||
{
|
|
||||||
(void) tif;
|
|
||||||
assert((cc % 3) == 0);
|
|
||||||
TIFFSwabArrayOfTriples((uint8*) buf, cc/3);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
_TIFFSwab32BitData(TIFF* tif, tidata_t buf, tsize_t cc)
|
|
||||||
{
|
|
||||||
(void) tif;
|
|
||||||
assert((cc & 3) == 0);
|
|
||||||
TIFFSwabArrayOfLong((uint32*) buf, cc/4);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
_TIFFSwab64BitData(TIFF* tif, tidata_t buf, tsize_t cc)
|
|
||||||
{
|
|
||||||
(void) tif;
|
|
||||||
assert((cc & 7) == 0);
|
|
||||||
TIFFSwabArrayOfDouble((double*) buf, cc/8);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
@@ -1,295 +0,0 @@
|
|||||||
/* $Id: tif_stream.cxx,v 1.6.2.1 2009-01-01 00:10:43 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 1988-1996 Sam Leffler
|
|
||||||
* Copyright (c) 1991-1996 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF Library UNIX-specific Routines.
|
|
||||||
*/
|
|
||||||
#include "tiffiop.h"
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
#ifndef __VMS
|
|
||||||
using namespace std;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
class tiffis_data
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
istream *myIS;
|
|
||||||
long myStreamStartPos;
|
|
||||||
};
|
|
||||||
|
|
||||||
class tiffos_data
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
ostream *myOS;
|
|
||||||
long myStreamStartPos;
|
|
||||||
};
|
|
||||||
|
|
||||||
static tsize_t
|
|
||||||
_tiffosReadProc(thandle_t, tdata_t, tsize_t)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static tsize_t
|
|
||||||
_tiffisReadProc(thandle_t fd, tdata_t buf, tsize_t size)
|
|
||||||
{
|
|
||||||
tiffis_data *data = (tiffis_data *)fd;
|
|
||||||
|
|
||||||
data->myIS->read((char *)buf, (int)size);
|
|
||||||
|
|
||||||
return data->myIS->gcount();
|
|
||||||
}
|
|
||||||
|
|
||||||
static tsize_t
|
|
||||||
_tiffosWriteProc(thandle_t fd, tdata_t buf, tsize_t size)
|
|
||||||
{
|
|
||||||
tiffos_data *data = (tiffos_data *)fd;
|
|
||||||
ostream *os = data->myOS;
|
|
||||||
int pos = os->tellp();
|
|
||||||
|
|
||||||
os->write((const char *)buf, size);
|
|
||||||
|
|
||||||
return ((int)os->tellp()) - pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
static tsize_t
|
|
||||||
_tiffisWriteProc(thandle_t, tdata_t, tsize_t)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static toff_t
|
|
||||||
_tiffosSeekProc(thandle_t fd, toff_t off, int whence)
|
|
||||||
{
|
|
||||||
tiffos_data *data = (tiffos_data *)fd;
|
|
||||||
ostream *os = data->myOS;
|
|
||||||
|
|
||||||
// if the stream has already failed, don't do anything
|
|
||||||
if( os->fail() )
|
|
||||||
return os->tellp();
|
|
||||||
|
|
||||||
switch(whence) {
|
|
||||||
case SEEK_SET:
|
|
||||||
os->seekp(data->myStreamStartPos + off, ios::beg);
|
|
||||||
break;
|
|
||||||
case SEEK_CUR:
|
|
||||||
os->seekp(off, ios::cur);
|
|
||||||
break;
|
|
||||||
case SEEK_END:
|
|
||||||
os->seekp(off, ios::end);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Attempt to workaround problems with seeking past the end of the
|
|
||||||
// stream. ofstream doesn't have a problem with this but
|
|
||||||
// ostrstream/ostringstream does. In that situation, add intermediate
|
|
||||||
// '\0' characters.
|
|
||||||
if( os->fail() ) {
|
|
||||||
#ifdef __VMS
|
|
||||||
int old_state;
|
|
||||||
#else
|
|
||||||
ios::iostate old_state;
|
|
||||||
#endif
|
|
||||||
toff_t origin=0;
|
|
||||||
|
|
||||||
old_state = os->rdstate();
|
|
||||||
// reset the fail bit or else tellp() won't work below
|
|
||||||
os->clear(os->rdstate() & ~ios::failbit);
|
|
||||||
switch( whence ) {
|
|
||||||
case SEEK_SET:
|
|
||||||
origin = data->myStreamStartPos;
|
|
||||||
break;
|
|
||||||
case SEEK_CUR:
|
|
||||||
origin = os->tellp();
|
|
||||||
break;
|
|
||||||
case SEEK_END:
|
|
||||||
os->seekp(0, ios::end);
|
|
||||||
origin = os->tellp();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
// restore original stream state
|
|
||||||
os->clear(old_state);
|
|
||||||
|
|
||||||
// only do something if desired seek position is valid
|
|
||||||
if( origin + off > data->myStreamStartPos ) {
|
|
||||||
toff_t num_fill;
|
|
||||||
|
|
||||||
// clear the fail bit
|
|
||||||
os->clear(os->rdstate() & ~ios::failbit);
|
|
||||||
|
|
||||||
// extend the stream to the expected size
|
|
||||||
os->seekp(0, ios::end);
|
|
||||||
num_fill = origin + off - (toff_t)os->tellp();
|
|
||||||
for( toff_t i = 0; i < num_fill; i++ )
|
|
||||||
os->put('\0');
|
|
||||||
|
|
||||||
// retry the seek
|
|
||||||
os->seekp(origin + off, ios::beg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return os->tellp();
|
|
||||||
}
|
|
||||||
|
|
||||||
static toff_t
|
|
||||||
_tiffisSeekProc(thandle_t fd, toff_t off, int whence)
|
|
||||||
{
|
|
||||||
tiffis_data *data = (tiffis_data *)fd;
|
|
||||||
|
|
||||||
switch(whence) {
|
|
||||||
case SEEK_SET:
|
|
||||||
data->myIS->seekg(data->myStreamStartPos + off, ios::beg);
|
|
||||||
break;
|
|
||||||
case SEEK_CUR:
|
|
||||||
data->myIS->seekg(off, ios::cur);
|
|
||||||
break;
|
|
||||||
case SEEK_END:
|
|
||||||
data->myIS->seekg(off, ios::end);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ((long)data->myIS->tellg()) - data->myStreamStartPos;
|
|
||||||
}
|
|
||||||
|
|
||||||
static toff_t
|
|
||||||
_tiffosSizeProc(thandle_t fd)
|
|
||||||
{
|
|
||||||
tiffos_data *data = (tiffos_data *)fd;
|
|
||||||
ostream *os = data->myOS;
|
|
||||||
toff_t pos = os->tellp();
|
|
||||||
toff_t len;
|
|
||||||
|
|
||||||
os->seekp(0, ios::end);
|
|
||||||
len = os->tellp();
|
|
||||||
os->seekp(pos);
|
|
||||||
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
static toff_t
|
|
||||||
_tiffisSizeProc(thandle_t fd)
|
|
||||||
{
|
|
||||||
tiffis_data *data = (tiffis_data *)fd;
|
|
||||||
int pos = data->myIS->tellg();
|
|
||||||
int len;
|
|
||||||
|
|
||||||
data->myIS->seekg(0, ios::end);
|
|
||||||
len = data->myIS->tellg();
|
|
||||||
data->myIS->seekg(pos);
|
|
||||||
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
_tiffosCloseProc(thandle_t fd)
|
|
||||||
{
|
|
||||||
// Our stream was not allocated by us, so it shouldn't be closed by us.
|
|
||||||
delete (tiffos_data *)fd;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
_tiffisCloseProc(thandle_t fd)
|
|
||||||
{
|
|
||||||
// Our stream was not allocated by us, so it shouldn't be closed by us.
|
|
||||||
delete (tiffis_data *)fd;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
_tiffDummyMapProc(thandle_t , tdata_t* , toff_t* )
|
|
||||||
{
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_tiffDummyUnmapProc(thandle_t , tdata_t , toff_t )
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Open a TIFF file descriptor for read/writing.
|
|
||||||
*/
|
|
||||||
static TIFF*
|
|
||||||
_tiffStreamOpen(const char* name, const char* mode, void *fd)
|
|
||||||
{
|
|
||||||
TIFF* tif;
|
|
||||||
|
|
||||||
if( strchr(mode, 'w') ) {
|
|
||||||
tiffos_data *data = new tiffos_data;
|
|
||||||
data->myOS = (ostream *)fd;
|
|
||||||
data->myStreamStartPos = data->myOS->tellp();
|
|
||||||
|
|
||||||
// Open for writing.
|
|
||||||
tif = TIFFClientOpen(name, mode,
|
|
||||||
(thandle_t) data,
|
|
||||||
_tiffosReadProc, _tiffosWriteProc,
|
|
||||||
_tiffosSeekProc, _tiffosCloseProc,
|
|
||||||
_tiffosSizeProc,
|
|
||||||
_tiffDummyMapProc, _tiffDummyUnmapProc);
|
|
||||||
} else {
|
|
||||||
tiffis_data *data = new tiffis_data;
|
|
||||||
data->myIS = (istream *)fd;
|
|
||||||
data->myStreamStartPos = data->myIS->tellg();
|
|
||||||
// Open for reading.
|
|
||||||
tif = TIFFClientOpen(name, mode,
|
|
||||||
(thandle_t) data,
|
|
||||||
_tiffisReadProc, _tiffisWriteProc,
|
|
||||||
_tiffisSeekProc, _tiffisCloseProc,
|
|
||||||
_tiffisSizeProc,
|
|
||||||
_tiffDummyMapProc, _tiffDummyUnmapProc);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (tif);
|
|
||||||
}
|
|
||||||
|
|
||||||
TIFF*
|
|
||||||
TIFFStreamOpen(const char* name, ostream *os)
|
|
||||||
{
|
|
||||||
// If os is either a ostrstream or ostringstream, and has no data
|
|
||||||
// written to it yet, then tellp() will return -1 which will break us.
|
|
||||||
// We workaround this by writing out a dummy character and
|
|
||||||
// then seek back to the beginning.
|
|
||||||
if( !os->fail() && (int)os->tellp() < 0 ) {
|
|
||||||
*os << '\0';
|
|
||||||
os->seekp(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// NB: We don't support mapped files with streams so add 'm'
|
|
||||||
return _tiffStreamOpen(name, "wm", os);
|
|
||||||
}
|
|
||||||
|
|
||||||
TIFF*
|
|
||||||
TIFFStreamOpen(const char* name, istream *is)
|
|
||||||
{
|
|
||||||
// NB: We don't support mapped files with streams so add 'm'
|
|
||||||
return _tiffStreamOpen(name, "rm", is);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
@@ -1,370 +0,0 @@
|
|||||||
/* $Id: tif_strip.c,v 1.19.2.1 2010-06-08 18:50:43 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 1991-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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF Library.
|
|
||||||
*
|
|
||||||
* Strip-organized Image Support Routines.
|
|
||||||
*/
|
|
||||||
#include "tiffiop.h"
|
|
||||||
|
|
||||||
static uint32
|
|
||||||
summarize(TIFF* tif, size_t summand1, size_t summand2, const char* where)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* XXX: We are using casting to uint32 here, bacause sizeof(size_t)
|
|
||||||
* may be larger than sizeof(uint32) on 64-bit architectures.
|
|
||||||
*/
|
|
||||||
uint32 bytes = summand1 + summand2;
|
|
||||||
|
|
||||||
if (bytes - summand1 != summand2) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Integer overflow in %s", where);
|
|
||||||
bytes = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (bytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint32
|
|
||||||
multiply(TIFF* tif, size_t nmemb, size_t elem_size, const char* where)
|
|
||||||
{
|
|
||||||
uint32 bytes = nmemb * elem_size;
|
|
||||||
|
|
||||||
if (elem_size && bytes / elem_size != nmemb) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Integer overflow in %s", where);
|
|
||||||
bytes = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (bytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Compute which strip a (row,sample) value is in.
|
|
||||||
*/
|
|
||||||
tstrip_t
|
|
||||||
TIFFComputeStrip(TIFF* tif, uint32 row, tsample_t sample)
|
|
||||||
{
|
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
|
||||||
tstrip_t strip;
|
|
||||||
|
|
||||||
strip = row / td->td_rowsperstrip;
|
|
||||||
if (td->td_planarconfig == PLANARCONFIG_SEPARATE) {
|
|
||||||
if (sample >= td->td_samplesperpixel) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
|
||||||
"%lu: Sample out of range, max %lu",
|
|
||||||
(unsigned long) sample, (unsigned long) td->td_samplesperpixel);
|
|
||||||
return ((tstrip_t) 0);
|
|
||||||
}
|
|
||||||
strip += sample*td->td_stripsperimage;
|
|
||||||
}
|
|
||||||
return (strip);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Compute how many strips are in an image.
|
|
||||||
*/
|
|
||||||
tstrip_t
|
|
||||||
TIFFNumberOfStrips(TIFF* tif)
|
|
||||||
{
|
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
|
||||||
tstrip_t nstrips;
|
|
||||||
|
|
||||||
nstrips = (td->td_rowsperstrip == (uint32) -1 ? 1 :
|
|
||||||
TIFFhowmany(td->td_imagelength, td->td_rowsperstrip));
|
|
||||||
if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
|
|
||||||
nstrips = multiply(tif, nstrips, td->td_samplesperpixel,
|
|
||||||
"TIFFNumberOfStrips");
|
|
||||||
return (nstrips);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Compute the # bytes in a variable height, row-aligned strip.
|
|
||||||
*/
|
|
||||||
tsize_t
|
|
||||||
TIFFVStripSize(TIFF* tif, uint32 nrows)
|
|
||||||
{
|
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
|
||||||
|
|
||||||
if (nrows == (uint32) -1)
|
|
||||||
nrows = td->td_imagelength;
|
|
||||||
if (td->td_planarconfig == PLANARCONFIG_CONTIG &&
|
|
||||||
td->td_photometric == PHOTOMETRIC_YCBCR &&
|
|
||||||
!isUpSampled(tif)) {
|
|
||||||
/*
|
|
||||||
* Packed YCbCr data contain one Cb+Cr for every
|
|
||||||
* HorizontalSampling*VerticalSampling Y values.
|
|
||||||
* Must also roundup width and height when calculating
|
|
||||||
* since images that are not a multiple of the
|
|
||||||
* horizontal/vertical subsampling area include
|
|
||||||
* YCbCr data for the extended image.
|
|
||||||
*/
|
|
||||||
uint16 ycbcrsubsampling[2];
|
|
||||||
tsize_t w, scanline, samplingarea;
|
|
||||||
|
|
||||||
TIFFGetField( tif, TIFFTAG_YCBCRSUBSAMPLING,
|
|
||||||
ycbcrsubsampling + 0,
|
|
||||||
ycbcrsubsampling + 1 );
|
|
||||||
|
|
||||||
samplingarea = ycbcrsubsampling[0]*ycbcrsubsampling[1];
|
|
||||||
if (samplingarea == 0) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
|
||||||
"Invalid YCbCr subsampling");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
w = TIFFroundup(td->td_imagewidth, ycbcrsubsampling[0]);
|
|
||||||
scanline = TIFFhowmany8(multiply(tif, w, td->td_bitspersample,
|
|
||||||
"TIFFVStripSize"));
|
|
||||||
nrows = TIFFroundup(nrows, ycbcrsubsampling[1]);
|
|
||||||
/* NB: don't need TIFFhowmany here 'cuz everything is rounded */
|
|
||||||
scanline = multiply(tif, nrows, scanline, "TIFFVStripSize");
|
|
||||||
return ((tsize_t)
|
|
||||||
summarize(tif, scanline,
|
|
||||||
multiply(tif, 2, scanline / samplingarea,
|
|
||||||
"TIFFVStripSize"), "TIFFVStripSize"));
|
|
||||||
} else
|
|
||||||
return ((tsize_t) multiply(tif, nrows, TIFFScanlineSize(tif),
|
|
||||||
"TIFFVStripSize"));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Compute the # bytes in a raw strip.
|
|
||||||
*/
|
|
||||||
tsize_t
|
|
||||||
TIFFRawStripSize(TIFF* tif, tstrip_t strip)
|
|
||||||
{
|
|
||||||
TIFFDirectory* td = &tif->tif_dir;
|
|
||||||
tsize_t bytecount = td->td_stripbytecount[strip];
|
|
||||||
|
|
||||||
if (bytecount <= 0) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
|
||||||
"%lu: Invalid strip byte count, strip %lu",
|
|
||||||
(unsigned long) bytecount, (unsigned long) strip);
|
|
||||||
bytecount = (tsize_t) -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return bytecount;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Compute the # bytes in a (row-aligned) strip.
|
|
||||||
*
|
|
||||||
* Note that if RowsPerStrip is larger than the
|
|
||||||
* recorded ImageLength, then the strip size is
|
|
||||||
* truncated to reflect the actual space required
|
|
||||||
* to hold the strip.
|
|
||||||
*/
|
|
||||||
tsize_t
|
|
||||||
TIFFStripSize(TIFF* tif)
|
|
||||||
{
|
|
||||||
TIFFDirectory* td = &tif->tif_dir;
|
|
||||||
uint32 rps = td->td_rowsperstrip;
|
|
||||||
if (rps > td->td_imagelength)
|
|
||||||
rps = td->td_imagelength;
|
|
||||||
return (TIFFVStripSize(tif, rps));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Compute a default strip size based on the image
|
|
||||||
* characteristics and a requested value. If the
|
|
||||||
* request is <1 then we choose a strip size according
|
|
||||||
* to certain heuristics.
|
|
||||||
*/
|
|
||||||
uint32
|
|
||||||
TIFFDefaultStripSize(TIFF* tif, uint32 request)
|
|
||||||
{
|
|
||||||
return (*tif->tif_defstripsize)(tif, request);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32
|
|
||||||
_TIFFDefaultStripSize(TIFF* tif, uint32 s)
|
|
||||||
{
|
|
||||||
if ((int32) s < 1) {
|
|
||||||
/*
|
|
||||||
* If RowsPerStrip is unspecified, try to break the
|
|
||||||
* image up into strips that are approximately
|
|
||||||
* STRIP_SIZE_DEFAULT bytes long.
|
|
||||||
*/
|
|
||||||
tsize_t scanline = TIFFScanlineSize(tif);
|
|
||||||
s = (uint32)STRIP_SIZE_DEFAULT / (scanline == 0 ? 1 : scanline);
|
|
||||||
if (s == 0) /* very wide images */
|
|
||||||
s = 1;
|
|
||||||
}
|
|
||||||
return (s);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return the number of bytes to read/write in a call to
|
|
||||||
* one of the scanline-oriented i/o routines. Note that
|
|
||||||
* this number may be 1/samples-per-pixel if data is
|
|
||||||
* stored as separate planes.
|
|
||||||
*/
|
|
||||||
tsize_t
|
|
||||||
TIFFScanlineSize(TIFF* tif)
|
|
||||||
{
|
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
|
||||||
tsize_t scanline;
|
|
||||||
|
|
||||||
if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
|
|
||||||
if (td->td_photometric == PHOTOMETRIC_YCBCR
|
|
||||||
&& !isUpSampled(tif)) {
|
|
||||||
uint16 ycbcrsubsampling[2];
|
|
||||||
|
|
||||||
TIFFGetField(tif, TIFFTAG_YCBCRSUBSAMPLING,
|
|
||||||
ycbcrsubsampling + 0,
|
|
||||||
ycbcrsubsampling + 1);
|
|
||||||
|
|
||||||
if (ycbcrsubsampling[0] == 0) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
|
||||||
"Invalid YCbCr subsampling");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
scanline = TIFFroundup(td->td_imagewidth,
|
|
||||||
ycbcrsubsampling[0]);
|
|
||||||
scanline = TIFFhowmany8(multiply(tif, scanline,
|
|
||||||
td->td_bitspersample,
|
|
||||||
"TIFFScanlineSize"));
|
|
||||||
return ((tsize_t)
|
|
||||||
summarize(tif, scanline,
|
|
||||||
multiply(tif, 2,
|
|
||||||
scanline / ycbcrsubsampling[0],
|
|
||||||
"TIFFVStripSize"),
|
|
||||||
"TIFFVStripSize"));
|
|
||||||
} else {
|
|
||||||
scanline = multiply(tif, td->td_imagewidth,
|
|
||||||
td->td_samplesperpixel,
|
|
||||||
"TIFFScanlineSize");
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
scanline = td->td_imagewidth;
|
|
||||||
return ((tsize_t) TIFFhowmany8(multiply(tif, scanline,
|
|
||||||
td->td_bitspersample,
|
|
||||||
"TIFFScanlineSize")));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Some stuff depends on this older version of TIFFScanlineSize
|
|
||||||
* TODO: resolve this
|
|
||||||
*/
|
|
||||||
tsize_t
|
|
||||||
TIFFOldScanlineSize(TIFF* tif)
|
|
||||||
{
|
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
|
||||||
tsize_t scanline;
|
|
||||||
|
|
||||||
scanline = multiply (tif, td->td_bitspersample, td->td_imagewidth,
|
|
||||||
"TIFFScanlineSize");
|
|
||||||
if (td->td_planarconfig == PLANARCONFIG_CONTIG)
|
|
||||||
scanline = multiply (tif, scanline, td->td_samplesperpixel,
|
|
||||||
"TIFFScanlineSize");
|
|
||||||
return ((tsize_t) TIFFhowmany8(scanline));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return the number of bytes to read/write in a call to
|
|
||||||
* one of the scanline-oriented i/o routines. Note that
|
|
||||||
* this number may be 1/samples-per-pixel if data is
|
|
||||||
* stored as separate planes.
|
|
||||||
* The ScanlineSize in case of YCbCrSubsampling is defined as the
|
|
||||||
* strip size divided by the strip height, i.e. the size of a pack of vertical
|
|
||||||
* subsampling lines divided by vertical subsampling. It should thus make
|
|
||||||
* sense when multiplied by a multiple of vertical subsampling.
|
|
||||||
* Some stuff depends on this newer version of TIFFScanlineSize
|
|
||||||
* TODO: resolve this
|
|
||||||
*/
|
|
||||||
tsize_t
|
|
||||||
TIFFNewScanlineSize(TIFF* tif)
|
|
||||||
{
|
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
|
||||||
tsize_t scanline;
|
|
||||||
|
|
||||||
if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
|
|
||||||
if (td->td_photometric == PHOTOMETRIC_YCBCR
|
|
||||||
&& !isUpSampled(tif)) {
|
|
||||||
uint16 ycbcrsubsampling[2];
|
|
||||||
|
|
||||||
TIFFGetField(tif, TIFFTAG_YCBCRSUBSAMPLING,
|
|
||||||
ycbcrsubsampling + 0,
|
|
||||||
ycbcrsubsampling + 1);
|
|
||||||
|
|
||||||
if (ycbcrsubsampling[0]*ycbcrsubsampling[1] == 0) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
|
||||||
"Invalid YCbCr subsampling");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return((tsize_t) ((((td->td_imagewidth+ycbcrsubsampling[0]-1)
|
|
||||||
/ycbcrsubsampling[0])
|
|
||||||
*(ycbcrsubsampling[0]*ycbcrsubsampling[1]+2)
|
|
||||||
*td->td_bitspersample+7)
|
|
||||||
/8)/ycbcrsubsampling[1]);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
scanline = multiply(tif, td->td_imagewidth,
|
|
||||||
td->td_samplesperpixel,
|
|
||||||
"TIFFScanlineSize");
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
scanline = td->td_imagewidth;
|
|
||||||
return ((tsize_t) TIFFhowmany8(multiply(tif, scanline,
|
|
||||||
td->td_bitspersample,
|
|
||||||
"TIFFScanlineSize")));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return the number of bytes required to store a complete
|
|
||||||
* decoded and packed raster scanline (as opposed to the
|
|
||||||
* I/O size returned by TIFFScanlineSize which may be less
|
|
||||||
* if data is store as separate planes).
|
|
||||||
*/
|
|
||||||
tsize_t
|
|
||||||
TIFFRasterScanlineSize(TIFF* tif)
|
|
||||||
{
|
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
|
||||||
tsize_t scanline;
|
|
||||||
|
|
||||||
scanline = multiply (tif, td->td_bitspersample, td->td_imagewidth,
|
|
||||||
"TIFFRasterScanlineSize");
|
|
||||||
if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
|
|
||||||
scanline = multiply (tif, scanline, td->td_samplesperpixel,
|
|
||||||
"TIFFRasterScanlineSize");
|
|
||||||
return ((tsize_t) TIFFhowmany8(scanline));
|
|
||||||
} else
|
|
||||||
return ((tsize_t) multiply (tif, TIFFhowmany8(scanline),
|
|
||||||
td->td_samplesperpixel,
|
|
||||||
"TIFFRasterScanlineSize"));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
@@ -1,242 +0,0 @@
|
|||||||
/* $Id: tif_swab.c,v 1.4.2.1 2010-06-08 18:50:43 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF Library Bit & Byte Swapping Support.
|
|
||||||
*
|
|
||||||
* XXX We assume short = 16-bits and long = 32-bits XXX
|
|
||||||
*/
|
|
||||||
#include "tiffiop.h"
|
|
||||||
|
|
||||||
#ifndef TIFFSwabShort
|
|
||||||
void
|
|
||||||
TIFFSwabShort(uint16* wp)
|
|
||||||
{
|
|
||||||
register unsigned char* cp = (unsigned char*) wp;
|
|
||||||
unsigned char t;
|
|
||||||
|
|
||||||
t = cp[1]; cp[1] = cp[0]; cp[0] = t;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef TIFFSwabLong
|
|
||||||
void
|
|
||||||
TIFFSwabLong(uint32* lp)
|
|
||||||
{
|
|
||||||
register unsigned char* cp = (unsigned char*) lp;
|
|
||||||
unsigned char t;
|
|
||||||
|
|
||||||
t = cp[3]; cp[3] = cp[0]; cp[0] = t;
|
|
||||||
t = cp[2]; cp[2] = cp[1]; cp[1] = t;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef TIFFSwabArrayOfShort
|
|
||||||
void
|
|
||||||
TIFFSwabArrayOfShort(uint16* wp, register unsigned long n)
|
|
||||||
{
|
|
||||||
register unsigned char* cp;
|
|
||||||
register unsigned char t;
|
|
||||||
|
|
||||||
/* XXX unroll loop some */
|
|
||||||
while (n-- > 0) {
|
|
||||||
cp = (unsigned char*) wp;
|
|
||||||
t = cp[1]; cp[1] = cp[0]; cp[0] = t;
|
|
||||||
wp++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef TIFFSwabArrayOfTriples
|
|
||||||
void
|
|
||||||
TIFFSwabArrayOfTriples(uint8* tp, unsigned long n)
|
|
||||||
{
|
|
||||||
unsigned char* cp;
|
|
||||||
unsigned char t;
|
|
||||||
|
|
||||||
/* XXX unroll loop some */
|
|
||||||
while (n-- > 0) {
|
|
||||||
cp = (unsigned char*) tp;
|
|
||||||
t = cp[2]; cp[2] = cp[0]; cp[0] = t;
|
|
||||||
tp += 3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef TIFFSwabArrayOfLong
|
|
||||||
void
|
|
||||||
TIFFSwabArrayOfLong(register uint32* lp, register unsigned long n)
|
|
||||||
{
|
|
||||||
register unsigned char *cp;
|
|
||||||
register unsigned char t;
|
|
||||||
|
|
||||||
/* XXX unroll loop some */
|
|
||||||
while (n-- > 0) {
|
|
||||||
cp = (unsigned char *)lp;
|
|
||||||
t = cp[3]; cp[3] = cp[0]; cp[0] = t;
|
|
||||||
t = cp[2]; cp[2] = cp[1]; cp[1] = t;
|
|
||||||
lp++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef TIFFSwabDouble
|
|
||||||
void
|
|
||||||
TIFFSwabDouble(double *dp)
|
|
||||||
{
|
|
||||||
register uint32* lp = (uint32*) dp;
|
|
||||||
uint32 t;
|
|
||||||
|
|
||||||
TIFFSwabArrayOfLong(lp, 2);
|
|
||||||
t = lp[0]; lp[0] = lp[1]; lp[1] = t;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef TIFFSwabArrayOfDouble
|
|
||||||
void
|
|
||||||
TIFFSwabArrayOfDouble(double* dp, register unsigned long n)
|
|
||||||
{
|
|
||||||
register uint32* lp = (uint32*) dp;
|
|
||||||
register uint32 t;
|
|
||||||
|
|
||||||
TIFFSwabArrayOfLong(lp, n + n);
|
|
||||||
while (n-- > 0) {
|
|
||||||
t = lp[0]; lp[0] = lp[1]; lp[1] = t;
|
|
||||||
lp += 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Bit reversal tables. TIFFBitRevTable[<byte>] gives
|
|
||||||
* the bit reversed value of <byte>. Used in various
|
|
||||||
* places in the library when the FillOrder requires
|
|
||||||
* bit reversal of byte values (e.g. CCITT Fax 3
|
|
||||||
* encoding/decoding). TIFFNoBitRevTable is provided
|
|
||||||
* for algorithms that want an equivalent table that
|
|
||||||
* do not reverse bit values.
|
|
||||||
*/
|
|
||||||
static const unsigned char TIFFBitRevTable[256] = {
|
|
||||||
0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
|
|
||||||
0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
|
|
||||||
0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
|
|
||||||
0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
|
|
||||||
0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
|
|
||||||
0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
|
|
||||||
0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
|
|
||||||
0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
|
|
||||||
0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
|
|
||||||
0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
|
|
||||||
0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
|
|
||||||
0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
|
|
||||||
0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
|
|
||||||
0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
|
|
||||||
0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
|
|
||||||
0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
|
|
||||||
0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
|
|
||||||
0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
|
|
||||||
0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
|
|
||||||
0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
|
|
||||||
0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
|
|
||||||
0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
|
|
||||||
0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
|
|
||||||
0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
|
|
||||||
0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
|
|
||||||
0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
|
|
||||||
0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
|
|
||||||
0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
|
|
||||||
0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
|
|
||||||
0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
|
|
||||||
0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
|
|
||||||
0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
|
|
||||||
};
|
|
||||||
static const unsigned char TIFFNoBitRevTable[256] = {
|
|
||||||
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
|
||||||
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
|
|
||||||
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
|
|
||||||
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
|
|
||||||
0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
|
|
||||||
0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
|
|
||||||
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
|
|
||||||
0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
|
|
||||||
0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
|
|
||||||
0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
|
|
||||||
0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
|
|
||||||
0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
|
|
||||||
0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
|
|
||||||
0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
|
|
||||||
0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
|
|
||||||
0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
|
|
||||||
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
|
|
||||||
0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
|
|
||||||
0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
|
|
||||||
0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
|
|
||||||
0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
|
|
||||||
0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
|
|
||||||
0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
|
|
||||||
0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
|
|
||||||
0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
|
|
||||||
0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
|
|
||||||
0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
|
|
||||||
0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
|
|
||||||
0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
|
|
||||||
0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
|
|
||||||
0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
|
|
||||||
0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
|
|
||||||
};
|
|
||||||
|
|
||||||
const unsigned char*
|
|
||||||
TIFFGetBitRevTable(int reversed)
|
|
||||||
{
|
|
||||||
return (reversed ? TIFFBitRevTable : TIFFNoBitRevTable);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
TIFFReverseBits(register unsigned char* cp, register unsigned long n)
|
|
||||||
{
|
|
||||||
for (; n > 8; n -= 8) {
|
|
||||||
cp[0] = TIFFBitRevTable[cp[0]];
|
|
||||||
cp[1] = TIFFBitRevTable[cp[1]];
|
|
||||||
cp[2] = TIFFBitRevTable[cp[2]];
|
|
||||||
cp[3] = TIFFBitRevTable[cp[3]];
|
|
||||||
cp[4] = TIFFBitRevTable[cp[4]];
|
|
||||||
cp[5] = TIFFBitRevTable[cp[5]];
|
|
||||||
cp[6] = TIFFBitRevTable[cp[6]];
|
|
||||||
cp[7] = TIFFBitRevTable[cp[7]];
|
|
||||||
cp += 8;
|
|
||||||
}
|
|
||||||
while (n-- > 0)
|
|
||||||
*cp = TIFFBitRevTable[*cp], cp++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
@@ -1,165 +0,0 @@
|
|||||||
/* $Id: tif_thunder.c,v 1.5.2.1 2010-06-08 18:50:43 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "tiffiop.h"
|
|
||||||
#ifdef THUNDER_SUPPORT
|
|
||||||
/*
|
|
||||||
* TIFF Library.
|
|
||||||
*
|
|
||||||
* ThunderScan 4-bit Compression Algorithm Support
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ThunderScan uses an encoding scheme designed for
|
|
||||||
* 4-bit pixel values. Data is encoded in bytes, with
|
|
||||||
* each byte split into a 2-bit code word and a 6-bit
|
|
||||||
* data value. The encoding gives raw data, runs of
|
|
||||||
* pixels, or pixel values encoded as a delta from the
|
|
||||||
* previous pixel value. For the latter, either 2-bit
|
|
||||||
* or 3-bit delta values are used, with the deltas packed
|
|
||||||
* into a single byte.
|
|
||||||
*/
|
|
||||||
#define THUNDER_DATA 0x3f /* mask for 6-bit data */
|
|
||||||
#define THUNDER_CODE 0xc0 /* mask for 2-bit code word */
|
|
||||||
/* code values */
|
|
||||||
#define THUNDER_RUN 0x00 /* run of pixels w/ encoded count */
|
|
||||||
#define THUNDER_2BITDELTAS 0x40 /* 3 pixels w/ encoded 2-bit deltas */
|
|
||||||
#define DELTA2_SKIP 2 /* skip code for 2-bit deltas */
|
|
||||||
#define THUNDER_3BITDELTAS 0x80 /* 2 pixels w/ encoded 3-bit deltas */
|
|
||||||
#define DELTA3_SKIP 4 /* skip code for 3-bit deltas */
|
|
||||||
#define THUNDER_RAW 0xc0 /* raw data encoded */
|
|
||||||
|
|
||||||
static const int twobitdeltas[4] = { 0, 1, 0, -1 };
|
|
||||||
static const int threebitdeltas[8] = { 0, 1, 2, 3, 0, -3, -2, -1 };
|
|
||||||
|
|
||||||
#define SETPIXEL(op, v) { \
|
|
||||||
lastpixel = (v) & 0xf; \
|
|
||||||
if (npixels++ & 1) \
|
|
||||||
*op++ |= lastpixel; \
|
|
||||||
else \
|
|
||||||
op[0] = (tidataval_t) (lastpixel << 4); \
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
ThunderDecode(TIFF* tif, tidata_t op, tsize_t maxpixels)
|
|
||||||
{
|
|
||||||
register unsigned char *bp;
|
|
||||||
register tsize_t cc;
|
|
||||||
unsigned int lastpixel;
|
|
||||||
tsize_t npixels;
|
|
||||||
|
|
||||||
bp = (unsigned char *)tif->tif_rawcp;
|
|
||||||
cc = tif->tif_rawcc;
|
|
||||||
lastpixel = 0;
|
|
||||||
npixels = 0;
|
|
||||||
while (cc > 0 && npixels < maxpixels) {
|
|
||||||
int n, delta;
|
|
||||||
|
|
||||||
n = *bp++, cc--;
|
|
||||||
switch (n & THUNDER_CODE) {
|
|
||||||
case THUNDER_RUN: /* pixel run */
|
|
||||||
/*
|
|
||||||
* Replicate the last pixel n times,
|
|
||||||
* where n is the lower-order 6 bits.
|
|
||||||
*/
|
|
||||||
if (npixels & 1) {
|
|
||||||
op[0] |= lastpixel;
|
|
||||||
lastpixel = *op++; npixels++; n--;
|
|
||||||
} else
|
|
||||||
lastpixel |= lastpixel << 4;
|
|
||||||
npixels += n;
|
|
||||||
if (npixels < maxpixels) {
|
|
||||||
for (; n > 0; n -= 2)
|
|
||||||
*op++ = (tidataval_t) lastpixel;
|
|
||||||
}
|
|
||||||
if (n == -1)
|
|
||||||
*--op &= 0xf0;
|
|
||||||
lastpixel &= 0xf;
|
|
||||||
break;
|
|
||||||
case THUNDER_2BITDELTAS: /* 2-bit deltas */
|
|
||||||
if ((delta = ((n >> 4) & 3)) != DELTA2_SKIP)
|
|
||||||
SETPIXEL(op, lastpixel + twobitdeltas[delta]);
|
|
||||||
if ((delta = ((n >> 2) & 3)) != DELTA2_SKIP)
|
|
||||||
SETPIXEL(op, lastpixel + twobitdeltas[delta]);
|
|
||||||
if ((delta = (n & 3)) != DELTA2_SKIP)
|
|
||||||
SETPIXEL(op, lastpixel + twobitdeltas[delta]);
|
|
||||||
break;
|
|
||||||
case THUNDER_3BITDELTAS: /* 3-bit deltas */
|
|
||||||
if ((delta = ((n >> 3) & 7)) != DELTA3_SKIP)
|
|
||||||
SETPIXEL(op, lastpixel + threebitdeltas[delta]);
|
|
||||||
if ((delta = (n & 7)) != DELTA3_SKIP)
|
|
||||||
SETPIXEL(op, lastpixel + threebitdeltas[delta]);
|
|
||||||
break;
|
|
||||||
case THUNDER_RAW: /* raw data */
|
|
||||||
SETPIXEL(op, n);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
tif->tif_rawcp = (tidata_t) bp;
|
|
||||||
tif->tif_rawcc = cc;
|
|
||||||
if (npixels != maxpixels) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
|
||||||
"ThunderDecode: %s data at scanline %ld (%lu != %lu)",
|
|
||||||
npixels < maxpixels ? "Not enough" : "Too much",
|
|
||||||
(long) tif->tif_row, (long) npixels, (long) maxpixels);
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
ThunderDecodeRow(TIFF* tif, tidata_t buf, tsize_t occ, tsample_t s)
|
|
||||||
{
|
|
||||||
tidata_t row = buf;
|
|
||||||
|
|
||||||
(void) s;
|
|
||||||
while ((long)occ > 0) {
|
|
||||||
if (!ThunderDecode(tif, row, tif->tif_dir.td_imagewidth))
|
|
||||||
return (0);
|
|
||||||
occ -= tif->tif_scanlinesize;
|
|
||||||
row += tif->tif_scanlinesize;
|
|
||||||
}
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
TIFFInitThunderScan(TIFF* tif, int scheme)
|
|
||||||
{
|
|
||||||
(void) scheme;
|
|
||||||
tif->tif_decoderow = ThunderDecodeRow;
|
|
||||||
tif->tif_decodestrip = ThunderDecodeRow;
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
#endif /* THUNDER_SUPPORT */
|
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
@@ -1,280 +0,0 @@
|
|||||||
/* $Id: tif_tile.c,v 1.12.2.1 2010-06-08 18:50:43 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 1991-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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF Library.
|
|
||||||
*
|
|
||||||
* Tiled Image Support Routines.
|
|
||||||
*/
|
|
||||||
#include "tiffiop.h"
|
|
||||||
|
|
||||||
static uint32
|
|
||||||
summarize(TIFF* tif, size_t summand1, size_t summand2, const char* where)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* XXX: We are using casting to uint32 here, because sizeof(size_t)
|
|
||||||
* may be larger than sizeof(uint32) on 64-bit architectures.
|
|
||||||
*/
|
|
||||||
uint32 bytes = summand1 + summand2;
|
|
||||||
|
|
||||||
if (bytes - summand1 != summand2) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Integer overflow in %s", where);
|
|
||||||
bytes = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (bytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint32
|
|
||||||
multiply(TIFF* tif, size_t nmemb, size_t elem_size, const char* where)
|
|
||||||
{
|
|
||||||
uint32 bytes = nmemb * elem_size;
|
|
||||||
|
|
||||||
if (elem_size && bytes / elem_size != nmemb) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Integer overflow in %s", where);
|
|
||||||
bytes = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (bytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Compute which tile an (x,y,z,s) value is in.
|
|
||||||
*/
|
|
||||||
ttile_t
|
|
||||||
TIFFComputeTile(TIFF* tif, uint32 x, uint32 y, uint32 z, tsample_t s)
|
|
||||||
{
|
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
|
||||||
uint32 dx = td->td_tilewidth;
|
|
||||||
uint32 dy = td->td_tilelength;
|
|
||||||
uint32 dz = td->td_tiledepth;
|
|
||||||
ttile_t tile = 1;
|
|
||||||
|
|
||||||
if (td->td_imagedepth == 1)
|
|
||||||
z = 0;
|
|
||||||
if (dx == (uint32) -1)
|
|
||||||
dx = td->td_imagewidth;
|
|
||||||
if (dy == (uint32) -1)
|
|
||||||
dy = td->td_imagelength;
|
|
||||||
if (dz == (uint32) -1)
|
|
||||||
dz = td->td_imagedepth;
|
|
||||||
if (dx != 0 && dy != 0 && dz != 0) {
|
|
||||||
uint32 xpt = TIFFhowmany(td->td_imagewidth, dx);
|
|
||||||
uint32 ypt = TIFFhowmany(td->td_imagelength, dy);
|
|
||||||
uint32 zpt = TIFFhowmany(td->td_imagedepth, dz);
|
|
||||||
|
|
||||||
if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
|
|
||||||
tile = (xpt*ypt*zpt)*s +
|
|
||||||
(xpt*ypt)*(z/dz) +
|
|
||||||
xpt*(y/dy) +
|
|
||||||
x/dx;
|
|
||||||
else
|
|
||||||
tile = (xpt*ypt)*(z/dz) + xpt*(y/dy) + x/dx;
|
|
||||||
}
|
|
||||||
return (tile);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Check an (x,y,z,s) coordinate
|
|
||||||
* against the image bounds.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
TIFFCheckTile(TIFF* tif, uint32 x, uint32 y, uint32 z, tsample_t s)
|
|
||||||
{
|
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
|
||||||
|
|
||||||
if (x >= td->td_imagewidth) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
|
||||||
"%lu: Col out of range, max %lu",
|
|
||||||
(unsigned long) x,
|
|
||||||
(unsigned long) (td->td_imagewidth - 1));
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
if (y >= td->td_imagelength) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
|
||||||
"%lu: Row out of range, max %lu",
|
|
||||||
(unsigned long) y,
|
|
||||||
(unsigned long) (td->td_imagelength - 1));
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
if (z >= td->td_imagedepth) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
|
||||||
"%lu: Depth out of range, max %lu",
|
|
||||||
(unsigned long) z,
|
|
||||||
(unsigned long) (td->td_imagedepth - 1));
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
if (td->td_planarconfig == PLANARCONFIG_SEPARATE &&
|
|
||||||
s >= td->td_samplesperpixel) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
|
||||||
"%lu: Sample out of range, max %lu",
|
|
||||||
(unsigned long) s,
|
|
||||||
(unsigned long) (td->td_samplesperpixel - 1));
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Compute how many tiles are in an image.
|
|
||||||
*/
|
|
||||||
ttile_t
|
|
||||||
TIFFNumberOfTiles(TIFF* tif)
|
|
||||||
{
|
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
|
||||||
uint32 dx = td->td_tilewidth;
|
|
||||||
uint32 dy = td->td_tilelength;
|
|
||||||
uint32 dz = td->td_tiledepth;
|
|
||||||
ttile_t ntiles;
|
|
||||||
|
|
||||||
if (dx == (uint32) -1)
|
|
||||||
dx = td->td_imagewidth;
|
|
||||||
if (dy == (uint32) -1)
|
|
||||||
dy = td->td_imagelength;
|
|
||||||
if (dz == (uint32) -1)
|
|
||||||
dz = td->td_imagedepth;
|
|
||||||
ntiles = (dx == 0 || dy == 0 || dz == 0) ? 0 :
|
|
||||||
multiply(tif, multiply(tif, TIFFhowmany(td->td_imagewidth, dx),
|
|
||||||
TIFFhowmany(td->td_imagelength, dy),
|
|
||||||
"TIFFNumberOfTiles"),
|
|
||||||
TIFFhowmany(td->td_imagedepth, dz), "TIFFNumberOfTiles");
|
|
||||||
if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
|
|
||||||
ntiles = multiply(tif, ntiles, td->td_samplesperpixel,
|
|
||||||
"TIFFNumberOfTiles");
|
|
||||||
return (ntiles);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Compute the # bytes in each row of a tile.
|
|
||||||
*/
|
|
||||||
tsize_t
|
|
||||||
TIFFTileRowSize(TIFF* tif)
|
|
||||||
{
|
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
|
||||||
tsize_t rowsize;
|
|
||||||
|
|
||||||
if (td->td_tilelength == 0 || td->td_tilewidth == 0)
|
|
||||||
return ((tsize_t) 0);
|
|
||||||
rowsize = multiply(tif, td->td_bitspersample, td->td_tilewidth,
|
|
||||||
"TIFFTileRowSize");
|
|
||||||
if (td->td_planarconfig == PLANARCONFIG_CONTIG)
|
|
||||||
rowsize = multiply(tif, rowsize, td->td_samplesperpixel,
|
|
||||||
"TIFFTileRowSize");
|
|
||||||
return ((tsize_t) TIFFhowmany8(rowsize));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Compute the # bytes in a variable length, row-aligned tile.
|
|
||||||
*/
|
|
||||||
tsize_t
|
|
||||||
TIFFVTileSize(TIFF* tif, uint32 nrows)
|
|
||||||
{
|
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
|
||||||
tsize_t tilesize;
|
|
||||||
|
|
||||||
if (td->td_tilelength == 0 || td->td_tilewidth == 0 ||
|
|
||||||
td->td_tiledepth == 0)
|
|
||||||
return ((tsize_t) 0);
|
|
||||||
if (td->td_planarconfig == PLANARCONFIG_CONTIG &&
|
|
||||||
td->td_photometric == PHOTOMETRIC_YCBCR &&
|
|
||||||
!isUpSampled(tif)) {
|
|
||||||
/*
|
|
||||||
* Packed YCbCr data contain one Cb+Cr for every
|
|
||||||
* HorizontalSampling*VerticalSampling Y values.
|
|
||||||
* Must also roundup width and height when calculating
|
|
||||||
* since images that are not a multiple of the
|
|
||||||
* horizontal/vertical subsampling area include
|
|
||||||
* YCbCr data for the extended image.
|
|
||||||
*/
|
|
||||||
tsize_t w =
|
|
||||||
TIFFroundup(td->td_tilewidth, td->td_ycbcrsubsampling[0]);
|
|
||||||
tsize_t rowsize =
|
|
||||||
TIFFhowmany8(multiply(tif, w, td->td_bitspersample,
|
|
||||||
"TIFFVTileSize"));
|
|
||||||
tsize_t samplingarea =
|
|
||||||
td->td_ycbcrsubsampling[0]*td->td_ycbcrsubsampling[1];
|
|
||||||
if (samplingarea == 0) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Invalid YCbCr subsampling");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
nrows = TIFFroundup(nrows, td->td_ycbcrsubsampling[1]);
|
|
||||||
/* NB: don't need TIFFhowmany here 'cuz everything is rounded */
|
|
||||||
tilesize = multiply(tif, nrows, rowsize, "TIFFVTileSize");
|
|
||||||
tilesize = summarize(tif, tilesize,
|
|
||||||
multiply(tif, 2, tilesize / samplingarea,
|
|
||||||
"TIFFVTileSize"),
|
|
||||||
"TIFFVTileSize");
|
|
||||||
} else
|
|
||||||
tilesize = multiply(tif, nrows, TIFFTileRowSize(tif),
|
|
||||||
"TIFFVTileSize");
|
|
||||||
return ((tsize_t)
|
|
||||||
multiply(tif, tilesize, td->td_tiledepth, "TIFFVTileSize"));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Compute the # bytes in a row-aligned tile.
|
|
||||||
*/
|
|
||||||
tsize_t
|
|
||||||
TIFFTileSize(TIFF* tif)
|
|
||||||
{
|
|
||||||
return (TIFFVTileSize(tif, tif->tif_dir.td_tilelength));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Compute a default tile size based on the image
|
|
||||||
* characteristics and a requested value. If a
|
|
||||||
* request is <1 then we choose a size according
|
|
||||||
* to certain heuristics.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
TIFFDefaultTileSize(TIFF* tif, uint32* tw, uint32* th)
|
|
||||||
{
|
|
||||||
(*tif->tif_deftilesize)(tif, tw, th);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
_TIFFDefaultTileSize(TIFF* tif, uint32* tw, uint32* th)
|
|
||||||
{
|
|
||||||
(void) tif;
|
|
||||||
if (*(int32*) tw < 1)
|
|
||||||
*tw = 256;
|
|
||||||
if (*(int32*) th < 1)
|
|
||||||
*th = 256;
|
|
||||||
/* roundup to a multiple of 16 per the spec */
|
|
||||||
if (*tw & 0xf)
|
|
||||||
*tw = TIFFroundup(*tw, 16);
|
|
||||||
if (*th & 0xf)
|
|
||||||
*th = TIFFroundup(*th, 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
@@ -1,300 +0,0 @@
|
|||||||
/* $Id: tif_unix.c,v 1.12.2.1 2010-06-08 18:50:43 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF Library UNIX-specific Routines. These are should also work with the
|
|
||||||
* Windows Common RunTime Library.
|
|
||||||
*/
|
|
||||||
#include "tif_config.h"
|
|
||||||
|
|
||||||
#ifdef HAVE_SYS_TYPES_H
|
|
||||||
# include <sys/types.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
|
|
||||||
#ifdef HAVE_UNISTD_H
|
|
||||||
# include <unistd.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_FCNTL_H
|
|
||||||
# include <fcntl.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_IO_H
|
|
||||||
# include <io.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "tiffiop.h"
|
|
||||||
|
|
||||||
static tsize_t
|
|
||||||
_tiffReadProc(thandle_t fd, tdata_t buf, tsize_t size)
|
|
||||||
{
|
|
||||||
return ((tsize_t) read((int) fd, buf, (size_t) size));
|
|
||||||
}
|
|
||||||
|
|
||||||
static tsize_t
|
|
||||||
_tiffWriteProc(thandle_t fd, tdata_t buf, tsize_t size)
|
|
||||||
{
|
|
||||||
return ((tsize_t) write((int) fd, buf, (size_t) size));
|
|
||||||
}
|
|
||||||
|
|
||||||
static toff_t
|
|
||||||
_tiffSeekProc(thandle_t fd, toff_t off, int whence)
|
|
||||||
{
|
|
||||||
return ((toff_t) lseek((int) fd, (off_t) off, whence));
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
_tiffCloseProc(thandle_t fd)
|
|
||||||
{
|
|
||||||
return (close((int) fd));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static toff_t
|
|
||||||
_tiffSizeProc(thandle_t fd)
|
|
||||||
{
|
|
||||||
#ifdef _AM29K
|
|
||||||
long fsize;
|
|
||||||
return ((fsize = lseek((int) fd, 0, SEEK_END)) < 0 ? 0 : fsize);
|
|
||||||
#else
|
|
||||||
struct stat sb;
|
|
||||||
return (toff_t) (fstat((int) fd, &sb) < 0 ? 0 : sb.st_size);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HAVE_MMAP
|
|
||||||
#include <sys/mman.h>
|
|
||||||
|
|
||||||
static int
|
|
||||||
_tiffMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize)
|
|
||||||
{
|
|
||||||
toff_t size = _tiffSizeProc(fd);
|
|
||||||
if (size != (toff_t) -1) {
|
|
||||||
*pbase = (tdata_t)
|
|
||||||
mmap(0, size, PROT_READ, MAP_SHARED, (int) fd, 0);
|
|
||||||
if (*pbase != (tdata_t) -1) {
|
|
||||||
*psize = size;
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_tiffUnmapProc(thandle_t fd, tdata_t base, toff_t size)
|
|
||||||
{
|
|
||||||
(void) fd;
|
|
||||||
(void) munmap(base, (off_t) size);
|
|
||||||
}
|
|
||||||
#else /* !HAVE_MMAP */
|
|
||||||
static int
|
|
||||||
_tiffMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize)
|
|
||||||
{
|
|
||||||
(void) fd; (void) pbase; (void) psize;
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_tiffUnmapProc(thandle_t fd, tdata_t base, toff_t size)
|
|
||||||
{
|
|
||||||
(void) fd; (void) base; (void) size;
|
|
||||||
}
|
|
||||||
#endif /* !HAVE_MMAP */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Open a TIFF file descriptor for read/writing.
|
|
||||||
*/
|
|
||||||
TIFF*
|
|
||||||
TIFFFdOpen(int fd, const char* name, const char* mode)
|
|
||||||
{
|
|
||||||
TIFF* tif;
|
|
||||||
|
|
||||||
tif = TIFFClientOpen(name, mode,
|
|
||||||
(thandle_t) fd,
|
|
||||||
_tiffReadProc, _tiffWriteProc,
|
|
||||||
_tiffSeekProc, _tiffCloseProc, _tiffSizeProc,
|
|
||||||
_tiffMapProc, _tiffUnmapProc);
|
|
||||||
if (tif)
|
|
||||||
tif->tif_fd = fd;
|
|
||||||
return (tif);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Open a TIFF file for read/writing.
|
|
||||||
*/
|
|
||||||
TIFF*
|
|
||||||
TIFFOpen(const char* name, const char* mode)
|
|
||||||
{
|
|
||||||
static const char module[] = "TIFFOpen";
|
|
||||||
int m, fd;
|
|
||||||
TIFF* tif;
|
|
||||||
|
|
||||||
m = _TIFFgetMode(mode, module);
|
|
||||||
if (m == -1)
|
|
||||||
return ((TIFF*)0);
|
|
||||||
|
|
||||||
/* for cygwin and mingw */
|
|
||||||
#ifdef O_BINARY
|
|
||||||
m |= O_BINARY;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef _AM29K
|
|
||||||
fd = open(name, m);
|
|
||||||
#else
|
|
||||||
fd = open(name, m, 0666);
|
|
||||||
#endif
|
|
||||||
if (fd < 0) {
|
|
||||||
TIFFErrorExt(0, module, "%s: Cannot open", name);
|
|
||||||
return ((TIFF *)0);
|
|
||||||
}
|
|
||||||
|
|
||||||
tif = TIFFFdOpen((int)fd, name, mode);
|
|
||||||
if(!tif)
|
|
||||||
close(fd);
|
|
||||||
return tif;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef __WIN32__
|
|
||||||
#include <windows.h>
|
|
||||||
/*
|
|
||||||
* Open a TIFF file with a Unicode filename, for read/writing.
|
|
||||||
*/
|
|
||||||
TIFF*
|
|
||||||
TIFFOpenW(const wchar_t* name, const char* mode)
|
|
||||||
{
|
|
||||||
static const char module[] = "TIFFOpenW";
|
|
||||||
int m, fd;
|
|
||||||
int mbsize;
|
|
||||||
char *mbname;
|
|
||||||
TIFF* tif;
|
|
||||||
|
|
||||||
m = _TIFFgetMode(mode, module);
|
|
||||||
if (m == -1)
|
|
||||||
return ((TIFF*)0);
|
|
||||||
|
|
||||||
/* for cygwin and mingw */
|
|
||||||
#ifdef O_BINARY
|
|
||||||
m |= O_BINARY;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
fd = _wopen(name, m, 0666);
|
|
||||||
if (fd < 0) {
|
|
||||||
TIFFErrorExt(0, module, "%s: Cannot open", name);
|
|
||||||
return ((TIFF *)0);
|
|
||||||
}
|
|
||||||
|
|
||||||
mbname = NULL;
|
|
||||||
mbsize = WideCharToMultiByte(CP_ACP, 0, name, -1, NULL, 0, NULL, NULL);
|
|
||||||
if (mbsize > 0) {
|
|
||||||
mbname = _TIFFmalloc(mbsize);
|
|
||||||
if (!mbname) {
|
|
||||||
TIFFErrorExt(0, module,
|
|
||||||
"Can't allocate space for filename conversion buffer");
|
|
||||||
return ((TIFF*)0);
|
|
||||||
}
|
|
||||||
|
|
||||||
WideCharToMultiByte(CP_ACP, 0, name, -1, mbname, mbsize,
|
|
||||||
NULL, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
tif = TIFFFdOpen((int)fd, (mbname != NULL) ? mbname : "<unknown>",
|
|
||||||
mode);
|
|
||||||
|
|
||||||
_TIFFfree(mbname);
|
|
||||||
|
|
||||||
if(!tif)
|
|
||||||
close(fd);
|
|
||||||
return tif;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void*
|
|
||||||
_TIFFmalloc(tsize_t s)
|
|
||||||
{
|
|
||||||
return (malloc((size_t) s));
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
_TIFFfree(tdata_t p)
|
|
||||||
{
|
|
||||||
free(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
void*
|
|
||||||
_TIFFrealloc(tdata_t p, tsize_t s)
|
|
||||||
{
|
|
||||||
return (realloc(p, (size_t) s));
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
_TIFFmemset(tdata_t p, int v, tsize_t c)
|
|
||||||
{
|
|
||||||
memset(p, v, (size_t) c);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
_TIFFmemcpy(tdata_t d, const tdata_t s, tsize_t c)
|
|
||||||
{
|
|
||||||
memcpy(d, s, (size_t) c);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
_TIFFmemcmp(const tdata_t p1, const tdata_t p2, tsize_t c)
|
|
||||||
{
|
|
||||||
return (memcmp(p1, p2, (size_t) c));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
unixWarningHandler(const char* module, const char* fmt, va_list ap)
|
|
||||||
{
|
|
||||||
if (module != NULL)
|
|
||||||
fprintf(stderr, "%s: ", module);
|
|
||||||
fprintf(stderr, "Warning, ");
|
|
||||||
vfprintf(stderr, fmt, ap);
|
|
||||||
fprintf(stderr, ".\n");
|
|
||||||
}
|
|
||||||
TIFFErrorHandler _TIFFwarningHandler = unixWarningHandler;
|
|
||||||
|
|
||||||
static void
|
|
||||||
unixErrorHandler(const char* module, const char* fmt, va_list ap)
|
|
||||||
{
|
|
||||||
if (module != NULL)
|
|
||||||
fprintf(stderr, "%s: ", module);
|
|
||||||
vfprintf(stderr, fmt, ap);
|
|
||||||
fprintf(stderr, ".\n");
|
|
||||||
}
|
|
||||||
TIFFErrorHandler _TIFFerrorHandler = unixErrorHandler;
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_version.c,v 1.2.2.1 2010-06-08 18:50:43 bfriesen Exp $ */
|
|
||||||
/*
|
|
||||||
* Copyright (c) 1992-1997 Sam Leffler
|
|
||||||
* Copyright (c) 1992-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.
|
|
||||||
*/
|
|
||||||
#include "tiffiop.h"
|
|
||||||
|
|
||||||
static const char TIFFVersion[] = TIFFLIB_VERSION_STR;
|
|
||||||
|
|
||||||
const char*
|
|
||||||
TIFFGetVersion(void)
|
|
||||||
{
|
|
||||||
return (TIFFVersion);
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
@@ -1,81 +0,0 @@
|
|||||||
/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_warning.c,v 1.2.2.1 2010-06-08 18:50:43 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF Library.
|
|
||||||
*/
|
|
||||||
#include "tiffiop.h"
|
|
||||||
|
|
||||||
TIFFErrorHandlerExt _TIFFwarningHandlerExt = NULL;
|
|
||||||
|
|
||||||
TIFFErrorHandler
|
|
||||||
TIFFSetWarningHandler(TIFFErrorHandler handler)
|
|
||||||
{
|
|
||||||
TIFFErrorHandler prev = _TIFFwarningHandler;
|
|
||||||
_TIFFwarningHandler = handler;
|
|
||||||
return (prev);
|
|
||||||
}
|
|
||||||
|
|
||||||
TIFFErrorHandlerExt
|
|
||||||
TIFFSetWarningHandlerExt(TIFFErrorHandlerExt handler)
|
|
||||||
{
|
|
||||||
TIFFErrorHandlerExt prev = _TIFFwarningHandlerExt;
|
|
||||||
_TIFFwarningHandlerExt = handler;
|
|
||||||
return (prev);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
TIFFWarning(const char* module, const char* fmt, ...)
|
|
||||||
{
|
|
||||||
va_list ap;
|
|
||||||
va_start(ap, fmt);
|
|
||||||
if (_TIFFwarningHandler)
|
|
||||||
(*_TIFFwarningHandler)(module, fmt, ap);
|
|
||||||
if (_TIFFwarningHandlerExt)
|
|
||||||
(*_TIFFwarningHandlerExt)(0, module, fmt, ap);
|
|
||||||
va_end(ap);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
TIFFWarningExt(thandle_t fd, const char* module, const char* fmt, ...)
|
|
||||||
{
|
|
||||||
va_list ap;
|
|
||||||
va_start(ap, fmt);
|
|
||||||
if (_TIFFwarningHandler)
|
|
||||||
(*_TIFFwarningHandler)(module, fmt, ap);
|
|
||||||
if (_TIFFwarningHandlerExt)
|
|
||||||
(*_TIFFwarningHandlerExt)(fd, module, fmt, ap);
|
|
||||||
va_end(ap);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
@@ -1,718 +0,0 @@
|
|||||||
/* $Id: tif_write.c,v 1.22.2.5 2010-06-08 18:50:43 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF Library.
|
|
||||||
*
|
|
||||||
* Scanline-oriented Write Support
|
|
||||||
*/
|
|
||||||
#include "tiffiop.h"
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#define STRIPINCR 20 /* expansion factor on strip array */
|
|
||||||
|
|
||||||
#define WRITECHECKSTRIPS(tif, module) \
|
|
||||||
(((tif)->tif_flags&TIFF_BEENWRITING) || TIFFWriteCheck((tif),0,module))
|
|
||||||
#define WRITECHECKTILES(tif, module) \
|
|
||||||
(((tif)->tif_flags&TIFF_BEENWRITING) || TIFFWriteCheck((tif),1,module))
|
|
||||||
#define BUFFERCHECK(tif) \
|
|
||||||
((((tif)->tif_flags & TIFF_BUFFERSETUP) && tif->tif_rawdata) || \
|
|
||||||
TIFFWriteBufferSetup((tif), NULL, (tsize_t) -1))
|
|
||||||
|
|
||||||
static int TIFFGrowStrips(TIFF*, int, const char*);
|
|
||||||
static int TIFFAppendToStrip(TIFF*, tstrip_t, tidata_t, tsize_t);
|
|
||||||
|
|
||||||
int
|
|
||||||
TIFFWriteScanline(TIFF* tif, tdata_t buf, uint32 row, tsample_t sample)
|
|
||||||
{
|
|
||||||
static const char module[] = "TIFFWriteScanline";
|
|
||||||
register TIFFDirectory *td;
|
|
||||||
int status, imagegrew = 0;
|
|
||||||
tstrip_t strip;
|
|
||||||
|
|
||||||
if (!WRITECHECKSTRIPS(tif, module))
|
|
||||||
return (-1);
|
|
||||||
/*
|
|
||||||
* Handle delayed allocation of data buffer. This
|
|
||||||
* permits it to be sized more intelligently (using
|
|
||||||
* directory information).
|
|
||||||
*/
|
|
||||||
if (!BUFFERCHECK(tif))
|
|
||||||
return (-1);
|
|
||||||
td = &tif->tif_dir;
|
|
||||||
/*
|
|
||||||
* Extend image length if needed
|
|
||||||
* (but only for PlanarConfig=1).
|
|
||||||
*/
|
|
||||||
if (row >= td->td_imagelength) { /* extend image */
|
|
||||||
if (td->td_planarconfig == PLANARCONFIG_SEPARATE) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
|
||||||
"Can not change \"ImageLength\" when using separate planes");
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
td->td_imagelength = row+1;
|
|
||||||
imagegrew = 1;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Calculate strip and check for crossings.
|
|
||||||
*/
|
|
||||||
if (td->td_planarconfig == PLANARCONFIG_SEPARATE) {
|
|
||||||
if (sample >= td->td_samplesperpixel) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
|
||||||
"%d: Sample out of range, max %d",
|
|
||||||
sample, td->td_samplesperpixel);
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
strip = sample*td->td_stripsperimage + row/td->td_rowsperstrip;
|
|
||||||
} else
|
|
||||||
strip = row / td->td_rowsperstrip;
|
|
||||||
/*
|
|
||||||
* Check strip array to make sure there's space. We don't support
|
|
||||||
* dynamically growing files that have data organized in separate
|
|
||||||
* bitplanes because it's too painful. In that case we require that
|
|
||||||
* the imagelength be set properly before the first write (so that the
|
|
||||||
* strips array will be fully allocated above).
|
|
||||||
*/
|
|
||||||
if (strip >= td->td_nstrips && !TIFFGrowStrips(tif, 1, module))
|
|
||||||
return (-1);
|
|
||||||
if (strip != tif->tif_curstrip) {
|
|
||||||
/*
|
|
||||||
* Changing strips -- flush any data present.
|
|
||||||
*/
|
|
||||||
if (!TIFFFlushData(tif))
|
|
||||||
return (-1);
|
|
||||||
tif->tif_curstrip = strip;
|
|
||||||
/*
|
|
||||||
* Watch out for a growing image. The value of strips/image
|
|
||||||
* will initially be 1 (since it can't be deduced until the
|
|
||||||
* imagelength is known).
|
|
||||||
*/
|
|
||||||
if (strip >= td->td_stripsperimage && imagegrew)
|
|
||||||
td->td_stripsperimage =
|
|
||||||
TIFFhowmany(td->td_imagelength,td->td_rowsperstrip);
|
|
||||||
tif->tif_row =
|
|
||||||
(strip % td->td_stripsperimage) * td->td_rowsperstrip;
|
|
||||||
if ((tif->tif_flags & TIFF_CODERSETUP) == 0) {
|
|
||||||
if (!(*tif->tif_setupencode)(tif))
|
|
||||||
return (-1);
|
|
||||||
tif->tif_flags |= TIFF_CODERSETUP;
|
|
||||||
}
|
|
||||||
|
|
||||||
tif->tif_rawcc = 0;
|
|
||||||
tif->tif_rawcp = tif->tif_rawdata;
|
|
||||||
|
|
||||||
if( td->td_stripbytecount[strip] > 0 )
|
|
||||||
{
|
|
||||||
/* if we are writing over existing tiles, zero length */
|
|
||||||
td->td_stripbytecount[strip] = 0;
|
|
||||||
|
|
||||||
/* this forces TIFFAppendToStrip() to do a seek */
|
|
||||||
tif->tif_curoff = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(*tif->tif_preencode)(tif, sample))
|
|
||||||
return (-1);
|
|
||||||
tif->tif_flags |= TIFF_POSTENCODE;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Ensure the write is either sequential or at the
|
|
||||||
* beginning of a strip (or that we can randomly
|
|
||||||
* access the data -- i.e. no encoding).
|
|
||||||
*/
|
|
||||||
if (row != tif->tif_row) {
|
|
||||||
if (row < tif->tif_row) {
|
|
||||||
/*
|
|
||||||
* Moving backwards within the same strip:
|
|
||||||
* backup to the start and then decode
|
|
||||||
* forward (below).
|
|
||||||
*/
|
|
||||||
tif->tif_row = (strip % td->td_stripsperimage) *
|
|
||||||
td->td_rowsperstrip;
|
|
||||||
tif->tif_rawcp = tif->tif_rawdata;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Seek forward to the desired row.
|
|
||||||
*/
|
|
||||||
if (!(*tif->tif_seek)(tif, row - tif->tif_row))
|
|
||||||
return (-1);
|
|
||||||
tif->tif_row = row;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* swab if needed - note that source buffer will be altered */
|
|
||||||
tif->tif_postdecode( tif, (tidata_t) buf, tif->tif_scanlinesize );
|
|
||||||
|
|
||||||
status = (*tif->tif_encoderow)(tif, (tidata_t) buf,
|
|
||||||
tif->tif_scanlinesize, sample);
|
|
||||||
|
|
||||||
/* we are now poised at the beginning of the next row */
|
|
||||||
tif->tif_row = row + 1;
|
|
||||||
return (status);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Encode the supplied data and write it to the
|
|
||||||
* specified strip.
|
|
||||||
*
|
|
||||||
* NB: Image length must be setup before writing.
|
|
||||||
*/
|
|
||||||
tsize_t
|
|
||||||
TIFFWriteEncodedStrip(TIFF* tif, tstrip_t strip, tdata_t data, tsize_t cc)
|
|
||||||
{
|
|
||||||
static const char module[] = "TIFFWriteEncodedStrip";
|
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
|
||||||
tsample_t sample;
|
|
||||||
|
|
||||||
if (!WRITECHECKSTRIPS(tif, module))
|
|
||||||
return ((tsize_t) -1);
|
|
||||||
/*
|
|
||||||
* Check strip array to make sure there's space.
|
|
||||||
* We don't support dynamically growing files that
|
|
||||||
* have data organized in separate bitplanes because
|
|
||||||
* it's too painful. In that case we require that
|
|
||||||
* the imagelength be set properly before the first
|
|
||||||
* write (so that the strips array will be fully
|
|
||||||
* allocated above).
|
|
||||||
*/
|
|
||||||
if (strip >= td->td_nstrips) {
|
|
||||||
if (td->td_planarconfig == PLANARCONFIG_SEPARATE) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
|
||||||
"Can not grow image by strips when using separate planes");
|
|
||||||
return ((tsize_t) -1);
|
|
||||||
}
|
|
||||||
if (!TIFFGrowStrips(tif, 1, module))
|
|
||||||
return ((tsize_t) -1);
|
|
||||||
td->td_stripsperimage =
|
|
||||||
TIFFhowmany(td->td_imagelength, td->td_rowsperstrip);
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Handle delayed allocation of data buffer. This
|
|
||||||
* permits it to be sized according to the directory
|
|
||||||
* info.
|
|
||||||
*/
|
|
||||||
if (!BUFFERCHECK(tif))
|
|
||||||
return ((tsize_t) -1);
|
|
||||||
tif->tif_curstrip = strip;
|
|
||||||
tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip;
|
|
||||||
if ((tif->tif_flags & TIFF_CODERSETUP) == 0) {
|
|
||||||
if (!(*tif->tif_setupencode)(tif))
|
|
||||||
return ((tsize_t) -1);
|
|
||||||
tif->tif_flags |= TIFF_CODERSETUP;
|
|
||||||
}
|
|
||||||
|
|
||||||
tif->tif_rawcc = 0;
|
|
||||||
tif->tif_rawcp = tif->tif_rawdata;
|
|
||||||
|
|
||||||
if( td->td_stripbytecount[strip] > 0 )
|
|
||||||
{
|
|
||||||
/* Force TIFFAppendToStrip() to consider placing data at end
|
|
||||||
of file. */
|
|
||||||
tif->tif_curoff = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
tif->tif_flags &= ~TIFF_POSTENCODE;
|
|
||||||
sample = (tsample_t)(strip / td->td_stripsperimage);
|
|
||||||
if (!(*tif->tif_preencode)(tif, sample))
|
|
||||||
return ((tsize_t) -1);
|
|
||||||
|
|
||||||
/* swab if needed - note that source buffer will be altered */
|
|
||||||
tif->tif_postdecode( tif, (tidata_t) data, cc );
|
|
||||||
|
|
||||||
if (!(*tif->tif_encodestrip)(tif, (tidata_t) data, cc, sample))
|
|
||||||
return ((tsize_t) 0);
|
|
||||||
if (!(*tif->tif_postencode)(tif))
|
|
||||||
return ((tsize_t) -1);
|
|
||||||
if (!isFillOrder(tif, td->td_fillorder) &&
|
|
||||||
(tif->tif_flags & TIFF_NOBITREV) == 0)
|
|
||||||
TIFFReverseBits(tif->tif_rawdata, tif->tif_rawcc);
|
|
||||||
if (tif->tif_rawcc > 0 &&
|
|
||||||
!TIFFAppendToStrip(tif, strip, tif->tif_rawdata, tif->tif_rawcc))
|
|
||||||
return ((tsize_t) -1);
|
|
||||||
tif->tif_rawcc = 0;
|
|
||||||
tif->tif_rawcp = tif->tif_rawdata;
|
|
||||||
return (cc);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Write the supplied data to the specified strip.
|
|
||||||
*
|
|
||||||
* NB: Image length must be setup before writing.
|
|
||||||
*/
|
|
||||||
tsize_t
|
|
||||||
TIFFWriteRawStrip(TIFF* tif, tstrip_t strip, tdata_t data, tsize_t cc)
|
|
||||||
{
|
|
||||||
static const char module[] = "TIFFWriteRawStrip";
|
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
|
||||||
|
|
||||||
if (!WRITECHECKSTRIPS(tif, module))
|
|
||||||
return ((tsize_t) -1);
|
|
||||||
/*
|
|
||||||
* Check strip array to make sure there's space.
|
|
||||||
* We don't support dynamically growing files that
|
|
||||||
* have data organized in separate bitplanes because
|
|
||||||
* it's too painful. In that case we require that
|
|
||||||
* the imagelength be set properly before the first
|
|
||||||
* write (so that the strips array will be fully
|
|
||||||
* allocated above).
|
|
||||||
*/
|
|
||||||
if (strip >= td->td_nstrips) {
|
|
||||||
if (td->td_planarconfig == PLANARCONFIG_SEPARATE) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
|
||||||
"Can not grow image by strips when using separate planes");
|
|
||||||
return ((tsize_t) -1);
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Watch out for a growing image. The value of
|
|
||||||
* strips/image will initially be 1 (since it
|
|
||||||
* can't be deduced until the imagelength is known).
|
|
||||||
*/
|
|
||||||
if (strip >= td->td_stripsperimage)
|
|
||||||
td->td_stripsperimage =
|
|
||||||
TIFFhowmany(td->td_imagelength,td->td_rowsperstrip);
|
|
||||||
if (!TIFFGrowStrips(tif, 1, module))
|
|
||||||
return ((tsize_t) -1);
|
|
||||||
}
|
|
||||||
tif->tif_curstrip = strip;
|
|
||||||
tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip;
|
|
||||||
return (TIFFAppendToStrip(tif, strip, (tidata_t) data, cc) ?
|
|
||||||
cc : (tsize_t) -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Write and compress a tile of data. The
|
|
||||||
* tile is selected by the (x,y,z,s) coordinates.
|
|
||||||
*/
|
|
||||||
tsize_t
|
|
||||||
TIFFWriteTile(TIFF* tif,
|
|
||||||
tdata_t buf, uint32 x, uint32 y, uint32 z, tsample_t s)
|
|
||||||
{
|
|
||||||
if (!TIFFCheckTile(tif, x, y, z, s))
|
|
||||||
return (-1);
|
|
||||||
/*
|
|
||||||
* NB: A tile size of -1 is used instead of tif_tilesize knowing
|
|
||||||
* that TIFFWriteEncodedTile will clamp this to the tile size.
|
|
||||||
* This is done because the tile size may not be defined until
|
|
||||||
* after the output buffer is setup in TIFFWriteBufferSetup.
|
|
||||||
*/
|
|
||||||
return (TIFFWriteEncodedTile(tif,
|
|
||||||
TIFFComputeTile(tif, x, y, z, s), buf, (tsize_t) -1));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Encode the supplied data and write it to the
|
|
||||||
* specified tile. There must be space for the
|
|
||||||
* data. The function clamps individual writes
|
|
||||||
* to a tile to the tile size, but does not (and
|
|
||||||
* can not) check that multiple writes to the same
|
|
||||||
* tile do not write more than tile size data.
|
|
||||||
*
|
|
||||||
* NB: Image length must be setup before writing; this
|
|
||||||
* interface does not support automatically growing
|
|
||||||
* the image on each write (as TIFFWriteScanline does).
|
|
||||||
*/
|
|
||||||
tsize_t
|
|
||||||
TIFFWriteEncodedTile(TIFF* tif, ttile_t tile, tdata_t data, tsize_t cc)
|
|
||||||
{
|
|
||||||
static const char module[] = "TIFFWriteEncodedTile";
|
|
||||||
TIFFDirectory *td;
|
|
||||||
tsample_t sample;
|
|
||||||
|
|
||||||
if (!WRITECHECKTILES(tif, module))
|
|
||||||
return ((tsize_t) -1);
|
|
||||||
td = &tif->tif_dir;
|
|
||||||
if (tile >= td->td_nstrips) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "%s: Tile %lu out of range, max %lu",
|
|
||||||
tif->tif_name, (unsigned long) tile, (unsigned long) td->td_nstrips);
|
|
||||||
return ((tsize_t) -1);
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Handle delayed allocation of data buffer. This
|
|
||||||
* permits it to be sized more intelligently (using
|
|
||||||
* directory information).
|
|
||||||
*/
|
|
||||||
if (!BUFFERCHECK(tif))
|
|
||||||
return ((tsize_t) -1);
|
|
||||||
tif->tif_curtile = tile;
|
|
||||||
|
|
||||||
tif->tif_rawcc = 0;
|
|
||||||
tif->tif_rawcp = tif->tif_rawdata;
|
|
||||||
|
|
||||||
if( td->td_stripbytecount[tile] > 0 )
|
|
||||||
{
|
|
||||||
/* Force TIFFAppendToStrip() to consider placing data at end
|
|
||||||
of file. */
|
|
||||||
tif->tif_curoff = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Compute tiles per row & per column to compute
|
|
||||||
* current row and column
|
|
||||||
*/
|
|
||||||
tif->tif_row = (tile % TIFFhowmany(td->td_imagelength, td->td_tilelength))
|
|
||||||
* td->td_tilelength;
|
|
||||||
tif->tif_col = (tile % TIFFhowmany(td->td_imagewidth, td->td_tilewidth))
|
|
||||||
* td->td_tilewidth;
|
|
||||||
|
|
||||||
if ((tif->tif_flags & TIFF_CODERSETUP) == 0) {
|
|
||||||
if (!(*tif->tif_setupencode)(tif))
|
|
||||||
return ((tsize_t) -1);
|
|
||||||
tif->tif_flags |= TIFF_CODERSETUP;
|
|
||||||
}
|
|
||||||
tif->tif_flags &= ~TIFF_POSTENCODE;
|
|
||||||
sample = (tsample_t)(tile/td->td_stripsperimage);
|
|
||||||
if (!(*tif->tif_preencode)(tif, sample))
|
|
||||||
return ((tsize_t) -1);
|
|
||||||
/*
|
|
||||||
* Clamp write amount to the tile size. This is mostly
|
|
||||||
* done so that callers can pass in some large number
|
|
||||||
* (e.g. -1) and have the tile size used instead.
|
|
||||||
*/
|
|
||||||
if ( cc < 1 || cc > tif->tif_tilesize)
|
|
||||||
cc = tif->tif_tilesize;
|
|
||||||
|
|
||||||
/* swab if needed - note that source buffer will be altered */
|
|
||||||
tif->tif_postdecode( tif, (tidata_t) data, cc );
|
|
||||||
|
|
||||||
if (!(*tif->tif_encodetile)(tif, (tidata_t) data, cc, sample))
|
|
||||||
return ((tsize_t) 0);
|
|
||||||
if (!(*tif->tif_postencode)(tif))
|
|
||||||
return ((tsize_t) -1);
|
|
||||||
if (!isFillOrder(tif, td->td_fillorder) &&
|
|
||||||
(tif->tif_flags & TIFF_NOBITREV) == 0)
|
|
||||||
TIFFReverseBits((unsigned char *)tif->tif_rawdata, tif->tif_rawcc);
|
|
||||||
if (tif->tif_rawcc > 0 && !TIFFAppendToStrip(tif, tile,
|
|
||||||
tif->tif_rawdata, tif->tif_rawcc))
|
|
||||||
return ((tsize_t) -1);
|
|
||||||
tif->tif_rawcc = 0;
|
|
||||||
tif->tif_rawcp = tif->tif_rawdata;
|
|
||||||
return (cc);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Write the supplied data to the specified strip.
|
|
||||||
* There must be space for the data; we don't check
|
|
||||||
* if strips overlap!
|
|
||||||
*
|
|
||||||
* NB: Image length must be setup before writing; this
|
|
||||||
* interface does not support automatically growing
|
|
||||||
* the image on each write (as TIFFWriteScanline does).
|
|
||||||
*/
|
|
||||||
tsize_t
|
|
||||||
TIFFWriteRawTile(TIFF* tif, ttile_t tile, tdata_t data, tsize_t cc)
|
|
||||||
{
|
|
||||||
static const char module[] = "TIFFWriteRawTile";
|
|
||||||
|
|
||||||
if (!WRITECHECKTILES(tif, module))
|
|
||||||
return ((tsize_t) -1);
|
|
||||||
if (tile >= tif->tif_dir.td_nstrips) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "%s: Tile %lu out of range, max %lu",
|
|
||||||
tif->tif_name, (unsigned long) tile,
|
|
||||||
(unsigned long) tif->tif_dir.td_nstrips);
|
|
||||||
return ((tsize_t) -1);
|
|
||||||
}
|
|
||||||
return (TIFFAppendToStrip(tif, tile, (tidata_t) data, cc) ?
|
|
||||||
cc : (tsize_t) -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define isUnspecified(tif, f) \
|
|
||||||
(TIFFFieldSet(tif,f) && (tif)->tif_dir.td_imagelength == 0)
|
|
||||||
|
|
||||||
int
|
|
||||||
TIFFSetupStrips(TIFF* tif)
|
|
||||||
{
|
|
||||||
TIFFDirectory* td = &tif->tif_dir;
|
|
||||||
|
|
||||||
if (isTiled(tif))
|
|
||||||
td->td_stripsperimage =
|
|
||||||
isUnspecified(tif, FIELD_TILEDIMENSIONS) ?
|
|
||||||
td->td_samplesperpixel : TIFFNumberOfTiles(tif);
|
|
||||||
else
|
|
||||||
td->td_stripsperimage =
|
|
||||||
isUnspecified(tif, FIELD_ROWSPERSTRIP) ?
|
|
||||||
td->td_samplesperpixel : TIFFNumberOfStrips(tif);
|
|
||||||
td->td_nstrips = td->td_stripsperimage;
|
|
||||||
if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
|
|
||||||
td->td_stripsperimage /= td->td_samplesperpixel;
|
|
||||||
td->td_stripoffset = (uint32 *)
|
|
||||||
_TIFFmalloc(td->td_nstrips * sizeof (uint32));
|
|
||||||
td->td_stripbytecount = (uint32 *)
|
|
||||||
_TIFFmalloc(td->td_nstrips * sizeof (uint32));
|
|
||||||
if (td->td_stripoffset == NULL || td->td_stripbytecount == NULL)
|
|
||||||
return (0);
|
|
||||||
/*
|
|
||||||
* Place data at the end-of-file
|
|
||||||
* (by setting offsets to zero).
|
|
||||||
*/
|
|
||||||
_TIFFmemset(td->td_stripoffset, 0, td->td_nstrips*sizeof (uint32));
|
|
||||||
_TIFFmemset(td->td_stripbytecount, 0, td->td_nstrips*sizeof (uint32));
|
|
||||||
TIFFSetFieldBit(tif, FIELD_STRIPOFFSETS);
|
|
||||||
TIFFSetFieldBit(tif, FIELD_STRIPBYTECOUNTS);
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
#undef isUnspecified
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Verify file is writable and that the directory
|
|
||||||
* information is setup properly. In doing the latter
|
|
||||||
* we also "freeze" the state of the directory so
|
|
||||||
* that important information is not changed.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
TIFFWriteCheck(TIFF* tif, int tiles, const char* module)
|
|
||||||
{
|
|
||||||
if (tif->tif_mode == O_RDONLY) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "%s: File not open for writing",
|
|
||||||
tif->tif_name);
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
if (tiles ^ isTiled(tif)) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name, tiles ?
|
|
||||||
"Can not write tiles to a stripped image" :
|
|
||||||
"Can not write scanlines to a tiled image");
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* On the first write verify all the required information
|
|
||||||
* has been setup and initialize any data structures that
|
|
||||||
* had to wait until directory information was set.
|
|
||||||
* Note that a lot of our work is assumed to remain valid
|
|
||||||
* because we disallow any of the important parameters
|
|
||||||
* from changing after we start writing (i.e. once
|
|
||||||
* TIFF_BEENWRITING is set, TIFFSetField will only allow
|
|
||||||
* the image's length to be changed).
|
|
||||||
*/
|
|
||||||
if (!TIFFFieldSet(tif, FIELD_IMAGEDIMENSIONS)) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
|
||||||
"%s: Must set \"ImageWidth\" before writing data",
|
|
||||||
tif->tif_name);
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
if (tif->tif_dir.td_samplesperpixel == 1) {
|
|
||||||
/*
|
|
||||||
* Planarconfiguration is irrelevant in case of single band
|
|
||||||
* images and need not be included. We will set it anyway,
|
|
||||||
* because this field is used in other parts of library even
|
|
||||||
* in the single band case.
|
|
||||||
*/
|
|
||||||
if (!TIFFFieldSet(tif, FIELD_PLANARCONFIG))
|
|
||||||
tif->tif_dir.td_planarconfig = PLANARCONFIG_CONTIG;
|
|
||||||
} else {
|
|
||||||
if (!TIFFFieldSet(tif, FIELD_PLANARCONFIG)) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
|
||||||
"%s: Must set \"PlanarConfiguration\" before writing data",
|
|
||||||
tif->tif_name);
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (tif->tif_dir.td_stripoffset == NULL && !TIFFSetupStrips(tif)) {
|
|
||||||
tif->tif_dir.td_nstrips = 0;
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "%s: No space for %s arrays",
|
|
||||||
tif->tif_name, isTiled(tif) ? "tile" : "strip");
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
tif->tif_tilesize = isTiled(tif) ? TIFFTileSize(tif) : (tsize_t) -1;
|
|
||||||
tif->tif_scanlinesize = TIFFScanlineSize(tif);
|
|
||||||
tif->tif_flags |= TIFF_BEENWRITING;
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Setup the raw data buffer used for encoding.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
TIFFWriteBufferSetup(TIFF* tif, tdata_t bp, tsize_t size)
|
|
||||||
{
|
|
||||||
static const char module[] = "TIFFWriteBufferSetup";
|
|
||||||
|
|
||||||
if (tif->tif_rawdata) {
|
|
||||||
if (tif->tif_flags & TIFF_MYBUFFER) {
|
|
||||||
_TIFFfree(tif->tif_rawdata);
|
|
||||||
tif->tif_flags &= ~TIFF_MYBUFFER;
|
|
||||||
}
|
|
||||||
tif->tif_rawdata = NULL;
|
|
||||||
}
|
|
||||||
if (size == (tsize_t) -1) {
|
|
||||||
size = (isTiled(tif) ?
|
|
||||||
tif->tif_tilesize : TIFFStripSize(tif));
|
|
||||||
/*
|
|
||||||
* Make raw data buffer at least 8K
|
|
||||||
*/
|
|
||||||
if (size < 8*1024)
|
|
||||||
size = 8*1024;
|
|
||||||
bp = NULL; /* NB: force malloc */
|
|
||||||
}
|
|
||||||
if (bp == NULL) {
|
|
||||||
bp = _TIFFmalloc(size);
|
|
||||||
if (bp == NULL) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "%s: No space for output buffer",
|
|
||||||
tif->tif_name);
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
tif->tif_flags |= TIFF_MYBUFFER;
|
|
||||||
} else
|
|
||||||
tif->tif_flags &= ~TIFF_MYBUFFER;
|
|
||||||
tif->tif_rawdata = (tidata_t) bp;
|
|
||||||
tif->tif_rawdatasize = size;
|
|
||||||
tif->tif_rawcc = 0;
|
|
||||||
tif->tif_rawcp = tif->tif_rawdata;
|
|
||||||
tif->tif_flags |= TIFF_BUFFERSETUP;
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Grow the strip data structures by delta strips.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
TIFFGrowStrips(TIFF* tif, int delta, const char* module)
|
|
||||||
{
|
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
|
||||||
uint32 *new_stripoffset, *new_stripbytecount;
|
|
||||||
|
|
||||||
assert(td->td_planarconfig == PLANARCONFIG_CONTIG);
|
|
||||||
new_stripoffset = (uint32*)_TIFFrealloc(td->td_stripoffset,
|
|
||||||
(td->td_nstrips + delta) * sizeof (uint32));
|
|
||||||
new_stripbytecount = (uint32*)_TIFFrealloc(td->td_stripbytecount,
|
|
||||||
(td->td_nstrips + delta) * sizeof (uint32));
|
|
||||||
if (new_stripoffset == NULL || new_stripbytecount == NULL) {
|
|
||||||
if (new_stripoffset)
|
|
||||||
_TIFFfree(new_stripoffset);
|
|
||||||
if (new_stripbytecount)
|
|
||||||
_TIFFfree(new_stripbytecount);
|
|
||||||
td->td_nstrips = 0;
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "%s: No space to expand strip arrays",
|
|
||||||
tif->tif_name);
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
td->td_stripoffset = new_stripoffset;
|
|
||||||
td->td_stripbytecount = new_stripbytecount;
|
|
||||||
_TIFFmemset(td->td_stripoffset + td->td_nstrips,
|
|
||||||
0, delta*sizeof (uint32));
|
|
||||||
_TIFFmemset(td->td_stripbytecount + td->td_nstrips,
|
|
||||||
0, delta*sizeof (uint32));
|
|
||||||
td->td_nstrips += delta;
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Append the data to the specified strip.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
TIFFAppendToStrip(TIFF* tif, tstrip_t strip, tidata_t data, tsize_t cc)
|
|
||||||
{
|
|
||||||
static const char module[] = "TIFFAppendToStrip";
|
|
||||||
TIFFDirectory *td = &tif->tif_dir;
|
|
||||||
|
|
||||||
if (td->td_stripoffset[strip] == 0 || tif->tif_curoff == 0) {
|
|
||||||
assert(td->td_nstrips > 0);
|
|
||||||
|
|
||||||
if( td->td_stripbytecount[strip] != 0
|
|
||||||
&& td->td_stripoffset[strip] != 0
|
|
||||||
&& td->td_stripbytecount[strip] >= cc )
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* There is already tile data on disk, and the new tile
|
|
||||||
* data we have to will fit in the same space. The only
|
|
||||||
* aspect of this that is risky is that there could be
|
|
||||||
* more data to append to this strip before we are done
|
|
||||||
* depending on how we are getting called.
|
|
||||||
*/
|
|
||||||
if (!SeekOK(tif, td->td_stripoffset[strip])) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
|
||||||
"Seek error at scanline %lu",
|
|
||||||
(unsigned long)tif->tif_row);
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Seek to end of file, and set that as our location to
|
|
||||||
* write this strip.
|
|
||||||
*/
|
|
||||||
td->td_stripoffset[strip] = TIFFSeekFile(tif, 0, SEEK_END);
|
|
||||||
}
|
|
||||||
|
|
||||||
tif->tif_curoff = td->td_stripoffset[strip];
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We are starting a fresh strip/tile, so set the size to zero.
|
|
||||||
*/
|
|
||||||
td->td_stripbytecount[strip] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!WriteOK(tif, data, cc)) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "Write error at scanline %lu",
|
|
||||||
(unsigned long) tif->tif_row);
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
tif->tif_curoff = tif->tif_curoff+cc;
|
|
||||||
td->td_stripbytecount[strip] += cc;
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Internal version of TIFFFlushData that can be
|
|
||||||
* called by ``encodestrip routines'' w/o concern
|
|
||||||
* for infinite recursion.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
TIFFFlushData1(TIFF* tif)
|
|
||||||
{
|
|
||||||
if (tif->tif_rawcc > 0) {
|
|
||||||
if (!isFillOrder(tif, tif->tif_dir.td_fillorder) &&
|
|
||||||
(tif->tif_flags & TIFF_NOBITREV) == 0)
|
|
||||||
TIFFReverseBits((unsigned char *)tif->tif_rawdata,
|
|
||||||
tif->tif_rawcc);
|
|
||||||
if (!TIFFAppendToStrip(tif,
|
|
||||||
isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip,
|
|
||||||
tif->tif_rawdata, tif->tif_rawcc))
|
|
||||||
return (0);
|
|
||||||
tif->tif_rawcc = 0;
|
|
||||||
tif->tif_rawcp = tif->tif_rawdata;
|
|
||||||
}
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set the current write offset. This should only be
|
|
||||||
* used to set the offset to a known previous location
|
|
||||||
* (very carefully), or to 0 so that the next write gets
|
|
||||||
* appended to the end of the file.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
TIFFSetWriteOffset(TIFF* tif, toff_t off)
|
|
||||||
{
|
|
||||||
tif->tif_curoff = off;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
@@ -1,419 +0,0 @@
|
|||||||
/* $Id: tif_zip.c,v 1.11.2.4 2010-06-08 18:50:43 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 1995-1997 Sam Leffler
|
|
||||||
* Copyright (c) 1995-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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "tiffiop.h"
|
|
||||||
#ifdef ZIP_SUPPORT
|
|
||||||
/*
|
|
||||||
* TIFF Library.
|
|
||||||
*
|
|
||||||
* ZIP (aka Deflate) Compression Support
|
|
||||||
*
|
|
||||||
* This file is simply an interface to the zlib library written by
|
|
||||||
* Jean-loup Gailly and Mark Adler. You must use version 1.0 or later
|
|
||||||
* of the library: this code assumes the 1.0 API and also depends on
|
|
||||||
* the ability to write the zlib header multiple times (one per strip)
|
|
||||||
* which was not possible with versions prior to 0.95. Note also that
|
|
||||||
* older versions of this codec avoided this bug by supressing the header
|
|
||||||
* entirely. This means that files written with the old library cannot
|
|
||||||
* be read; they should be converted to a different compression scheme
|
|
||||||
* and then reconverted.
|
|
||||||
*
|
|
||||||
* The data format used by the zlib library is described in the files
|
|
||||||
* zlib-3.1.doc, deflate-1.1.doc and gzip-4.1.doc, available in the
|
|
||||||
* directory ftp://ftp.uu.net/pub/archiving/zip/doc. The library was
|
|
||||||
* last found at ftp://ftp.uu.net/pub/archiving/zip/zlib/zlib-0.99.tar.gz.
|
|
||||||
*/
|
|
||||||
#include "tif_predict.h"
|
|
||||||
#include "zlib.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Sigh, ZLIB_VERSION is defined as a string so there's no
|
|
||||||
* way to do a proper check here. Instead we guess based
|
|
||||||
* on the presence of #defines that were added between the
|
|
||||||
* 0.95 and 1.0 distributions.
|
|
||||||
*/
|
|
||||||
#if !defined(Z_NO_COMPRESSION) || !defined(Z_DEFLATED)
|
|
||||||
#error "Antiquated ZLIB software; you must use version 1.0 or later"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* State block for each open TIFF
|
|
||||||
* file using ZIP compression/decompression.
|
|
||||||
*/
|
|
||||||
typedef struct {
|
|
||||||
TIFFPredictorState predict;
|
|
||||||
z_stream stream;
|
|
||||||
int zipquality; /* compression level */
|
|
||||||
int state; /* state flags */
|
|
||||||
#define ZSTATE_INIT_DECODE 0x01
|
|
||||||
#define ZSTATE_INIT_ENCODE 0x02
|
|
||||||
|
|
||||||
TIFFVGetMethod vgetparent; /* super-class method */
|
|
||||||
TIFFVSetMethod vsetparent; /* super-class method */
|
|
||||||
} ZIPState;
|
|
||||||
|
|
||||||
#define ZState(tif) ((ZIPState*) (tif)->tif_data)
|
|
||||||
#define DecoderState(tif) ZState(tif)
|
|
||||||
#define EncoderState(tif) ZState(tif)
|
|
||||||
|
|
||||||
static int ZIPEncode(TIFF*, tidata_t, tsize_t, tsample_t);
|
|
||||||
static int ZIPDecode(TIFF*, tidata_t, tsize_t, tsample_t);
|
|
||||||
|
|
||||||
static int
|
|
||||||
ZIPSetupDecode(TIFF* tif)
|
|
||||||
{
|
|
||||||
ZIPState* sp = DecoderState(tif);
|
|
||||||
static const char module[] = "ZIPSetupDecode";
|
|
||||||
|
|
||||||
assert(sp != NULL);
|
|
||||||
|
|
||||||
/* if we were last encoding, terminate this mode */
|
|
||||||
if (sp->state & ZSTATE_INIT_ENCODE) {
|
|
||||||
deflateEnd(&sp->stream);
|
|
||||||
sp->state = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (inflateInit(&sp->stream) != Z_OK) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "%s: %s", tif->tif_name, sp->stream.msg);
|
|
||||||
return (0);
|
|
||||||
} else {
|
|
||||||
sp->state |= ZSTATE_INIT_DECODE;
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Setup state for decoding a strip.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
ZIPPreDecode(TIFF* tif, tsample_t s)
|
|
||||||
{
|
|
||||||
ZIPState* sp = DecoderState(tif);
|
|
||||||
|
|
||||||
(void) s;
|
|
||||||
assert(sp != NULL);
|
|
||||||
|
|
||||||
if( (sp->state & ZSTATE_INIT_DECODE) == 0 )
|
|
||||||
tif->tif_setupdecode( tif );
|
|
||||||
|
|
||||||
sp->stream.next_in = tif->tif_rawdata;
|
|
||||||
sp->stream.avail_in = tif->tif_rawcc;
|
|
||||||
return (inflateReset(&sp->stream) == Z_OK);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
ZIPDecode(TIFF* tif, tidata_t op, tsize_t occ, tsample_t s)
|
|
||||||
{
|
|
||||||
ZIPState* sp = DecoderState(tif);
|
|
||||||
static const char module[] = "ZIPDecode";
|
|
||||||
|
|
||||||
(void) s;
|
|
||||||
assert(sp != NULL);
|
|
||||||
assert(sp->state == ZSTATE_INIT_DECODE);
|
|
||||||
|
|
||||||
sp->stream.next_out = op;
|
|
||||||
sp->stream.avail_out = occ;
|
|
||||||
do {
|
|
||||||
int state = inflate(&sp->stream, Z_PARTIAL_FLUSH);
|
|
||||||
if (state == Z_STREAM_END)
|
|
||||||
break;
|
|
||||||
if (state == Z_DATA_ERROR) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
|
||||||
"%s: Decoding error at scanline %d, %s",
|
|
||||||
tif->tif_name, tif->tif_row, sp->stream.msg);
|
|
||||||
if (inflateSync(&sp->stream) != Z_OK)
|
|
||||||
return (0);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (state != Z_OK) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "%s: zlib error: %s",
|
|
||||||
tif->tif_name, sp->stream.msg);
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
} while (sp->stream.avail_out > 0);
|
|
||||||
if (sp->stream.avail_out != 0) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
|
||||||
"%s: Not enough data at scanline %d (short %d bytes)",
|
|
||||||
tif->tif_name, tif->tif_row, sp->stream.avail_out);
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
ZIPSetupEncode(TIFF* tif)
|
|
||||||
{
|
|
||||||
ZIPState* sp = EncoderState(tif);
|
|
||||||
static const char module[] = "ZIPSetupEncode";
|
|
||||||
|
|
||||||
assert(sp != NULL);
|
|
||||||
if (sp->state & ZSTATE_INIT_DECODE) {
|
|
||||||
inflateEnd(&sp->stream);
|
|
||||||
sp->state = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (deflateInit(&sp->stream, sp->zipquality) != Z_OK) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "%s: %s", tif->tif_name, sp->stream.msg);
|
|
||||||
return (0);
|
|
||||||
} else {
|
|
||||||
sp->state |= ZSTATE_INIT_ENCODE;
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Reset encoding state at the start of a strip.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
ZIPPreEncode(TIFF* tif, tsample_t s)
|
|
||||||
{
|
|
||||||
ZIPState *sp = EncoderState(tif);
|
|
||||||
|
|
||||||
(void) s;
|
|
||||||
assert(sp != NULL);
|
|
||||||
if( sp->state != ZSTATE_INIT_ENCODE )
|
|
||||||
tif->tif_setupencode( tif );
|
|
||||||
|
|
||||||
sp->stream.next_out = tif->tif_rawdata;
|
|
||||||
sp->stream.avail_out = tif->tif_rawdatasize;
|
|
||||||
return (deflateReset(&sp->stream) == Z_OK);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Encode a chunk of pixels.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
ZIPEncode(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s)
|
|
||||||
{
|
|
||||||
ZIPState *sp = EncoderState(tif);
|
|
||||||
static const char module[] = "ZIPEncode";
|
|
||||||
|
|
||||||
assert(sp != NULL);
|
|
||||||
assert(sp->state == ZSTATE_INIT_ENCODE);
|
|
||||||
|
|
||||||
(void) s;
|
|
||||||
sp->stream.next_in = bp;
|
|
||||||
sp->stream.avail_in = cc;
|
|
||||||
do {
|
|
||||||
if (deflate(&sp->stream, Z_NO_FLUSH) != Z_OK) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "%s: Encoder error: %s",
|
|
||||||
tif->tif_name, sp->stream.msg);
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
if (sp->stream.avail_out == 0) {
|
|
||||||
tif->tif_rawcc = tif->tif_rawdatasize;
|
|
||||||
TIFFFlushData1(tif);
|
|
||||||
sp->stream.next_out = tif->tif_rawdata;
|
|
||||||
sp->stream.avail_out = tif->tif_rawdatasize;
|
|
||||||
}
|
|
||||||
} while (sp->stream.avail_in > 0);
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Finish off an encoded strip by flushing the last
|
|
||||||
* string and tacking on an End Of Information code.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
ZIPPostEncode(TIFF* tif)
|
|
||||||
{
|
|
||||||
ZIPState *sp = EncoderState(tif);
|
|
||||||
static const char module[] = "ZIPPostEncode";
|
|
||||||
int state;
|
|
||||||
|
|
||||||
sp->stream.avail_in = 0;
|
|
||||||
do {
|
|
||||||
state = deflate(&sp->stream, Z_FINISH);
|
|
||||||
switch (state) {
|
|
||||||
case Z_STREAM_END:
|
|
||||||
case Z_OK:
|
|
||||||
if ((int)sp->stream.avail_out != (int)tif->tif_rawdatasize)
|
|
||||||
{
|
|
||||||
tif->tif_rawcc =
|
|
||||||
tif->tif_rawdatasize - sp->stream.avail_out;
|
|
||||||
TIFFFlushData1(tif);
|
|
||||||
sp->stream.next_out = tif->tif_rawdata;
|
|
||||||
sp->stream.avail_out = tif->tif_rawdatasize;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "%s: zlib error: %s",
|
|
||||||
tif->tif_name, sp->stream.msg);
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
} while (state != Z_STREAM_END);
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
ZIPCleanup(TIFF* tif)
|
|
||||||
{
|
|
||||||
ZIPState* sp = ZState(tif);
|
|
||||||
|
|
||||||
assert(sp != 0);
|
|
||||||
|
|
||||||
(void)TIFFPredictorCleanup(tif);
|
|
||||||
|
|
||||||
tif->tif_tagmethods.vgetfield = sp->vgetparent;
|
|
||||||
tif->tif_tagmethods.vsetfield = sp->vsetparent;
|
|
||||||
|
|
||||||
if (sp->state & ZSTATE_INIT_ENCODE) {
|
|
||||||
deflateEnd(&sp->stream);
|
|
||||||
sp->state = 0;
|
|
||||||
} else if( sp->state & ZSTATE_INIT_DECODE) {
|
|
||||||
inflateEnd(&sp->stream);
|
|
||||||
sp->state = 0;
|
|
||||||
}
|
|
||||||
_TIFFfree(sp);
|
|
||||||
tif->tif_data = NULL;
|
|
||||||
|
|
||||||
_TIFFSetDefaultCompressionState(tif);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
ZIPVSetField(TIFF* tif, ttag_t tag, va_list ap)
|
|
||||||
{
|
|
||||||
ZIPState* sp = ZState(tif);
|
|
||||||
static const char module[] = "ZIPVSetField";
|
|
||||||
|
|
||||||
switch (tag) {
|
|
||||||
case TIFFTAG_ZIPQUALITY:
|
|
||||||
sp->zipquality = va_arg(ap, int);
|
|
||||||
if ( sp->state&ZSTATE_INIT_ENCODE ) {
|
|
||||||
if (deflateParams(&sp->stream,
|
|
||||||
sp->zipquality, Z_DEFAULT_STRATEGY) != Z_OK) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "%s: zlib error: %s",
|
|
||||||
tif->tif_name, sp->stream.msg);
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return (1);
|
|
||||||
default:
|
|
||||||
return (*sp->vsetparent)(tif, tag, ap);
|
|
||||||
}
|
|
||||||
/*NOTREACHED*/
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
ZIPVGetField(TIFF* tif, ttag_t tag, va_list ap)
|
|
||||||
{
|
|
||||||
ZIPState* sp = ZState(tif);
|
|
||||||
|
|
||||||
switch (tag) {
|
|
||||||
case TIFFTAG_ZIPQUALITY:
|
|
||||||
*va_arg(ap, int*) = sp->zipquality;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return (*sp->vgetparent)(tif, tag, ap);
|
|
||||||
}
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const TIFFFieldInfo zipFieldInfo[] = {
|
|
||||||
{ TIFFTAG_ZIPQUALITY, 0, 0, TIFF_ANY, FIELD_PSEUDO,
|
|
||||||
TRUE, FALSE, "" },
|
|
||||||
};
|
|
||||||
|
|
||||||
int
|
|
||||||
TIFFInitZIP(TIFF* tif, int scheme)
|
|
||||||
{
|
|
||||||
static const char module[] = "TIFFInitZIP";
|
|
||||||
ZIPState* sp;
|
|
||||||
|
|
||||||
assert( (scheme == COMPRESSION_DEFLATE)
|
|
||||||
|| (scheme == COMPRESSION_ADOBE_DEFLATE));
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Merge codec-specific tag information.
|
|
||||||
*/
|
|
||||||
if (!_TIFFMergeFieldInfo(tif, zipFieldInfo,
|
|
||||||
TIFFArrayCount(zipFieldInfo))) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
|
||||||
"Merging Deflate codec-specific tags failed");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Allocate state block so tag methods have storage to record values.
|
|
||||||
*/
|
|
||||||
tif->tif_data = (tidata_t) _TIFFmalloc(sizeof (ZIPState));
|
|
||||||
if (tif->tif_data == NULL)
|
|
||||||
goto bad;
|
|
||||||
sp = ZState(tif);
|
|
||||||
sp->stream.zalloc = NULL;
|
|
||||||
sp->stream.zfree = NULL;
|
|
||||||
sp->stream.opaque = NULL;
|
|
||||||
sp->stream.data_type = Z_BINARY;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Override parent get/set field methods.
|
|
||||||
*/
|
|
||||||
sp->vgetparent = tif->tif_tagmethods.vgetfield;
|
|
||||||
tif->tif_tagmethods.vgetfield = ZIPVGetField; /* hook for codec tags */
|
|
||||||
sp->vsetparent = tif->tif_tagmethods.vsetfield;
|
|
||||||
tif->tif_tagmethods.vsetfield = ZIPVSetField; /* hook for codec tags */
|
|
||||||
|
|
||||||
/* Default values for codec-specific fields */
|
|
||||||
sp->zipquality = Z_DEFAULT_COMPRESSION; /* default comp. level */
|
|
||||||
sp->state = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Install codec methods.
|
|
||||||
*/
|
|
||||||
tif->tif_setupdecode = ZIPSetupDecode;
|
|
||||||
tif->tif_predecode = ZIPPreDecode;
|
|
||||||
tif->tif_decoderow = ZIPDecode;
|
|
||||||
tif->tif_decodestrip = ZIPDecode;
|
|
||||||
tif->tif_decodetile = ZIPDecode;
|
|
||||||
tif->tif_setupencode = ZIPSetupEncode;
|
|
||||||
tif->tif_preencode = ZIPPreEncode;
|
|
||||||
tif->tif_postencode = ZIPPostEncode;
|
|
||||||
tif->tif_encoderow = ZIPEncode;
|
|
||||||
tif->tif_encodestrip = ZIPEncode;
|
|
||||||
tif->tif_encodetile = ZIPEncode;
|
|
||||||
tif->tif_cleanup = ZIPCleanup;
|
|
||||||
/*
|
|
||||||
* Setup predictor setup.
|
|
||||||
*/
|
|
||||||
(void) TIFFPredictorInit(tif);
|
|
||||||
return (1);
|
|
||||||
bad:
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
|
||||||
"No space for ZIP state block");
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
#endif /* ZIP_SUPORT */
|
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
/* $Id: tiffio.hxx,v 1.1.2.1 2010-06-08 18:50:43 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _TIFFIO_HXX_
|
|
||||||
#define _TIFFIO_HXX_
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TIFF I/O library definitions which provide C++ streams API.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include "tiff.h"
|
|
||||||
|
|
||||||
extern TIFF* TIFFStreamOpen(const char*, std::ostream *);
|
|
||||||
extern TIFF* TIFFStreamOpen(const char*, std::istream *);
|
|
||||||
|
|
||||||
#endif /* _TIFFIO_HXX_ */
|
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c++
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
@@ -1,352 +0,0 @@
|
|||||||
/* $Id: tiffiop.h,v 1.51.2.6 2010-06-12 02:55:16 bfriesen Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _TIFFIOP_
|
|
||||||
#define _TIFFIOP_
|
|
||||||
/*
|
|
||||||
* ``Library-private'' definitions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "tif_config.h"
|
|
||||||
|
|
||||||
#ifdef HAVE_FCNTL_H
|
|
||||||
# include <fcntl.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_SYS_TYPES_H
|
|
||||||
# include <sys/types.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_STRING_H
|
|
||||||
# include <string.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_ASSERT_H
|
|
||||||
# include <assert.h>
|
|
||||||
#else
|
|
||||||
# define assert(x)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_SEARCH_H
|
|
||||||
# include <search.h>
|
|
||||||
#else
|
|
||||||
extern void *lfind(const void *, const void *, size_t *, size_t,
|
|
||||||
int (*)(const void *, const void *));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
Libtiff itself does not require a 64-bit type, but bundled TIFF
|
|
||||||
utilities may use it.
|
|
||||||
*/
|
|
||||||
#ifndef __HAIKU__
|
|
||||||
typedef TIFF_INT64_T int64;
|
|
||||||
typedef TIFF_UINT64_T uint64;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "tiffio.h"
|
|
||||||
#include "tif_dir.h"
|
|
||||||
|
|
||||||
#ifndef STRIP_SIZE_DEFAULT
|
|
||||||
# define STRIP_SIZE_DEFAULT 8192
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define streq(a,b) (strcmp(a,b) == 0)
|
|
||||||
|
|
||||||
#ifndef TRUE
|
|
||||||
#define TRUE 1
|
|
||||||
#define FALSE 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct client_info {
|
|
||||||
struct client_info *next;
|
|
||||||
void *data;
|
|
||||||
char *name;
|
|
||||||
} TIFFClientInfoLink;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Typedefs for ``method pointers'' used internally.
|
|
||||||
*/
|
|
||||||
typedef unsigned char tidataval_t; /* internal image data value type */
|
|
||||||
typedef tidataval_t* tidata_t; /* reference to internal image data */
|
|
||||||
|
|
||||||
typedef void (*TIFFVoidMethod)(TIFF*);
|
|
||||||
typedef int (*TIFFBoolMethod)(TIFF*);
|
|
||||||
typedef int (*TIFFPreMethod)(TIFF*, tsample_t);
|
|
||||||
typedef int (*TIFFCodeMethod)(TIFF*, tidata_t, tsize_t, tsample_t);
|
|
||||||
typedef int (*TIFFSeekMethod)(TIFF*, uint32);
|
|
||||||
typedef void (*TIFFPostMethod)(TIFF*, tidata_t, tsize_t);
|
|
||||||
typedef uint32 (*TIFFStripMethod)(TIFF*, uint32);
|
|
||||||
typedef void (*TIFFTileMethod)(TIFF*, uint32*, uint32*);
|
|
||||||
|
|
||||||
struct tiff {
|
|
||||||
char* tif_name; /* name of open file */
|
|
||||||
int tif_fd; /* open file descriptor */
|
|
||||||
int tif_mode; /* open mode (O_*) */
|
|
||||||
uint32 tif_flags;
|
|
||||||
#define TIFF_FILLORDER 0x00003 /* natural bit fill order for machine */
|
|
||||||
#define TIFF_DIRTYHEADER 0x00004 /* header must be written on close */
|
|
||||||
#define TIFF_DIRTYDIRECT 0x00008 /* current directory must be written */
|
|
||||||
#define TIFF_BUFFERSETUP 0x00010 /* data buffers setup */
|
|
||||||
#define TIFF_CODERSETUP 0x00020 /* encoder/decoder setup done */
|
|
||||||
#define TIFF_BEENWRITING 0x00040 /* written 1+ scanlines to file */
|
|
||||||
#define TIFF_SWAB 0x00080 /* byte swap file information */
|
|
||||||
#define TIFF_NOBITREV 0x00100 /* inhibit bit reversal logic */
|
|
||||||
#define TIFF_MYBUFFER 0x00200 /* my raw data buffer; free on close */
|
|
||||||
#define TIFF_ISTILED 0x00400 /* file is tile, not strip- based */
|
|
||||||
#define TIFF_MAPPED 0x00800 /* file is mapped into memory */
|
|
||||||
#define TIFF_POSTENCODE 0x01000 /* need call to postencode routine */
|
|
||||||
#define TIFF_INSUBIFD 0x02000 /* currently writing a subifd */
|
|
||||||
#define TIFF_UPSAMPLED 0x04000 /* library is doing data up-sampling */
|
|
||||||
#define TIFF_STRIPCHOP 0x08000 /* enable strip chopping support */
|
|
||||||
#define TIFF_HEADERONLY 0x10000 /* read header only, do not process */
|
|
||||||
/* the first directory */
|
|
||||||
#define TIFF_NOREADRAW 0x20000 /* skip reading of raw uncompressed */
|
|
||||||
/* image data */
|
|
||||||
#define TIFF_INCUSTOMIFD 0x40000 /* currently writing a custom IFD */
|
|
||||||
toff_t tif_diroff; /* file offset of current directory */
|
|
||||||
toff_t tif_nextdiroff; /* file offset of following directory */
|
|
||||||
toff_t* tif_dirlist; /* list of offsets to already seen */
|
|
||||||
/* directories to prevent IFD looping */
|
|
||||||
tsize_t tif_dirlistsize;/* number of entires in offset list */
|
|
||||||
uint16 tif_dirnumber; /* number of already seen directories */
|
|
||||||
TIFFDirectory tif_dir; /* internal rep of current directory */
|
|
||||||
TIFFDirectory tif_customdir; /* custom IFDs are separated from
|
|
||||||
the main ones */
|
|
||||||
TIFFHeader tif_header; /* file's header block */
|
|
||||||
const int* tif_typeshift; /* data type shift counts */
|
|
||||||
const long* tif_typemask; /* data type masks */
|
|
||||||
uint32 tif_row; /* current scanline */
|
|
||||||
tdir_t tif_curdir; /* current directory (index) */
|
|
||||||
tstrip_t tif_curstrip; /* current strip for read/write */
|
|
||||||
toff_t tif_curoff; /* current offset for read/write */
|
|
||||||
toff_t tif_dataoff; /* current offset for writing dir */
|
|
||||||
/* SubIFD support */
|
|
||||||
uint16 tif_nsubifd; /* remaining subifds to write */
|
|
||||||
toff_t tif_subifdoff; /* offset for patching SubIFD link */
|
|
||||||
/* tiling support */
|
|
||||||
uint32 tif_col; /* current column (offset by row too) */
|
|
||||||
ttile_t tif_curtile; /* current tile for read/write */
|
|
||||||
tsize_t tif_tilesize; /* # of bytes in a tile */
|
|
||||||
/* compression scheme hooks */
|
|
||||||
int tif_decodestatus;
|
|
||||||
TIFFBoolMethod tif_setupdecode;/* called once before predecode */
|
|
||||||
TIFFPreMethod tif_predecode; /* pre- row/strip/tile decoding */
|
|
||||||
TIFFBoolMethod tif_setupencode;/* called once before preencode */
|
|
||||||
int tif_encodestatus;
|
|
||||||
TIFFPreMethod tif_preencode; /* pre- row/strip/tile encoding */
|
|
||||||
TIFFBoolMethod tif_postencode; /* post- row/strip/tile encoding */
|
|
||||||
TIFFCodeMethod tif_decoderow; /* scanline decoding routine */
|
|
||||||
TIFFCodeMethod tif_encoderow; /* scanline encoding routine */
|
|
||||||
TIFFCodeMethod tif_decodestrip;/* strip decoding routine */
|
|
||||||
TIFFCodeMethod tif_encodestrip;/* strip encoding routine */
|
|
||||||
TIFFCodeMethod tif_decodetile; /* tile decoding routine */
|
|
||||||
TIFFCodeMethod tif_encodetile; /* tile encoding routine */
|
|
||||||
TIFFVoidMethod tif_close; /* cleanup-on-close routine */
|
|
||||||
TIFFSeekMethod tif_seek; /* position within a strip routine */
|
|
||||||
TIFFVoidMethod tif_cleanup; /* cleanup state routine */
|
|
||||||
TIFFStripMethod tif_defstripsize;/* calculate/constrain strip size */
|
|
||||||
TIFFTileMethod tif_deftilesize;/* calculate/constrain tile size */
|
|
||||||
tidata_t tif_data; /* compression scheme private data */
|
|
||||||
/* input/output buffering */
|
|
||||||
tsize_t tif_scanlinesize;/* # of bytes in a scanline */
|
|
||||||
tsize_t tif_scanlineskew;/* scanline skew for reading strips */
|
|
||||||
tidata_t tif_rawdata; /* raw data buffer */
|
|
||||||
tsize_t tif_rawdatasize;/* # of bytes in raw data buffer */
|
|
||||||
tidata_t tif_rawcp; /* current spot in raw buffer */
|
|
||||||
tsize_t tif_rawcc; /* bytes unread from raw buffer */
|
|
||||||
/* memory-mapped file support */
|
|
||||||
tidata_t tif_base; /* base of mapped file */
|
|
||||||
toff_t tif_size; /* size of mapped file region (bytes)
|
|
||||||
FIXME: it should be tsize_t */
|
|
||||||
TIFFMapFileProc tif_mapproc; /* map file method */
|
|
||||||
TIFFUnmapFileProc tif_unmapproc;/* unmap file method */
|
|
||||||
/* input/output callback methods */
|
|
||||||
thandle_t tif_clientdata; /* callback parameter */
|
|
||||||
TIFFReadWriteProc tif_readproc; /* read method */
|
|
||||||
TIFFReadWriteProc tif_writeproc;/* write method */
|
|
||||||
TIFFSeekProc tif_seekproc; /* lseek method */
|
|
||||||
TIFFCloseProc tif_closeproc; /* close method */
|
|
||||||
TIFFSizeProc tif_sizeproc; /* filesize method */
|
|
||||||
/* post-decoding support */
|
|
||||||
TIFFPostMethod tif_postdecode; /* post decoding routine */
|
|
||||||
/* tag support */
|
|
||||||
TIFFFieldInfo** tif_fieldinfo; /* sorted table of registered tags */
|
|
||||||
size_t tif_nfields; /* # entries in registered tag table */
|
|
||||||
const TIFFFieldInfo *tif_foundfield;/* cached pointer to already found tag */
|
|
||||||
TIFFTagMethods tif_tagmethods; /* tag get/set/print routines */
|
|
||||||
TIFFClientInfoLink *tif_clientinfo; /* extra client information. */
|
|
||||||
};
|
|
||||||
|
|
||||||
#define isPseudoTag(t) (t > 0xffff) /* is tag value normal or pseudo */
|
|
||||||
|
|
||||||
#define isTiled(tif) (((tif)->tif_flags & TIFF_ISTILED) != 0)
|
|
||||||
#define isMapped(tif) (((tif)->tif_flags & TIFF_MAPPED) != 0)
|
|
||||||
#define isFillOrder(tif, o) (((tif)->tif_flags & (o)) != 0)
|
|
||||||
#define isUpSampled(tif) (((tif)->tif_flags & TIFF_UPSAMPLED) != 0)
|
|
||||||
#define TIFFReadFile(tif, buf, size) \
|
|
||||||
((*(tif)->tif_readproc)((tif)->tif_clientdata,buf,size))
|
|
||||||
#define TIFFWriteFile(tif, buf, size) \
|
|
||||||
((*(tif)->tif_writeproc)((tif)->tif_clientdata,buf,size))
|
|
||||||
#define TIFFSeekFile(tif, off, whence) \
|
|
||||||
((*(tif)->tif_seekproc)((tif)->tif_clientdata,(toff_t)(off),whence))
|
|
||||||
#define TIFFCloseFile(tif) \
|
|
||||||
((*(tif)->tif_closeproc)((tif)->tif_clientdata))
|
|
||||||
#define TIFFGetFileSize(tif) \
|
|
||||||
((*(tif)->tif_sizeproc)((tif)->tif_clientdata))
|
|
||||||
#define TIFFMapFileContents(tif, paddr, psize) \
|
|
||||||
((*(tif)->tif_mapproc)((tif)->tif_clientdata,paddr,psize))
|
|
||||||
#define TIFFUnmapFileContents(tif, addr, size) \
|
|
||||||
((*(tif)->tif_unmapproc)((tif)->tif_clientdata,addr,size))
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Default Read/Seek/Write definitions.
|
|
||||||
*/
|
|
||||||
#ifndef ReadOK
|
|
||||||
#define ReadOK(tif, buf, size) \
|
|
||||||
(TIFFReadFile(tif, (tdata_t) buf, (tsize_t)(size)) == (tsize_t)(size))
|
|
||||||
#endif
|
|
||||||
#ifndef SeekOK
|
|
||||||
#define SeekOK(tif, off) \
|
|
||||||
(TIFFSeekFile(tif, (toff_t) off, SEEK_SET) == (toff_t) off)
|
|
||||||
#endif
|
|
||||||
#ifndef WriteOK
|
|
||||||
#define WriteOK(tif, buf, size) \
|
|
||||||
(TIFFWriteFile(tif, (tdata_t) buf, (tsize_t) size) == (tsize_t) size)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* NB: the uint32 casts are to silence certain ANSI-C compilers */
|
|
||||||
#define TIFFhowmany(x, y) (((uint32)x < (0xffffffff - (uint32)(y-1))) ? \
|
|
||||||
((((uint32)(x))+(((uint32)(y))-1))/((uint32)(y))) : \
|
|
||||||
0U)
|
|
||||||
#define TIFFhowmany8(x) (((x)&0x07)?((uint32)(x)>>3)+1:(uint32)(x)>>3)
|
|
||||||
#define TIFFroundup(x, y) (TIFFhowmany(x,y)*(y))
|
|
||||||
|
|
||||||
/* Safe multiply which returns zero if there is an integer overflow */
|
|
||||||
#define TIFFSafeMultiply(t,v,m) ((((t)m != (t)0) && (((t)((v*m)/m)) == (t)v)) ? (t)(v*m) : (t)0)
|
|
||||||
|
|
||||||
#define TIFFmax(A,B) ((A)>(B)?(A):(B))
|
|
||||||
#define TIFFmin(A,B) ((A)<(B)?(A):(B))
|
|
||||||
|
|
||||||
#define TIFFArrayCount(a) (sizeof (a) / sizeof ((a)[0]))
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
extern int _TIFFgetMode(const char*, const char*);
|
|
||||||
extern int _TIFFNoRowEncode(TIFF*, tidata_t, tsize_t, tsample_t);
|
|
||||||
extern int _TIFFNoStripEncode(TIFF*, tidata_t, tsize_t, tsample_t);
|
|
||||||
extern int _TIFFNoTileEncode(TIFF*, tidata_t, tsize_t, tsample_t);
|
|
||||||
extern int _TIFFNoRowDecode(TIFF*, tidata_t, tsize_t, tsample_t);
|
|
||||||
extern int _TIFFNoStripDecode(TIFF*, tidata_t, tsize_t, tsample_t);
|
|
||||||
extern int _TIFFNoTileDecode(TIFF*, tidata_t, tsize_t, tsample_t);
|
|
||||||
extern void _TIFFNoPostDecode(TIFF*, tidata_t, tsize_t);
|
|
||||||
extern int _TIFFNoPreCode (TIFF*, tsample_t);
|
|
||||||
extern int _TIFFNoSeek(TIFF*, uint32);
|
|
||||||
extern void _TIFFSwab16BitData(TIFF*, tidata_t, tsize_t);
|
|
||||||
extern void _TIFFSwab24BitData(TIFF*, tidata_t, tsize_t);
|
|
||||||
extern void _TIFFSwab32BitData(TIFF*, tidata_t, tsize_t);
|
|
||||||
extern void _TIFFSwab64BitData(TIFF*, tidata_t, tsize_t);
|
|
||||||
extern int TIFFFlushData1(TIFF*);
|
|
||||||
extern int TIFFDefaultDirectory(TIFF*);
|
|
||||||
extern void _TIFFSetDefaultCompressionState(TIFF*);
|
|
||||||
extern int TIFFSetCompressionScheme(TIFF*, int);
|
|
||||||
extern int TIFFSetDefaultCompressionState(TIFF*);
|
|
||||||
extern uint32 _TIFFDefaultStripSize(TIFF*, uint32);
|
|
||||||
extern void _TIFFDefaultTileSize(TIFF*, uint32*, uint32*);
|
|
||||||
extern int _TIFFDataSize(TIFFDataType);
|
|
||||||
|
|
||||||
extern void _TIFFsetByteArray(void**, void*, uint32);
|
|
||||||
extern void _TIFFsetString(char**, char*);
|
|
||||||
extern void _TIFFsetShortArray(uint16**, uint16*, uint32);
|
|
||||||
extern void _TIFFsetLongArray(uint32**, uint32*, uint32);
|
|
||||||
extern void _TIFFsetFloatArray(float**, float*, uint32);
|
|
||||||
extern void _TIFFsetDoubleArray(double**, double*, uint32);
|
|
||||||
|
|
||||||
extern void _TIFFprintAscii(FILE*, const char*);
|
|
||||||
extern void _TIFFprintAsciiTag(FILE*, const char*, const char*);
|
|
||||||
|
|
||||||
extern TIFFErrorHandler _TIFFwarningHandler;
|
|
||||||
extern TIFFErrorHandler _TIFFerrorHandler;
|
|
||||||
extern TIFFErrorHandlerExt _TIFFwarningHandlerExt;
|
|
||||||
extern TIFFErrorHandlerExt _TIFFerrorHandlerExt;
|
|
||||||
|
|
||||||
extern tdata_t _TIFFCheckMalloc(TIFF*, size_t, size_t, const char*);
|
|
||||||
extern tdata_t _TIFFCheckRealloc(TIFF*, tdata_t, size_t, size_t, const char*);
|
|
||||||
|
|
||||||
extern int TIFFInitDumpMode(TIFF*, int);
|
|
||||||
#ifdef PACKBITS_SUPPORT
|
|
||||||
extern int TIFFInitPackBits(TIFF*, int);
|
|
||||||
#endif
|
|
||||||
#ifdef CCITT_SUPPORT
|
|
||||||
extern int TIFFInitCCITTRLE(TIFF*, int), TIFFInitCCITTRLEW(TIFF*, int);
|
|
||||||
extern int TIFFInitCCITTFax3(TIFF*, int), TIFFInitCCITTFax4(TIFF*, int);
|
|
||||||
#endif
|
|
||||||
#ifdef THUNDER_SUPPORT
|
|
||||||
extern int TIFFInitThunderScan(TIFF*, int);
|
|
||||||
#endif
|
|
||||||
#ifdef NEXT_SUPPORT
|
|
||||||
extern int TIFFInitNeXT(TIFF*, int);
|
|
||||||
#endif
|
|
||||||
#ifdef LZW_SUPPORT
|
|
||||||
extern int TIFFInitLZW(TIFF*, int);
|
|
||||||
#endif
|
|
||||||
#ifdef OJPEG_SUPPORT
|
|
||||||
extern int TIFFInitOJPEG(TIFF*, int);
|
|
||||||
#endif
|
|
||||||
#ifdef JPEG_SUPPORT
|
|
||||||
extern int TIFFInitJPEG(TIFF*, int);
|
|
||||||
#endif
|
|
||||||
#ifdef JBIG_SUPPORT
|
|
||||||
extern int TIFFInitJBIG(TIFF*, int);
|
|
||||||
#endif
|
|
||||||
#ifdef ZIP_SUPPORT
|
|
||||||
extern int TIFFInitZIP(TIFF*, int);
|
|
||||||
#endif
|
|
||||||
#ifdef PIXARLOG_SUPPORT
|
|
||||||
extern int TIFFInitPixarLog(TIFF*, int);
|
|
||||||
#endif
|
|
||||||
#ifdef LOGLUV_SUPPORT
|
|
||||||
extern int TIFFInitSGILog(TIFF*, int);
|
|
||||||
#endif
|
|
||||||
#ifdef VMS
|
|
||||||
extern const TIFFCodec _TIFFBuiltinCODECS[];
|
|
||||||
#else
|
|
||||||
extern TIFFCodec _TIFFBuiltinCODECS[];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif /* _TIFFIOP_ */
|
|
||||||
|
|
||||||
/* vim: set ts=8 sts=8 sw=8 noet: */
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
@@ -1,180 +0,0 @@
|
|||||||
/* Version 1.0 generated April 7, 1997 by Greg Ward Larson, SGI */
|
|
||||||
#define UV_SQSIZ (float)0.003500
|
|
||||||
#define UV_NDIVS 16289
|
|
||||||
#define UV_VSTART (float)0.016940
|
|
||||||
#define UV_NVS 163
|
|
||||||
static struct {
|
|
||||||
float ustart;
|
|
||||||
short nus, ncum;
|
|
||||||
} uv_row[UV_NVS] = {
|
|
||||||
{ (float)0.247663, 4, 0 },
|
|
||||||
{ (float)0.243779, 6, 4 },
|
|
||||||
{ (float)0.241684, 7, 10 },
|
|
||||||
{ (float)0.237874, 9, 17 },
|
|
||||||
{ (float)0.235906, 10, 26 },
|
|
||||||
{ (float)0.232153, 12, 36 },
|
|
||||||
{ (float)0.228352, 14, 48 },
|
|
||||||
{ (float)0.226259, 15, 62 },
|
|
||||||
{ (float)0.222371, 17, 77 },
|
|
||||||
{ (float)0.220410, 18, 94 },
|
|
||||||
{ (float)0.214710, 21, 112 },
|
|
||||||
{ (float)0.212714, 22, 133 },
|
|
||||||
{ (float)0.210721, 23, 155 },
|
|
||||||
{ (float)0.204976, 26, 178 },
|
|
||||||
{ (float)0.202986, 27, 204 },
|
|
||||||
{ (float)0.199245, 29, 231 },
|
|
||||||
{ (float)0.195525, 31, 260 },
|
|
||||||
{ (float)0.193560, 32, 291 },
|
|
||||||
{ (float)0.189878, 34, 323 },
|
|
||||||
{ (float)0.186216, 36, 357 },
|
|
||||||
{ (float)0.186216, 36, 393 },
|
|
||||||
{ (float)0.182592, 38, 429 },
|
|
||||||
{ (float)0.179003, 40, 467 },
|
|
||||||
{ (float)0.175466, 42, 507 },
|
|
||||||
{ (float)0.172001, 44, 549 },
|
|
||||||
{ (float)0.172001, 44, 593 },
|
|
||||||
{ (float)0.168612, 46, 637 },
|
|
||||||
{ (float)0.168612, 46, 683 },
|
|
||||||
{ (float)0.163575, 49, 729 },
|
|
||||||
{ (float)0.158642, 52, 778 },
|
|
||||||
{ (float)0.158642, 52, 830 },
|
|
||||||
{ (float)0.158642, 52, 882 },
|
|
||||||
{ (float)0.153815, 55, 934 },
|
|
||||||
{ (float)0.153815, 55, 989 },
|
|
||||||
{ (float)0.149097, 58, 1044 },
|
|
||||||
{ (float)0.149097, 58, 1102 },
|
|
||||||
{ (float)0.142746, 62, 1160 },
|
|
||||||
{ (float)0.142746, 62, 1222 },
|
|
||||||
{ (float)0.142746, 62, 1284 },
|
|
||||||
{ (float)0.138270, 65, 1346 },
|
|
||||||
{ (float)0.138270, 65, 1411 },
|
|
||||||
{ (float)0.138270, 65, 1476 },
|
|
||||||
{ (float)0.132166, 69, 1541 },
|
|
||||||
{ (float)0.132166, 69, 1610 },
|
|
||||||
{ (float)0.126204, 73, 1679 },
|
|
||||||
{ (float)0.126204, 73, 1752 },
|
|
||||||
{ (float)0.126204, 73, 1825 },
|
|
||||||
{ (float)0.120381, 77, 1898 },
|
|
||||||
{ (float)0.120381, 77, 1975 },
|
|
||||||
{ (float)0.120381, 77, 2052 },
|
|
||||||
{ (float)0.120381, 77, 2129 },
|
|
||||||
{ (float)0.112962, 82, 2206 },
|
|
||||||
{ (float)0.112962, 82, 2288 },
|
|
||||||
{ (float)0.112962, 82, 2370 },
|
|
||||||
{ (float)0.107450, 86, 2452 },
|
|
||||||
{ (float)0.107450, 86, 2538 },
|
|
||||||
{ (float)0.107450, 86, 2624 },
|
|
||||||
{ (float)0.107450, 86, 2710 },
|
|
||||||
{ (float)0.100343, 91, 2796 },
|
|
||||||
{ (float)0.100343, 91, 2887 },
|
|
||||||
{ (float)0.100343, 91, 2978 },
|
|
||||||
{ (float)0.095126, 95, 3069 },
|
|
||||||
{ (float)0.095126, 95, 3164 },
|
|
||||||
{ (float)0.095126, 95, 3259 },
|
|
||||||
{ (float)0.095126, 95, 3354 },
|
|
||||||
{ (float)0.088276, 100, 3449 },
|
|
||||||
{ (float)0.088276, 100, 3549 },
|
|
||||||
{ (float)0.088276, 100, 3649 },
|
|
||||||
{ (float)0.088276, 100, 3749 },
|
|
||||||
{ (float)0.081523, 105, 3849 },
|
|
||||||
{ (float)0.081523, 105, 3954 },
|
|
||||||
{ (float)0.081523, 105, 4059 },
|
|
||||||
{ (float)0.081523, 105, 4164 },
|
|
||||||
{ (float)0.074861, 110, 4269 },
|
|
||||||
{ (float)0.074861, 110, 4379 },
|
|
||||||
{ (float)0.074861, 110, 4489 },
|
|
||||||
{ (float)0.074861, 110, 4599 },
|
|
||||||
{ (float)0.068290, 115, 4709 },
|
|
||||||
{ (float)0.068290, 115, 4824 },
|
|
||||||
{ (float)0.068290, 115, 4939 },
|
|
||||||
{ (float)0.068290, 115, 5054 },
|
|
||||||
{ (float)0.063573, 119, 5169 },
|
|
||||||
{ (float)0.063573, 119, 5288 },
|
|
||||||
{ (float)0.063573, 119, 5407 },
|
|
||||||
{ (float)0.063573, 119, 5526 },
|
|
||||||
{ (float)0.057219, 124, 5645 },
|
|
||||||
{ (float)0.057219, 124, 5769 },
|
|
||||||
{ (float)0.057219, 124, 5893 },
|
|
||||||
{ (float)0.057219, 124, 6017 },
|
|
||||||
{ (float)0.050985, 129, 6141 },
|
|
||||||
{ (float)0.050985, 129, 6270 },
|
|
||||||
{ (float)0.050985, 129, 6399 },
|
|
||||||
{ (float)0.050985, 129, 6528 },
|
|
||||||
{ (float)0.050985, 129, 6657 },
|
|
||||||
{ (float)0.044859, 134, 6786 },
|
|
||||||
{ (float)0.044859, 134, 6920 },
|
|
||||||
{ (float)0.044859, 134, 7054 },
|
|
||||||
{ (float)0.044859, 134, 7188 },
|
|
||||||
{ (float)0.040571, 138, 7322 },
|
|
||||||
{ (float)0.040571, 138, 7460 },
|
|
||||||
{ (float)0.040571, 138, 7598 },
|
|
||||||
{ (float)0.040571, 138, 7736 },
|
|
||||||
{ (float)0.036339, 142, 7874 },
|
|
||||||
{ (float)0.036339, 142, 8016 },
|
|
||||||
{ (float)0.036339, 142, 8158 },
|
|
||||||
{ (float)0.036339, 142, 8300 },
|
|
||||||
{ (float)0.032139, 146, 8442 },
|
|
||||||
{ (float)0.032139, 146, 8588 },
|
|
||||||
{ (float)0.032139, 146, 8734 },
|
|
||||||
{ (float)0.032139, 146, 8880 },
|
|
||||||
{ (float)0.027947, 150, 9026 },
|
|
||||||
{ (float)0.027947, 150, 9176 },
|
|
||||||
{ (float)0.027947, 150, 9326 },
|
|
||||||
{ (float)0.023739, 154, 9476 },
|
|
||||||
{ (float)0.023739, 154, 9630 },
|
|
||||||
{ (float)0.023739, 154, 9784 },
|
|
||||||
{ (float)0.023739, 154, 9938 },
|
|
||||||
{ (float)0.019504, 158, 10092 },
|
|
||||||
{ (float)0.019504, 158, 10250 },
|
|
||||||
{ (float)0.019504, 158, 10408 },
|
|
||||||
{ (float)0.016976, 161, 10566 },
|
|
||||||
{ (float)0.016976, 161, 10727 },
|
|
||||||
{ (float)0.016976, 161, 10888 },
|
|
||||||
{ (float)0.016976, 161, 11049 },
|
|
||||||
{ (float)0.012639, 165, 11210 },
|
|
||||||
{ (float)0.012639, 165, 11375 },
|
|
||||||
{ (float)0.012639, 165, 11540 },
|
|
||||||
{ (float)0.009991, 168, 11705 },
|
|
||||||
{ (float)0.009991, 168, 11873 },
|
|
||||||
{ (float)0.009991, 168, 12041 },
|
|
||||||
{ (float)0.009016, 170, 12209 },
|
|
||||||
{ (float)0.009016, 170, 12379 },
|
|
||||||
{ (float)0.009016, 170, 12549 },
|
|
||||||
{ (float)0.006217, 173, 12719 },
|
|
||||||
{ (float)0.006217, 173, 12892 },
|
|
||||||
{ (float)0.005097, 175, 13065 },
|
|
||||||
{ (float)0.005097, 175, 13240 },
|
|
||||||
{ (float)0.005097, 175, 13415 },
|
|
||||||
{ (float)0.003909, 177, 13590 },
|
|
||||||
{ (float)0.003909, 177, 13767 },
|
|
||||||
{ (float)0.002340, 177, 13944 },
|
|
||||||
{ (float)0.002389, 170, 14121 },
|
|
||||||
{ (float)0.001068, 164, 14291 },
|
|
||||||
{ (float)0.001653, 157, 14455 },
|
|
||||||
{ (float)0.000717, 150, 14612 },
|
|
||||||
{ (float)0.001614, 143, 14762 },
|
|
||||||
{ (float)0.000270, 136, 14905 },
|
|
||||||
{ (float)0.000484, 129, 15041 },
|
|
||||||
{ (float)0.001103, 123, 15170 },
|
|
||||||
{ (float)0.001242, 115, 15293 },
|
|
||||||
{ (float)0.001188, 109, 15408 },
|
|
||||||
{ (float)0.001011, 103, 15517 },
|
|
||||||
{ (float)0.000709, 97, 15620 },
|
|
||||||
{ (float)0.000301, 89, 15717 },
|
|
||||||
{ (float)0.002416, 82, 15806 },
|
|
||||||
{ (float)0.003251, 76, 15888 },
|
|
||||||
{ (float)0.003246, 69, 15964 },
|
|
||||||
{ (float)0.004141, 62, 16033 },
|
|
||||||
{ (float)0.005963, 55, 16095 },
|
|
||||||
{ (float)0.008839, 47, 16150 },
|
|
||||||
{ (float)0.010490, 40, 16197 },
|
|
||||||
{ (float)0.016994, 31, 16237 },
|
|
||||||
{ (float)0.023659, 21, 16268 },
|
|
||||||
};
|
|
||||||
/*
|
|
||||||
* Local Variables:
|
|
||||||
* mode: c
|
|
||||||
* c-basic-offset: 8
|
|
||||||
* fill-column: 78
|
|
||||||
* End:
|
|
||||||
*/
|
|
||||||
Reference in New Issue
Block a user