Annotation of researchv9/jtools/src/cip/draw.c, revision 1.1.1.1

1.1       root        1: /*
                      2:   %Z%  %M%  version %I% %Q%of %H% %T%
                      3:   Last Delta:  %G% %U% to %P%
                      4: */
                      5: 
                      6: #include "cip.h"
                      7: #define DOT 2
                      8: #define DASH 10
                      9: #define ARROWwid 10
                     10: #define ARROWht 5
                     11: 
                     12: Rectangle saveScreenmap;
                     13: Word *saveBase;
                     14: extern Point jString ();
                     15: extern void jMoveTo ();
                     16: extern Rectangle brushes[];
                     17: struct thing addOffset();
                     18: 
                     19: /* This routine clips an arc within rectangle brushes[PIC] */
                     20: 
                     21: xarc(p0, p1, p2) 
                     22: Point p0, p1, p2;
                     23: {
                     24:   arc(&display , p0, p1, p2, F_XOR);
                     25: }
                     26: 
                     27: 
                     28: /* This routine clips a spline within rectangle brushes[PIC] */
                     29: 
                     30: xspline(offset,p, n) 
                     31: Point offset;
                     32: register Point *p;
                     33: int n;
                     34: {
                     35:   spline(offset,p, n);
                     36: }
                     37: 
                     38: /* This routine clips a line within rectangle brushes[PIC] */
                     39: 
                     40: xsegment (p, q)
                     41: Point p, q;
                     42: {
                     43:   segment(&display , p, q, F_XOR);
                     44:   PtCurrent = q;
                     45: }
                     46: 
                     47: draw(t,offset) 
                     48: register struct thing *t; 
                     49: Point offset; 
                     50: {
                     51:   register struct thing *s; 
                     52:   Rectangle rc; 
                     53:   Point p1,p2; 
                     54:   register int u;
                     55:   register Font *ft;
                     56: 
                     57:   if (t != (struct thing *) NULL) {
                     58:     cursinhibit();
                     59:     switch(t->type) {
                     60:       case CIRCLE: {
                     61:        circle(&display,add(offset,t->origin),
                     62:               t->otherValues.radius,F_XOR);
                     63:        break;
                     64:       }
                     65:       case BOX: {
                     66:        rc = raddp(t->bb,offset);
                     67:        if (t->boorder == DOTTED) {
                     68:          dashedBox(rc,DOT);
                     69:        }
                     70:        else {
                     71:          if (t->boorder == DASHED) {
                     72:            dashedBox(rc,DASH);
                     73:          }
                     74:          else {
                     75:            box(rc);
                     76:          }
                     77:        }
                     78:        break;
                     79:       }
                     80:       case ELLIPSE: {
                     81:        Ellipse(add(offset,t->origin),t->otherValues.ellipse.ht,
                     82:            t->otherValues.ellipse.wid);
                     83:        break;
                     84:       }
                     85:       case LINE:  {
                     86:        p1 = add(t->origin,offset);
                     87:        p2 = add(t->otherValues.end,offset);
                     88:        if (t->boorder == DOTTED) {
                     89:          dashedLine(p1,p2,DOT);
                     90:        }
                     91:        else {
                     92:          if (t->boorder == DASHED) {
                     93:            dashedLine(p1,p2,DASH);
                     94:          }
                     95:          else {
                     96:            segment(&display,p1,p2,F_XOR);
                     97:            PtCurrent = p2;
                     98:          }
                     99:         }
                    100:        if ((t->arrow==startARROW)||(t->arrow==doubleARROW)) {
                    101:          arrow(p2,p1);
                    102:        }
                    103:        if ((t->arrow==endARROW)||(t->arrow==doubleARROW)) {
                    104:          arrow(p1,p2);
                    105:        }
                    106:        break;
                    107:       }
                    108:       case ARC: {
                    109:        arc (&display, add(offset,t->origin),
                    110:                         add(offset,t->otherValues.arc.start),
                    111:                         add(offset,t->otherValues.arc.end),F_XOR);
                    112:        break;
                    113:       }
                    114:       case TEXT: {
                    115:        ft = t->otherValues.text.f->f;
                    116:        u = strwidth(ft,t->otherValues.text.s);
                    117:        switch (t->otherValues.text.just) {
                    118:          case CENTER: {
                    119:            p1 = add(offset,sub(t->origin,Pt(u>>1,0)));
                    120:            break;
                    121:          }
                    122:          case LEFTJUST: {
                    123:            p1 = add(offset,t->origin);
                    124:            break;
                    125:          }
                    126:          case RIGHTJUST: {
                    127:            p1 = add(offset,sub(t->origin,Pt(u,0)));
                    128:            break;
                    129:          }
                    130:        }
                    131:        string(ft,t->otherValues.text.s,&display,p1,F_XOR);
                    132:        break;
                    133:       }
                    134:       case SPLINE: {
                    135:        u = t->otherValues.spline.used;
                    136:        spline(offset,t->otherValues.spline.plist,u);
                    137:        if ((t->arrow==startARROW)||(t->arrow==doubleARROW)) {
                    138:          arrow(add(offset,t->otherValues.spline.plist[2]),
                    139:                add(offset,t->otherValues.spline.plist[1]));
                    140:        }
                    141:        if ((t->arrow==endARROW)||(t->arrow==doubleARROW)) {
                    142:          arrow(add(offset,t->otherValues.spline.plist[u-2]),
                    143:                add(offset,t->otherValues.spline.plist[u-1]));
                    144:        }
                    145:        break;
                    146:       }
                    147:       case MACRO: {
                    148:        if ((s=t->otherValues.list->parts) != (struct thing *)NULL) {
                    149:          do {
                    150:            draw(s,add(offset,t->origin));
                    151:            s = s->next;
                    152:          } while (s != t->otherValues.list->parts);
                    153:        }
                    154:        break;
                    155:       }
                    156:     }
                    157:     cursallow();
                    158:   }
                    159: }
                    160: 
                    161: xbox(r) 
                    162: Rectangle r; 
                    163: {
                    164:   xsegment(r.origin,Pt(r.corner.x,r.origin.y));
                    165:   xsegment(Pt(r.corner.x,r.origin.y),r.corner);
                    166:   xsegment(r.corner,Pt(r.origin.x,r.corner.y));
                    167:   xsegment(Pt(r.origin.x,r.corner.y),r.origin);
                    168: }
                    169: 
                    170: box(r) 
                    171: Rectangle r; 
                    172: {
                    173:   segment(&display , r.origin,Pt(r.corner.x,r.origin.y),F_XOR);
                    174:   segment(&display , Pt(r.corner.x,r.origin.y),r.corner,F_XOR);
                    175:   segment(&display , r.corner,Pt(r.origin.x,r.corner.y),F_XOR);
                    176:   segment(&display , Pt(r.origin.x,r.corner.y),r.origin,F_XOR);
                    177:   PtCurrent = r.origin;
                    178: }
                    179: 
                    180: dashedBox(r,dashsize) 
                    181: Rectangle r; 
                    182: register int dashsize;
                    183: {
                    184:   dashedLine(r.origin,Pt(r.corner.x,r.origin.y),dashsize);
                    185:   dashedLine(Pt(r.corner.x,r.origin.y),r.corner,dashsize);
                    186:   dashedLine(r.corner,Pt(r.origin.x,r.corner.y),dashsize);
                    187:   dashedLine(Pt(r.origin.x,r.corner.y),r.origin,dashsize);
                    188: }
                    189: 
                    190: dashedLine(s,end,dashsize) 
                    191: Point s, end; 
                    192: int dashsize;
                    193: {
                    194:   register int e, dx, dy, i, toDraw, yinc, xinc, swit;
                    195: 
                    196:   initpoints(&display, F_XOR);
                    197:   dx = abs(end.x - s.x);
                    198:   dy = abs(end.y - s.y);
                    199:   xinc = ((end.x-s.x)>0)? 1 : -1;
                    200:   yinc = ((end.y-s.y)>0)? 1 : -1;
                    201:   swit = (dy>dx);
                    202:   toDraw = 1;
                    203:   e = (swit)? (2*dx - dy) : (2*dy - dx);
                    204:   for (i=0; i < ((swit) ? dy : dx); i++) {
                    205:     if (i>0 && i%dashsize==0) {
                    206:       toDraw = (toDraw==1)?0:1;
                    207:     }
                    208:     if (toDraw) {
                    209:       points(s, F_XOR);
                    210:     }
                    211:     if (e>0) {
                    212:       if (swit) {
                    213:        s.x += xinc;
                    214:       }
                    215:       else {
                    216:        s.y += yinc;
                    217:       }
                    218:       e += (swit)? (2*dx - 2*dy) : (2*dy - 2*dx);
                    219:     }
                    220:     else {
                    221:       e += (swit)? 2*dx : 2*dy;
                    222:     }
                    223:     if (swit) {
                    224:       s.y += yinc;
                    225:     }
                    226:     else {
                    227:       s.x += xinc;
                    228:     }
                    229:   }
                    230:   endpoints();
                    231: }
                    232: 
                    233: int 
                    234: degrees(d)  
                    235: register int d;
                    236: {
                    237:   while (d>360) {
                    238:     d -= 360;
                    239:   }
                    240:   while (d<0) {
                    241:     d += 360;
                    242:   }
                    243:   return(d);
                    244: }
                    245: 
                    246: arrow(a, b)            /* draw arrow (without line) */
                    247: Point a,b; 
                    248: {
                    249:   register int alpha, rot, hyp;
                    250:   register int dx, dy;
                    251: 
                    252:   rot = atan2( ARROWwid / 2, ARROWht);
                    253:   hyp = norm(ARROWwid,ARROWht,0);
                    254:   alpha = atan2(b.y-a.y, b.x-a.x);
                    255:   dx = muldiv(hyp,cos(degrees(alpha + 180 + rot)),1024);
                    256:   dy = muldiv(hyp,sin(degrees(alpha + 180 + rot)),1024);
                    257:   cursinhibit(); 
                    258:   segment(&display,add(b,Pt(-dx,dy)),b,F_XOR); 
                    259:   cursallow();
                    260:   dx = muldiv(hyp,cos(degrees(alpha + 180 - rot)),1024);
                    261:   dy = muldiv(hyp,sin(degrees(alpha + 180 - rot)),1024);
                    262:   cursinhibit(); 
                    263:   segment(&display,add(b,Pt(dx,-dy)),b,F_XOR); 
                    264:   cursallow();
                    265: }
                    266: 
                    267: centeredText(p,s) 
                    268: Point p; 
                    269: register char *s; 
                    270: {
                    271:   jMoveTo(Pt(p.x-(strwidth(&defont,s)>>1),p.y)); 
                    272:   jString(s);
                    273: }
                    274: 
                    275: flash(b,offset) 
                    276: register Rectangle *b; 
                    277: Point offset;
                    278: {
                    279:   if (b != (Rectangle *) NULL) {
                    280:     cursinhibit();
                    281:     rectf(&display,inset(raddp(*b,offset),1),F_XOR);
                    282:     cursallow();
                    283:   }
                    284: }
                    285: 
                    286: flashThing(t,offset) 
                    287: register struct thing *t; 
                    288: Point offset;
                    289: {      
                    290:   if (t != (struct thing *) NULL) {
                    291:     cursinhibit();
                    292:     switch (t->type) {
                    293:       case CIRCLE:
                    294:       case BOX:
                    295:       case ELLIPSE:
                    296:       case LINE:
                    297:       case ARC:
                    298:       case SPLINE: {
                    299:        draw(t,offset);
                    300:        break;
                    301:       }
                    302:       case MACRO:
                    303:       case TEXT: {
                    304:        flash(&t->bb,offset);
                    305:        break;
                    306:       }
                    307:     }
                    308:     cursallow();
                    309:   }
                    310: }
                    311: 
                    312: Ellipse(p,h,w) 
                    313: Point p; 
                    314: register int h, w;
                    315: {
                    316: 
                    317:   ellipse(&display , p, w>>1, h>>1, F_XOR);
                    318: }
                    319: 
                    320: drawZigZag(offset,p,n) 
                    321: Point offset;  
                    322: register Point *p;  
                    323: int n; 
                    324: {
                    325:   register int i;
                    326:   register Point j, k;
                    327: 
                    328:   if (p != (Point *) NULL) {
                    329:     cursinhibit();
                    330:     if (n>0) {
                    331:       j = add(offset, p[1]);
                    332:       for (i=2; i<=n; i++) {
                    333:         k = add (offset, p[i]);
                    334:         xsegment(j, k);
                    335:         j = k;
                    336:       }
                    337:     }
                    338:     cursallow();
                    339:   }
                    340: }
                    341: 
                    342: #define SCALE (long) 1000
                    343: #define STEPS 10
                    344: 
                    345: spline(offset,p, n) 
                    346: Point offset; 
                    347: register Point *p;
                    348: int n;
                    349: {
                    350:   register long w, t1, t2, t3; 
                    351:   register int i, j; 
                    352:   Point q;
                    353:   Point pcurrent;              /* Current point */
                    354: 
                    355:   if (p != (Point *) NULL) {
                    356:     p[0] = p[1];
                    357:     p[n] = p[n-1];
                    358:     cursinhibit();
                    359:     pcurrent = add(offset,p[0]);
                    360:     for (i = 0; i < n-1; i++) {
                    361:       for (j = 0; j < STEPS; j++) {
                    362:         w = SCALE * j / STEPS;
                    363:         t1 = w * w / (2 * SCALE);
                    364:         w = w - SCALE/2;
                    365:         t2 = 3*SCALE/4 - w * w / SCALE;
                    366:         w = w - SCALE/2;
                    367:         t3 = w * w / (2*SCALE);
                    368:         q.x = (t1*p[i+2].x + t2*p[i+1].x + t3*p[i].x + SCALE/2) / SCALE;
                    369:         q.y = (t1*p[i+2].y + t2*p[i+1].y + t3*p[i].y + SCALE/2) / SCALE;
                    370:         segment(&display, pcurrent, add(offset,q), F_XOR);
                    371:         pcurrent = add(offset, q );
                    372:       }
                    373:     }
                    374:     cursallow();
                    375:   }
                    376: }

unix.superglobalmegacorp.com

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