New functionality for tiff2ps utility: splitting long images in several pages.

See http://bugzilla.remotesensing.org/show_bug.cgi?id=142 for explanation.
Patch granted by John Williams <williams@morinda.com>.
This commit is contained in:
Andrey Kiselev 2002-06-21 10:24:40 +00:00
parent f6c9c4db41
commit 68db217599
2 changed files with 150 additions and 17 deletions

View File

@ -1,4 +1,4 @@
.\" $Header: /cvs/maptools/cvsroot/libtiff/man/tiff2ps.1,v 1.3 2002-05-10 10:45:43 dron Exp $
.\" $Header: /cvs/maptools/cvsroot/libtiff/man/tiff2ps.1,v 1.4 2002-06-21 10:24:40 dron Exp $
.\"
.\" Copyright (c) 1988-1997 Sam Leffler
.\" Copyright (c) 1991-1997 Silicon Graphics, Inc.
@ -113,11 +113,23 @@ Force the generation of Encapsulated \*(Ps.
.B \-h
Specify the vertical size of the printed area (in inches).
.TP
.B \-H
Specify the maximum height of image (in inches). Images with larger sizes will
be splitted in several pages. Option
.B \-L
may be used for specifying size of splitted images overlapping.
.TP
.B \-i
Enable/disable pixel interpolation. This option requires a
single numeric value: zero to disable pixel interpolation and
non-zero to enable. The default is enabled.
.TP
.B \-L
Specify the size of overlapping for splitted images (in inches). Used in
conjuction with
.B \-H
option.
.TP
.B \-m
Where possible render using the
.B imagemask
@ -179,6 +191,24 @@ tiff2ps -d 1 foo.tif
.fi
.RE
(notice that directories are numbered starting at zero.)
.PP
If you have a long image, it may be splitted in several pages:
.RS
.nf
tiff2ps -h11 -w8.5 -H14 -L.5 foo.tif > foo.ps
.fi
.RE
The page size is set to 8.5x11 by
.B \-w
and
.B \-h
options. We will accept a small amount of vertical compression, so
.B \-H
set to 14. Any pages between 11 and 14 inches will be fit onto one page.
Pages longer than 14 inches are cut off at 11 and continued on the next
page. The
.B \-L.5
option says to repeat a half inch on the next page (to improve readability).
.SH BUGS
Because \*(Ps does not support the notion of a colormap,
8-bit palette images produce 24-bit \*(Ps images.

View File

@ -1,4 +1,4 @@
/* $Header: /cvs/maptools/cvsroot/libtiff/tools/tiff2ps.c,v 1.7 2002-06-02 11:41:23 dron Exp $ */
/* $Header: /cvs/maptools/cvsroot/libtiff/tools/tiff2ps.c,v 1.8 2002-06-21 10:24:40 dron Exp $ */
/*
* Copyright (c) 1988-1997 Sam Leffler
@ -107,6 +107,8 @@ int generateEPSF = TRUE; /* generate Encapsulated PostScript */
int PSduplex = FALSE; /* enable duplex printing */
int PStumble = FALSE; /* enable top edge binding */
int PSavoiddeadzone = TRUE; /* enable avoiding printer deadzone */
float maxPageHeight = 0; /* maximum size to fit on page */
float splitOverlap = 0; /* amount for split pages to overlag */
char *filename; /* input filename */
int useImagemask = FALSE; /* Use imagemask instead of image operator */
uint16 res_unit = 0; /* Resolution units: 1 - inches, 2 - cm*/
@ -150,7 +152,7 @@ main(int argc, char* argv[])
extern int optind;
FILE* output = stdout;
while ((c = getopt(argc, argv, "h:i:w:d:o:O:acemnzps128DT")) != -1)
while ((c = getopt(argc, argv, "h:H:L:i:w:d:o:O:acemnzps128DT")) != -1)
switch (c) {
case 'd':
dirnum = atoi(optarg);
@ -170,6 +172,13 @@ main(int argc, char* argv[])
case 'h':
pageHeight = atof(optarg);
break;
case 'H':
maxPageHeight = atof(optarg);
if (pageHeight==0) pageHeight = maxPageHeight;
break;
case 'L':
splitOverlap = atof(optarg);
break;
case 'm':
useImagemask = TRUE;
break;
@ -362,6 +371,12 @@ PhotoshopBanner(FILE* fd, uint32 w, uint32 h, int bs, int nc, char* startline)
fprintf(fd, "\"\n");
}
/*
* pw : image width in pixels
* ph : image height in pixels
* pprw : image width in PS units (72 dpi)
* pprh : image height in PS units (72 dpi)
*/
static void
setupPageState(TIFF* tif, uint32* pw, uint32* ph, float* pprw, float* pprh)
{
@ -410,6 +425,75 @@ static tsize_t tf_rowsperstrip;
static tsize_t tf_numberstrips;
static char *hex = "0123456789abcdef";
/*
* imagewidth & imageheight are 1/72 inches
* pagewidth & pageheight are inches
*/
int
PlaceImage(FILE *fp, float pagewidth, float pageheight,
float imagewidth, float imageheight, int splitpage)
{
float xtran = 0;
float ytran = 0;
float xscale = 1;
float yscale = 1;
float subimageheight;
float splitheight;
float overlap;
pagewidth *= PS_UNIT_SIZE;
pageheight *= PS_UNIT_SIZE;
if (maxPageHeight==0)
splitheight = 0;
else
splitheight = maxPageHeight * PS_UNIT_SIZE;
overlap = splitOverlap * PS_UNIT_SIZE;
/*
* WIDTH:
* if too wide, scrunch to fit
* else leave it alone
*/
if (imagewidth <= pagewidth) {
xscale = imagewidth;
} else {
xscale = pagewidth;
}
/* HEIGHT:
* if too long, scrunch to fit
* if too short, move to top of page
*/
if (imageheight <= pageheight) {
yscale = imageheight;
ytran = pageheight - imageheight;
} else if (imageheight > pageheight &&
(splitheight == 0 || imageheight <= splitheight)) {
yscale = pageheight;
} else /* imageheight > splitheight */ {
subimageheight = imageheight - (pageheight-overlap)*splitpage;
if (subimageheight <= pageheight) {
yscale = imageheight;
ytran = pageheight - subimageheight;
splitpage = 0;
} else if ( subimageheight > pageheight && subimageheight <= splitheight) {
yscale = imageheight * pageheight / subimageheight;
ytran = 0;
splitpage = 0;
} else /* sumimageheight > splitheight */ {
yscale = imageheight;
ytran = pageheight - subimageheight;
splitpage++;
}
}
fprintf(fp,"%f %f translate\n",xtran,ytran);
fprintf(fp,"%f %f scale\n",xscale,yscale);
return splitpage;
}
/* returns the sequence number of the page processed */
int
@ -421,6 +505,7 @@ TIFF2PS(FILE* fd, TIFF* tif, float pw, float ph)
uint32 subfiletype;
uint16* sampleinfo;
static int npages = 0;
int split;
if (!TIFFGetField(tif, TIFFTAG_XPOSITION, &ox))
ox = 0;
@ -469,14 +554,30 @@ TIFF2PS(FILE* fd, TIFF* tif, float pw, float ph)
fprintf(fd, "gsave\n");
fprintf(fd, "100 dict begin\n");
if (pw != 0 && ph != 0) {
/* NB: maintain image aspect ratio */
scale = (pw*PS_UNIT_SIZE/prw) < (ph*PS_UNIT_SIZE/prh) ?
(pw*PS_UNIT_SIZE/prw) :
(ph*PS_UNIT_SIZE/prh);
if (scale > 1.0)
scale = 1.0;
fprintf(fd, "0 %f translate\n", ph*PS_UNIT_SIZE-prh*scale);
fprintf(fd, "%f %f scale\n", prw*scale, prh*scale);
if (maxPageHeight) { /* used -H option */
split = PlaceImage(fd,pw,ph,prw,prh,0);
while( split ) {
PSpage(fd, tif, w, h);
fprintf(fd, "end\n");
fprintf(fd, "grestore\n");
fprintf(fd, "showpage\n");
npages++;
fprintf(fd, "%%%%Page: %d %d\n", npages, npages);
fprintf(fd, "gsave\n");
fprintf(fd, "100 dict begin\n");
split = PlaceImage(fd,pw,ph,prw,prh,split);
}
} else {
/* NB: maintain image aspect ratio */
scale = (pw*PS_UNIT_SIZE/prw) < (ph*PS_UNIT_SIZE/prh) ?
(pw*PS_UNIT_SIZE/prw) :
(ph*PS_UNIT_SIZE/prh);
if (scale > 1.0)
scale = 1.0;
fprintf(fd, "0 %f translate\n",
ph*PS_UNIT_SIZE-prh*scale);
fprintf(fd, "%f %f scale\n", prw*scale, prh*scale);
}
} else
fprintf(fd, "%f %f scale\n", prw, prh);
PSpage(fd, tif, w, h);
@ -961,8 +1062,8 @@ PS_Lvl2page(FILE* fd, TIFF* tif, uint32 w, uint32 h)
tsize_t chunk_size, byte_count;
#if defined( EXP_ASCII85ENCODER )
int ascii85_l; /* Length, in bytes, of ascii85_p[] data */
uint8 * ascii85_p = 0; /* Holds ASCII85 encoded data */
int ascii85_l; /* Length, in bytes, of ascii85_p[] data */
uint8 * ascii85_p = 0; /* Holds ASCII85 encoded data */
#endif
PS_Lvl2colorspace(fd, tif);
@ -1370,8 +1471,8 @@ PSDataBW(FILE* fd, TIFF* tif, uint32 w, uint32 h)
tstrip_t s;
#if defined( EXP_ASCII85ENCODER )
int ascii85_l; /* Length, in bytes, of ascii85_p[] data */
uint8 * ascii85_p = 0; /* Holds ASCII85 encoded data */
int ascii85_l; /* Length, in bytes, of ascii85_p[] data */
uint8 *ascii85_p = 0; /* Holds ASCII85 encoded data */
#endif
(void) w; (void) h;
@ -1772,21 +1873,23 @@ char* stuff[] = {
" -1 generate PostScript Level I (default)",
" -2 generate PostScript Level II",
" -8 disable use of ASCII85 encoding with PostScript Level II",
" -a convert all directories in file (default is first)",
" -n override resolution units as inches",
" -c override resolution units as centimeters",
" -d # convert directory number #",
" -D enable duplex printing (two pages per sheet of paper)",
" -e generate Encapsulated PostScript (EPS)",
" -h # assume printed page height is # inches (default 11)",
" -w # assume printed page width is # inches (default 8.5)",
" -H # split image if height is more than # inches",
" -L # overLap split images by # inches",
" -i # enable/disable (Nz/0) pixel interpolation (default: enable)",
" -m use \"imagemask\" operator instead of \"image\"",
" -o # convert directory at file offset #",
" -O file write PostScript to file instead of standard output",
" -a convert all directories in file (default is first)",
" -p generate regular PostScript",
" -s generate PostScript for a single image",
" -T print pages for top edge binding",
" -w # assume printed page width is # inches (default 8.5)",
" -z enable printing in the deadzone (only for PostScript Level II)",
NULL
};