Blame tools/fax2ps.c

Packit 7838c8
/* $Id: fax2ps.c,v 1.31 2015-09-06 18:24:27 bfriesen Exp $" */
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * Copyright (c) 1991-1997 Sam Leffler
Packit 7838c8
 * Copyright (c) 1991-1997 Silicon Graphics, Inc.
Packit 7838c8
 *
Packit 7838c8
 * Permission to use, copy, modify, distribute, and sell this software and 
Packit 7838c8
 * its documentation for any purpose is hereby granted without fee, provided
Packit 7838c8
 * that (i) the above copyright notices and this permission notice appear in
Packit 7838c8
 * all copies of the software and related documentation, and (ii) the names of
Packit 7838c8
 * Sam Leffler and Silicon Graphics may not be used in any advertising or
Packit 7838c8
 * publicity relating to the software without the specific, prior written
Packit 7838c8
 * permission of Sam Leffler and Silicon Graphics.
Packit 7838c8
 * 
Packit 7838c8
 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
Packit 7838c8
 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
Packit 7838c8
 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
Packit 7838c8
 * 
Packit 7838c8
 * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
Packit 7838c8
 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
Packit 7838c8
 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
Packit 7838c8
 * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
Packit 7838c8
 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
Packit 7838c8
 * OF THIS SOFTWARE.
Packit 7838c8
 */
Packit 7838c8
#include "tif_config.h"
Packit 7838c8
Packit 7838c8
#include <stdlib.h>
Packit 7838c8
#include <stdio.h>
Packit 7838c8
#include <string.h>
Packit 7838c8
#include <math.h>
Packit 7838c8
#include <time.h>
Packit 7838c8
Packit 7838c8
#ifdef HAVE_UNISTD_H
Packit 7838c8
# include <unistd.h>
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
#ifdef HAVE_FCNTL_H
Packit 7838c8
# include <fcntl.h>
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
#ifdef HAVE_IO_H
Packit 7838c8
# include <io.h>
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
#ifdef NEED_LIBPORT
Packit 7838c8
# include "libport.h"
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
#include "tiffiop.h"
Packit 7838c8
#include "tiffio.h"
Packit 7838c8
Packit 7838c8
float	defxres = 204.;		/* default x resolution (pixels/inch) */
Packit 7838c8
float	defyres = 98.;		/* default y resolution (lines/inch) */
Packit 7838c8
const float half = 0.5;
Packit 7838c8
const float points = 72.0;
Packit 7838c8
float	pageWidth = 0;		/* image page width (inches) */
Packit 7838c8
float	pageHeight = 0;		/* image page length (inches) */
Packit 7838c8
int	scaleToPage = 0;	/* if true, scale raster to page dimensions */
Packit 7838c8
int	totalPages = 0;		/* total # pages printed */
Packit 7838c8
int	row;			/* current output row */
Packit 7838c8
int	maxline = 512;		/* max output line of PostScript */
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * Turn a bit-mapped scanline into the appropriate sequence
Packit 7838c8
 * of PostScript characters to be rendered.
Packit 7838c8
 *  
Packit 7838c8
 * Original version written by Bret D. Whissel,
Packit 7838c8
 * Florida State University Meteorology Department
Packit 7838c8
 * March 13-15, 1995.
Packit 7838c8
 */
