Annotation of researchv9/jtools/src/cip/track.c, revision 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: 
        !             8: extern Rectangle brushes[];
        !             9: 
        !            10: Point 
        !            11: track(p,offset,b,th) 
        !            12: Point p,offset; int b; 
        !            13: register struct thing *th;
        !            14: {
        !            15:   Point t, ot, r;
        !            16: 
        !            17:   if ( b != ARC ) {
        !            18:     p = add(p,offset);
        !            19:     ot = p;
        !            20:   }
        !            21:   else {
        !            22:     ot = add(p,offset);                
        !            23:   }
        !            24:   if (th != TNULL || b==BOX || b==LINE || b==REVLINE || b==ARC) {
        !            25:     do {
        !            26:       t = MOUSE_XY;
        !            27:       if ((t.x!=ot.x)||(t.y!=ot.y)) {
        !            28:        cursinhibit();
        !            29:        switch (b) {
        !            30:          case BOX: {
        !            31:            r = near(t,th,offset);
        !            32:            if (r.x != 0) {
        !            33:              t = r;
        !            34:            }
        !            35:            else {
        !            36:              r=near(Pt(p.x,t.y),th,offset);
        !            37:              if (r.x!=0) {
        !            38:                t.y = r.y;
        !            39:              }
        !            40:              else {
        !            41:                r=near(Pt(t.x,p.y),th,offset);
        !            42:                if (r.x != 0) {
        !            43:                  t.x = r.x;
        !            44:                }
        !            45:              }
        !            46:            }
        !            47:            xbox (canon (p, ot));
        !            48:            xbox (canon (p, t));
        !            49:            break;
        !            50:          }
        !            51:          case ARC: {
        !            52:            th->type = ARC;
        !            53:            th->otherValues.arc.start = p;
        !            54:            th->otherValues.arc.end = sub( ot,offset );
        !            55:            th->origin=computeArcOrigin( p, sub( ot,offset ));
        !            56:            if (!eqpt(th->otherValues.arc.start,
        !            57:                      th->otherValues.arc.end)) {
        !            58:              draw(th,offset);  
        !            59:            }
        !            60:            th->otherValues.arc.end = sub( t,offset );
        !            61:            th->origin=computeArcOrigin( p,sub( t,offset ));
        !            62:            draw(th,offset);    
        !            63:            break;
        !            64:          }
        !            65:          case REVLINE:
        !            66:          case LINE: {
        !            67:            r=near(t,th,offset);
        !            68:            if (r.x!=0) {
        !            69:              t=r;
        !            70:            }
        !            71:            else {
        !            72:              if (abs(p.x-t.x)<nearlyStraight) {
        !            73:                t.x=p.x;
        !            74:              }
        !            75:              else {
        !            76:                if (abs(p.y-t.y)<nearlyStraight) {
        !            77:                  t.y=p.y;
        !            78:                }
        !            79:              }
        !            80:            }
        !            81:            if (b== LINE) {     /* See note 1 */
        !            82:              xsegment(p,ot);
        !            83:              xsegment(p,t);
        !            84:            }
        !            85:            else {
        !            86:              xsegment(ot,p);
        !            87:              xsegment(t,p);
        !            88:            }
        !            89:            break;
        !            90:          }
        !            91:          case GROWCIRCLE: {
        !            92:            draw(th,offset);
        !            93:            th->otherValues.radius=distance(add(th->origin,offset),t);
        !            94:            draw(th,offset);
        !            95:            break;
        !            96:          }
        !            97:          case MOVE: {
        !            98:            r=near(t,th,offset);
        !            99:            if (r.x != 0) {
        !           100:              t=r;
        !           101:            }
        !           102:            draw(th,offset);
        !           103:            th->origin = sub(t,offset);
        !           104:            draw(th,offset);
        !           105:            break;      
        !           106:          }
        !           107:          case GROWEHT: {
        !           108:            draw(th,offset);
        !           109:            th->otherValues.ellipse.ht =  
        !           110:                abs(th->origin.y-t.y+offset.y)<<1;
        !           111:            draw(th,offset);
        !           112:            break;
        !           113:          }
        !           114:          case GROWEWID: {
        !           115:            draw(th,offset);
        !           116:            th->otherValues.ellipse.wid = 
        !           117:                abs(th->origin.x-t.x+offset.x)<<1;
        !           118:            draw(th,offset);
        !           119:            break;
        !           120:          }
        !           121:          case ELLIPSE: {
        !           122:            draw(th,offset);
        !           123:            th->otherValues.ellipse.wid = 
        !           124:                (abs(th->origin.x-t.x+offset.x))<<1;
        !           125:            th->otherValues.ellipse.ht =  
        !           126:                abs(th->origin.y-t.y+offset.y)<<1;
        !           127:            draw(th,offset);
        !           128:            break;
        !           129:          }
        !           130:        }
        !           131:        ot = t;
        !           132:        cursallow();
        !           133:       }
        !           134:       jnap(2);
        !           135:     } while (button2());
        !           136:   }
        !           137:   if ( b == ARC ) {
        !           138:     draw(th,offset);
        !           139:   }
        !           140:   cursinhibit();
        !           141:   switch (b) {
        !           142:     case BOX: {
        !           143:       xbox (canon (p, ot));
        !           144:       break;
        !           145:     }
        !           146: /*  case REVLINE:      /* REVLINE not needed, used only with splines */
        !           147:     case LINE: {
        !           148:       /* Don't draw line if tracking a spline */
        !           149:       if (th->type != SPLINE) {
        !           150:        xsegment(p,ot);
        !           151:       }
        !           152:       break;
        !           153:     }
        !           154:   }
        !           155:   cursallow();
        !           156:   return(sub(t,offset));
        !           157: }
        !           158: /* NOTE 1: */
        !           159: /* Lines drawn and undrawn using XOR mode must always be drawn in the */
        !           160: /* same direction.  This is because the last point on the line is not */
        !           161: /* drawn.  The same line drawn twice, but in opposite directions */
        !           162: /* will leave two points on the screen.  So, because of this when */
        !           163: /* the tracking routine is tracking a spline from p[2] to p[1] the */
        !           164: /* line must be drawn in the opposite direction (from p[1] to p[2]). */
        !           165: /* Therefore, the need for the REVLINE value. */
        !           166: 
        !           167: Point 
        !           168: track2(offset,o1, o2, p) 
        !           169: Point offset, o1, o2, p;
        !           170: {
        !           171:   Point op;
        !           172: 
        !           173:   o1 = add(offset,o1);
        !           174:   o2 = add(offset,o2);
        !           175:   op = add(offset,p);
        !           176:   do {
        !           177:     p = MOUSE_XY;
        !           178:     cursinhibit();
        !           179:     if ((p.x!=op.x)||(p.y!=op.y)) {
        !           180:       xsegment(o1,op);
        !           181:       xsegment(op,o2);
        !           182:       xsegment(o1,p);
        !           183:       xsegment(p,o2);
        !           184:     }
        !           185:     op = p;
        !           186:     cursallow();
        !           187:     jnap(2);
        !           188:   } while (button2());
        !           189:   cursinhibit ();
        !           190:   cursallow ();
        !           191:   return(sub(p,offset));
        !           192: }
        !           193: 
        !           194: Rectangle
        !           195: moveBox(p,r,h,offset)
        !           196: Point p, offset; 
        !           197: Rectangle r; 
        !           198: register struct thing *h;
        !           199: {
        !           200:   Rectangle or; Point dor, dc; Point op, q;
        !           201: 
        !           202:   or = r;
        !           203:   dor= sub(or.origin,p);
        !           204:   dc = sub(or.corner,p);
        !           205:   op = add(p,offset);
        !           206:   do {
        !           207:     p = MOUSE_XY;      
        !           208:     r.origin = add(or.origin,sub(p,op));
        !           209:     q = near(add(r.origin,offset),h,offset);
        !           210:     if (q.x!=0) {
        !           211:       p = sub(q,dor);
        !           212:     }
        !           213:     else {
        !           214:       r.corner = add(or.corner,sub(p,op));
        !           215:       q = near(add(r.corner,offset),h,offset);
        !           216:       if (q.x!=0) {
        !           217:        p = sub(q,dc);
        !           218:       }
        !           219:     }
        !           220:     r.origin = add(or.origin,sub(p,op));
        !           221:     r.corner = add(or.corner,sub(p,op));
        !           222:     cursinhibit();
        !           223:     xbox(raddp(or,offset));
        !           224:     xbox(raddp (r, offset));
        !           225:     op = p;
        !           226:     or = r;
        !           227:     cursallow();
        !           228:     jnap(2);
        !           229:   } while (button2()); 
        !           230:   return(r);
        !           231: }
        !           232:     
        !           233: arcOrigin(t,offset) 
        !           234: register struct thing *t; 
        !           235: Point offset;
        !           236: {
        !           237:   Point oc, c, c1, c2, s, e, om, m, org, mid; 
        !           238: 
        !           239:   s = add(offset,t->otherValues.arc.start);
        !           240:   e = add(offset,t->otherValues.arc.end);
        !           241:   org = add(offset,t->origin);
        !           242:   mid = sub(org,div(add(s,e),2));
        !           243:   oc = org;
        !           244:   om = oc;
        !           245:   do {
        !           246:     cursinhibit();
        !           247:     m = MOUSE_XY;
        !           248:     if (distance(m,om)>2) {
        !           249:       c1.x = m.x;
        !           250:       c1.y = muldiv(mid.y, c1.x-org.x, mid.x) + org.y;
        !           251:       c2.y = m.y;
        !           252:       c2.x = muldiv(c2.y-org.y, mid.x,mid.y) + org.x;
        !           253:       c = (distance(oc,c1)<distance(c,c2))?c1:c2;
        !           254:       eraseAndDrawArc(oc,e,s,c,e,s);
        !           255:       oc = c;
        !           256:       om = m;
        !           257:       t->origin = sub(c,offset);
        !           258:     }
        !           259:     cursallow();
        !           260:     jnap(2);
        !           261:   } while (button2());
        !           262: }
        !           263: 
        !           264: arcStart(t,offset) 
        !           265: register struct thing *t; 
        !           266: Point offset;
        !           267: {
        !           268:   Point oc, s, e, os; 
        !           269: 
        !           270:   os = add(offset,t->otherValues.arc.start);
        !           271:   e = add(offset,t->otherValues.arc.end);
        !           272:   oc = add(offset,t->origin);
        !           273:   do {
        !           274:     cursinhibit();
        !           275:     s = MOUSE_XY;
        !           276:     if (distance(s,os)>2) {
        !           277:       eraseAndDrawArc(oc,e,os,oc,e,s);
        !           278:       os = s;
        !           279:       t->otherValues.arc.start=sub(s,offset);
        !           280:     }
        !           281:     cursallow();
        !           282:     jnap(2);
        !           283:   } while (button2());
        !           284: }
        !           285: 
        !           286: arcEnd(t,offset) 
        !           287: register struct thing *t; 
        !           288: Point offset;
        !           289: {
        !           290:   Point oc, s, e, oe; 
        !           291: 
        !           292:   s = add(offset,t->otherValues.arc.start);
        !           293:   oe = add(offset,t->otherValues.arc.end);
        !           294:   oc = add(offset,t->origin);
        !           295:   do {
        !           296:     cursinhibit();
        !           297:     e = MOUSE_XY;
        !           298:     if (distance(e,oe)>2) {
        !           299:       eraseAndDrawArc(oc,oe,s,oc,e,s);
        !           300:       oe = e;
        !           301:       t->otherValues.arc.end=sub(e,offset);
        !           302:     }
        !           303:     cursallow();
        !           304:     jnap(2);
        !           305:   } while (button2());
        !           306: }
        !           307: 
        !           308: eraseAndDrawArc(oc,oe,os,c,e,s) 
        !           309: Point oc, oe, os, c, e, s;
        !           310: {
        !           311:   xarc(oc,os,oe);
        !           312:   xsegment(oc,os);
        !           313:   xsegment(oc,oe);
        !           314:   xarc(c,s,e);
        !           315:   xsegment(c,s);
        !           316:   xsegment(c,e);
        !           317: }

unix.superglobalmegacorp.com

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