Index: trunk/src/polygon.c =================================================================== --- trunk/src/polygon.c (revision 16963) +++ trunk/src/polygon.c (revision 16964) @@ -1242,10 +1242,12 @@ static pcb_bool inhibit = pcb_false; -int pcb_poly_init_clip(pcb_data_t *Data, pcb_layer_t *layer, pcb_poly_t * p) +int pcb_poly_init_clip_prog(pcb_data_t *Data, pcb_layer_t *layer, pcb_poly_t *p, void (*cb)(void *ctx), void *ctx) { pcb_board_t *pcb; pcb_bool need_full; + void (*old_cb)(void *ctx); + void *old_ctx; if (inhibit) return 0; @@ -1279,13 +1281,26 @@ if (pcb != NULL) Data = pcb->Data; + old_cb = pcb_poly_clip_prog; + old_ctx = pcb_poly_clip_prog_ctx; + pcb_poly_clip_prog = cb; + pcb_poly_clip_prog_ctx = ctx; + if (PCB_FLAG_TEST(PCB_FLAG_CLEARPOLY, p)) clearPoly(Data, layer, p, NULL, 0, 0); else p->NoHolesValid = 0; + + pcb_poly_clip_prog = old_cb; + pcb_poly_clip_prog_ctx = old_ctx; return 1; } +int pcb_poly_init_clip(pcb_data_t *Data, pcb_layer_t *layer, pcb_poly_t *p) +{ + return pcb_poly_init_clip_prog(Data, layer, p, NULL, NULL); +} + /* -------------------------------------------------------------------------- * 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 16963) +++ trunk/src/polygon.h (revision 16964) @@ -89,6 +89,10 @@ void pcb_poly_restore_to_poly(pcb_data_t *, int, void *, void *); void pcb_poly_clear_from_poly(pcb_data_t *, int, void *, void *); +/* Same as pcb_poly_init_clip() but also call cb before each operation, + 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); + 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);