Packit 7838c8
static void
Packit 7838c8
printruns(unsigned char* buf, uint32* runs, uint32* erun, uint32 lastx)
Packit 7838c8
{
Packit 7838c8
    static struct {
Packit 7838c8
	char white, black;
Packit 7838c8
	unsigned short width;
Packit 7838c8
    } WBarr[] = {
Packit 7838c8
	{ 'd', 'n', 512 }, { 'e', 'o', 256 }, { 'f', 'p', 128 },
Packit 7838c8
	{ 'g', 'q',  64 }, { 'h', 'r',  32 }, { 'i', 's',  16 },
Packit 7838c8
	{ 'j', 't',   8 }, { 'k', 'u',   4 }, { 'l', 'v',   2 },
Packit 7838c8
	{ 'm', 'w',   1 }
Packit 7838c8
    };
Packit 7838c8
    static char* svalue =
Packit 7838c8
	" !\"#$&'*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abc";
Packit 7838c8
    int colormode = 1;		/* 0 for white, 1 for black */
Packit 7838c8
    uint32 runlength = 0;
Packit 7838c8
    int n = maxline;
Packit 7838c8
    uint32 x = 0;
Packit 7838c8
    int l;
Packit 7838c8
Packit 7838c8
    (void) buf;
Packit 7838c8
    printf("%d m(", row++);
Packit 7838c8
    while (runs < erun) {
Packit 7838c8
	if (runlength <= 0) {
Packit 7838c8
	    colormode ^= 1;
Packit 7838c8
	    runlength = *runs++;
Packit 7838c8
	    if (x+runlength > lastx)
Packit 7838c8
		runlength = runs[-1] = lastx-x;
Packit 7838c8
	    x += runlength;
Packit 7838c8
	    if (!colormode && runs == erun)	
Packit 7838c8
		break;		/* don't bother printing the final white run */
Packit 7838c8
	}
Packit 7838c8
	/*
Packit 7838c8
	 * If a runlength is greater than 6 pixels, then spit out
Packit 7838c8
	 * black or white characters until the runlength drops to
Packit 7838c8
	 * 6 or less.  Once a runlength is <= 6, then combine black
Packit 7838c8
	 * and white runlengths until a 6-pixel pattern is obtained.
Packit 7838c8
	 * Then write out the special character.  Six-pixel patterns
Packit 7838c8
	 * were selected since 64 patterns is the largest power of
Packit 7838c8
	 * two less than the 92 "easily printable" PostScript
Packit 7838c8
	 * characters (i.e., no escape codes or octal chars).
Packit 7838c8
	 */
Packit 7838c8
	l = 0;
Packit 7838c8
	while (runlength > 6) {	/* Run is greater than six... */
Packit 7838c8
	    if (runlength >= WBarr[l].width) {
Packit 7838c8
		if (n == 0) {
Packit 7838c8
		    putchar('\n');
Packit 7838c8
		    n = maxline;
Packit 7838c8
		}
Packit 7838c8
		putchar(colormode ? WBarr[l].black : WBarr[l].white), n--;
Packit 7838c8
		runlength -= WBarr[l].width;
Packit 7838c8
	    } else
Packit 7838c8
		l++;
Packit 7838c8
	}
Packit 7838c8
	while (runlength > 0 && runlength <= 6) {
Packit 7838c8
	    uint32 bitsleft = 6;
Packit 7838c8
	    int t = 0;
Packit 7838c8
	    while (bitsleft) {
Packit 7838c8
		if (runlength <= bitsleft) {
Packit 7838c8
		    if (colormode)
Packit 7838c8
			t |= ((1 << runlength)-1) << (bitsleft-runlength);
Packit 7838c8
		    bitsleft -= runlength;
Packit 7838c8
		    runlength = 0;
Packit 7838c8
		    if (bitsleft) {
Packit 7838c8
			if (runs >= erun)
Packit 7838c8
			    break;
Packit 7838c8
			colormode ^= 1;
Packit 7838c8
			runlength = *runs++;
Packit 7838c8
			if (x+runlength > lastx)
Packit 7838c8
			    runlength = runs[-1] = lastx-x;
Packit 7838c8
			x += runlength;
Packit 7838c8
		    }
Packit 7838c8
		} else {		/* runlength exceeds bits left */
Packit 7838c8
		    if (colormode)
Packit 7838c8
			t |= ((1 << bitsleft)-1);
Packit 7838c8
		    runlength -= bitsleft;
Packit 7838c8
		    bitsleft = 0;
Packit 7838c8
		}
Packit 7838c8
	    }
Packit 7838c8
	    if (n == 0) {
Packit 7838c8
		putchar('\n');
Packit 7838c8
		n = maxline;
Packit 7838c8
	    }
Packit 7838c8
	    putchar(svalue[t]), n--;
Packit 7838c8
	}
Packit 7838c8
    }
Packit 7838c8
    printf(")s\n");
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
/* 
Packit 7838c8
 * Create a special PostScript font for printing FAX documents.  By taking
Packit 7838c8
 * advantage of the font-cacheing mechanism, a substantial speed-up in 
Packit 7838c8
 * rendering time is realized. 
Packit 7838c8
 */
Packit 7838c8
static void
Packit 7838c8
emitFont(FILE* fd)
Packit 7838c8
{
Packit 7838c8
    static const char* fontPrologue[] = {
Packit 7838c8
	"/newfont 10 dict def newfont begin /FontType 3 def /FontMatrix [1",
Packit 7838c8
	"0 0 1 0 0] def /FontBBox [0 0 512 1] def /Encoding 256 array def",
Packit 7838c8
	"0 1 31{Encoding exch /255 put}for 120 1 255{Encoding exch /255",
Packit 7838c8
	"put}for Encoding 37 /255 put Encoding 40 /255 put Encoding 41 /255",
Packit 7838c8
	"put Encoding 92 /255 put /count 0 def /ls{Encoding exch count 3",
Packit 7838c8
	"string cvs cvn put /count count 1 add def}def 32 1 36{ls}for",
Packit 7838c8
	"38 1 39{ls}for 42 1 91{ls}for 93 1 99{ls}for /count 100",
Packit 7838c8
	"def 100 1 119{ls}for /CharDict 5 dict def CharDict begin /white",
Packit 7838c8
	"{dup 255 eq{pop}{1 dict begin 100 sub neg 512 exch bitshift",
Packit 7838c8
	"/cw exch def cw 0 0 0 cw 1 setcachedevice end}ifelse}def /black",
Packit 7838c8
	"{dup 255 eq{pop}{1 dict begin 110 sub neg 512 exch bitshift",
Packit 7838c8
	"/cw exch def cw 0 0 0 cw 1 setcachedevice 0 0 moveto cw 0 rlineto",
Packit 7838c8
	"0 1 rlineto cw neg 0 rlineto closepath fill end}ifelse}def /numbuild",
Packit 7838c8
	"{dup 255 eq{pop}{6 0 0 0 6 1 setcachedevice 0 1 5{0 moveto",
Packit 7838c8
	"dup 32 and 32 eq{1 0 rlineto 0 1 rlineto -1 0 rlineto closepath",
Packit 7838c8
	"fill newpath}if 1 bitshift}for pop}ifelse}def /.notdef {}",
Packit 7838c8
	"def /255 {}def end /BuildChar{exch begin dup 110 ge{Encoding",
Packit 7838c8
	"exch get 3 string cvs cvi CharDict /black get}{dup 100 ge {Encoding",
Packit 7838c8
	"exch get 3 string cvs cvi CharDict /white get}{Encoding exch get",
Packit 7838c8
	"3 string cvs cvi CharDict /numbuild get}ifelse}ifelse exec end",
Packit 7838c8
	"}def end /Bitfont newfont definefont 1 scalefont setfont",
Packit 7838c8
	NULL
Packit 7838c8
    };
Packit 7838c8
    int i;
Packit 7838c8
    for (i = 0; fontPrologue[i] != NULL; i++)
Packit 7838c8
	fprintf(fd, "%s\n", fontPrologue[i]);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
void
Packit 7838c8
printTIF(TIFF* tif, uint16 pageNumber)
Packit 7838c8
{
Packit 7838c8
    uint32 w, h;
Packit 7838c8
    uint16 unit, compression;
Packit 7838c8
    float xres, yres, scale = 1.0;
Packit 7838c8
    tstrip_t s, ns;
Packit 7838c8
    time_t creation_time;
Packit 7838c8
Packit 7838c8
    TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &h);
Packit 7838c8
    TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &w);
Packit 7838c8
    if (!TIFFGetField(tif, TIFFTAG_COMPRESSION, &compression)
Packit 7838c8
	|| compression < COMPRESSION_CCITTRLE
Packit 7838c8
	|| compression > COMPRESSION_CCITT_T6)
Packit 7838c8
	return;
Packit 7838c8
    if (!TIFFGetField(tif, TIFFTAG_XRESOLUTION, &xres) || !xres) {
Packit 7838c8
	TIFFWarning(TIFFFileName(tif),
Packit 7838c8
	    "No x-resolution, assuming %g dpi", defxres);
Packit 7838c8
	xres = defxres;
Packit 7838c8
    }
Packit 7838c8
    if (!TIFFGetField(tif, TIFFTAG_YRESOLUTION, &yres) || !yres) {
Packit 7838c8
	TIFFWarning(TIFFFileName(tif),
Packit 7838c8
	    "No y-resolution, assuming %g lpi", defyres);
Packit 7838c8
	yres = defyres;					/* XXX */
Packit 7838c8
    }
Packit 7838c8
    if (TIFFGetField(tif, TIFFTAG_RESOLUTIONUNIT, &unit) &&
Packit 7838c8
      unit == RESUNIT_CENTIMETER) {
Packit 7838c8
	xres *= 2.54F;
Packit 7838c8
	yres *= 2.54F;
Packit 7838c8
    }
Packit 7838c8
    if (pageWidth == 0)
Packit 7838c8
	pageWidth = w / xres;
Packit 7838c8
    if (pageHeight == 0)
Packit 7838c8
	pageHeight = h / yres;
Packit 7838c8
Packit 7838c8
    printf("%%!PS-Adobe-3.0\n");
Packit 7838c8
    printf("%%%%Creator: fax2ps\n");
Packit 7838c8
#ifdef notdef
Packit 7838c8
    printf("%%%%Title: %s\n", file);
Packit 7838c8
#endif
Packit 7838c8
    creation_time = time(0);
Packit 7838c8
    printf("%%%%CreationDate: %s", ctime(&creation_time));
Packit 7838c8
    printf("%%%%Origin: 0 0\n");
Packit 7838c8
    printf("%%%%BoundingBox: 0 0 %u %u\n",
Packit 7838c8
	(int)(pageWidth * points), (int)(pageHeight * points));	/* XXX */
Packit 7838c8
    printf("%%%%Pages: (atend)\n");
Packit 7838c8
    printf("%%%%EndComments\n");
Packit 7838c8
    printf("%%%%BeginProlog\n");
Packit 7838c8
    emitFont(stdout);
Packit 7838c8
    printf("/d{bind def}def\n"); /* bind and def proc */
Packit 7838c8
    printf("/m{0 exch moveto}d\n");
Packit 7838c8
    printf("/s{show}d\n");
Packit 7838c8
    printf("/p{showpage}d \n");	/* end page */
Packit 7838c8
    printf("%%%%EndProlog\n");
Packit 7838c8
    printf("%%%%Page: \"%u\" %u\n", pageNumber, pageNumber);
Packit 7838c8
    printf("/$pageTop save def gsave\n");
Packit 7838c8
    if (scaleToPage)
Packit 7838c8
        scale = pageHeight / (h/yres) < pageWidth / (w/xres) ?
Packit 7838c8
            pageHeight / (h/yres) : pageWidth / (w/xres);
Packit 7838c8
    printf("%g %g translate\n",
Packit 7838c8
           points * (pageWidth - scale*w/xres) * half,
Packit 7838c8
           points * (scale*h/yres + (pageHeight - scale*h/yres) * half));
Packit 7838c8
    printf("%g %g scale\n", points/xres*scale, -points/yres*scale);
Packit 7838c8
    printf("0 setgray\n");
Packit 7838c8
    TIFFSetField(tif, TIFFTAG_FAXFILLFUNC, printruns);
Packit 7838c8
    ns = TIFFNumberOfStrips(tif);
Packit 7838c8
    row = 0;
Packit 7838c8
    for (s = 0; s < ns; s++)
Packit 7838c8
	(void) TIFFReadEncodedStrip(tif, s, (tdata_t) NULL, (tsize_t) -1);
Packit 7838c8
    printf("p\n");
Packit 7838c8
    printf("grestore $pageTop restore\n");
Packit 7838c8
    totalPages++;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
#define	GetPageNumber(tif) \
Packit 7838c8
TIFFGetField(tif, TIFFTAG_PAGENUMBER, &pn, &ptotal)
Packit 7838c8
Packit 7838c8
int
Packit 7838c8
findPage(TIFF* tif, uint16 pageNumber)
Packit 7838c8
{
Packit 7838c8
    uint16 pn = (uint16) -1;
Packit 7838c8
    uint16 ptotal = (uint16) -1;
Packit 7838c8
    if (GetPageNumber(tif)) {
Packit 7838c8
	while (pn != (pageNumber-1) && TIFFReadDirectory(tif) && GetPageNumber(tif))
Packit 7838c8
	    ;
Packit 7838c8
	return (pn == (pageNumber-1));
Packit 7838c8
    } else
Packit 7838c8
	return (TIFFSetDirectory(tif, (tdir_t)(pageNumber-1)));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
void
Packit 7838c8
fax2ps(TIFF* tif, uint16 npages, uint16* pages, char* filename)
Packit 7838c8
{
Packit 7838c8
    if (npages > 0) {
Packit 7838c8
	uint16 pn, ptotal;
Packit 7838c8
	int i;
Packit 7838c8
Packit 7838c8
	if (!GetPageNumber(tif))
Packit 7838c8
	    fprintf(stderr, "%s: No page numbers, counting directories.\n",
Packit 7838c8
		filename);
Packit 7838c8
	for (i = 0; i < npages; i++) {
Packit 7838c8
	    if (findPage(tif, pages[i]))
Packit 7838c8
		printTIF(tif, pages[i]);
Packit 7838c8
	    else
Packit 7838c8
		fprintf(stderr, "%s: No page number %d\n", filename, pages[i]);
Packit 7838c8
	}
Packit 7838c8
    } else {
Packit 7838c8
	uint16 pageNumber = 0;
Packit 7838c8
	do
Packit 7838c8
	    printTIF(tif, pageNumber++);
Packit 7838c8
	while (TIFFReadDirectory(tif));
Packit 7838c8
    }
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
#undef GetPageNumber
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
pcompar(const void* va, const void* vb)
Packit 7838c8
{
Packit 7838c8
    const int* pa = (const int*) va;
Packit 7838c8
    const int* pb = (const int*) vb;
Packit 7838c8
    return (*pa - *pb);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static	void usage(int code);
Packit 7838c8
Packit 7838c8
int
Packit 7838c8
main(int argc, char** argv)
Packit 7838c8
{
Packit 7838c8
#if !HAVE_DECL_OPTARG
Packit 7838c8
    extern int optind;
Packit 7838c8
    extern char* optarg;
Packit 7838c8
#endif
Packit 7838c8
    uint16 *pages = NULL, npages = 0, pageNumber;
Packit 7838c8
    int c, dowarnings = 0;		/* if 1, enable library warnings */
Packit 7838c8
    TIFF* tif;
Packit 7838c8
Packit 7838c8
    while ((c = getopt(argc, argv, "l:p:x:y:W:H:wS")) != -1)
Packit 7838c8
	switch (c) {
Packit 7838c8
	case 'H':		/* page height */
Packit 7838c8
	    pageHeight = (float)atof(optarg);
Packit 7838c8
	    break;
Packit 7838c8
	case 'S':		/* scale to page */
Packit 7838c8
	    scaleToPage = 1;
Packit 7838c8
	    break;
Packit 7838c8
	case 'W':		/* page width */
Packit 7838c8
	    pageWidth = (float)atof(optarg);
Packit 7838c8
	    break;
Packit 7838c8
	case 'p':		/* print specific page */
Packit 7838c8
	    pageNumber = (uint16)atoi(optarg);
Packit 7838c8
	    if (pages)
Packit 7838c8
		pages = (uint16*) realloc(pages, (npages+1)*sizeof(uint16));
Packit 7838c8
	    else
Packit 7838c8
		pages = (uint16*) malloc(sizeof(uint16));
Packit 7838c8
	    if( pages == NULL )
Packit 7838c8
	    {
Packit 7838c8
		fprintf(stderr, "Out of memory\n");
Packit 7838c8
		exit(-1);
Packit 7838c8
	    }
Packit 7838c8
	    pages[npages++] = pageNumber;
Packit 7838c8
	    break;
Packit 7838c8
	case 'w':
Packit 7838c8
	    dowarnings = 1;
Packit 7838c8
	    break;
Packit 7838c8
	case 'x':
Packit 7838c8
	    defxres = (float)atof(optarg);
Packit 7838c8
	    break;
Packit 7838c8
	case 'y':
Packit 7838c8
	    defyres = (float)atof(optarg);
Packit 7838c8
	    break;
Packit 7838c8
	case 'l':
Packit 7838c8
	    maxline = atoi(optarg);
Packit 7838c8
	    break;
Packit 7838c8
	case '?':
Packit 7838c8
	    usage(-1);
Packit 7838c8
	}
Packit 7838c8
    if (npages > 0)
Packit 7838c8
	qsort(pages, npages, sizeof(uint16), pcompar);
Packit 7838c8
    if (!dowarnings)
Packit 7838c8
	TIFFSetWarningHandler(0);
Packit 7838c8
    if (optind < argc) {
Packit 7838c8
	do {
Packit 7838c8
	    tif = TIFFOpen(argv[optind], "r");
Packit 7838c8
	    if (tif) {
Packit 7838c8
		fax2ps(tif, npages, pages, argv[optind]);
Packit 7838c8
		TIFFClose(tif);
Packit 7838c8
	    } else
Packit 7838c8
		fprintf(stderr, "%s: Can not open, or not a TIFF file.\n",
Packit 7838c8
		    argv[optind]);
Packit 7838c8
	} while (++optind < argc);
Packit 7838c8
    } else {
Packit 7838c8
	int n;
Packit 7838c8
	FILE* fd;
Packit 7838c8
	char buf[16*1024];
Packit 7838c8
Packit 7838c8
	fd = tmpfile();
Packit 7838c8
	if (fd == NULL) {
Packit 7838c8
	    fprintf(stderr, "Could not obtain temporary file.\n");
Packit 7838c8
	    exit(-2);
Packit 7838c8
	}
Packit 7838c8
#if defined(HAVE_SETMODE) && defined(O_BINARY)
Packit 7838c8
	setmode(fileno(stdin), O_BINARY);
Packit 7838c8
#endif
Packit 7838c8
	while ((n = read(fileno(stdin), buf, sizeof (buf))) > 0) {
Packit 7838c8
                if (write(fileno(fd), buf, n) != n) {
Packit 7838c8
                        fclose(fd);
Packit 7838c8
                        fprintf(stderr,
Packit 7838c8
                                "Could not copy stdin to temporary file.\n");
Packit 7838c8
                        exit(-2);  
Packit 7838c8
                }
Packit 7838c8
        }
Packit 7838c8
	_TIFF_lseek_f(fileno(fd), 0, SEEK_SET);
Packit 7838c8
#if defined(_WIN32) && defined(USE_WIN32_FILEIO)
Packit 7838c8
	tif = TIFFFdOpen(_get_osfhandle(fileno(fd)), "temp", "r");
Packit 7838c8
#else
Packit 7838c8
	tif = TIFFFdOpen(fileno(fd), "temp", "r");
Packit 7838c8
#endif
Packit 7838c8
	if (tif) {
Packit 7838c8
	    fax2ps(tif, npages, pages, "<stdin>");
Packit 7838c8
	    TIFFClose(tif);
Packit 7838c8
	} else
Packit 7838c8
	    fprintf(stderr, "Can not open, or not a TIFF file.\n");
Packit 7838c8
	fclose(fd);
Packit 7838c8
    }
Packit 7838c8
    printf("%%%%Trailer\n");
Packit 7838c8
    printf("%%%%Pages: %u\n", totalPages);
Packit 7838c8
    printf("%%%%EOF\n");
Packit 7838c8
Packit 7838c8
    return (0);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
char* stuff[] = {
Packit 7838c8
"usage: fax2ps [options] [input.tif ...]",
Packit 7838c8
"where options are:",
Packit 7838c8
" -w            suppress warning messages",
Packit 7838c8
" -l chars      set maximum output line length for generated PostScript",
Packit 7838c8
" -p page#      select page to print (can use multiple times)",
Packit 7838c8
" -x xres       set default horizontal resolution of input data (dpi)",
Packit 7838c8
" -y yres       set default vertical resolution of input data (lpi)",
Packit 7838c8
" -S            scale output to page size",
Packit 7838c8
" -W width      set output page width (inches), default is 8.5",
Packit 7838c8
" -H height     set output page height (inches), default is 11",
Packit 7838c8
NULL
Packit 7838c8
};
Packit 7838c8
Packit 7838c8
static void
Packit 7838c8
usage(int code)
Packit 7838c8
{
Packit 7838c8
	char buf[BUFSIZ];
Packit 7838c8
	int i;
Packit 7838c8
Packit 7838c8
	setbuf(stderr, buf);
Packit 7838c8
        fprintf(stderr, "%s\n\n", TIFFGetVersion());
Packit 7838c8
	for (i = 0; stuff[i] != NULL; i++)
Packit 7838c8
		fprintf(stderr, "%s\n", stuff[i]);
Packit 7838c8
	exit(code);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
/* vim: set ts=8 sts=8 sw=8 noet: */
Packit 7838c8
/*
Packit 7838c8
 * Local Variables:
Packit 7838c8
 * mode: c
Packit 7838c8
 * c-basic-offset: 8
Packit 7838c8
 * fill-column: 78
Packit 7838c8
 * End:
Packit 7838c8
 */