/* * 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 *tif, uint32_t strip); int TIFFFillTile(TIFF *tif, uint32_t tile); static int TIFFStartStrip(TIFF *tif, uint32_t strip); static int TIFFStartTile(TIFF *tif, uint32_t tile); static int TIFFCheckRead(TIFF *, int); static tmsize_t TIFFReadRawStrip1(TIFF *tif, uint32_t strip, void *buf, tmsize_t size, const char *module); static tmsize_t TIFFReadRawTile1(TIFF *tif, uint32_t tile, void *buf, tmsize_t size, const char *module); #define NOSTRIP … #define NOTILE … #define INITIAL_THRESHOLD … #define THRESHOLD_MULTIPLIER … #define MAX_THRESHOLD … #define TIFF_INT64_MAX … /* Read 'size' bytes in tif_rawdata buffer starting at offset 'rawdata_offset' * Returns 1 in case of success, 0 otherwise. */ static int TIFFReadAndRealloc(TIFF *tif, tmsize_t size, tmsize_t rawdata_offset, int is_strip, uint32_t strip_or_tile, const char *module) { … } static int TIFFFillStripPartial(TIFF *tif, int strip, tmsize_t read_ahead, int restart) { … } /* * Seek to a random row+sample in a file. * * Only used by TIFFReadScanline, and is only used on * strip organized files. We do some tricky stuff to try * and avoid reading the whole compressed raw data for big * strips. */ static int TIFFSeek(TIFF *tif, uint32_t row, uint16_t sample) { … } int TIFFReadScanline(TIFF *tif, void *buf, uint32_t row, uint16_t sample) { … } /* * Calculate the strip size according to the number of * rows in the strip (check for truncated last strip on any * of the separations). */ static tmsize_t TIFFReadEncodedStripGetStripSize(TIFF *tif, uint32_t strip, uint16_t *pplane) { … } /* * Read a strip of data and decompress the specified * amount into the user-supplied buffer. */ tmsize_t TIFFReadEncodedStrip(TIFF *tif, uint32_t strip, void *buf, tmsize_t size) { … } /* Variant of TIFFReadEncodedStrip() that does * * if *buf == NULL, *buf = _TIFFmallocExt(tif, bufsizetoalloc) only after * TIFFFillStrip() has succeeded. This avoid excessive memory allocation in case * of truncated file. * * calls regular TIFFReadEncodedStrip() if *buf != NULL */ tmsize_t _TIFFReadEncodedStripAndAllocBuffer(TIFF *tif, uint32_t strip, void **buf, tmsize_t bufsizetoalloc, tmsize_t size_to_read) { … } static tmsize_t TIFFReadRawStrip1(TIFF *tif, uint32_t strip, void *buf, tmsize_t size, const char *module) { … } static tmsize_t TIFFReadRawStripOrTile2(TIFF *tif, uint32_t strip_or_tile, int is_strip, tmsize_t size, const char *module) { … } /* * Read a strip of data from the file. */ tmsize_t TIFFReadRawStrip(TIFF *tif, uint32_t strip, void *buf, tmsize_t size) { … } TIFF_NOSANITIZE_UNSIGNED_INT_OVERFLOW static uint64_t NoSanitizeSubUInt64(uint64_t a, uint64_t b) { … } /* * Read the specified strip and setup for decoding. The data buffer is * expanded, as necessary, to hold the strip's data. */ int TIFFFillStrip(TIFF *tif, uint32_t 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. */ tmsize_t TIFFReadTile(TIFF *tif, void *buf, uint32_t x, uint32_t y, uint32_t z, uint16_t s) { … } /* * Read a tile of data and decompress the specified * amount into the user-supplied buffer. */ tmsize_t TIFFReadEncodedTile(TIFF *tif, uint32_t tile, void *buf, tmsize_t size) { … } /* Variant of TIFFReadTile() that does * * if *buf == NULL, *buf = _TIFFmallocExt(tif, bufsizetoalloc) only after * TIFFFillTile() has succeeded. This avoid excessive memory allocation in case * of truncated file. * * calls regular TIFFReadEncodedTile() if *buf != NULL */ tmsize_t _TIFFReadTileAndAllocBuffer(TIFF *tif, void **buf, tmsize_t bufsizetoalloc, uint32_t x, uint32_t y, uint32_t z, uint16_t s) { … } /* Variant of TIFFReadEncodedTile() that does * * if *buf == NULL, *buf = _TIFFmallocExt(tif, bufsizetoalloc) only after * TIFFFillTile() has succeeded. This avoid excessive memory allocation in case * of truncated file. * * calls regular TIFFReadEncodedTile() if *buf != NULL */ tmsize_t _TIFFReadEncodedTileAndAllocBuffer(TIFF *tif, uint32_t tile, void **buf, tmsize_t bufsizetoalloc, tmsize_t size_to_read) { … } static tmsize_t TIFFReadRawTile1(TIFF *tif, uint32_t tile, void *buf, tmsize_t size, const char *module) { … } /* * Read a tile of data from the file. */ tmsize_t TIFFReadRawTile(TIFF *tif, uint32_t tile, void *buf, tmsize_t size) { … } /* * Read the specified tile and setup for decoding. The data buffer is * expanded, as necessary, to hold the tile's data. */ int TIFFFillTile(TIFF *tif, uint32_t 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, void *bp, tmsize_t size) { … } /* * Set state to appear as if a * strip has just been read in. */ static int TIFFStartStrip(TIFF *tif, uint32_t strip) { … } /* * Set state to appear as if a * tile has just been read in. */ static int TIFFStartTile(TIFF *tif, uint32_t tile) { … } static int TIFFCheckRead(TIFF *tif, int tiles) { … } /* Use the provided input buffer (inbuf, insize) and decompress it into * (outbuf, outsize). * This function replaces the use of * TIFFReadEncodedStrip()/TIFFReadEncodedTile() when the user can provide the * buffer for the input data, for example when he wants to avoid libtiff to read * the strile offset/count values from the [Strip|Tile][Offsets/ByteCounts] * array. inbuf content must be writable (if bit reversal is needed) Returns 1 * in case of success, 0 otherwise. */ int TIFFReadFromUserBuffer(TIFF *tif, uint32_t strile, void *inbuf, tmsize_t insize, void *outbuf, tmsize_t outsize) { … } void _TIFFNoPostDecode(TIFF *tif, uint8_t *buf, tmsize_t cc) { … } void _TIFFSwab16BitData(TIFF *tif, uint8_t *buf, tmsize_t cc) { … } void _TIFFSwab24BitData(TIFF *tif, uint8_t *buf, tmsize_t cc) { … } void _TIFFSwab32BitData(TIFF *tif, uint8_t *buf, tmsize_t cc) { … } void _TIFFSwab64BitData(TIFF *tif, uint8_t *buf, tmsize_t cc) { … }