Index: trunk/src/obj_poly.c =================================================================== --- trunk/src/obj_poly.c (revision 10047) +++ trunk/src/obj_poly.c (revision 10048) @@ -783,7 +783,32 @@ } +/*** iteration helpers ***/ +void pcb_poly_map_contours(pcb_polygon_t *p, void *ctx, pcb_poly_map_cb_t *cb) +{ + pcb_polyarea_t *pa; + pcb_pline_t *pl; + pa = p->Clipped; + do { + int cidx; + for(cidx = 0, pl = pa->contours; pl != NULL; cidx++, pl = pl->next) { + pcb_vnode_t *v; + cb(p, ctx, (cidx == 0 ? PCB_POLYEV_ISLAND_START : PCB_POLYEV_HOLE_START), 0, 0); + v = pa->contours->head.next; + do { + cb(p, ctx, (cidx == 0 ? PCB_POLYEV_ISLAND_POINT : PCB_POLYEV_HOLE_POINT), v->point[0], v->point[1]); + } while ((v = v->next) != pa->contours->head.next); + + cb(p, ctx, (cidx == 0 ? PCB_POLYEV_ISLAND_END : PCB_POLYEV_HOLE_END), 0, 0); + } + pa = pa->f; + } while(pa != p->Clipped); +} + + + + /*** draw ***/ pcb_r_dir_t draw_poly_callback(const pcb_box_t * b, void *cl) { Index: trunk/src/obj_poly.h =================================================================== --- trunk/src/obj_poly.h (revision 10047) +++ trunk/src/obj_poly.h (revision 10048) @@ -76,6 +76,27 @@ double pcb_poly_area(const pcb_polygon_t *poly); +/*** helpers for iterating over countours */ + +/*** Polygon helpers on the clopped polygon ***/ +typedef enum { + PCB_POLYEV_ISLAND_START, + PCB_POLYEV_ISLAND_POINT, + PCB_POLYEV_ISLAND_END, + PCB_POLYEV_HOLE_START, + PCB_POLYEV_HOLE_POINT, + PCB_POLYEV_HOLE_END +} pcb_poly_event_t; + +/* return non-zero to quit mapping immediatley */ +typedef int pcb_poly_map_cb_t(pcb_polygon_t *p, void *ctx, pcb_poly_event_t ev, pcb_coord_t x, pcb_coord_t y); + +/* call cb for each point of each island and cutout */ +void pcb_poly_map_contours(pcb_polygon_t *p, void *ctx, pcb_poly_map_cb_t *cb); + + +/*** loops ***/ + #define PCB_POLY_LOOP(layer) do { \ pcb_polygon_t *polygon; \ gdl_iterator_t __it__; \