Commit files that should have gone with previous commit
This commit is contained in:
parent
c2be1447d9
commit
9129c40f98
@ -1,4 +1,4 @@
|
||||
/* $Id: tif_getimage.c,v 1.109 2017-06-30 13:11:18 erouault Exp $ */
|
||||
/* $Id: tif_getimage.c,v 1.110 2017-07-04 13:28:42 erouault Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1991-1997 Sam Leffler
|
||||
@ -626,7 +626,7 @@ gtTileContig(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h)
|
||||
uint32 col, row, y, rowstoread;
|
||||
tmsize_t pos;
|
||||
uint32 tw, th;
|
||||
unsigned char* buf;
|
||||
unsigned char* buf = NULL;
|
||||
int32 fromskew, toskew;
|
||||
uint32 nrow;
|
||||
int ret = 1, flip;
|
||||
@ -634,13 +634,14 @@ gtTileContig(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h)
|
||||
int32 this_toskew, leftmost_toskew;
|
||||
int32 leftmost_fromskew;
|
||||
uint32 leftmost_tw;
|
||||
tmsize_t bufsize;
|
||||
|
||||
buf = (unsigned char*) _TIFFmalloc(TIFFTileSize(tif));
|
||||
if (buf == 0) {
|
||||
TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "%s", "No space for tile buffer");
|
||||
return (0);
|
||||
bufsize = TIFFTileSize(tif);
|
||||
if (bufsize == 0) {
|
||||
TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "%s", "No space for tile buffer");
|
||||
return (0);
|
||||
}
|
||||
_TIFFmemset(buf, 0, TIFFTileSize(tif));
|
||||
|
||||
TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tw);
|
||||
TIFFGetField(tif, TIFFTAG_TILELENGTH, &th);
|
||||
|
||||
@ -671,8 +672,9 @@ gtTileContig(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h)
|
||||
col = img->col_offset;
|
||||
while (tocol < w)
|
||||
{
|
||||
if (TIFFReadTile(tif, buf, col,
|
||||
row+img->row_offset, 0, 0)==(tmsize_t)(-1) && img->stoponerr)
|
||||
if (_TIFFReadTileAndAllocBuffer(tif, (void**) &buf, bufsize, col,
|
||||
row+img->row_offset, 0, 0)==(tmsize_t)(-1) &&
|
||||
(buf == NULL || img->stoponerr))
|
||||
{
|
||||
ret = 0;
|
||||
break;
|
||||
@ -737,11 +739,11 @@ gtTileSeparate(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h)
|
||||
uint32 col, row, y, rowstoread;
|
||||
tmsize_t pos;
|
||||
uint32 tw, th;
|
||||
unsigned char* buf;
|
||||
unsigned char* p0;
|
||||
unsigned char* p1;
|
||||
unsigned char* p2;
|
||||
unsigned char* pa;
|
||||
unsigned char* buf = NULL;
|
||||
unsigned char* p0 = NULL;
|
||||
unsigned char* p1 = NULL;
|
||||
unsigned char* p2 = NULL;
|
||||
unsigned char* pa = NULL;
|
||||
tmsize_t tilesize;
|
||||
tmsize_t bufsize;
|
||||
int32 fromskew, toskew;
|
||||
@ -760,16 +762,7 @@ gtTileSeparate(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h)
|
||||
TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "Integer overflow in %s", "gtTileSeparate");
|
||||
return (0);
|
||||
}
|
||||
buf = (unsigned char*) _TIFFmalloc(bufsize);
|
||||
if (buf == 0) {
|
||||
TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "%s", "No space for tile buffer");
|
||||
return (0);
|
||||
}
|
||||
_TIFFmemset(buf, 0, bufsize);
|
||||
p0 = buf;
|
||||
p1 = p0 + tilesize;
|
||||
p2 = p1 + tilesize;
|
||||
pa = (alpha?(p2+tilesize):NULL);
|
||||
|
||||
TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tw);
|
||||
TIFFGetField(tif, TIFFTAG_TILELENGTH, &th);
|
||||
|
||||
@ -789,7 +782,6 @@ gtTileSeparate(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h)
|
||||
case PHOTOMETRIC_MINISBLACK:
|
||||
case PHOTOMETRIC_PALETTE:
|
||||
colorchannels = 1;
|
||||
p2 = p1 = p0;
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -814,7 +806,30 @@ gtTileSeparate(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h)
|
||||
col = img->col_offset;
|
||||
while (tocol < w)
|
||||
{
|
||||
if (TIFFReadTile(tif, p0, col,
|
||||
if( buf == NULL )
|
||||
{
|
||||
if (_TIFFReadTileAndAllocBuffer(
|
||||
tif, (void**) &buf, bufsize, col,
|
||||
row+img->row_offset,0,0)==(tmsize_t)(-1)
|
||||
&& (buf == NULL || img->stoponerr))
|
||||
{
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
p0 = buf;
|
||||
if( colorchannels == 1 )
|
||||
{
|
||||
p2 = p1 = p0;
|
||||
pa = (alpha?(p0+3*tilesize):NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
p1 = p0 + tilesize;
|
||||
p2 = p1 + tilesize;
|
||||
pa = (alpha?(p2+tilesize):NULL);
|
||||
}
|
||||
}
|
||||
else if (TIFFReadTile(tif, p0, col,
|
||||
row+img->row_offset,0,0)==(tmsize_t)(-1) && img->stoponerr)
|
||||
{
|
||||
ret = 0;
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $Id: tif_read.c,v 1.63 2017-07-02 14:13:39 erouault Exp $ */
|
||||
/* $Id: tif_read.c,v 1.64 2017-07-04 13:28:42 erouault Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988-1997 Sam Leffler
|
||||
@ -1014,6 +1014,77 @@ TIFFReadEncodedTile(TIFF* tif, uint32 tile, void* buf, tmsize_t size)
|
||||
return ((tmsize_t)(-1));
|
||||
}
|
||||
|
||||
/* Variant of TIFFReadTile() that does
|
||||
* * if *buf == NULL, *buf = _TIFFmalloc(bufsizetoalloc) only after TIFFFillTile() has
|
||||
* suceeded. This avoid excessive memory allocation in case of truncated
|
||||
* file.
|
||||
* * calls regular TIFFReadEncodedTile() if *buf != NULL
|
||||
*/
|
||||
tmsize_t
|
||||
_TIFFReadTileAndAllocBuffer(TIFF* tif,
|
||||
void **buf, tmsize_t bufsizetoalloc,
|
||||
uint32 x, uint32 y, uint32 z, uint16 s)
|
||||
{
|
||||
if (!TIFFCheckRead(tif, 1) || !TIFFCheckTile(tif, x, y, z, s))
|
||||
return ((tmsize_t)(-1));
|
||||
return (_TIFFReadEncodedTileAndAllocBuffer(tif,
|
||||
TIFFComputeTile(tif, x, y, z, s),
|
||||
buf, bufsizetoalloc,
|
||||
(tmsize_t)(-1)));
|
||||
}
|
||||
|
||||
/* Variant of TIFFReadEncodedTile() that does
|
||||
* * if *buf == NULL, *buf = _TIFFmalloc(bufsizetoalloc) only after TIFFFillTile() has
|
||||
* suceeded. This avoid excessive memory allocation in case of truncated
|
||||
* file.
|
||||
* * calls regular TIFFReadEncodedTile() if *buf != NULL
|
||||
*/
|
||||
tmsize_t
|
||||
_TIFFReadEncodedTileAndAllocBuffer(TIFF* tif, uint32 tile,
|
||||
void **buf, tmsize_t bufsizetoalloc,
|
||||
tmsize_t size_to_read)
|
||||
{
|
||||
static const char module[] = "_TIFFReadEncodedTileAndAllocBuffer";
|
||||
TIFFDirectory *td = &tif->tif_dir;
|
||||
tmsize_t tilesize = tif->tif_tilesize;
|
||||
|
||||
if( *buf != NULL )
|
||||
{
|
||||
return TIFFReadEncodedTile(tif, tile, *buf, size_to_read);
|
||||
}
|
||||
|
||||
if (!TIFFCheckRead(tif, 1))
|
||||
return ((tmsize_t)(-1));
|
||||
if (tile >= td->td_nstrips) {
|
||||
TIFFErrorExt(tif->tif_clientdata, module,
|
||||
"%lu: Tile out of range, max %lu",
|
||||
(unsigned long) tile, (unsigned long) td->td_nstrips);
|
||||
return ((tmsize_t)(-1));
|
||||
}
|
||||
|
||||
if (!TIFFFillTile(tif,tile))
|
||||
return((tmsize_t)(-1));
|
||||
|
||||
*buf = _TIFFmalloc(bufsizetoalloc);
|
||||
if (*buf == NULL) {
|
||||
TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif),
|
||||
"No space for tile buffer");
|
||||
return((tmsize_t)(-1));
|
||||
}
|
||||
_TIFFmemset(*buf, 0, bufsizetoalloc);
|
||||
|
||||
if (size_to_read == (tmsize_t)(-1))
|
||||
size_to_read = tilesize;
|
||||
else if (size_to_read > tilesize)
|
||||
size_to_read = tilesize;
|
||||
if( (*tif->tif_decodetile)(tif,
|
||||
(uint8*) *buf, size_to_read, (uint16)(tile/td->td_stripsperimage))) {
|
||||
(*tif->tif_postdecode)(tif, (uint8*) *buf, size_to_read);
|
||||
return (size_to_read);
|
||||
} else
|
||||
return ((tmsize_t)(-1));
|
||||
}
|
||||
|
||||
static tmsize_t
|
||||
TIFFReadRawTile1(TIFF* tif, uint32 tile, void* buf, tmsize_t size, const char* module)
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $Id: tiffiop.h,v 1.93 2017-06-30 13:11:18 erouault Exp $ */
|
||||
/* $Id: tiffiop.h,v 1.94 2017-07-04 13:28:42 erouault Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988-1997 Sam Leffler
|
||||
@ -376,6 +376,14 @@ extern tmsize_t
|
||||
_TIFFReadEncodedStripAndAllocBuffer(TIFF* tif, uint32 strip,
|
||||
void **buf, tmsize_t bufsizetoalloc,
|
||||
tmsize_t size_to_read);
|
||||
extern tmsize_t
|
||||
_TIFFReadEncodedTileAndAllocBuffer(TIFF* tif, uint32 tile,
|
||||
void **buf, tmsize_t bufsizetoalloc,
|
||||
tmsize_t size_to_read);
|
||||
extern tmsize_t
|
||||
_TIFFReadTileAndAllocBuffer(TIFF* tif,
|
||||
void **buf, tmsize_t bufsizetoalloc,
|
||||
uint32 x, uint32 y, uint32 z, uint16 s);
|
||||
|
||||
extern int TIFFInitDumpMode(TIFF*, int);
|
||||
#ifdef PACKBITS_SUPPORT
|
||||
|
Loading…
Reference in New Issue
Block a user