/* Compile with
 *
 * gcc -g -Wall repeat.c -ltiff
 */

#include <stdlib.h>
#include <stdio.h>
#include <tiffio.h>

/* Copy fields.
 */
#define CopyField( tag, v ) \
	if( TIFFGetField( in, tag, &v ) ) TIFFSetField( out, tag, v )

/* Copy a TIFF file ... we know we wrote it, so just copy the tags we know 
 * we might have set.
 */
static int
tiff_copy( TIFF *out, TIFF *in )
{
	uint32 i32;
	uint16 i16;
	int i;
	float f;
	tdata_t buf;
	ttile_t tile;
	ttile_t n;

	CopyField( TIFFTAG_IMAGEWIDTH, i32 );
	CopyField( TIFFTAG_IMAGELENGTH, i32 );
	CopyField( TIFFTAG_PLANARCONFIG, i16 );
	CopyField( TIFFTAG_ORIENTATION, i16 );
	CopyField( TIFFTAG_COMPRESSION, i16 );
	CopyField( TIFFTAG_XRESOLUTION, f );
	CopyField( TIFFTAG_YRESOLUTION, f );
	CopyField( TIFFTAG_RESOLUTIONUNIT, i16 );
	CopyField( TIFFTAG_JPEGQUALITY, i );
        CopyField( TIFFTAG_PREDICTOR, i16 );
	CopyField( TIFFTAG_SAMPLESPERPIXEL, i16 );
	CopyField( TIFFTAG_BITSPERSAMPLE, i16 );
	CopyField( TIFFTAG_PHOTOMETRIC, i16 );
	CopyField( TIFFTAG_TILEWIDTH, i32 );
	CopyField( TIFFTAG_TILELENGTH, i32 );
	CopyField( TIFFTAG_ROWSPERSTRIP, i32 );

	buf = malloc( TIFFTileSize( in ) );
	n = TIFFNumberOfTiles( in );
	for( tile = 0; tile < n; tile++ ) {
		tsize_t len;

		len = TIFFReadEncodedTile( in, tile, buf, (tsize_t) -1 );
		if( len < 0 ||
			TIFFWriteEncodedTile( out, tile, buf, len ) < 0 ) {
			free( buf );
			return( -1 );
		}
	}
	free( buf );

	if( !TIFFWriteDirectory( out ) ) 
		return( -1 );

	return( 0 );
}

int
main( int argc, char **argv )
{
	TIFF *in, *out;
	int num;
	int i;

	if( argc < 4 ) {
		printf( "usage: %s in out n-repeats\n"
			"\tcopy tiff file in into tiff file "
			"out n-repeats times\n", argv[0] );
		return( -1 );
	}

	if( !(in = TIFFOpen( argv[1], "r" )) ) {
		fprintf( stderr, "unable to open %s for input\n", argv[1] );
		return( -1 );
	}
	if( !(out = TIFFOpen( argv[2], "w" )) ) {
		fprintf( stderr, "unable to open %s for output\n", argv[2] );
		return( -1 );
	}
	num = atoi( argv[3] );

	for( i = 0; i < num; i++ ) {
		if( tiff_copy( out, in ) ) {
			fprintf( stderr, "unable to append\n" );
			return( -1 );
		}
	}
	TIFFClose( out );
	TIFFClose( in );

	return( 0 );
}

