This is tifftoeps.c in view mode; [Download] [Up]
/*
* tifftoeps - convert AppleScanned .tiff file to EPSF
* Eric P. Scott, San Francisco State University, September 1989
*
* Disclaimer: this is a cheap hack; it does not attempt to
* handle arbitrary .tiff files, nor does it make use of all the
* information available to it. In particular, the XResolution
* and YResolution tags are ignored. Heck, it doesn't even
* accept little-endian TIFF...
*
* Future versions may (will?) support other kinds of scanners.
*
*/
#include <stdio.h>
static char sccsid[]="@(#)tifftoeps 1.0 (SFSU) 9/15/89";
int iwidth=0, ilen=0, bits=0, invert=255;
long stripoff=0L;
main(argc, argv)
int argc;
char *argv[];
{
char *malloc();
register int i;
register long value;
long sig, ifdoff;
short ifditems;
struct ifdent {
short ifd_tag;
short ifd_type;
long ifd_len;
union {
unsigned long ifd_long;
unsigned short ifd_short;
unsigned char ifd_byte;
} ifd_off;
} *ifdp;
if (argc!=2) {
fprintf(stderr, "Usage: %s tiff-file\n", *argv);
exit(1);
}
if (strcmp(argv[1], "-")&&!freopen(argv[1], "r", stdin)) {
perror(argv[1]);
exit(1);
}
if (fread((char *)&sig, sizeof sig, 1, stdin)!=1) {
perror("fread");
exit(1);
}
if (sig!=0x4d4d002a) {
fprintf(stderr, "%s: that's not a TIFF file!\n", *argv);
exit(1);
}
if (fread((char *)&ifdoff, sizeof ifdoff, 1, stdin)!=1) {
perror("fread");
exit(1);
}
if (fseek(stdin, ifdoff, 0)<0L) {
perror("fseek");
exit(1);
}
if (fread((char *)&ifditems, sizeof ifditems, 1, stdin)!=1) {
perror("fread");
exit(1);
}
if (!(ifdp=(struct ifdent *)malloc(ifditems*sizeof (struct ifdent)))) {
perror("malloc");
exit(1);
}
if (fread((char *)ifdp, sizeof (struct ifdent), ifditems, stdin)!=
ifditems) {
perror("fread");
exit(1);
}
for (i=0;i<ifditems;i++) {
switch (ifdp->ifd_type) {
case 1:
value=ifdp->ifd_off.ifd_byte;
break;
case 3:
value=ifdp->ifd_off.ifd_short;
break;
case 4:
value=ifdp->ifd_off.ifd_long;
break;
default: /* ifdp->ifd_off.ifd_long is offset */
value=0L; /* do The Wrong Thing(tm) */
break;
}
switch (ifdp->ifd_tag) {
case 256: /* ImageWidth */
iwidth=value;
break;
case 257: /* ImageLength */
ilen=value;
break;
case 258: /* BitsPerSample */
bits=value;
break;
case 259: /* Compression */
if (value!=1) {
fprintf(stderr, "%s: Compression=%ld\n",
*argv, value);
exit(1);
}
break;
case 262: /* PhotometricInterpretation */
switch (value) {
case 0:
invert=255;
break;
case 1:
invert=0;
break;
default:
fprintf(stderr,
"%s: PhotometricInterpretation=%ld\n", *argv, value);
if (value==5) fputs("\tI don't grok alpha\n",
stderr);
exit(1);
break;
}
break;
case 273:
stripoff=value;
break;
case 277: /* SamplesPerPixel */
if (value!=1) {
fprintf(stderr, "%s: SamplesPerPixel=%ld\n",
*argv, value);
exit(1);
}
break;
#ifdef NOTDEF
case 284: /* PlanarConfiguration */
break;
#endif
default:
break;
}
ifdp++;
}
if (iwidth<=0L) {
fprintf(stderr, "%s: missing ImageWidth\n", *argv);
exit(1);
}
if (ilen<=0L) {
fprintf(stderr, "%s: missing ImageLength\n", *argv);
exit(1);
}
if (bits<=0L) {
fprintf(stderr, "%s: missing BitsPerSample\n", *argv);
exit(1);
}
if (stripoff<=0L) {
fprintf(stderr, "%s: missing StripOffsets\n", *argv);
exit(1);
}
if (fseek(stdin, stripoff, 0L)<0L) {
perror("fseek");
exit(1);
}
fputs("%!PS-Adobe-2.0 EPSF-1.2\n%%Creator:tifftoeps\n\
%%Origin:0 720\n%%BoundingBox: 0 0 ", stdout);
printf("%d %d", iwidth, ilen);
fputs("\n%%EndComments\n/picstr ", stdout);
printf("%ld", ((long)iwidth*bits+7L)/8L);
fputs(" string def\ngsave\n0 0 translate\n1 1 scale\n", stdout);
printf("%d %d scale\n%d %d %d\n", iwidth, ilen, iwidth, ilen, bits);
printf("[%d 0 0 %d neg 0 %d]\n", iwidth, ilen, ilen);
fputs("{currentfile picstr readhexstring pop}\nimage", stdout);
sig=(((long)iwidth*bits+7L)/8L)*ilen;
value=0L; while ((i=getchar())!=EOF) {
if (value>=sig) break;
if ((value&31)==0) putchar('\n');
printf("%02X", i^invert);
value++;
}
fputs("\n\n\ngrestore\n", stdout);
exit(0);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.