tiff write sets page number

tiffsave sets `PAGENUMBER` and `FILETYPE_PAGE`, thanks jclavoie-jive

see https://github.com/libvips/libvips/issues/1565
This commit is contained in:
John Cupitt 2020-03-08 11:06:19 +00:00
parent a592d99bb2
commit 03399b4d7e
2 changed files with 42 additions and 19 deletions

View File

@ -14,6 +14,7 @@
- revise gifload to fix BACKGROUND and PREVIOUS dispose [alon-ne] - revise gifload to fix BACKGROUND and PREVIOUS dispose [alon-ne]
- add subsample_mode, deprecate no_subsample in jpegsave [Elad-Laufer] - add subsample_mode, deprecate no_subsample in jpegsave [Elad-Laufer]
- add vips_isdirf() - add vips_isdirf()
- add PAGENUMBER support to tiff write [jclavoie-jive]
31/1/19 started 8.9.2 31/1/19 started 8.9.2
- fix a deadlock with --vips-leak [DarthSim] - fix a deadlock with --vips-leak [DarthSim]

View File

@ -191,6 +191,8 @@
* - add "depth" to set pyr depth * - add "depth" to set pyr depth
* 27/1/20 * 27/1/20
* - write XYZ images as logluv * - write XYZ images as logluv
* 7/2/20 [jclavoie-jive]
* - add PAGENUMBER support
*/ */
/* /*
@ -334,10 +336,13 @@ struct _Wtiff {
VipsForeignDzDepth depth; /* Pyr depth */ VipsForeignDzDepth depth; /* Pyr depth */
/* True if we've detected a toilet-roll image, plus the page height, /* True if we've detected a toilet-roll image, plus the page height,
* which has been checked to be a factor of im->Ysize. * which has been checked to be a factor of im->Ysize. page_number
* starts at zero and ticks up as we write each page.
*/ */
gboolean toilet_roll; gboolean toilet_roll;
int page_height; int page_height;
int page_number;
int n_pages;
/* The height of the TIFF we write. Equal to page_height in toilet /* The height of the TIFF we write. Equal to page_height in toilet
* roll mode. * roll mode.
@ -779,6 +784,15 @@ wtiff_write_header( Wtiff *wtiff, Layer *layer )
*/ */
TIFFSetField( tif, TIFFTAG_SUBFILETYPE, FILETYPE_REDUCEDIMAGE ); TIFFSetField( tif, TIFFTAG_SUBFILETYPE, FILETYPE_REDUCEDIMAGE );
if( wtiff->toilet_roll ) {
/* One page of many.
*/
TIFFSetField( tif, TIFFTAG_SUBFILETYPE, FILETYPE_PAGE );
TIFFSetField( tif, TIFFTAG_PAGENUMBER,
wtiff->page_number, wtiff->n_pages );
}
/* Sample format. /* Sample format.
* *
* Don't set for logluv: libtiff does this for us. * Don't set for logluv: libtiff does this for us.
@ -1052,6 +1066,8 @@ wtiff_new( VipsImage *input, const char *filename,
wtiff->depth = depth; wtiff->depth = depth;
wtiff->toilet_roll = FALSE; wtiff->toilet_roll = FALSE;
wtiff->page_height = vips_image_get_page_height( input ); wtiff->page_height = vips_image_get_page_height( input );
wtiff->page_number = 0;
wtiff->n_pages = 1;
wtiff->image_height = input->Ysize; wtiff->image_height = input->Ysize;
/* Any pre-processing on the image. /* Any pre-processing on the image.
@ -1079,6 +1095,7 @@ wtiff_new( VipsImage *input, const char *filename,
wtiff->toilet_roll = TRUE; wtiff->toilet_roll = TRUE;
wtiff->image_height = wtiff->page_height; wtiff->image_height = wtiff->page_height;
wtiff->n_pages = wtiff->ready->Ysize / wtiff->page_height;
/* We can't pyramid toilet roll images. /* We can't pyramid toilet roll images.
*/ */
@ -1738,8 +1755,9 @@ write_strip( VipsRegion *region, VipsRect *area, void *a )
static int static int
wtiff_copy_tiff( Wtiff *wtiff, TIFF *out, TIFF *in ) wtiff_copy_tiff( Wtiff *wtiff, TIFF *out, TIFF *in )
{ {
uint32 i32; uint32 ui32;
uint16 i16; uint16 ui16;
uint16 ui16_2;
float f; float f;
tdata_t buf; tdata_t buf;
ttile_t tile; ttile_t tile;
@ -1748,25 +1766,28 @@ wtiff_copy_tiff( Wtiff *wtiff, TIFF *out, TIFF *in )
/* All the fields we might have set. /* All the fields we might have set.
*/ */
CopyField( TIFFTAG_IMAGEWIDTH, i32 ); CopyField( TIFFTAG_IMAGEWIDTH, ui32 );
CopyField( TIFFTAG_IMAGELENGTH, i32 ); CopyField( TIFFTAG_IMAGELENGTH, ui32 );
CopyField( TIFFTAG_PLANARCONFIG, i16 ); CopyField( TIFFTAG_PLANARCONFIG, ui16 );
CopyField( TIFFTAG_ORIENTATION, i16 ); CopyField( TIFFTAG_ORIENTATION, ui16 );
CopyField( TIFFTAG_XRESOLUTION, f ); CopyField( TIFFTAG_XRESOLUTION, f );
CopyField( TIFFTAG_YRESOLUTION, f ); CopyField( TIFFTAG_YRESOLUTION, f );
CopyField( TIFFTAG_RESOLUTIONUNIT, i16 ); CopyField( TIFFTAG_RESOLUTIONUNIT, ui16 );
CopyField( TIFFTAG_COMPRESSION, i16 ); CopyField( TIFFTAG_COMPRESSION, ui16 );
CopyField( TIFFTAG_SAMPLESPERPIXEL, i16 ); CopyField( TIFFTAG_SAMPLESPERPIXEL, ui16 );
CopyField( TIFFTAG_BITSPERSAMPLE, i16 ); CopyField( TIFFTAG_BITSPERSAMPLE, ui16 );
CopyField( TIFFTAG_PHOTOMETRIC, i16 ); CopyField( TIFFTAG_PHOTOMETRIC, ui16 );
CopyField( TIFFTAG_ORIENTATION, i16 ); CopyField( TIFFTAG_ORIENTATION, ui16 );
CopyField( TIFFTAG_TILEWIDTH, i32 ); CopyField( TIFFTAG_TILEWIDTH, ui32 );
CopyField( TIFFTAG_TILELENGTH, i32 ); CopyField( TIFFTAG_TILELENGTH, ui32 );
CopyField( TIFFTAG_ROWSPERSTRIP, i32 ); CopyField( TIFFTAG_ROWSPERSTRIP, ui32 );
CopyField( TIFFTAG_SUBFILETYPE, i32 ); CopyField( TIFFTAG_SUBFILETYPE, ui32 );
if( TIFFGetField( in, TIFFTAG_EXTRASAMPLES, &i16, &a ) ) if( TIFFGetField( in, TIFFTAG_EXTRASAMPLES, &ui16, &a ) )
TIFFSetField( out, TIFFTAG_EXTRASAMPLES, i16, a ); TIFFSetField( out, TIFFTAG_EXTRASAMPLES, ui16, a );
if( TIFFGetField( in, TIFFTAG_PAGENUMBER, &ui16, &ui16_2 ) )
TIFFSetField( out, TIFFTAG_PAGENUMBER, ui16, ui16_2 );
/* TIFFTAG_JPEGQUALITY is a pesudo-tag, so we can't copy it. /* TIFFTAG_JPEGQUALITY is a pesudo-tag, so we can't copy it.
* Set explicitly from Wtiff. * Set explicitly from Wtiff.
@ -1912,6 +1933,7 @@ wtiff_write_image( Wtiff *wtiff )
} }
g_object_unref( page ); g_object_unref( page );
wtiff->page_number += 1;
y += wtiff->page_height; y += wtiff->page_height;
if( y >= wtiff->ready->Ysize ) if( y >= wtiff->ready->Ysize )
break; break;