Index: trunk/src/data.c =================================================================== --- trunk/src/data.c (revision 30056) +++ trunk/src/data.c (revision 30057) @@ -790,12 +790,12 @@ calculated, the clearing poly has a contour */ PCB_POLY_ALL_LOOP(data); { if ((force_all || polygon->clip_dirty) && (PCB_FLAG_TEST(PCB_FLAG_CLEARPOLYPOLY, polygon))) - pcb_poly_init_clip_prog(data, layer, polygon, (enable_progbar ? data_clip_all_cb : NULL), &ctx); + pcb_poly_init_clip_prog(data, layer, polygon, (enable_progbar ? data_clip_all_cb : NULL), &ctx, 0); } PCB_ENDALL_LOOP; PCB_POLY_ALL_LOOP(data); { if ((force_all || polygon->clip_dirty) && (!PCB_FLAG_TEST(PCB_FLAG_CLEARPOLYPOLY, polygon))) - pcb_poly_init_clip_prog(data, layer, polygon, (enable_progbar ? data_clip_all_cb : NULL), &ctx); + pcb_poly_init_clip_prog(data, layer, polygon, (enable_progbar ? data_clip_all_cb : NULL), &ctx, 0); } PCB_ENDALL_LOOP; if (enable_progbar) Index: trunk/src/polygon.c =================================================================== --- trunk/src/polygon.c (revision 30056) +++ trunk/src/polygon.c (revision 30057) @@ -926,7 +926,7 @@ static pcb_bool inhibit = pcb_false; -int pcb_poly_init_clip_prog(pcb_data_t *Data, pcb_layer_t *layer, pcb_poly_t *p, void (*cb)(void *ctx), void *ctx) +int pcb_poly_init_clip_prog(pcb_data_t *Data, pcb_layer_t *layer, pcb_poly_t *p, void (*cb)(void *ctx), void *ctx, int force) { pcb_board_t *pcb; pcb_bool need_full; @@ -936,7 +936,7 @@ if (inhibit) return 0; - if (Data->clip_inhibit > 0) { + if ((!force) && (Data->clip_inhibit > 0)) { p->clip_dirty = 1; return 0; } @@ -953,6 +953,8 @@ } pcb_poly_contours_free(&p->NoHoles); + p->clip_dirty = 0; + if (layer == NULL) return 0; @@ -982,9 +984,14 @@ 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); + return pcb_poly_init_clip_prog(Data, layer, p, NULL, NULL, 0); } +int pcb_poly_init_clip_force(pcb_data_t *Data, pcb_layer_t *layer, pcb_poly_t *p) +{ + return pcb_poly_init_clip_prog(Data, layer, p, NULL, NULL, 1); +} + pcb_cardinal_t pcb_poly_num_clears(pcb_data_t *data, pcb_layer_t *layer, pcb_poly_t *polygon) { pcb_cardinal_t res; Index: trunk/src/polygon.h =================================================================== --- trunk/src/polygon.h (revision 30056) +++ trunk/src/polygon.h (revision 30057) @@ -71,6 +71,7 @@ pcb_polyarea_t *pcb_poly_clearance_construct(pcb_poly_t *subpoly, pcb_coord_t *clr_override); /* clearance shape for when clearpolypoly is set */ int pcb_poly_init_clip(pcb_data_t * d, pcb_layer_t * l, pcb_poly_t * p); +int pcb_poly_init_clip_force(pcb_data_t *Data, pcb_layer_t *layer, pcb_poly_t *p); /* bypasses clip inhibit */ void pcb_poly_restore_to_poly(pcb_data_t *, int, void *, void *); void pcb_poly_clear_from_poly(pcb_data_t *, int, void *, void *); @@ -79,7 +80,7 @@ /* 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); +int pcb_poly_init_clip_prog(pcb_data_t *Data, pcb_layer_t *layer, pcb_poly_t *p, void (*cb)(void *ctx), void *ctx, int force); /* Return the number of subtractions that have to be executed by a pcb_poly_init_clip() on the given polygon */