Annotation of researchv9/jtools/src/Jpic/pltroff.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *     jerq driver
        !             3:  */
        !             4: 
        !             5: #include <stdio.h>
        !             6: #include <math.h>
        !             7: #include "y.tab.h"
        !             8: #include "pic.h"
        !             9: 
        !            10: 
        !            11: #define        abs(n)  (n >= 0 ? n : -(n))
        !            12: #define        PI      3.141592654
        !            13: #define        PI2     PI/2
        !            14: 
        !            15: extern int     res;
        !            16: extern int     DX;     /* step size in x */
        !            17: extern int     DY;     /* step size in y */
        !            18: 
        !            19: extern float   hshift; /* how much to move left by for text */
        !            20: extern float   vshift; /* how much down */
        !            21: 
        !            22: /* scaling stuff, specific to typesetter */
        !            23: /* defined by s command as X0,Y0 to X1,Y1 */
        !            24: /* output dimensions set by -l,-w options to 0,0 to hmax, vmax */
        !            25: /* default output is 6x6 inches */
        !            26: 
        !            27: float  xscale;
        !            28: float  yscale;
        !            29: 
        !            30: int    hpos    = 0;    /* current horizontal position in output coordinate system */
        !            31: int    vpos    = 0;    /* current vertical position; 0 is top of page */
        !            32: 
        !            33: int    X0, Y0;         /* left bottom of input */
        !            34: int    X1, Y1;         /* right top of input */
        !            35: #define        CX      0       /* center of jerq screen */
        !            36: #define        CY      0
        !            37: #define        JERQRES 81
        !            38: 
        !            39: int    hmax;           /* right end of output */
        !            40: int    vmax;           /* top of output (down is positive) */
        !            41: 
        !            42: extern float   deltx;
        !            43: extern float   delty;
        !            44: extern int     xmin, ymin, xmax, ymax, sxmin, symin, sxmax, symax;
        !            45: extern int     crop;
        !            46: 
        !            47: openpl(s)      /* initialize device */
        !            48: char *s;       /* residue of .PS invocation line */
        !            49: {
        !            50:        hpos = vpos = 0;
        !            51:        res = JERQRES;
        !            52:        if (delty == 0)
        !            53:                delty = deltx;  /* -w alone implies -s */
        !            54:        hmax = vmax = 8 * res;  /* default = 8 x 8 */
        !            55:        if (deltx > 0 && delty > 0) {   /* have to change default size */
        !            56:                if (deltx < 9)  /* assume inches were specified */
        !            57:                        hmax = res * deltx;
        !            58:                else
        !            59:                        hmax = res * 9;
        !            60:                if (deltx < 9)  /* assume inches were specified */
        !            61:                        vmax = res * delty;
        !            62:                else
        !            63:                        vmax = res * 9;
        !            64:        }
        !            65:        if (crop) {
        !            66:                if (xmax == xmin)
        !            67:                        space(xmin, ymin, xmin + ymax-ymin, ymax);
        !            68:                else
        !            69:                        space(xmin, ymin, xmax, ymin + xmax-xmin);      /* assumes 1:1 aspect ratio */
        !            70:        }
        !            71:        else
        !            72:                space(sxmin, symin, sxmax, symax);
        !            73:        printf("... %d %d %d %d %d %d %d %d\n",
        !            74:                (xmin), (ymin), (xmax), (ymax),
        !            75:                (sxmin), (symin), (sxmax), (symax));
        !            76:        printf("... %du %du %du %du %du %du %du %du\n",
        !            77:                xconv(xmin), yconv(ymin), xconv(xmax), yconv(ymax),
        !            78:                xconv(sxmin), yconv(symin), xconv(sxmax), yconv(symax));
        !            79:        printf(".PS %d %d %s", yconv(ymin), xconv(xmax), s);
        !            80:                /* assumes \n comes as part of s */
        !            81:        erase();
        !            82: }
        !            83: 
        !            84: closepl(type)  /* clean up after finished */
        !            85: {
        !            86:        printf("S\n");
        !            87: }
        !            88: 
        !            89: move(x, y)     /* go to position x, y in external coords */
        !            90: int x, y;
        !            91: {
        !            92:        hgoto(xconv(x));
        !            93:        vgoto(yconv(y));
        !            94: }
        !            95: 
        !            96: movehv(h, v)   /* go to internal position h, v */
        !            97: int h, v;
        !            98: {
        !            99:        hgoto(h);
        !           100:        vgoto(v);
        !           101: }
        !           102: 
        !           103: hmot(n)        /* generate n units of horizontal motion */
        !           104: int n;
        !           105: {
        !           106:        hpos += n;
        !           107: }
        !           108: 
        !           109: vmot(n)        /* generate n units of vertical motion */
        !           110: int n;
        !           111: {
        !           112:        vpos += n;
        !           113: }
        !           114: 
        !           115: hgoto(n)
        !           116: {
        !           117:        hpos = n;
        !           118: }
        !           119: 
        !           120: vgoto(n)
        !           121: {
        !           122:        vpos = n;
        !           123: }
        !           124: 
        !           125: hvflush()      /* get to proper point for output */
        !           126: {
        !           127:        printf("m %d %d\n", hpos, vpos);
        !           128: }
        !           129: 
        !           130: troff(s)       /* output troff right here */
        !           131: char *s;
        !           132: {
        !           133:        printf("%s\n", s);
        !           134: }
        !           135: 
        !           136: label(s, t, nh)        /* text s of type t nh half-lines up */
        !           137: char *s;
        !           138: int t, nh;
        !           139: {
        !           140:        int x0, y0, x1, y1;
        !           141:        int q;
        !           142:        char *p;
        !           143: 
        !           144:        if (t == 'A')
        !           145:                nh++;
        !           146:        else if (t == 'B')
        !           147:                nh--;
        !           148:        vpos += nh * 10;        /* approx 1/2 line */
        !           149:        switch (t) {
        !           150:        default:
        !           151:                t = ' ';
        !           152:                /* FALL THROUGH */
        !           153:        case 'L':
        !           154:        case 'A':
        !           155:        case 'B':
        !           156:        case 'C':
        !           157:        case 'R':
        !           158:                printf("t %d %d %c%s\n", hpos, vpos, t, s);
        !           159:                break;
        !           160:        }
        !           161: }
        !           162: 
        !           163: /* line(x0, y0, x1, y1)        /* draw line from x0,y0 to x1,y1 */
        !           164: /* int x0, y0, x1, y1;
        !           165: /* {
        !           166: /*     printf("l %d %d %d %d\n", xconv(x0), yconv(y0), xconv(x1), yconv(y1));
        !           167: /* }
        !           168: */
        !           169: 
        !           170: arrow(x0, y0, x1, y1, w, h)    /* draw arrow (without line), head wid w & len h */
        !           171: {
        !           172:        double alpha, rot, hyp;
        !           173:        int dx, dy;
        !           174:        extern int dbg;
        !           175: 
        !           176:        rot = atan2( ((double) w) / 2, (double) h );
        !           177:        hyp = sqrt( (float) (w/2 * w/2 + h * h) );
        !           178:        alpha = atan2((float)(y1-y0), (float)(x1-x0));
        !           179:        if (dbg)
        !           180:                printf("rot=%f, hyp=%f, alpha=%f\n", rot, hyp, alpha);
        !           181:        dx = hyp * cos(alpha + PI + rot) + 0.5;
        !           182:        dy = hyp * sin(alpha + PI + rot) + 0.5;
        !           183:        if (dbg) printf("dx,dy = %d,%d\n", dx, dy);
        !           184:        /* line(x1+dx, y1+dy, x1, y1); */
        !           185:        printf("l 2 %d %d %d %d\n",
        !           186:                xconv(x1+dx), yconv(y1+dy), xconv(x1), yconv(y1));
        !           187:        dx = hyp * cos(alpha + PI - rot) + 0.5;
        !           188:        dy = hyp * sin(alpha + PI - rot) + 0.5;
        !           189:        if (dbg) printf("dx,dy = %d,%d\n", dx, dy);
        !           190:        /* line(x1+dx, y1+dy, x1, y1); */
        !           191:        printf("l 2 %d %d %d %d\n",
        !           192:                xconv(x1+dx), yconv(y1+dy), xconv(x1), yconv(y1));
        !           193: }
        !           194: 
        !           195: box(x0, y0, x1, y1, dotdash, ddval)
        !           196: {
        !           197:        printf("b");
        !           198:        if (dotdash == DOT)
        !           199:                printf(". %d", xsc(ddval));
        !           200:        else if (dotdash == DASH)
        !           201:                printf("- %d", xsc(ddval));
        !           202:        printf(" %d %d %d %d\n", xconv(x0), yconv(y0), xconv(x1), yconv(y1));
        !           203: }
        !           204: 
        !           205: circle(x, y, r)
        !           206: {
        !           207:        printf("c %d %d %d\n", hpos = xconv(x), vpos = yconv(y), xsc(r));
        !           208: }
        !           209: 
        !           210: spline(x, y, n, p, head)
        !           211:        int x, y, n, *p, head;
        !           212: {
        !           213:        int i, j, dx, dy;
        !           214: 
        !           215:        printf("~ ");
        !           216:        if (head & HEAD1)
        !           217:                printf("<");
        !           218:        if (head & HEAD2)
        !           219:                printf(">");
        !           220:        printf(" %d %d %d", n+1, hpos = xconv(x), vpos = yconv(y));
        !           221:        for (i = 0; i < 2 * n; i += 2) {
        !           222:                x += p[i];
        !           223:                y += p[i+1];
        !           224:                printf(" %d %d", xconv(x), yconv(y));
        !           225:        }
        !           226:        printf("\n");
        !           227: }
        !           228: 
        !           229: line(x, y, n, p, head, dotdash, ddval)
        !           230:        int x, y, n, *p, head;
        !           231:        int dotdash, ddval;
        !           232: {
        !           233:        int i, j, dx, dy;
        !           234: 
        !           235:        printf("l ");   /* a line */
        !           236:        if (head & HEAD1)
        !           237:                printf("<");
        !           238:        if (head & HEAD2)
        !           239:                printf(">");
        !           240:        if (dotdash == DOT)
        !           241:                printf(". %d", xsc(ddval));
        !           242:        else if (dotdash == DASH)
        !           243:                printf("- %d", xsc(ddval));
        !           244:        printf(" %d %d %d", n+1, hpos = xconv(x), vpos = yconv(y));
        !           245:        for (i = 0; i < 2 * n; i += 2) {
        !           246:                x += p[i];
        !           247:                y += p[i+1];
        !           248:                printf(" %d %d", xconv(x), yconv(y));
        !           249:        }
        !           250:        printf("\n");
        !           251: }
        !           252: 
        !           253: 
        !           254: ellipse(x, y, r1, r2)
        !           255: {
        !           256:        r1 = xsc(r1);
        !           257:        r2 = ysc(r2);
        !           258:        printf("e %d %d %d %d\n", xconv(x), yconv(y), abs(r1), abs(r2));
        !           259: }
        !           260: 
        !           261: arc(x, y, x0, y0, x1, y1)      /* draw arc with center x,y */
        !           262: {
        !           263:        float r;
        !           264:        float dx2, dy2, phi, ht, d;
        !           265:        int cx, cy;
        !           266: 
        !           267:        r = sqrt( (float) (x0-x) * (x0-x) + (float) (y0-y) * (y0-y) );
        !           268:        /* decide which radius is really needed: */
        !           269:        dx2 = (float)(x1 - x0) / 2;
        !           270:        dy2 = (float)(y1 - y0) / 2;
        !           271:        phi = atan2(dy2, dx2) + PI2;
        !           272:        ht = sqrt(r*r - (dx2*dx2 + dy2*dy2));
        !           273:        cx = x0 + dx2 + ht * cos(phi) + 0.5;
        !           274:        cy = y0 + dy2 + ht * sin(phi) + 0.5;
        !           275:        if (abs(cx-x) >= 5 || abs(cy-y) >= 5)
        !           276:                r = -r; /* wrong center was picked */
        !           277:        printf("a %d %d %d %d %d %d\n", xconv(x), yconv(y),
        !           278:                xconv(x0), yconv(y0), xconv(x1), yconv(y1));
        !           279: }
        !           280: 
        !           281: erase()        /* get to bottom of frame */
        !           282: {
        !           283:        printf("E\n");
        !           284:        fflush(stdout);
        !           285: }
        !           286: 
        !           287: point(x, y)    /* put point at x,y */
        !           288: int x, y;
        !           289: {
        !           290:        static char *temp = ".";
        !           291: 
        !           292:        move(x, y);
        !           293:        label(temp, 'L');
        !           294: }
        !           295: 
        !           296: space(x0, y0, x1, y1)  /* set limits of page */
        !           297: int x0, y0, x1, y1;
        !           298: {
        !           299:        if (x0 == x1)
        !           300:                x1 = x0 + 1;
        !           301:        if (y0 == y1)
        !           302:                y1 = y0 - 1;    /* kludge */
        !           303:        X0 = x0;
        !           304:        Y0 = y0;
        !           305:        X1 = x1;
        !           306:        Y1 = y1;
        !           307:        xscale = (float) hmax / (float) (X1-X0);
        !           308:        yscale = (float) vmax / (float) (Y0-Y1);
        !           309: }
        !           310: 
        !           311: xconv(x)       /* convert x from external to internal form */
        !           312: int x;
        !           313: {
        !           314:        int v;
        !           315: 
        !           316:        v = (x-X0) * xscale + 0.5;
        !           317:        return v + CX;
        !           318: }
        !           319: 
        !           320: xsc(x) /* convert x from external to internal form, scaling only */
        !           321: int x;
        !           322: {
        !           323:        int v;
        !           324: 
        !           325:        v = (x) * xscale + 0.5;
        !           326:        return v;
        !           327: }
        !           328: 
        !           329: yconv(y)       /* convert y from external to internal form */
        !           330: int y;
        !           331: {
        !           332:        int v;
        !           333: 
        !           334:        y += Y1 - ymax;
        !           335:        v = (y-Y1) * yscale + 0.5;
        !           336:        return v + CY;
        !           337: }
        !           338: 
        !           339: ysc(y) /* convert y from external to internal form, scaling only */
        !           340: int y;
        !           341: {
        !           342:        int v;
        !           343: 
        !           344:        v = (y) * yscale + 0.5;
        !           345:        return v;
        !           346: }
        !           347: 
        !           348: linemod(s)
        !           349: char *s;
        !           350: {
        !           351: }
        !           352: 
        !           353: dot() {
        !           354:        hvflush();
        !           355:        printf("tc.\n");
        !           356: }

unix.superglobalmegacorp.com

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