Index: trunk/src/obj_poly.h =================================================================== --- trunk/src/obj_poly.h (revision 11668) +++ trunk/src/obj_poly.h (revision 11669) @@ -34,6 +34,7 @@ struct pcb_polygon_s { /* holds information about a polygon */ PCB_ANYOBJECTFIELDS; + pcb_coord_t Clearance; pcb_cardinal_t PointN; /* number of points in polygon */ pcb_cardinal_t PointMax; /* max number from malloc() */ pcb_polyarea_t *Clipped; /* the clipped region of this polygon */ Index: trunk/src/polygon.c =================================================================== --- trunk/src/polygon.c (revision 11668) +++ trunk/src/polygon.c (revision 11669) @@ -954,6 +954,24 @@ return PCB_R_DIR_FOUND_CONTINUE; } +static pcb_r_dir_t poly_sub_callback(const pcb_box_t *b, void *cl) +{ + pcb_polygon_t *subpoly = (pcb_polygon_t *)b; + struct cpInfo *info = (struct cpInfo *) cl; + pcb_polygon_t *polygon; + + /* don't subtract the object that was put back! */ + if (b == info->other) + return PCB_R_DIR_NOT_FOUND; + if (!PCB_OBJ_HAS_CLEARANCE(subpoly)) + return PCB_R_DIR_NOT_FOUND; + + polygon = info->polygon; + if (Subtract(subpoly->Clipped, polygon, pcb_false) < 0) + longjmp(info->env, 1); + return PCB_R_DIR_FOUND_CONTINUE; +} + static pcb_r_dir_t pad_sub_callback(const pcb_box_t * b, void *cl) { pcb_pad_t *pad = (pcb_pad_t *) b; @@ -1066,6 +1084,8 @@ r += seen; pcb_r_search(layer->text_tree, ®ion, NULL, text_sub_callback, &info, &seen); r += seen; + pcb_r_search(layer->polygon_tree, ®ion, NULL, poly_sub_callback, &info, &seen); + r += seen; } PCB_END_LOOP; pcb_r_search(Data->via_tree, ®ion, NULL, pin_sub_callback, &info, &seen);