This is mpnttotiff.c in view mode; [Download] [Up]
/* Convert Macintosh screen shot (MPNT/PNTG) to NeXT TIFF * Eric P. Scott, San Francisco State University, October 1990 * * This input for this is the data fork of a Mac file created * with Command-Shift-3 * * "For more information see" * Tag Image File Format Specification, Revision 5.0 * Macintosh Technical Note #86, MacPaint Document Format * Macintosh Technical Note #171, _PackBits Data Format * * Small-screen Macs (e.g. SEs) save in the normal orientation * Large-screen Macs (e.g. IIs) rotate their bitmap--use -r option * * To compile: * cc -s -o mpnttotiff -O -bsd mpnttotiff.c -lsys_s */ #include <stdio.h> #ifndef lint static char sccsid[]="@(#)mpnttotiff 1.0 (SFSU) 10/24/90"; #endif struct { long tiff_magic, tiff_firstifd; short tiff_ifdents; struct ifdent { short ifd_tag, ifd_type; long ifd_len, ifd_off; } tiff_ifd[8]; long tiff_ifdchain; } header={ /* warning: nonportable */ 0x4d4d002aL, 8L, 8, { { 255, 3, 1L, 1L<<16 }, /* SubfileType */ { 256, 3, 1L, 720L<<16 }, /* ImageWidth */ { 257, 3, 1L, 576L<<16 }, /* ImageLength */ { 262, 3, 1L, 1L<<16 }, /* PhotometricInterpretation */ { 277, 3, 1L, 1L<<16 }, /* SamplesPerPixel */ { 284, 3, 1L, 2L<<16 }, /* PlanarConfiguration */ { 258, 3, 1L, 1L<<16 }, /* BitsPerSample */ { 273, 4, 1L, 110L } /* StripOffsets */ }, 0L }; int rotate=0; main(argc, argv) int argc; char *argv[]; { extern int optind; extern char *optarg; register unsigned char *q, *p; int c; long lbuf[12960]; /* space for 576x720x1 image */ while ((c=getopt(argc, argv, "r"))!=EOF) switch (c) { case 'r': rotate++; break; default: usage: (void)fprintf(stderr, "Usage: %s [-r] paint-file tiff-file\n", *argv); (void)fputs("\t-r rotate 90 degrees counterclockwise\n", stderr); exit(1); break; } if (argc-optind!=2) goto usage; if (strcmp(argv[optind], "-")&&!freopen(argv[optind], "r", stdin)) { perror(argv[optind]); exit(1); } (void)fread((char *)lbuf, 512, 1, stdin); if (*lbuf!=0L) { (void)fprintf(stderr, "%s: input isn't in a format I can deal with\n", *argv); exit(1); } p=(unsigned char *)&lbuf[sizeof lbuf/sizeof lbuf[0]]; q=(unsigned char *)lbuf; bzero((char *)q, sizeof lbuf); while ((c=getchar())!=EOF) { /* UnPackBits */ /* I'm cheating: you're supposed to do this a row at a time */ register int b; if ((c&=255)<=127) { do { if (q>=p) { ovfl: (void)fprintf(stderr, "%s: internal buffer overflow\n", *argv); exit(1); } if ((b=getchar())==EOF) { tooshort: (void)fprintf(stderr, "%s: EOF in sequence\n", *argv); exit(1); } *q++=b; } while (--c>=0); } else { c-=256; if ((b=getchar())==EOF) goto tooshort; do { if (q>=p) goto ovfl; *q++=b; } while (++c<=0); } } if (strcmp(argv[++optind], "-")&&!freopen(argv[optind], "w", stdout)) { perror(argv[optind]); exit(1); } if (!rotate) { /* swap dimensions */ header.tiff_ifd[1].ifd_off=576L<<16; header.tiff_ifd[2].ifd_off=720L<<16; } (void)fwrite((char *)&header, sizeof header, 1, stdout); if (rotate) { /* rotate 90 degrees clockwise and invert */ long obuf[180]; p=(unsigned char *)&lbuf[12816]; c=72; do { register int r; q=(unsigned char *)obuf; bzero((char *)q, sizeof obuf); r=90; do { #define twist(m) \ if ((*p&m)==0) *q=1; \ if ((p[72]&m)==0) *q|=2; \ if ((p[144]&m)==0) *q|=4; \ if ((p[216]&m)==0) *q|=8; \ if ((p[288]&m)==0) *q|=16; \ if ((p[360]&m)==0) *q|=32; \ if ((p[432]&m)==0) *q|=64; \ if ((p[504]&m)==0) *q|=128 twist(128); q+=90; twist(64); q+=90; twist(32); q+=90; twist(16); q+=90; twist(8); q+=90; twist(4); q+=90; twist(2); q+=90; twist(1); q-=629; p-=576; } while (--r>0); (void)fwrite((char *)obuf, sizeof obuf, 1, stdout); p+=51841; /* 1+sizeof lbuf */ } while (--c>0); } else { /* just invert */ p=(unsigned char *)&lbuf[sizeof lbuf/sizeof lbuf[0]]; q=(unsigned char *)lbuf; do { putchar(*q++^255); } while (q<p); } (void)fflush(stdout); exit(0); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.