Index: trunk/src/obj_text.c =================================================================== --- trunk/src/obj_text.c (revision 22946) +++ trunk/src/obj_text.c (revision 22947) @@ -869,9 +869,37 @@ pcb_poly_clear_from_poly(data, PCB_OBJ_TEXT, layer, text); } +void pcb_text_flagchg_pre(pcb_text_t *Text, unsigned long flagbits, void **save) +{ + pcb_data_t *data = Text->parent.layer->parent.data; + + *save = NULL; + if ((flagbits & PCB_FLAG_CLEARLINE) || (flagbits & PCB_FLAG_ONSOLDER)) + pcb_poly_restore_to_poly(data, PCB_OBJ_TEXT, Text->parent.layer, Text); + if (flagbits & PCB_FLAG_ONSOLDER) { /* bbox will also change, need to do rtree administration */ + *save = Text->parent.layer; + pcb_r_delete_entry(Text->parent.layer->text_tree, (pcb_box_t *)Text); + } +} + +void pcb_text_flagchg_post(pcb_text_t *Text, unsigned long flagbits, void **save) +{ + pcb_data_t *data = Text->parent.layer->parent.data; + pcb_layer_t *orig_layer = *save; + + if (orig_layer != NULL) { + pcb_text_bbox(pcb_font(PCB, Text->fid, 1), Text); + pcb_r_insert_entry(orig_layer->text_tree, (pcb_box_t *)Text); + } + if ((flagbits & PCB_FLAG_CLEARLINE) || (orig_layer != NULL)) + pcb_poly_clear_from_poly(data, PCB_OBJ_TEXT, Text->parent.layer, Text); + + *save = NULL; +} + void *pcb_textop_change_flag(pcb_opctx_t *ctx, pcb_layer_t *Layer, pcb_text_t *Text) { - pcb_layer_t *orig_layer = NULL; + void *save; static pcb_flag_values_t pcb_text_flags = 0; if (pcb_text_flags == 0) pcb_text_flags = pcb_obj_valid_flags(PCB_OBJ_TEXT); @@ -882,22 +910,10 @@ return NULL; pcb_undo_add_obj_to_flag(Text); - if ((ctx->chgflag.flag & PCB_FLAG_CLEARLINE) || (ctx->chgflag.flag & PCB_FLAG_ONSOLDER)) - pcb_poly_restore_to_poly(ctx->chgflag.pcb->Data, PCB_OBJ_TEXT, Text->parent.layer, Text); - if (ctx->chgflag.flag & PCB_FLAG_ONSOLDER) { /* bbox will also change, need to do rtree administration */ - orig_layer = Text->parent.layer; - pcb_r_delete_entry(orig_layer->text_tree, (pcb_box_t *)Text); - } - + pcb_text_flagchg_pre(/*ctx->chgflag.pcb->Data, */Text, ctx->chgflag.flag, &save); PCB_FLAG_CHANGE(ctx->chgflag.how, ctx->chgflag.flag, Text); + pcb_text_flagchg_post(Text, ctx->chgflag.flag, &save); - if (orig_layer != NULL) { - pcb_text_bbox(pcb_font(PCB, Text->fid, 1), Text); - pcb_r_insert_entry(orig_layer->text_tree, (pcb_box_t *)Text); - } - if ((ctx->chgflag.flag & PCB_FLAG_CLEARLINE) || (orig_layer != NULL)) - pcb_poly_clear_from_poly(ctx->chgflag.pcb->Data, PCB_OBJ_TEXT, Text->parent.layer, Text); - return Text; } Index: trunk/src/obj_text.h =================================================================== --- trunk/src/obj_text.h (revision 22946) +++ trunk/src/obj_text.h (revision 22947) @@ -78,6 +78,12 @@ void pcb_text_pre(pcb_text_t *text); void pcb_text_post(pcb_text_t *text); +/* Before and after a flag change on text, call these; flagbits should + be the new bits we are changing to; save should be the + address of a local (void *) cache. The calls make sure bbox and rtree + administration are done properly */ +void pcb_text_flagchg_pre(pcb_text_t *Text, unsigned long flagbits, void **save); +void pcb_text_flagchg_post(pcb_text_t *Text, unsigned long flagbits, void **save); /* Low level draw call for direct rendering on preview */ void pcb_text_draw_string_simple(pcb_font_t *font, const char *string, pcb_coord_t x0, pcb_coord_t y0, int scale, double rotdeg, int mirror, pcb_coord_t thickness, int xordraw, pcb_coord_t xordx, pcb_coord_t xordy);