Annotation of 43BSDTahoe/new/dipress/src/bin/mp2res/mp2res.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1984, 1985, 1986 Xerox Corp.
                      3:  *
                      4:  *    This module reads a compressed bitmap file in the MacPaint
                      5:  *    format and outputs an RES file.
                      6:  *
                      7:  *    For a description of RES (Raster Encoding Standard) see
                      8:  *    the booklet entitled "Raster Encoding Standard" XNS Standard 178506
                      9:  *    (June, 1985)
                     10:  *
                     11:  * HISTORY
                     12:  * 21-Jul-86  Lee Moore (lee) at Xerox Webster Research Center
                     13:  *     Added the ability to generate IP masters, too.
                     14:  *
                     15:  * 07-Jul-86  Lee Moore (lee) at Xerox Webster Research Center
                     16:  *     Converted for use with getopt.
                     17:  *
                     18:  * 03-Jun-86  Lee Moore (lee) at Xerox Webster Research Center
                     19:  *     Created mp2res from readmac.c .
                     20:  *
                     21:  *
                     22:  * K. Knox, 10-Dec-84 18:51:22, Created readmac.
                     23:  */
                     24: 
                     25: #include <stdio.h>
                     26: 
                     27: #include "iptokens.h"
                     28: #include "literal.h"
                     29: #include "operator.h"
                     30: 
                     31: #define err0 "usage: readmac filename\n"
                     32: #define err1 "mp2res: Could not open, %s.\n"
                     33: 
                     34: #define TRUE   1
                     35: #define FALSE  0
                     36: 
                     37: /* External procedures. */
                     38: extern char *malloc();
                     39: 
                     40: /*
                     41:  * Main program
                     42:  *     parse command line
                     43:  *     call ProcessData to do the work
                     44:  */
                     45: 
                     46: main(argc, argv)
                     47: int argc;
                     48: char *argv[];
                     49: {
                     50:        int c;
                     51:        int     firstRow = 0,
                     52:                lastRow = (720 - 1),
                     53:                firstColumn = 0,
                     54:                lastColumn = (576 - 1),
                     55:                outputFileFD,
                     56:                makeInterpress = FALSE;
                     57:        extern char *optarg;
                     58:        extern optind;
                     59:        FILE *inputFileDesc;
                     60: 
                     61:        outputFileFD = 1;               /* standard out */
                     62: 
                     63:        while ((c = getopt(argc, argv, "it:b:l:o:r:")) != EOF)
                     64:            switch (c) {
                     65:                case 'i':
                     66:                    makeInterpress = TRUE;
                     67:                    break;
                     68: 
                     69:                case 't':               /* top */
                     70:                    firstRow = atoi(optarg);
                     71:                    break;
                     72: 
                     73:                case 'b':               /* bottom */
                     74:                    lastRow = atoi(optarg);
                     75:                    break;
                     76: 
                     77:                case 'l':               /* left */
                     78:                    firstColumn = atoi(optarg);
                     79:                    break;
                     80: 
                     81:                case 'o':               /* output file */
                     82:                    if( (outputFileFD = creat(optarg, 0664)) < 0) {
                     83:                        fprintf(stderr, "mp2res: can't open %s for writing\n", optarg);
                     84:                        perror(optarg);
                     85:                        exit(1);
                     86:                    }
                     87:                    break;
                     88: 
                     89:                case 'r':               /* right */
                     90:                    lastColumn = atoi(optarg);
                     91:                    break;
                     92: 
                     93:            default:
                     94:                printf("ipmetrics: option '%c' not allowed\n");
                     95:            }
                     96: 
                     97:        /* do we read from standard input? */
                     98:        if (argc == optind) {
                     99:                inputFileDesc = stdin;
                    100:        } else {
                    101:                /* open the MacPaint file */
                    102:                if ((inputFileDesc = fopen(argv[optind], "r")) == NULL)
                    103:                        fprintf(stderr, err1, argv[optind]);
                    104:        }
                    105: 
                    106:        if (! makeInterpress )
                    107:            MakeRES(inputFileDesc, outputFileFD,
                    108:                firstRow, lastRow, firstColumn, lastColumn);
                    109:        else
                    110:            MakeIP(inputFileDesc, outputFileFD,
                    111:                firstRow, lastRow, firstColumn, lastColumn);
                    112: 
                    113:        exit(0);
                    114: }
                    115: 
                    116: 
                    117: /*
                    118:  * Convert a MacPaint document to an RES file
                    119:  *     don't copy the data that the user doesn't want
                    120:  */
                    121: 
                    122: MakeRES(inputFileDesc, outputFileFD,
                    123:        firstRow, lastRow, firstColumn, lastColumn)
                    124: FILE *inputFileDesc;
                    125: int outputFileFD,
                    126:        firstRow, lastRow, firstColumn, lastColumn;
                    127: {
                    128:        int i,
                    129:                bufferSize;
                    130:        int     pixelsPerScanLine,
                    131:                numberOfScanLines,
                    132:                bytesPerScanLine;
                    133:        unsigned char *image, *p;
                    134: 
                    135:        pixelsPerScanLine = lastColumn - firstColumn + 1;
                    136:        numberOfScanLines = lastRow - firstRow + 1;
                    137: 
                    138:        if( pixelsPerScanLine % 32 != 0 )
                    139:                fprintf(stderr, "internal error: %d is not a multiple of 32\n", pixelsPerScanLine);
                    140: 
                    141:        bytesPerScanLine = (pixelsPerScanLine + 7)/8;
                    142: 
                    143:        /* skip over MacPaint header */
                    144:        for (i=0; i < 512; i++)
                    145:                getc(inputFileDesc);
                    146: 
                    147:        bufferSize = bytesPerScanLine * numberOfScanLines;
                    148:        image = (unsigned char *) malloc((unsigned) bufferSize);
                    149: 
                    150:        res_select(outputFileFD);
                    151: 
                    152:        AppendOp(OP_beginBlock);
                    153: 
                    154:        /* element 1: imageScale */
                    155:        AppendRational(254L, 72L*100*100);      /* assume 72 spots/inch */
                    156:        AppendOp(OP_dup);
                    157:        AppendInteger(2L);
                    158:        AppendOp(OP_makevec);
                    159: 
                    160:        /* element 2: xDimension */
                    161:        AppendInteger((long) pixelsPerScanLine);                /* xPixels */
                    162: 
                    163:        /* element 3: yDimension */
                    164:        AppendInteger((long) numberOfScanLines);                /* yPixels */
                    165: 
                    166:        /* element 4: maskImage */
                    167:        AppendInteger(0L);                              /* maskImage */
                    168: 
                    169:        /* element 5: colorImage */
                    170:        AppendInteger((long) numberOfScanLines);                /* yPixels */
                    171:        AppendInteger((long) pixelsPerScanLine);                /* xPixels */
                    172:        AppendInteger(1L);              /* sampelsPerPixel */
                    173:        AppendInteger(1L);              /* maxSampleValue */
                    174:        AppendInteger(1L);              /* samplesInterleaved */
                    175: 
                    176:        /* enter transformation to bring it to row major order */
                    177:        AppendInteger(-90L);
                    178:        AppendOp(OP_rotate);
                    179:        AppendInteger(0L);
                    180:        AppendInteger((long) numberOfScanLines);
                    181:        AppendOp(OP_translate);
                    182:        AppendOp(OP_concat);
                    183: 
                    184:        /* skip over as many rows as needed */
                    185:        for (i = 0; i < firstRow; i++)
                    186:                readscan(inputFileDesc, image);
                    187: 
                    188:        /* read the scan lines in */
                    189:        for (i = firstRow, p = image; i <= lastRow; i++, p += bytesPerScanLine)
                    190:                readscan(inputFileDesc, p);
                    191: 
                    192:        AppendPPVector(bufferSize, 1, pixelsPerScanLine, (unsigned char *) image);
                    193: 
                    194:        Op(makepixelarray);             /* make the array */
                    195: 
                    196:        /* element 6: colorOperator */
                    197:        AppendInteger(0L);
                    198: 
                    199:        /* element 7: image Properties */
                    200:        AppendIdentifier("imageDescription");
                    201:        AppendString("made from a MacPaint file");
                    202:        Makevec(2);
                    203: 
                    204:        /* element 8: signature */
                    205:        AppendInteger(13086L);
                    206: 
                    207:        AppendOp(OP_endBlock);
                    208: 
                    209:        ip_flush();
                    210: 
                    211:        free((char *) image);
                    212: }
                    213: 
                    214: MakeIP(inputFileDesc, outputFileFD,
                    215:        firstRow, lastRow, firstColumn, lastColumn)
                    216: FILE *inputFileDesc;
                    217: int outputFileFD,
                    218:        firstRow, lastRow, firstColumn, lastColumn;
                    219: {
                    220:        int i,
                    221:                bufferSize;
                    222:        int     pixelsPerScanLine,
                    223:                numberOfScanLines,
                    224:                bytesPerScanLine;
                    225:        unsigned char *image, *p;
                    226: 
                    227:        pixelsPerScanLine = lastColumn - firstColumn + 1;
                    228:        numberOfScanLines = lastRow - firstRow + 1;
                    229: 
                    230:        if( pixelsPerScanLine % 32 != 0 )
                    231:                fprintf(stderr, "%d is not a multiple of 32\n", pixelsPerScanLine);
                    232: 
                    233:        bytesPerScanLine = (pixelsPerScanLine + 7)/8;
                    234: 
                    235:        for (i=0; i < 512; i++)
                    236:                getc(inputFileDesc);
                    237: 
                    238:        bufferSize = bytesPerScanLine * numberOfScanLines;
                    239:        image = (unsigned char *) malloc((unsigned) bufferSize);
                    240: 
                    241:        ip_select(outputFileFD);
                    242: 
                    243:        AppendOp(OP_beginBlock);
                    244:        AppendOp(OP_beginBody);
                    245:        AppendOp(OP_endBody);   /* end preamble */
                    246:        AppendOp(OP_beginBody); /* page 1 (and only) */
                    247: 
                    248:        AppendRational(254L, 72L*100*100);      /* assume 72 spots/inch */
                    249:        AppendOp(OP_scale);
                    250:        Translate(.5*.0254, .25*.0254);
                    251:        AppendOp(OP_concat);
                    252:        AppendOp(OP_concatt);
                    253: 
                    254:        AppendInteger((long) numberOfScanLines);                /* yPixels */
                    255:        AppendInteger((long) pixelsPerScanLine);                /* xPixels */
                    256:        AppendInteger(1L);              /* sampelsPerPixel */
                    257:        AppendInteger(1L);              /* maxSampleValue */
                    258:        AppendInteger(1L);              /* samplesInterleaved */
                    259: 
                    260:        /* enter transformation to bring it to row major order */
                    261:        AppendInteger(-90L);
                    262:        AppendOp(OP_rotate);
                    263:        AppendInteger(0L);
                    264:        AppendInteger((long) numberOfScanLines);
                    265:        AppendOp(OP_translate);
                    266:        AppendOp(OP_concat);
                    267: 
                    268:        /* skip over as many rows as needed */
                    269:        for (i = 0; i < firstRow; i++)
                    270:                readscan(inputFileDesc, image);
                    271: 
                    272:        for (i = firstRow, p = image; i <= lastRow; i++, p += bytesPerScanLine)
                    273:                readscan(inputFileDesc, p);
                    274: 
                    275:        /* output the result to the Interpress file */
                    276:        AppendPPVector(bufferSize, 1, pixelsPerScanLine, (unsigned char *) image);
                    277: 
                    278:        Op(makepixelarray);             /* make the array */
                    279: 
                    280:        /* draw a box around the pixel array */
                    281:        AppendInteger(1L);              /* unit stroke width */
                    282:        AppendInteger(15L);             /* stroke width imager variable */
                    283:        AppendOp(OP_iset);
                    284:        AppendRational(-1L, 2L);
                    285:        AppendRational(-1L, 2L);
                    286:        AppendOp(OP_moveto);
                    287:        AppendInteger((long) (numberOfScanLines + 1));
                    288:        AppendOp(OP_linetoy);
                    289:        AppendInteger((long) (pixelsPerScanLine + 1));
                    290:        AppendOp(OP_linetox);
                    291:        AppendRational(-1L, 2L);
                    292:        AppendOp(OP_linetoy);
                    293:        AppendRational(-1L, 2L);
                    294:        AppendOp(OP_linetox);
                    295:        AppendOp(OP_maskstroke);
                    296: 
                    297:        /* prepare to show pixel array */
                    298:        AppendInteger(0L);
                    299:        AppendInteger(0L);
                    300:        AppendOp(OP_setxy);
                    301:        Op(maskpixel);                  /* show it */
                    302: 
                    303:        AppendOp(OP_endBody);
                    304:        AppendOp(OP_endBlock);
                    305: 
                    306:        ip_flush();
                    307: 
                    308:        free((char *) image);
                    309: }
                    310: 
                    311: 
                    312: /*
                    313:  * Read the next scan line from the MacPaint file
                    314:  */
                    315: 
                    316: readscan(inputFileDesc, image)
                    317: FILE *inputFileDesc;
                    318: unsigned char *image;
                    319: {
                    320:        int in_pos, count, data_byte;
                    321: 
                    322:        in_pos = 0;
                    323: 
                    324:        while (in_pos < 72)
                    325:        {
                    326:                count = getc(inputFileDesc);
                    327: 
                    328:                if (count > 127)
                    329:                        count -= 256;
                    330: 
                    331:                if (count >= 0) {
                    332:                        /* run of raw bytes */
                    333:                        count++;                            /* # of bytes to read */
                    334: 
                    335:                        while (count--)
                    336:                                image[in_pos++] = getc(inputFileDesc);
                    337:                } 
                    338:                else {
                    339:                        /* run of repeated byte */
                    340:                        count = -count+1;                        /* repetition factor */
                    341:                        data_byte = getc(inputFileDesc);              /* byte to repeat */
                    342: 
                    343:                        while (count--)
                    344:                                image[in_pos++] = data_byte;
                    345:                }
                    346:        }
                    347: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.