Merge branch '8.7'

This commit is contained in:
John Cupitt 2019-04-20 17:35:39 +01:00
commit 27d8cd40fe

View File

@ -265,6 +265,7 @@ typedef struct _RtiffHeader {
*/ */
uint32 rows_per_strip; uint32 rows_per_strip;
tsize_t strip_size; tsize_t strip_size;
tsize_t scanline_size;
int number_of_strips; int number_of_strips;
/* If read_scanlinewise is TRUE, the strips are too large to read in a /* If read_scanlinewise is TRUE, the strips are too large to read in a
@ -272,12 +273,12 @@ typedef struct _RtiffHeader {
*/ */
gboolean read_scanlinewise; gboolean read_scanlinewise;
/* Strip read geometry. These are the read params as they will be used /* Strip read geometry. Number of lines we read at once (whole strip
* to read, with either TIFFReadScanline() or TIFFReadEncodedStrip(), * or 1) and size of the buffer we read to (a scanline, or a strip in
* not as they are stored in the file. * size).
*/ */
uint32 read_rows_per_strip; uint32 read_height;
tsize_t read_strip_size; tsize_t read_size;
} RtiffHeader; } RtiffHeader;
/* Scanline-type process function. /* Scanline-type process function.
@ -1756,16 +1757,15 @@ static int
rtiff_strip_read_interleaved( Rtiff *rtiff, tstrip_t strip, tdata_t buf ) rtiff_strip_read_interleaved( Rtiff *rtiff, tstrip_t strip, tdata_t buf )
{ {
int samples_per_pixel = rtiff->header.samples_per_pixel; int samples_per_pixel = rtiff->header.samples_per_pixel;
int read_rows_per_strip = rtiff->header.read_rows_per_strip; int read_height = rtiff->header.read_height;
int bits_per_sample = rtiff->header.bits_per_sample; int bits_per_sample = rtiff->header.bits_per_sample;
int strip_y = strip * read_rows_per_strip; int strip_y = strip * read_height;
if( rtiff->header.separate ) { if( rtiff->header.separate ) {
int page_width = rtiff->header.width; int page_width = rtiff->header.width;
int page_height = rtiff->header.height; int page_height = rtiff->header.height;
int strips_per_plane = 1 + (page_height - 1) / int strips_per_plane = 1 + (page_height - 1) / read_height;
read_rows_per_strip; int strip_height = VIPS_MIN( read_height,
int strip_height = VIPS_MIN( read_rows_per_strip,
page_height - strip_y ); page_height - strip_y );
int pels_per_strip = page_width * strip_height; int pels_per_strip = page_width * strip_height;
int bytes_per_sample = bits_per_sample >> 3; int bytes_per_sample = bits_per_sample >> 3;
@ -1805,9 +1805,9 @@ rtiff_stripwise_generate( VipsRegion *or,
void *seq, void *a, void *b, gboolean *stop ) void *seq, void *a, void *b, gboolean *stop )
{ {
Rtiff *rtiff = (Rtiff *) a; Rtiff *rtiff = (Rtiff *) a;
int read_rows_per_strip = rtiff->header.read_rows_per_strip; int read_height = rtiff->header.read_height;
int page_height = rtiff->header.height; int page_height = rtiff->header.height;
tsize_t scanline_size = TIFFScanlineSize( rtiff->tiff ); tsize_t scanline_size = rtiff->header.scanline_size;
VipsRect *r = &or->valid; VipsRect *r = &or->valid;
int y; int y;
@ -1833,7 +1833,7 @@ rtiff_stripwise_generate( VipsRegion *or,
* strip in the image. * strip in the image.
*/ */
g_assert( r->height == g_assert( r->height ==
VIPS_MIN( read_rows_per_strip, or->im->Ysize - r->top ) ); VIPS_MIN( read_height, or->im->Ysize - r->top ) );
/* And check that y_pos is correct. It should be, since we are inside /* And check that y_pos is correct. It should be, since we are inside
* a vips_sequential(). * a vips_sequential().
@ -1857,7 +1857,7 @@ rtiff_stripwise_generate( VipsRegion *or,
/* Strip number. /* Strip number.
*/ */
tstrip_t strip_no = y_page / read_rows_per_strip; tstrip_t strip_no = y_page / read_height;
VipsRect image, page, strip, hit; VipsRect image, page, strip, hit;
@ -1875,9 +1875,9 @@ rtiff_stripwise_generate( VipsRegion *or,
page.height = page_height; page.height = page_height;
strip.left = 0; strip.left = 0;
strip.top = page.top + strip_no * read_rows_per_strip; strip.top = page.top + strip_no * read_height;
strip.width = rtiff->out->Xsize; strip.width = rtiff->out->Xsize;
strip.height = read_rows_per_strip; strip.height = read_height;
/* Clip strip against page and image ... the final strip will /* Clip strip against page and image ... the final strip will
* be smaller. * be smaller.
@ -1987,10 +1987,10 @@ rtiff_read_stripwise( Rtiff *rtiff, VipsImage *out )
rtiff->header.strip_size ); rtiff->header.strip_size );
printf( "rtiff_read_stripwise: header.number_of_strips = %d\n", printf( "rtiff_read_stripwise: header.number_of_strips = %d\n",
rtiff->header.number_of_strips ); rtiff->header.number_of_strips );
printf( "rtiff_read_stripwise: header.read_rows_per_strip = %u\n", printf( "rtiff_read_stripwise: header.read_height = %u\n",
rtiff->header.read_rows_per_strip ); rtiff->header.read_height );
printf( "rtiff_read_stripwise: header.read_strip_size = %zd\n", printf( "rtiff_read_stripwise: header.read_size = %zd\n",
rtiff->header.read_strip_size ); rtiff->header.read_size );
#endif /*DEBUG*/ #endif /*DEBUG*/
/* Double check: in memcpy mode, the vips linesize should exactly /* Double check: in memcpy mode, the vips linesize should exactly
@ -2007,7 +2007,7 @@ rtiff_read_stripwise( Rtiff *rtiff, VipsImage *out )
else else
vips_line_size = VIPS_IMAGE_SIZEOF_LINE( t[0] ); vips_line_size = VIPS_IMAGE_SIZEOF_LINE( t[0] );
if( vips_line_size != TIFFScanlineSize( rtiff->tiff ) ) { if( vips_line_size != rtiff->header.scanline_size ) {
vips_error( "tiff2vips", vips_error( "tiff2vips",
"%s", _( "unsupported tiff image type" ) ); "%s", _( "unsupported tiff image type" ) );
return( -1 ); return( -1 );
@ -2022,7 +2022,7 @@ rtiff_read_stripwise( Rtiff *rtiff, VipsImage *out )
*/ */
if( rtiff->header.separate ) { if( rtiff->header.separate ) {
if( !(rtiff->plane_buf = vips_malloc( VIPS_OBJECT( out ), if( !(rtiff->plane_buf = vips_malloc( VIPS_OBJECT( out ),
rtiff->header.read_strip_size )) ) rtiff->header.read_size )) )
return( -1 ); return( -1 );
} }
@ -2039,7 +2039,7 @@ rtiff_read_stripwise( Rtiff *rtiff, VipsImage *out )
rtiff->n > 1 ) { rtiff->n > 1 ) {
tsize_t size; tsize_t size;
size = rtiff->header.read_strip_size; size = rtiff->header.read_size;
if( rtiff->header.separate ) if( rtiff->header.separate )
size *= rtiff->header.samples_per_pixel; size *= rtiff->header.samples_per_pixel;
@ -2056,7 +2056,7 @@ rtiff_read_stripwise( Rtiff *rtiff, VipsImage *out )
NULL, rtiff_stripwise_generate, NULL, NULL, rtiff_stripwise_generate, NULL,
rtiff, NULL ) || rtiff, NULL ) ||
vips_sequential( t[0], &t[1], vips_sequential( t[0], &t[1],
"tile_height", rtiff->header.read_rows_per_strip, "tile_height", rtiff->header.read_height,
NULL ) || NULL ) ||
rtiff_autorotate( rtiff, t[1], &t[2] ) || rtiff_autorotate( rtiff, t[1], &t[2] ) ||
rtiff_unpremultiply( rtiff, t[2], &t[3] ) || rtiff_unpremultiply( rtiff, t[2], &t[3] ) ||
@ -2153,14 +2153,15 @@ rtiff_header_read( Rtiff *rtiff, RtiffHeader *header )
header->rows_per_strip = 0; header->rows_per_strip = 0;
header->strip_size = 0; header->strip_size = 0;
header->number_of_strips = 0; header->number_of_strips = 0;
header->read_rows_per_strip = 0; header->read_height = 0;
header->read_strip_size = 0; header->read_size = 0;
} }
else { else {
if( !tfget32( rtiff->tiff, if( !tfget32( rtiff->tiff,
TIFFTAG_ROWSPERSTRIP, &header->rows_per_strip ) ) TIFFTAG_ROWSPERSTRIP, &header->rows_per_strip ) )
return( -1 ); return( -1 );
header->strip_size = TIFFStripSize( rtiff->tiff ); header->strip_size = TIFFStripSize( rtiff->tiff );
header->scanline_size = TIFFScanlineSize( rtiff->tiff );
header->number_of_strips = TIFFNumberOfStrips( rtiff->tiff ); header->number_of_strips = TIFFNumberOfStrips( rtiff->tiff );
/* libtiff has two strip-wise readers. TIFFReadEncodedStrip() /* libtiff has two strip-wise readers. TIFFReadEncodedStrip()
@ -2184,9 +2185,8 @@ rtiff_header_read( Rtiff *rtiff, RtiffHeader *header )
header->photometric_interpretation != header->photometric_interpretation !=
PHOTOMETRIC_YCBCR ) { PHOTOMETRIC_YCBCR ) {
header->read_scanlinewise = TRUE; header->read_scanlinewise = TRUE;
header->read_rows_per_strip = 1; header->read_height = 1;
header->read_strip_size = header->read_size = rtiff->header.scanline_size;
TIFFScanlineSize( rtiff->tiff );
} }
else { else {
header->read_scanlinewise = FALSE; header->read_scanlinewise = FALSE;
@ -2197,11 +2197,9 @@ rtiff_header_read( Rtiff *rtiff, RtiffHeader *header )
* *
* And it musn't be zero. * And it musn't be zero.
*/ */
header->read_rows_per_strip = header->read_height = VIPS_CLIP( 1,
VIPS_CLIP( 1, header->rows_per_strip, header->height );
header->rows_per_strip, header->read_size = header->strip_size;
header->height );
header->read_strip_size = header->strip_size;
} }
/* Stop some compiler warnings. /* Stop some compiler warnings.
@ -2240,8 +2238,8 @@ rtiff_header_equal( RtiffHeader *h1, RtiffHeader *h2 )
return( 0 ); return( 0 );
} }
else { else {
if( h1->read_rows_per_strip != h2->read_rows_per_strip || if( h1->read_height != h2->read_height ||
h1->read_strip_size != h2->read_strip_size || h1->read_size != h2->read_size ||
h1->number_of_strips != h2->number_of_strips ) h1->number_of_strips != h2->number_of_strips )
return( 0 ); return( 0 );
} }