1*37da2899SCharles.Forsyth #include "lib9.h" 2*37da2899SCharles.Forsyth #include "interp.h" 3*37da2899SCharles.Forsyth #include "isa.h" 4*37da2899SCharles.Forsyth #include "draw.h" 5*37da2899SCharles.Forsyth #include "runt.h" 6*37da2899SCharles.Forsyth #include "raise.h" 7*37da2899SCharles.Forsyth 8*37da2899SCharles.Forsyth void Point_add(void * fp)9*37da2899SCharles.ForsythPoint_add(void *fp) 10*37da2899SCharles.Forsyth { 11*37da2899SCharles.Forsyth F_Point_add *f; 12*37da2899SCharles.Forsyth Draw_Point *ret; 13*37da2899SCharles.Forsyth 14*37da2899SCharles.Forsyth f = fp; 15*37da2899SCharles.Forsyth 16*37da2899SCharles.Forsyth ret = f->ret; 17*37da2899SCharles.Forsyth ret->x = f->p.x + f->q.x; 18*37da2899SCharles.Forsyth ret->y = f->p.y + f->q.y; 19*37da2899SCharles.Forsyth } 20*37da2899SCharles.Forsyth 21*37da2899SCharles.Forsyth void Point_sub(void * fp)22*37da2899SCharles.ForsythPoint_sub(void *fp) 23*37da2899SCharles.Forsyth { 24*37da2899SCharles.Forsyth F_Point_sub *f; 25*37da2899SCharles.Forsyth Draw_Point *ret; 26*37da2899SCharles.Forsyth 27*37da2899SCharles.Forsyth f = fp; 28*37da2899SCharles.Forsyth 29*37da2899SCharles.Forsyth ret = f->ret; 30*37da2899SCharles.Forsyth ret->x = f->p.x - f->q.x; 31*37da2899SCharles.Forsyth ret->y = f->p.y - f->q.y; 32*37da2899SCharles.Forsyth } 33*37da2899SCharles.Forsyth 34*37da2899SCharles.Forsyth void Point_mul(void * fp)35*37da2899SCharles.ForsythPoint_mul(void *fp) 36*37da2899SCharles.Forsyth { 37*37da2899SCharles.Forsyth F_Point_mul *f; 38*37da2899SCharles.Forsyth Draw_Point *ret; 39*37da2899SCharles.Forsyth 40*37da2899SCharles.Forsyth f = fp; 41*37da2899SCharles.Forsyth 42*37da2899SCharles.Forsyth ret = f->ret; 43*37da2899SCharles.Forsyth ret->x = f->p.x * f->i; 44*37da2899SCharles.Forsyth ret->y = f->p.y * f->i; 45*37da2899SCharles.Forsyth } 46*37da2899SCharles.Forsyth 47*37da2899SCharles.Forsyth void Point_div(void * fp)48*37da2899SCharles.ForsythPoint_div(void *fp) 49*37da2899SCharles.Forsyth { 50*37da2899SCharles.Forsyth F_Point_div *f; 51*37da2899SCharles.Forsyth Draw_Point *ret; 52*37da2899SCharles.Forsyth 53*37da2899SCharles.Forsyth f = fp; 54*37da2899SCharles.Forsyth 55*37da2899SCharles.Forsyth if(f->i == 0) 56*37da2899SCharles.Forsyth error(exZdiv); 57*37da2899SCharles.Forsyth ret = f->ret; 58*37da2899SCharles.Forsyth ret->x = f->p.x / f->i; 59*37da2899SCharles.Forsyth ret->y = f->p.y / f->i; 60*37da2899SCharles.Forsyth } 61*37da2899SCharles.Forsyth 62*37da2899SCharles.Forsyth void Point_eq(void * fp)63*37da2899SCharles.ForsythPoint_eq(void *fp) 64*37da2899SCharles.Forsyth { 65*37da2899SCharles.Forsyth F_Point_eq *f; 66*37da2899SCharles.Forsyth 67*37da2899SCharles.Forsyth f = fp; 68*37da2899SCharles.Forsyth *f->ret = f->p.x == f->q.x && f->p.y == f->q.y; 69*37da2899SCharles.Forsyth } 70*37da2899SCharles.Forsyth 71*37da2899SCharles.Forsyth void Point_in(void * fp)72*37da2899SCharles.ForsythPoint_in(void *fp) 73*37da2899SCharles.Forsyth { 74*37da2899SCharles.Forsyth F_Point_in *f; 75*37da2899SCharles.Forsyth 76*37da2899SCharles.Forsyth f = fp; 77*37da2899SCharles.Forsyth *f->ret = f->p.x >= f->r.min.x && f->p.x < f->r.max.x && 78*37da2899SCharles.Forsyth f->p.y >= f->r.min.y && f->p.y < f->r.max.y; 79*37da2899SCharles.Forsyth } 80*37da2899SCharles.Forsyth 81*37da2899SCharles.Forsyth void Rect_canon(void * fp)82*37da2899SCharles.ForsythRect_canon(void *fp) 83*37da2899SCharles.Forsyth { 84*37da2899SCharles.Forsyth F_Rect_canon *f; 85*37da2899SCharles.Forsyth Draw_Rect *ret; 86*37da2899SCharles.Forsyth WORD t; 87*37da2899SCharles.Forsyth 88*37da2899SCharles.Forsyth f = fp; 89*37da2899SCharles.Forsyth 90*37da2899SCharles.Forsyth ret = f->ret; 91*37da2899SCharles.Forsyth if(f->r.max.x < f->r.min.x){ 92*37da2899SCharles.Forsyth t = f->r.max.x; 93*37da2899SCharles.Forsyth ret->max.x = f->r.min.x; 94*37da2899SCharles.Forsyth ret->min.x = t; 95*37da2899SCharles.Forsyth }else{ 96*37da2899SCharles.Forsyth t = f->r.max.x; 97*37da2899SCharles.Forsyth ret->min.x = f->r.min.x; 98*37da2899SCharles.Forsyth ret->max.x = t; 99*37da2899SCharles.Forsyth } 100*37da2899SCharles.Forsyth if(f->r.max.y < f->r.min.y){ 101*37da2899SCharles.Forsyth t = f->r.max.y; 102*37da2899SCharles.Forsyth ret->max.y = f->r.min.y; 103*37da2899SCharles.Forsyth ret->min.y = t; 104*37da2899SCharles.Forsyth }else{ 105*37da2899SCharles.Forsyth t = f->r.max.y; 106*37da2899SCharles.Forsyth ret->min.y = f->r.min.y; 107*37da2899SCharles.Forsyth ret->max.y = t; 108*37da2899SCharles.Forsyth } 109*37da2899SCharles.Forsyth } 110*37da2899SCharles.Forsyth 111*37da2899SCharles.Forsyth void Rect_combine(void * fp)112*37da2899SCharles.ForsythRect_combine(void *fp) 113*37da2899SCharles.Forsyth { 114*37da2899SCharles.Forsyth F_Rect_combine *f; 115*37da2899SCharles.Forsyth Draw_Rect *ret; 116*37da2899SCharles.Forsyth 117*37da2899SCharles.Forsyth f = fp; 118*37da2899SCharles.Forsyth ret = f->ret; 119*37da2899SCharles.Forsyth *ret = f->r; 120*37da2899SCharles.Forsyth if(f->r.min.x > f->s.min.x) 121*37da2899SCharles.Forsyth ret->min.x = f->s.min.x; 122*37da2899SCharles.Forsyth if(f->r.min.y > f->s.min.y) 123*37da2899SCharles.Forsyth ret->min.y = f->s.min.y; 124*37da2899SCharles.Forsyth if(f->r.max.x < f->s.max.x) 125*37da2899SCharles.Forsyth ret->max.x = f->s.max.x; 126*37da2899SCharles.Forsyth if(f->r.max.y < f->s.max.y) 127*37da2899SCharles.Forsyth ret->max.y = f->s.max.y; 128*37da2899SCharles.Forsyth } 129*37da2899SCharles.Forsyth 130*37da2899SCharles.Forsyth void Rect_eq(void * fp)131*37da2899SCharles.ForsythRect_eq(void *fp) 132*37da2899SCharles.Forsyth { 133*37da2899SCharles.Forsyth F_Rect_eq *f; 134*37da2899SCharles.Forsyth 135*37da2899SCharles.Forsyth f = fp; 136*37da2899SCharles.Forsyth 137*37da2899SCharles.Forsyth *f->ret = f->r.min.x == f->s.min.x 138*37da2899SCharles.Forsyth && f->r.max.x == f->s.max.x 139*37da2899SCharles.Forsyth && f->r.min.y == f->s.min.y 140*37da2899SCharles.Forsyth && f->r.max.y == f->s.max.y; 141*37da2899SCharles.Forsyth } 142*37da2899SCharles.Forsyth 143*37da2899SCharles.Forsyth void Rect_Xrect(void * fp)144*37da2899SCharles.ForsythRect_Xrect(void *fp) 145*37da2899SCharles.Forsyth { 146*37da2899SCharles.Forsyth F_Rect_Xrect *f; 147*37da2899SCharles.Forsyth 148*37da2899SCharles.Forsyth f = fp; 149*37da2899SCharles.Forsyth 150*37da2899SCharles.Forsyth *f->ret = f->r.min.x < f->s.max.x 151*37da2899SCharles.Forsyth && f->s.min.x < f->r.max.x 152*37da2899SCharles.Forsyth && f->r.min.y < f->s.max.y 153*37da2899SCharles.Forsyth && f->s.min.y < f->r.max.y; 154*37da2899SCharles.Forsyth } 155*37da2899SCharles.Forsyth 156*37da2899SCharles.Forsyth void Rect_clip(void * fp)157*37da2899SCharles.ForsythRect_clip(void *fp) 158*37da2899SCharles.Forsyth { 159*37da2899SCharles.Forsyth F_Rect_clip *f; 160*37da2899SCharles.Forsyth Draw_Rect *r, *s, *ret; 161*37da2899SCharles.Forsyth 162*37da2899SCharles.Forsyth f = fp; 163*37da2899SCharles.Forsyth 164*37da2899SCharles.Forsyth r = &f->r; 165*37da2899SCharles.Forsyth s = &f->s; 166*37da2899SCharles.Forsyth ret = &f->ret->t0; 167*37da2899SCharles.Forsyth 168*37da2899SCharles.Forsyth /* 169*37da2899SCharles.Forsyth * Expand rectXrect() in line for speed 170*37da2899SCharles.Forsyth */ 171*37da2899SCharles.Forsyth if(!(r->min.x<s->max.x && s->min.x<r->max.x 172*37da2899SCharles.Forsyth && r->min.y<s->max.y && s->min.y<r->max.y)){ 173*37da2899SCharles.Forsyth *ret = *r; 174*37da2899SCharles.Forsyth f->ret->t1 = 0; 175*37da2899SCharles.Forsyth return; 176*37da2899SCharles.Forsyth } 177*37da2899SCharles.Forsyth 178*37da2899SCharles.Forsyth /* They must overlap */ 179*37da2899SCharles.Forsyth if(r->min.x < s->min.x) 180*37da2899SCharles.Forsyth ret->min.x = s->min.x; 181*37da2899SCharles.Forsyth else 182*37da2899SCharles.Forsyth ret->min.x = r->min.x; 183*37da2899SCharles.Forsyth if(r->min.y < s->min.y) 184*37da2899SCharles.Forsyth ret->min.y = s->min.y; 185*37da2899SCharles.Forsyth else 186*37da2899SCharles.Forsyth ret->min.y = r->min.y; 187*37da2899SCharles.Forsyth if(r->max.x > s->max.x) 188*37da2899SCharles.Forsyth ret->max.x = s->max.x; 189*37da2899SCharles.Forsyth else 190*37da2899SCharles.Forsyth ret->max.x = r->max.x; 191*37da2899SCharles.Forsyth if(r->max.y > s->max.y) 192*37da2899SCharles.Forsyth ret->max.y = s->max.y; 193*37da2899SCharles.Forsyth else 194*37da2899SCharles.Forsyth ret->max.y = r->max.y; 195*37da2899SCharles.Forsyth f->ret->t1 = 1; 196*37da2899SCharles.Forsyth } 197*37da2899SCharles.Forsyth 198*37da2899SCharles.Forsyth void Rect_inrect(void * fp)199*37da2899SCharles.ForsythRect_inrect(void *fp) 200*37da2899SCharles.Forsyth { 201*37da2899SCharles.Forsyth F_Rect_inrect *f; 202*37da2899SCharles.Forsyth 203*37da2899SCharles.Forsyth f = fp; 204*37da2899SCharles.Forsyth 205*37da2899SCharles.Forsyth *f->ret = f->s.min.x <= f->r.min.x 206*37da2899SCharles.Forsyth && f->r.max.x <= f->s.max.x 207*37da2899SCharles.Forsyth && f->s.min.y <= f->r.min.y 208*37da2899SCharles.Forsyth && f->r.max.y <= f->s.max.y; 209*37da2899SCharles.Forsyth } 210*37da2899SCharles.Forsyth 211*37da2899SCharles.Forsyth void Rect_contains(void * fp)212*37da2899SCharles.ForsythRect_contains(void *fp) 213*37da2899SCharles.Forsyth { 214*37da2899SCharles.Forsyth F_Rect_contains *f; 215*37da2899SCharles.Forsyth WORD x, y; 216*37da2899SCharles.Forsyth 217*37da2899SCharles.Forsyth f = fp; 218*37da2899SCharles.Forsyth 219*37da2899SCharles.Forsyth x = f->p.x; 220*37da2899SCharles.Forsyth y = f->p.y; 221*37da2899SCharles.Forsyth *f->ret = x >= f->r.min.x && x < f->r.max.x 222*37da2899SCharles.Forsyth && y >= f->r.min.y && y < f->r.max.y; 223*37da2899SCharles.Forsyth } 224*37da2899SCharles.Forsyth 225*37da2899SCharles.Forsyth void Rect_addpt(void * fp)226*37da2899SCharles.ForsythRect_addpt(void *fp) 227*37da2899SCharles.Forsyth { 228*37da2899SCharles.Forsyth F_Rect_addpt *f; 229*37da2899SCharles.Forsyth Draw_Rect *ret; 230*37da2899SCharles.Forsyth WORD n; 231*37da2899SCharles.Forsyth 232*37da2899SCharles.Forsyth f = fp; 233*37da2899SCharles.Forsyth 234*37da2899SCharles.Forsyth ret = f->ret; 235*37da2899SCharles.Forsyth n = f->p.x; 236*37da2899SCharles.Forsyth ret->min.x = f->r.min.x + n; 237*37da2899SCharles.Forsyth ret->max.x = f->r.max.x + n; 238*37da2899SCharles.Forsyth n = f->p.y; 239*37da2899SCharles.Forsyth ret->min.y = f->r.min.y + n; 240*37da2899SCharles.Forsyth ret->max.y = f->r.max.y + n; 241*37da2899SCharles.Forsyth } 242*37da2899SCharles.Forsyth 243*37da2899SCharles.Forsyth void Rect_subpt(void * fp)244*37da2899SCharles.ForsythRect_subpt(void *fp) 245*37da2899SCharles.Forsyth { 246*37da2899SCharles.Forsyth WORD n; 247*37da2899SCharles.Forsyth F_Rect_subpt *f; 248*37da2899SCharles.Forsyth Draw_Rect *ret; 249*37da2899SCharles.Forsyth 250*37da2899SCharles.Forsyth f = fp; 251*37da2899SCharles.Forsyth 252*37da2899SCharles.Forsyth ret = f->ret; 253*37da2899SCharles.Forsyth n = f->p.x; 254*37da2899SCharles.Forsyth ret->min.x = f->r.min.x - n; 255*37da2899SCharles.Forsyth ret->max.x = f->r.max.x - n; 256*37da2899SCharles.Forsyth n = f->p.y; 257*37da2899SCharles.Forsyth ret->min.y = f->r.min.y - n; 258*37da2899SCharles.Forsyth ret->max.y = f->r.max.y - n; 259*37da2899SCharles.Forsyth } 260*37da2899SCharles.Forsyth 261*37da2899SCharles.Forsyth void Rect_inset(void * fp)262*37da2899SCharles.ForsythRect_inset(void *fp) 263*37da2899SCharles.Forsyth { 264*37da2899SCharles.Forsyth WORD n; 265*37da2899SCharles.Forsyth Draw_Rect *ret; 266*37da2899SCharles.Forsyth F_Rect_inset *f; 267*37da2899SCharles.Forsyth 268*37da2899SCharles.Forsyth f = fp; 269*37da2899SCharles.Forsyth 270*37da2899SCharles.Forsyth ret = f->ret; 271*37da2899SCharles.Forsyth n = f->n; 272*37da2899SCharles.Forsyth ret->min.x = f->r.min.x + n; 273*37da2899SCharles.Forsyth ret->min.y = f->r.min.y + n; 274*37da2899SCharles.Forsyth ret->max.x = f->r.max.x - n; 275*37da2899SCharles.Forsyth ret->max.y = f->r.max.y - n; 276*37da2899SCharles.Forsyth } 277*37da2899SCharles.Forsyth 278*37da2899SCharles.Forsyth void Rect_dx(void * fp)279*37da2899SCharles.ForsythRect_dx(void *fp) 280*37da2899SCharles.Forsyth { 281*37da2899SCharles.Forsyth F_Rect_dx *f; 282*37da2899SCharles.Forsyth 283*37da2899SCharles.Forsyth f = fp; 284*37da2899SCharles.Forsyth 285*37da2899SCharles.Forsyth *f->ret = f->r.max.x-f->r.min.x; 286*37da2899SCharles.Forsyth } 287*37da2899SCharles.Forsyth 288*37da2899SCharles.Forsyth void Rect_dy(void * fp)289*37da2899SCharles.ForsythRect_dy(void *fp) 290*37da2899SCharles.Forsyth { 291*37da2899SCharles.Forsyth F_Rect_dy *f; 292*37da2899SCharles.Forsyth 293*37da2899SCharles.Forsyth f = fp; 294*37da2899SCharles.Forsyth 295*37da2899SCharles.Forsyth *f->ret = f->r.max.y-f->r.min.y; 296*37da2899SCharles.Forsyth } 297*37da2899SCharles.Forsyth 298*37da2899SCharles.Forsyth void Rect_size(void * fp)299*37da2899SCharles.ForsythRect_size(void *fp) 300*37da2899SCharles.Forsyth { 301*37da2899SCharles.Forsyth F_Rect_size *f; 302*37da2899SCharles.Forsyth Draw_Point *ret; 303*37da2899SCharles.Forsyth 304*37da2899SCharles.Forsyth f = fp; 305*37da2899SCharles.Forsyth 306*37da2899SCharles.Forsyth ret = f->ret; 307*37da2899SCharles.Forsyth ret->x = f->r.max.x-f->r.min.x; 308*37da2899SCharles.Forsyth ret->y = f->r.max.y-f->r.min.y; 309*37da2899SCharles.Forsyth } 310