#include "art.h" /* * walk a display list, calling f with a transformed version of each * primitive node. tx is the transformation currently in effect. */ void walk(Item *p, Dpoint tx, void (*f)(Item *, Item *)){ if(p==0) return; if(p->type==HEAD){ for(;;){ p=p->next; if(p->type==HEAD) break; walk1(p, tx, f, p); } } else walk1(p, tx, f, p); } void walk1(Item *p, Dpoint tx, void (*f)(Item *, Item *), Item *top){ Item i; Dpoint pt[200]; /* wrong!!! secret unchecked limit */ int n; if(p->type==HEAD){ for(;;){ p=p->next; if(p->type==HEAD) break; walk1(p, tx, f, top); } } else if(p->type==GROUP){ if(!(p->flags&INVIS) /* could be wrong, but makes draw() work */ && goodgroup(p->group)) walk1(group[p->group], dadd(tx, p->p[0]), f, top); } else{ i=*p; i.p=pt; for(n=0;n!=i.np;n++) i.p[n]=dadd(p->p[n], tx); (*f)(&i, top); } } void mwalk(Item *p, Dpoint tx, void (*f)(Item *, Item *)){ if(p==0) return; if(p->type==HEAD){ for(;;){ p=p->next; if(p->type==HEAD) break; if(!(p->flags&MOVING)) walk1(p, tx, f, p); } } else if(!(p->flags&MOVING)) walk1(p, tx, f, p); }