Annotation of researchv9/jtools/src/cip/edit.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: 
                      8: editThing(m,p,t)  
                      9: Point m;                       /* Mouse location */
                     10: Point p;                       /* Offset */
                     11: register struct thing *t;      /* Thing to be edited */
                     12: {
                     13:   register int d,dx,dy,u;  
                     14:   Point o, np; 
                     15:   if (t != TNULL) {
                     16:          o = t->origin;
                     17:     switch(t->type) {
                     18:       case CIRCLE: {
                     19:        d = norm(o.x-m.x,o.y-m.y,0);
                     20:        if (d< (t->otherValues.radius>>1)) {
                     21:          track(m,p,MOVE,t); 
                     22:        }
                     23:        else {
                     24:          track(m,p,GROWCIRCLE,t);
                     25:        }
                     26:        d = t->otherValues.radius;
                     27:        break;
                     28:       }
                     29:       case BOX: {
                     30:        np = t->otherValues.corner;
                     31:        dx = (np.x - o.x)>>2;
                     32:        dy = (np.y - o.y)>>2;
                     33:        if (ptinrect(m,Rect(o.x+dx,o.y+dy,np.x-dx,np.y-dy))) {
                     34:          if (t->boorder != SOLID) {
                     35:            draw(t,p);
                     36:            xbox(raddp(t->bb,p));
                     37:          }
                     38:          t->bb = moveBox(m,t->bb,t,p);
                     39:          t->otherValues.corner = t->bb.corner;
                     40:          t->origin = t->bb.origin;
                     41:          xbox(raddp(t->bb,p));
                     42:        }
                     43:        else {
                     44:          draw(t,p);
                     45:          t->origin.x = 0;
                     46:          t->origin.y = 0;
                     47:          t->bb.origin = t->origin;
                     48:          t->bb.corner = t->origin;
                     49:          t->otherValues.corner = t->origin;
                     50:          if (!ptinrect(m,Rect(o.x-dx,o.y-dy,o.x+dx,o.y-dy))) {
                     51:            if (ptinrect(m,Rect(o.x-dx,np.y-dy,o.x+dx,np.y+dy))) {
                     52:              np.y = o.y;
                     53:            }
                     54:            else {
                     55:              if (ptinrect(m,Rect(np.x-dx,np.y-dy,np.x+dx,np.y+dy))) {
                     56:                np = o;
                     57:              }
                     58:              else {
                     59:                if (ptinrect(m,Rect(np.x-dx,o.y-dy,np.x+dx,o.y+dy))) {
                     60:                  np.x = o.x;
                     61:                }
                     62:              }
                     63:            }
                     64:          }
                     65:          o = track(np,p,BOX,t);
                     66:          t->origin.x = min(o.x,np.x);
                     67:          t->origin.y = min(o.y,np.y);
                     68:          t->otherValues.corner.x = max(o.x,np.x);
                     69:          t->otherValues.corner.y = max(o.y,np.y);
                     70:        }               
                     71:        break;
                     72:       }
                     73:       case ELLIPSE: {
                     74:        dx = abs(m.x - o.x);  
                     75:        dy = abs(m.y - o.y);
                     76:        d = norm(dx,dy,0);
                     77:        if ((dx > dy) && (d > (t->otherValues.ellipse.wid>>2))) {
                     78:          track(m,p,GROWEWID,t); 
                     79:        }
                     80:        else {
                     81:          if ((dx < dy) && (d > (t->otherValues.ellipse.ht>>2))) {
                     82:            track(m,p,GROWEHT,t); 
                     83:          }
                     84:          else {
                     85:            track(m,p,MOVE,t); 
                     86:          }
                     87:        }
                     88:        break;
                     89:       }
                     90:       case LINE: {
                     91:        np=t->otherValues.end;
                     92:        draw(t,p);
                     93:        if (distance(m,o)<distance(m,np)) {
                     94:          t->origin = track(np,p,LINE,t);
                     95:        }
                     96:        else {
                     97:          t->otherValues.end = track(o,p,LINE,t);
                     98:        }
                     99:        break;
                    100:       }
                    101:       case ARC: {
                    102:        d = (distance(o,t->otherValues.arc.start))>>1;
                    103:        if (distance(o,m)<d)  {
                    104:          arcOrigin(t,p);
                    105:        }
                    106:        else {
                    107:          if (distance(m,t->otherValues.arc.start)<
                    108:              distance(m,t->otherValues.arc.end)) {
                    109:                arcStart(t,p);
                    110:          }
                    111:          else {
                    112:            arcEnd(t,p);
                    113:          }
                    114:        }
                    115:        break;
                    116:       }
                    117:       case MACRO: {
                    118:        draw(t,p);
                    119:        xbox(raddp(t->bb,p));
                    120:        t->bb = moveBox(m,t->bb,t,p);
                    121:        t->origin = t->bb.origin;
                    122:        xbox(raddp(t->bb,p));
                    123:        break;
                    124:       }
                    125:       case TEXT: {
                    126:        track(m,p,MOVE,t);
                    127:        break;
                    128:       }
                    129:       case SPLINE: {
                    130:        u = t->otherValues.spline.used;
                    131:        d=findNearestPoint(m,t->otherValues.spline.plist,u);
                    132:        if ((t->arrow==startARROW)||(t->arrow==doubleARROW)) {
                    133:          arrow(add(p,t->otherValues.spline.plist[2]),
                    134:                add(p,t->otherValues.spline.plist[1]));
                    135:        }
                    136:        if ((t->arrow==endARROW)||(t->arrow==doubleARROW)) {
                    137:          arrow(add(p,t->otherValues.spline.plist[u-2]),
                    138:                add(p,t->otherValues.spline.plist[u-1]));
                    139:        }
                    140:        if ((d == u-1) || (d==1)) {
                    141:          xsegment
                    142:              (add(p,t->otherValues.spline.plist[(d==1)?1:(d-1)]),
                    143:               add(p,t->otherValues.spline.plist[(d==1)?2:d]));
                    144:          np=track(t->otherValues.spline.plist[(d==1)?2:(d-1)],
                    145:              p,(d==1)?REVLINE:LINE,t); /* See note 1 in track.c */
                    146:        }
                    147:        else {
                    148:          np=track2(p,t->otherValues.spline.plist[d-1],
                    149:                      t->otherValues.spline.plist[d+1],
                    150:                      t->otherValues.spline.plist[d]);
                    151:        }
                    152:        xspline(p,t->otherValues.spline.plist,u);
                    153:        t->otherValues.spline.plist[d]=np;
                    154:        t->origin=t->otherValues.spline.plist[1];
                    155:        break;
                    156:       }
                    157:     } /* end switch */
                    158:     BoundingBox(t);
                    159:     switch (t->type) {
                    160:       case TEXT:
                    161:       case CIRCLE:
                    162:       case ARC:
                    163:       case ELLIPSE: {
                    164:        break;
                    165:       }
                    166:       default: {
                    167:        draw(t,p);      
                    168:        break;
                    169:       }
                    170:     }
                    171:   }
                    172: } 
                    173:     
                    174: struct thing *
                    175: copyThing(t,p,offset) 
                    176: register struct thing *t; 
                    177: Point p, offset;
                    178: {
                    179:   register struct thing *c; 
                    180:   Point *pl; 
                    181:   int i, n; 
                    182: 
                    183:   if (t != TNULL) {
                    184:     switch(t->type) {
                    185:       case CIRCLE: {
                    186:        if ((c = newCircle(p)) != TNULL) {
                    187:          c->otherValues.radius = t->otherValues.radius;
                    188:        }
                    189:        break;
                    190:       }
                    191:       case BOX: {
                    192:        if ((c=newBox(Rpt(p,add(p,sub(t->bb.corner,t->origin))))) 
                    193:              != TNULL) {
                    194:          c->boorder = t->boorder;
                    195:        }
                    196:        break;
                    197:       }
                    198:       case ELLIPSE: {
                    199:        if ((c = newEllipse(p)) != TNULL) {
                    200:          c->otherValues = t->otherValues;
                    201:        }
                    202:        break;
                    203:       }
                    204:       case LINE: {
                    205:        if ((c = newLine(p,add(p,sub(t->otherValues.end,t->origin))))
                    206:               != TNULL) {
                    207:          c->boorder = t->boorder;
                    208:          c->arrow = t->arrow;
                    209:        }
                    210:        break;
                    211:       }
                    212:       case ARC: {
                    213:        c = newArc(p,add(p, sub(t->otherValues.arc.end,
                    214:                                t->otherValues.arc.start)));
                    215:        break;
                    216:       }
                    217:       case SPLINE: {
                    218:        n = t->otherValues.spline.used;
                    219:        c = TNULL;
                    220:        if ((pl = (Point *) getSpace ((n+2)*sizeof(Point)))
                    221:             != (Point *)NULL){
                    222:          p = sub(p, t->origin);
                    223:          for (i=1; i<=n; i++) {
                    224:            pl[i]=add(p,t->otherValues.spline.plist[i]);
                    225:          }
                    226:          c = newSpline(n,n,pl);                
                    227:        }
                    228:        break;
                    229:       }
                    230:       case TEXT: {
                    231:        if ((c = newText(p,t->otherValues.text.s)) != TNULL) {
                    232:          c->otherValues.text.f = t->otherValues.text.f;
                    233:          c->otherValues.text.just = t->otherValues.text.just;
                    234:        }
                    235:        break;
                    236:       }
                    237:       case MACRO: {
                    238:        c = newMacro(p,t->otherValues.list);
                    239:        break;
                    240:       }
                    241:     }
                    242:     if (c == TNULL) {
                    243:       return (c);
                    244:     }
                    245:     BoundingBox(c);
                    246:     draw(c,offset);
                    247:     return(c);
                    248:   }
                    249:   else {
                    250:     return(t);
                    251:   }
                    252: }
                    253: 
                    254: /* Returns the index of the point, in plist p, closest to point */
                    255: /* given by o. */
                    256: 
                    257: int 
                    258: findNearestPoint(o,p,n)
                    259: register Point *p;     /* Plist of spline points */
                    260: int n;                 /* Number of points in Plist */
                    261: Point o;               /* Mouse location */
                    262: {
                    263:   register int i; 
                    264:   int f;               /* Plist index to point closest to o */
                    265:   int d;               /* Distance between point and o */
                    266:   int mind = -1;       /* Minimum distance */
                    267: 
                    268:   if (p != (Point *) NULL) {
                    269:     for (i=1; i<=n; i++) {
                    270:       d = norm(o.x-p[i].x, o.y-p[i].y, 0);
                    271:       if ((mind<0) || (mind>d)) {
                    272:        mind = d;
                    273:        f = i;
                    274:       }
                    275:     }
                    276:     return(f);
                    277:   }
                    278:   else {
                    279:     return(-1);
                    280:   }
                    281: }

unix.superglobalmegacorp.com

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