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

1.1       root        1: /*
                      2:  * (c) Copyright 1986, Xerox Corporation
                      3:  *
                      4:  * pl2ip: convert Unix plot format to and interpress master
                      5:  *
                      6:  * Generally, this program is straightforward.  The main complication comes
                      7:  * from the desire to string contigious lines into one Interpress trajectory.
                      8:  * The main modivation for this is to provide for nice dashed lines on printers
                      9:  * that accept IP 3.0 and higher.  It can also be used to round the corners
                     10:  * of other lines.
                     11:  *
                     12:  * HISTORY
                     13:  * 22-Apr-86  Lee Moore (lee) at Xerox Webster Research Center
                     14:  *     Created.
                     15:  *
                     16:  */
                     17: 
                     18: #include <stdio.h>
                     19: #include "iptokens.h"
                     20: #include "operator.h"
                     21: #include "literal.h"
                     22: 
                     23: /* #define DEBUG  /* */
                     24: 
                     25: #define MAXSTRINGSIZE  128
                     26: 
                     27: #define TRUE           1
                     28: #define FALSE          0
                     29: 
                     30: #define F_font         10
                     31: #define STROKE_WIDTH   15L     /* was 50 */    /* width for drawing lines */
                     32: #define STROKEEND_BUTT 1L              /* end lines hard */
                     33: 
                     34: int HaveTrajectory = FALSE,            /* is a trajectory being built? */
                     35:     CurrentX = 0,                      /* the current X position */    
                     36:     CurrentY = 0,                      /* the current Y position */
                     37:     Pitch = 10;                                /* pitch of the default font */
                     38: 
                     39: 
                     40: /*
                     41:  * declare the Unix plot commands
                     42:  */
                     43: 
                     44: #define MOVECMD                'm'
                     45: #define CONTCMD                'n'
                     46: #define POINTCMD       'p'
                     47: #define LINECMD                'l'
                     48: #define LABELCMD       't'
                     49: #define ARCCMD         'a'
                     50: #define CIRCLECMD      'c'
                     51: #define ERASECMD       'e'
                     52: #define LINEMODCMD     'f'
                     53: #define SPACECMD       's'
                     54: 
                     55: 
                     56: main(argc, argv)
                     57:     int argc;
                     58:     char *argv[]; {
                     59:        char *outputName = NULL;
                     60:        int command, ipFD,
                     61:            textSize = 8,               /* size of text (in points) */
                     62:            c;
                     63:        extern int optind;
                     64:        extern char *optarg;
                     65: 
                     66:        while ((c = getopt(argc, argv, "o:s:")) != EOF)
                     67:            switch (c) {
                     68:                case 'o':
                     69:                        outputName = optarg;
                     70:                        break;
                     71: 
                     72:                case 's':
                     73:                        textSize = atoi(optarg);
                     74:                        break;
                     75:            }
                     76: 
                     77: 
                     78:        if( outputName != NULL ) {
                     79:                if( (ipFD = creat(outputName, 0644)) < 0 ) {
                     80:                        fprintf(stderr, "pl2ip: can't open %s for writing\n", outputName);
                     81:                        exit(1);
                     82:                }
                     83:        } else
                     84:                ipFD = 1;       /* std. output */
                     85: 
                     86:        ip_select(ipFD);
                     87:        AppendOp(OP_beginBlock);
                     88:        AppendOp(OP_beginBody);
                     89:        AppendOp(OP_endBody);   /* end preamble */
                     90:        AppendOp(OP_beginBody); /* begin page 1 */
                     91: #ifdef notdef
                     92:        SetupFont("Xerox/XC1-1-1/Classic", (10.*2.54)/(72.0*100.0), F_font);
                     93:        Setfont(F_font);
                     94: #else
                     95:        AppendIdentifier("Xerox");
                     96:        AppendIdentifier("XC1-1-1");
                     97:        AppendIdentifier("Terminal");
                     98:        AppendInteger(3L);
                     99:        AppendOp(OP_makevec);
                    100:        AppendOp(OP_findfont);
                    101:        AppendRational(4096L * textSize, 36L*13);
                    102:        AppendOp(OP_scale);
                    103:        AppendOp(OP_modifyfont);
                    104:        AppendInteger((long) I_font);
                    105:        AppendOp(OP_iset);
                    106: #endif
                    107: 
                    108:        /* set coordinate system */
                    109:        AppendRational( (long)(6.5*2.54*100.0 + .5), 4096L*100L*100L);
                    110:        AppendOp(OP_scale);
                    111:        AppendOp(OP_concatt);
                    112: 
                    113:        /* set the stroke width */
                    114:        AppendInteger(STROKE_WIDTH);            /* stroke width */
                    115:        AppendInteger(15L);             /* stroke width imager variable */
                    116:        AppendOp(OP_iset);
                    117: 
                    118: #ifdef notdef
                    119:        /* set stroke end */
                    120:        AppendInteger(STROKEEND_BUTT);
                    121:        AppendInteger(16L);             /* stroke end imager variable */
                    122:        AppendOp(OP_iset);
                    123: #endif
                    124: 
                    125:        while( (command = getchar()) != EOF ) {
                    126:                switch( command ) {
                    127:                case MOVECMD:           move(); break;
                    128:                case CONTCMD:           cont(); break;
                    129:                case POINTCMD:          point(); break;
                    130:                case LINECMD:           line(); break;
                    131:                case LABELCMD:          label(); break;
                    132:                case ARCCMD:            arc(); break;
                    133:                case CIRCLECMD:         circle(); break;
                    134:                case ERASECMD:          erase(); break;
                    135:                case LINEMODCMD:        lineMod(); break;
                    136:                case SPACECMD:          space(); break;
                    137: 
                    138:                default:
                    139:                        printf("unknown command: ");
                    140: 
                    141:                        if( command <= ' ' || command >= 0177 )
                    142:                                printf("\\%03o", command);
                    143:                        else
                    144:                                putchar(command);
                    145: 
                    146:                        putchar('\n');
                    147:                }
                    148:        }
                    149: 
                    150:        if( HaveTrajectory )
                    151:                ShowTrajectory();
                    152: 
                    153:        /* wrap it up */
                    154:        AppendOp(OP_endBody);
                    155:        AppendOp(OP_endBlock);
                    156:        ip_flush();
                    157:        exit(0);
                    158: }
                    159: 
                    160: getShort() {
                    161:        unsigned char c;
                    162: 
                    163:        c = getchar();
                    164:        return (getchar() << 8) | c;
                    165: }
                    166: 
                    167: 
                    168: /*
                    169:  * move: The next four bytes give a new currect point
                    170:  *
                    171:  * The problem here is that there are two kind of moves: those
                    172:  * for lines and those for characters.  We try to keep the apart.
                    173:  */
                    174: 
                    175: move() {
                    176:        if( HaveTrajectory )
                    177:                ShowTrajectory();
                    178: 
                    179:        CurrentX = getShort();
                    180:        CurrentY = getShort();
                    181: #ifdef DEBUG
                    182:        printf("move to (%d, %d)\n", CurrentX, CurrentY);
                    183: #endif DEBUG
                    184: }
                    185: 
                    186: 
                    187: /*
                    188:  * cont: Draw a line from the current point to the point given by the next
                    189:  *     four bytes.  See plot(1g)
                    190:  */
                    191: 
                    192: cont() {
                    193:        int x, y;
                    194: 
                    195:        x = getShort();
                    196:        y = getShort();
                    197: #ifdef DEBUG
                    198:        printf("continue to (%d, %d)\n", x, y);
                    199: #endif DEBUG
                    200: 
                    201:        if( ! HaveTrajectory ) {
                    202:                AppendInteger((long) CurrentX);
                    203:                AppendInteger((long) CurrentY);
                    204:                AppendOp(OP_moveto);
                    205:                HaveTrajectory = TRUE;
                    206:        }
                    207: 
                    208:        AppendInteger((long) x);
                    209:        AppendInteger((long) y);
                    210:        AppendOp(OP_lineto);
                    211:        CurrentX = x;
                    212:        CurrentY = y;
                    213: }
                    214: 
                    215: 
                    216: /*
                    217:  * point: Plot the point given by the next four bytes.
                    218:  */
                    219: 
                    220: point() {
                    221:        int x, y;
                    222: 
                    223:        if( HaveTrajectory )
                    224:                ShowTrajectory();
                    225: 
                    226:        x = getShort();
                    227:        y = getShort();
                    228: #ifdef DEBUG
                    229:        printf("point at (%d, %d)\n", x, y);
                    230: #endif DEBUG
                    231:        AppendInteger((long) x);
                    232:        AppendInteger((long) y);
                    233:        CurrentX = x;
                    234:        CurrentY = y;
                    235: }
                    236: 
                    237: 
                    238: /*
                    239:  * line: Draw a line from the point given by the next four bytes to the point
                    240:  *     given by the following four bytes.
                    241:  */
                    242: 
                    243: line() {
                    244:        int x0, y0, x1, y1;
                    245: 
                    246:        x0 = getShort();
                    247:        y0 = getShort();
                    248:        x1 = getShort();
                    249:        y1 = getShort();
                    250: #ifdef DEBUG
                    251:        printf("line from (%d, %d) to (%d, %d)\n", x0, y0, x1, y1);
                    252: #endif DEBUG
                    253: 
                    254:        if( ! HaveTrajectory ) {
                    255:                AppendInteger((long) x0);
                    256:                AppendInteger((long) y0);
                    257:                AppendOp(OP_moveto); }
                    258:        else
                    259:                if( x0 != CurrentX  ||  y0 != CurrentY ) {
                    260:                        ShowTrajectory();
                    261: 
                    262:                        AppendInteger((long) x0);
                    263:                        AppendInteger((long) y0);
                    264:                        AppendOp(OP_moveto); }
                    265: 
                    266:        AppendInteger((long) x1);
                    267:        AppendInteger((long) y1);
                    268:        AppendOp(OP_lineto);
                    269:        HaveTrajectory = TRUE;
                    270:        CurrentX = x1;
                    271:        CurrentY = y1;
                    272: }
                    273: 
                    274: 
                    275: /*
                    276:  * label: Place the following ASCII string so that its first character falls
                    277:  *     on the current point.  The string is terminated by a newline.
                    278:  *
                    279:  * Unspoken in the documentation but implied by practice is 
                    280:  * that the current position is changed to the end of text string.
                    281:  * This artifact can cause problems because we don't know the width
                    282:  * of characters in a font.
                    283:  */
                    284: 
                    285: label() {
                    286:        char labelString[MAXSTRINGSIZE];
                    287: 
                    288:        if( HaveTrajectory ) {
                    289:                printf("pl2ip: opps trying to put text at end of line!\n");
                    290:                ShowTrajectory();
                    291:        }
                    292: 
                    293:        (void) gets(labelString);
                    294: #ifdef DEBUG
                    295:        printf("output label string: '%s'\n", labelString);
                    296: #endif DEBUG
                    297:        AppendInteger((long) CurrentX);
                    298:        AppendInteger((long) CurrentY);
                    299:        AppendOp(OP_setxy);
                    300:        AppendString(labelString);
                    301:        AppendOp(OP_show);
                    302: 
                    303:        CurrentX += strlen(labelString)*(4096.0/(Pitch * 6.5)) + .4999999;
                    304: }
                    305: 
                    306: 
                    307: /*
                    308:  * arc: The first four bytes give the center, the next four give the starting
                    309:  *     proint and the last four give the end point of a circular arc.  The
                    310:  *     least significant coordinate of the end point is used to only to
                    311:  *     determine the quadrant.  The arc is drawn counter-clockwise.
                    312:  */
                    313: 
                    314: arc() {
                    315: #ifdef DEBUG
                    316:        int     centerX, centerY,
                    317:                startX, startY,
                    318:                endX, endY;
                    319: 
                    320:        if( HaveTrajectory )
                    321:                ShowTrajectory();
                    322: 
                    323:        centerX = getShort();
                    324:        centerY = getShort();
                    325:        startX = getShort();
                    326:        startY = getShort();
                    327:        endX = getShort();
                    328:        endY = getShort();
                    329:        printf("arc with center (%d, %d), starting at (%d, %d) and ending at (%d, %d)\n", centerX, centerY, startX, startY, endX, endY);
                    330: #endif DEBUG
                    331: }
                    332: 
                    333: 
                    334: /*
                    335:  * circle: The first four bytes give the center of the circle, the next
                    336:  *     two the radius.
                    337:  */
                    338: 
                    339: circle() {
                    340: #ifdef DEBUG
                    341:        int     centerX, centerY,
                    342:                radius;
                    343: 
                    344:        if( HaveTrajectory )
                    345:                ShowTrajectory();
                    346: 
                    347:        centerX = getShort();
                    348:        centerY = getShort();
                    349:        radius = getShort();
                    350:        printf("circle at (%d, %d) with radius %d\n", centerX, centerY, radius);
                    351: #endif DEBUG
                    352: }
                    353: 
                    354: 
                    355: /*
                    356:  * erase: Start another frame of output
                    357:  */
                    358: 
                    359: erase() {
                    360:        if( HaveTrajectory )
                    361:                ShowTrajectory();
                    362: 
                    363: #ifdef DEBUG
                    364:        printf("erase\n");
                    365: #endif DEBUG
                    366: }
                    367: 
                    368: 
                    369: /*
                    370:  * linemod: Take the following string, up to a newline, as the style for
                    371:  *     drawing further lines.  The syles are 'dotted', 'solid', 'longdashed',
                    372:  *     'shortdashed', and 'dotdashed'.
                    373:  */
                    374: 
                    375: lineMod() {
                    376:        char lineType[MAXSTRINGSIZE];
                    377: 
                    378:        if( HaveTrajectory )
                    379:                ShowTrajectory();
                    380: 
                    381:        (void) gets(lineType);
                    382: #ifdef DEBUG
                    383:        printf("change line mode to '%s'\n", lineType);
                    384: #endif DEBUG
                    385: }
                    386: 
                    387: /*
                    388:  * space: The next four bytes give the lower left corner of the plotting area;
                    389:  *     the following four give the upper right corner.  The plot will be
                    390:  *     magnified or reduced to fit the device as closely as possible.
                    391:  */
                    392: 
                    393: space() {
                    394: #ifdef DEBUG
                    395:        int     lowerLeftX, lowerLeftY,
                    396:                upperRightX, upperRightY;
                    397: 
                    398:        lowerLeftX = getShort();
                    399:        lowerLeftY = getShort();
                    400:        upperRightX = getShort();
                    401:        upperRightY = getShort();
                    402:        printf("space with lower left at (%d, %d) and upper right at (%d, %d)\n", lowerLeftX, lowerLeftY, upperRightX, upperRightY);
                    403: #endif DEBUG
                    404: } 
                    405: 
                    406: 
                    407: /*
                    408:  * draw the current trajectory
                    409:  */
                    410: 
                    411: ShowTrajectory() {
                    412:        AppendOp(OP_maskstroke);
                    413:        HaveTrajectory = FALSE;
                    414: }

unix.superglobalmegacorp.com

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