#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);
}
|