Index: trunk/src/polygon.c =================================================================== --- trunk/src/polygon.c (revision 16964) +++ trunk/src/polygon.c (revision 16965) @@ -1301,6 +1301,23 @@ return pcb_poly_init_clip_prog(Data, layer, p, NULL, NULL); } +pcb_cardinal_t pcb_poly_num_clears(pcb_data_t *data, pcb_layer_t *layer, pcb_poly_t *polygon) +{ + pcb_cardinal_t res; + void (*old_cb)(void *ctx); + + if (layer->is_bound) + layer = layer->meta.bound.real; + + old_cb = pcb_poly_clip_prog; + pcb_poly_clip_prog = NULL; + + res = clearPoly(data, layer, polygon, NULL, NULL, 1); + + pcb_poly_clip_prog = old_cb; + return res; +} + /* -------------------------------------------------------------------------- * remove redundant polygon points. Any point that lies on the straight * line between the points on either side of it is redundant. Index: trunk/src/polygon.h =================================================================== --- trunk/src/polygon.h (revision 16964) +++ trunk/src/polygon.h (revision 16965) @@ -93,6 +93,11 @@ giving the caller a chance to draw a progress bar */ int pcb_poly_init_clip_prog(pcb_data_t *Data, pcb_layer_t *layer, pcb_poly_t *p, void (*cb)(void *ctx), void *ctx); +/* Return the number of subtractions that have to be executed by a + pcb_poly_init_clip() on the given polygon */ +pcb_cardinal_t pcb_poly_num_clears(pcb_data_t *data, pcb_layer_t *layer, pcb_poly_t *polygon); + + pcb_bool pcb_poly_is_point_in_p(pcb_coord_t, pcb_coord_t, pcb_coord_t, pcb_poly_t *); pcb_bool pcb_poly_is_point_in_p_ignore_holes(pcb_coord_t, pcb_coord_t, pcb_poly_t *); pcb_bool_t pcb_is_point_in_convex_quad(pcb_vector_t p, pcb_vector_t *q);