Index: trunk/src/buffer.c =================================================================== --- trunk/src/buffer.c (revision 29715) +++ trunk/src/buffer.c (revision 29716) @@ -625,7 +625,7 @@ Buffer->X = PCB_SWAP_X(Buffer->X); Buffer->Y = PCB_SWAP_Y(Buffer->Y); pcb_undo_freeze_add(); - pcb_data_mirror(Buffer->Data, 0, PCB_TXM_COORD, pcb_false); + pcb_data_mirror(Buffer->Data, 0, PCB_TXM_COORD, pcb_false, 0); pcb_undo_unfreeze_add(); pcb_set_buffer_bbox(Buffer); } @@ -660,7 +660,7 @@ PCB_PADSTACK_LOOP(Buffer->Data); { - pcb_pstk_mirror(padstack, PCB_PSTK_DONT_MIRROR_COORDS, 1, 0); + pcb_pstk_mirror(padstack, PCB_PSTK_DONT_MIRROR_COORDS, 1, 0, 0); } PCB_END_LOOP; PCB_LINE_ALL_LOOP(Buffer->Data); @@ -680,7 +680,7 @@ PCB_ENDALL_LOOP; PCB_TEXT_ALL_LOOP(Buffer->Data); { - pcb_text_flip_side(layer, text, 0); + pcb_text_flip_side(layer, text, 0, 0); } PCB_ENDALL_LOOP; Index: trunk/src/data.c =================================================================== --- trunk/src/data.c (revision 29715) +++ trunk/src/data.c (revision 29716) @@ -396,31 +396,31 @@ return NULL; } -void pcb_data_mirror(pcb_data_t *data, pcb_coord_t y_offs, pcb_data_mirror_text_t mtxt, pcb_bool pstk_smirror) +void pcb_data_mirror(pcb_data_t *data, pcb_coord_t y_offs, pcb_data_mirror_text_t mtxt, pcb_bool pstk_smirror, pcb_bool undoable) { PCB_PADSTACK_LOOP(data); { - pcb_pstk_mirror(padstack, y_offs, pstk_smirror, 0); + pcb_pstk_mirror(padstack, y_offs, pstk_smirror, 0, undoable); } PCB_END_LOOP; PCB_SUBC_LOOP(data); { - pcb_subc_mirror(data, subc, y_offs, pstk_smirror); + pcb_subc_mirror(data, subc, y_offs, pstk_smirror, undoable); } PCB_END_LOOP; PCB_LINE_ALL_LOOP(data); { - pcb_line_mirror(layer, line, y_offs); + pcb_line_mirror(layer, line, y_offs, undoable); } PCB_ENDALL_LOOP; PCB_ARC_ALL_LOOP(data); { - pcb_arc_mirror(layer, arc, y_offs); + pcb_arc_mirror(layer, arc, y_offs, undoable); } PCB_ENDALL_LOOP; PCB_POLY_ALL_LOOP(data); { - pcb_poly_mirror(layer, polygon, y_offs); + pcb_poly_mirror(layer, polygon, y_offs, undoable); } PCB_ENDALL_LOOP; @@ -430,7 +430,7 @@ case PCB_TXM_SIDE: PCB_TEXT_ALL_LOOP(data); { - pcb_text_flip_side(layer, text, y_offs); + pcb_text_flip_side(layer, text, y_offs, undoable); } PCB_ENDALL_LOOP; break; @@ -437,7 +437,7 @@ case PCB_TXM_COORD: PCB_TEXT_ALL_LOOP(data); { - pcb_text_mirror_coords(layer, text, y_offs); + pcb_text_mirror_coords(layer, text, y_offs, undoable); } PCB_ENDALL_LOOP; break; Index: trunk/src/data.h =================================================================== --- trunk/src/data.h (revision 29715) +++ trunk/src/data.h (revision 29716) @@ -170,7 +170,7 @@ PCB_TXM_SIDE = 1, /* mirror text, changing side */ PCB_TXM_COORD /* mirror text base coords only */ } pcb_data_mirror_text_t; -void pcb_data_mirror(pcb_data_t *data, pcb_coord_t y_offs, pcb_data_mirror_text_t mtxt, pcb_bool pstk_smirror); +void pcb_data_mirror(pcb_data_t *data, pcb_coord_t y_offs, pcb_data_mirror_text_t mtxt, pcb_bool pstk_smirror, pcb_bool undoable); void pcb_data_move(pcb_data_t *data, pcb_coord_t dx, pcb_coord_t dy, int undoable); Index: trunk/src/gui_act.c =================================================================== --- trunk/src/gui_act.c (revision 29715) +++ trunk/src/gui_act.c (revision 29716) @@ -1300,7 +1300,7 @@ PCB_ACT_MAY_CONVARG(1, FGW_KEYWORD, boardflip, op = fgw_keyword(&argv[1])); smirror = (op == F_Sides); - pcb_data_mirror(PCB->Data, 0, smirror ? PCB_TXM_SIDE : PCB_TXM_COORD, smirror); + pcb_data_mirror(PCB->Data, 0, smirror ? PCB_TXM_SIDE : PCB_TXM_COORD, smirror, 1); PCB_ACT_IRES(0); return 0; Index: trunk/src/obj_arc.c =================================================================== --- trunk/src/obj_arc.c (revision 29715) +++ trunk/src/obj_arc.c (revision 29716) @@ -752,7 +752,7 @@ pcb_r_insert_entry(layer->arc_tree, (pcb_box_t *) arc); } -void pcb_arc_mirror(pcb_layer_t *layer, pcb_arc_t *arc, pcb_coord_t y_offs) +void pcb_arc_mirror(pcb_layer_t *layer, pcb_arc_t *arc, pcb_coord_t y_offs, pcb_bool undoable) { if (layer->arc_tree != NULL) pcb_r_delete_entry(layer->arc_tree, (pcb_box_t *) arc); Index: trunk/src/obj_arc.h =================================================================== --- trunk/src/obj_arc.h (revision 29715) +++ trunk/src/obj_arc.h (revision 29716) @@ -64,7 +64,7 @@ void pcb_arc_bbox(pcb_arc_t *Arc); void pcb_arc_rotate90(pcb_arc_t *Arc, pcb_coord_t X, pcb_coord_t Y, unsigned Number); void pcb_arc_rotate(pcb_layer_t *layer, pcb_arc_t *arc, pcb_coord_t X, pcb_coord_t Y, double cosa, double sina, pcb_angle_t angle); -void pcb_arc_mirror(pcb_layer_t *layer, pcb_arc_t *arc, pcb_coord_t y_offs); +void pcb_arc_mirror(pcb_layer_t *layer, pcb_arc_t *arc, pcb_coord_t y_offs, pcb_bool undoable); void pcb_arc_flip_side(pcb_layer_t *layer, pcb_arc_t *arc); void pcb_arc_scale(pcb_arc_t *arc, double sx, double sy, double sth); pcb_box_t pcb_arc_mini_bbox(const pcb_arc_t *arc); Index: trunk/src/obj_line.c =================================================================== --- trunk/src/obj_line.c (revision 29715) +++ trunk/src/obj_line.c (revision 29716) @@ -896,7 +896,7 @@ pcb_r_insert_entry(layer->line_tree, (pcb_box_t *) line); } -void pcb_line_mirror(pcb_layer_t *layer, pcb_line_t *line, pcb_coord_t y_offs) +void pcb_line_mirror(pcb_layer_t *layer, pcb_line_t *line, pcb_coord_t y_offs, pcb_bool undoable) { if (layer->line_tree != NULL) pcb_r_delete_entry(layer->line_tree, (pcb_box_t *) line); Index: trunk/src/obj_line.h =================================================================== --- trunk/src/obj_line.h (revision 29715) +++ trunk/src/obj_line.h (revision 29716) @@ -66,7 +66,7 @@ void pcb_line_bbox(pcb_line_t *Line); void pcb_line_rotate90(pcb_line_t *Line, pcb_coord_t X, pcb_coord_t Y, unsigned Number); void pcb_line_rotate(pcb_layer_t *layer, pcb_line_t *line, pcb_coord_t X, pcb_coord_t Y, double cosa, double sina); -void pcb_line_mirror(pcb_layer_t *layer, pcb_line_t *line, pcb_coord_t y_offs); +void pcb_line_mirror(pcb_layer_t *layer, pcb_line_t *line, pcb_coord_t y_offs, pcb_bool undoable); void pcb_line_flip_side(pcb_layer_t *layer, pcb_line_t *line); void pcb_line_scale(pcb_line_t *line, double sx, double sy, double sth); Index: trunk/src/obj_poly.c =================================================================== --- trunk/src/obj_poly.c (revision 29715) +++ trunk/src/obj_poly.c (revision 29716) @@ -203,7 +203,7 @@ pcb_r_insert_entry(layer->polygon_tree, (pcb_box_t *) polygon); } -void pcb_poly_mirror(pcb_layer_t *layer, pcb_poly_t *polygon, pcb_coord_t y_offs) +void pcb_poly_mirror(pcb_layer_t *layer, pcb_poly_t *polygon, pcb_coord_t y_offs, pcb_bool undoable) { if (layer->polygon_tree != NULL) pcb_r_delete_entry(layer->polygon_tree, (pcb_box_t *)polygon); Index: trunk/src/obj_poly.h =================================================================== --- trunk/src/obj_poly.h (revision 29715) +++ trunk/src/obj_poly.h (revision 29716) @@ -76,7 +76,7 @@ void pcb_poly_rotate90(pcb_poly_t *Polygon, pcb_coord_t X, pcb_coord_t Y, unsigned Number); void pcb_poly_rotate(pcb_layer_t *layer, pcb_poly_t *poly, pcb_coord_t X, pcb_coord_t Y, double cosa, double sina); -void pcb_poly_mirror(pcb_layer_t *layer, pcb_poly_t *polygon, pcb_coord_t y_offs); +void pcb_poly_mirror(pcb_layer_t *layer, pcb_poly_t *polygon, pcb_coord_t y_offs, pcb_bool undoable); void pcb_poly_flip_side(pcb_layer_t *layer, pcb_poly_t *polygon); void pcb_poly_scale(pcb_poly_t *poly, double sx, double sy); Index: trunk/src/obj_pstk.c =================================================================== --- trunk/src/obj_pstk.c (revision 29715) +++ trunk/src/obj_pstk.c (revision 29716) @@ -1171,7 +1171,7 @@ *err_minhole = proto->hdia; } -void pcb_pstk_mirror(pcb_pstk_t *ps, pcb_coord_t y_offs, int swap_side, int disable_xmirror) +void pcb_pstk_mirror(pcb_pstk_t *ps, pcb_coord_t y_offs, int swap_side, int disable_xmirror, pcb_bool undoable) { int xmirror = !ps->xmirror, smirror = (swap_side ? (!ps->smirror) : ps->smirror); Index: trunk/src/obj_pstk.h =================================================================== --- trunk/src/obj_pstk.h (revision 29715) +++ trunk/src/obj_pstk.h (revision 29716) @@ -227,7 +227,7 @@ are already mirrored so they represent the other-side geometry (e.g. when importing from old pcb formats). If y_offs is PCB_PSTK_DONT_MIRROR_COORDS, do not change the y coord */ -void pcb_pstk_mirror(pcb_pstk_t *ps, pcb_coord_t y_offs, int swap_side, int disable_xmirror); +void pcb_pstk_mirror(pcb_pstk_t *ps, pcb_coord_t y_offs, int swap_side, int disable_xmirror, pcb_bool undoable); /* Create a new proto and scale it for the padstack; center x and y are scaled too */ void pcb_pstk_scale(pcb_pstk_t *ps, double sx, double sy); Index: trunk/src/obj_subc.c =================================================================== --- trunk/src/obj_subc.c (revision 29715) +++ trunk/src/obj_subc.c (revision 29716) @@ -1766,13 +1766,13 @@ } /* mirrors the coordinates of a subcircuit; an additional offset is passed */ -void pcb_subc_mirror(pcb_data_t *data, pcb_subc_t *subc, pcb_coord_t y_offs, pcb_bool smirror) +void pcb_subc_mirror(pcb_data_t *data, pcb_subc_t *subc, pcb_coord_t y_offs, pcb_bool smirror, pcb_bool undoable) { if ((data != NULL) && (data->subc_tree != NULL)) pcb_r_delete_entry(data->subc_tree, (pcb_box_t *)subc); pcb_undo_freeze_add(); - pcb_data_mirror(subc->data, y_offs, smirror ? PCB_TXM_SIDE : PCB_TXM_COORD, smirror); + pcb_data_mirror(subc->data, y_offs, smirror ? PCB_TXM_SIDE : PCB_TXM_COORD, smirror, 0); pcb_undo_unfreeze_add(); pcb_subc_bbox(subc); @@ -1814,7 +1814,7 @@ pcb_r_delete_entry(data->subc_tree, (pcb_box_t *)subc); pcb_undo_freeze_add(); - pcb_data_mirror(subc->data, yoff, PCB_TXM_SIDE, 1); + pcb_data_mirror(subc->data, yoff, PCB_TXM_SIDE, 1, 0); pcb_undo_unfreeze_add(); for(n = 0; n < subc->data->LayerN; n++) { Index: trunk/src/obj_subc.h =================================================================== --- trunk/src/obj_subc.h (revision 29715) +++ trunk/src/obj_subc.h (revision 29716) @@ -76,7 +76,7 @@ int pcb_subc_convert_from_buffer(pcb_buffer_t *buffer); pcb_bool pcb_subc_smash_buffer(pcb_buffer_t *buff); -void pcb_subc_mirror(pcb_data_t *data, pcb_subc_t *subc, pcb_coord_t y_offs, pcb_bool smirror); +void pcb_subc_mirror(pcb_data_t *data, pcb_subc_t *subc, pcb_coord_t y_offs, pcb_bool smirror, pcb_bool undoable); /* Scale coords/pos of a subc by sx,sy with thickness factor sth; if recurse is non-zero, descend in subc-in-subc */ Index: trunk/src/obj_text.c =================================================================== --- trunk/src/obj_text.c (revision 29715) +++ trunk/src/obj_text.c (revision 29716) @@ -782,7 +782,7 @@ return Text; } -void pcb_text_flip_side(pcb_layer_t *layer, pcb_text_t *text, pcb_coord_t y_offs) +void pcb_text_flip_side(pcb_layer_t *layer, pcb_text_t *text, pcb_coord_t y_offs, pcb_bool undoable) { if (layer->text_tree != NULL) pcb_r_delete_entry(layer->text_tree, (pcb_box_t *) text); @@ -794,7 +794,7 @@ pcb_r_insert_entry(layer->text_tree, (pcb_box_t *) text); } -void pcb_text_mirror_coords(pcb_layer_t *layer, pcb_text_t *text, pcb_coord_t y_offs) +void pcb_text_mirror_coords(pcb_layer_t *layer, pcb_text_t *text, pcb_coord_t y_offs, pcb_bool undoable) { if (layer->text_tree != NULL) pcb_r_delete_entry(layer->text_tree, (pcb_box_t *) text); Index: trunk/src/obj_text.h =================================================================== --- trunk/src/obj_text.h (revision 29715) +++ trunk/src/obj_text.h (revision 29716) @@ -68,8 +68,8 @@ void pcb_text_rotate90(pcb_text_t *Text, pcb_coord_t X, pcb_coord_t Y, unsigned Number); void pcb_text_rotate(pcb_text_t *Text, pcb_coord_t X, pcb_coord_t Y, double cosa, double sina, double rotdeg); void pcb_text_scale(pcb_text_t *text, double sx, double sy, double sth); -void pcb_text_flip_side(pcb_layer_t *layer, pcb_text_t *text, pcb_coord_t y_offs); -void pcb_text_mirror_coords(pcb_layer_t *layer, pcb_text_t *text, pcb_coord_t y_offs); /* mirror the coords but do not mirror the text itself (no on-solder) */ +void pcb_text_flip_side(pcb_layer_t *layer, pcb_text_t *text, pcb_coord_t y_offs, pcb_bool undoable); +void pcb_text_mirror_coords(pcb_layer_t *layer, pcb_text_t *text, pcb_coord_t y_offs, pcb_bool undoable); /* mirror the coords but do not mirror the text itself (no on-solder) */ void pcb_text_set_font(pcb_text_t *text, pcb_font_id_t fid); void pcb_text_update(pcb_layer_t *layer, pcb_text_t *text); Index: trunk/src_plugins/io_autotrax/read.c =================================================================== --- trunk/src_plugins/io_autotrax/read.c (revision 29715) +++ trunk/src_plugins/io_autotrax/read.c (revision 29716) @@ -1169,7 +1169,7 @@ /* we now flip the board about the X-axis, to invert the Y coords used by autotrax */ pcb_undo_freeze_add(); - pcb_data_mirror(Ptr->Data, 0, PCB_TXM_COORD, 0); + pcb_data_mirror(Ptr->Data, 0, PCB_TXM_COORD, 0, 0); pcb_undo_unfreeze_add(); /* still not sure if this is required: */ Index: trunk/src_plugins/io_dsn/read.c =================================================================== --- trunk/src_plugins/io_dsn/read.c (revision 29715) +++ trunk/src_plugins/io_dsn/read.c (revision 29716) @@ -1481,7 +1481,7 @@ } if (back) - pcb_pstk_mirror(ps, PCB_PSTK_DONT_MIRROR_COORDS, 1, 1); + pcb_pstk_mirror(ps, PCB_PSTK_DONT_MIRROR_COORDS, 1, 1, 0); return 0; Index: trunk/src_plugins/io_eagle/read.c =================================================================== --- trunk/src_plugins/io_eagle/read.c (revision 29715) +++ trunk/src_plugins/io_eagle/read.c (revision 29716) @@ -1733,7 +1733,7 @@ res = eagle_foreach_dispatch(&st, st.parser.calls->children(&st.parser, st.parser.root), disp, NULL, 0); if (res == 0) { pcb_undo_freeze_add(); - pcb_data_mirror(pcb->Data, 0, PCB_TXM_COORD, 0); + pcb_data_mirror(pcb->Data, 0, PCB_TXM_COORD, 0, 0); pcb_undo_unfreeze_add(); } pcb_create_being_lenient = old_leni; @@ -1798,7 +1798,7 @@ res |= eagle_foreach_dispatch(&st, st.parser.calls->children(&st.parser, st.parser.root), disp_2, NULL, 0); if (res == 0) { pcb_undo_freeze_add(); - pcb_data_mirror(pcb->Data, 0, PCB_TXM_COORD, 0); + pcb_data_mirror(pcb->Data, 0, PCB_TXM_COORD, 0, 0); pcb_undo_unfreeze_add(); } pcb_create_being_lenient = old_leni; Index: trunk/src_plugins/io_lihata/read.c =================================================================== --- trunk/src_plugins/io_lihata/read.c (revision 29715) +++ trunk/src_plugins/io_lihata/read.c (revision 29716) @@ -1177,7 +1177,7 @@ pcb_attribute_put(&ps->Attributes, "name", Name); if (subc_on_bottom) - pcb_pstk_mirror(ps, PCB_PSTK_DONT_MIRROR_COORDS, 1, 0); + pcb_pstk_mirror(ps, PCB_PSTK_DONT_MIRROR_COORDS, 1, 0, 0); return err; } @@ -1219,7 +1219,7 @@ pcb_attribute_put(&p->Attributes, "name", Name); if (subc_on_bottom) - pcb_pstk_mirror(p, PCB_PSTK_DONT_MIRROR_COORDS, 1, 0); + pcb_pstk_mirror(p, PCB_PSTK_DONT_MIRROR_COORDS, 1, 0, 0); pcb_attrib_compat_set_intconn(&p->Attributes, intconn); parse_attributes(&p->Attributes, lht_dom_hash_get(obj, "attributes")); Index: trunk/src_plugins/io_pcb/file.c =================================================================== --- trunk/src_plugins/io_pcb/file.c (revision 29715) +++ trunk/src_plugins/io_pcb/file.c (revision 29716) @@ -1105,7 +1105,7 @@ pcb_attribute_put(&p->Attributes, "name", Name); if (yysubc_bottom) - pcb_pstk_mirror(p, PCB_PSTK_DONT_MIRROR_COORDS, 1, 0); + pcb_pstk_mirror(p, PCB_PSTK_DONT_MIRROR_COORDS, 1, 0, 0); return p; } @@ -1122,7 +1122,7 @@ if (yysubc_bottom) { pcb_data_t *old_hack = pcb_pstk_data_hack; pcb_pstk_data_hack = subc->parent.data; - pcb_pstk_mirror(p, PCB_PSTK_DONT_MIRROR_COORDS, 1, 1); + pcb_pstk_mirror(p, PCB_PSTK_DONT_MIRROR_COORDS, 1, 1, 0); pcb_pstk_data_hack = old_hack; } Index: trunk/src_plugins/lib_netmap/placement.c =================================================================== --- trunk/src_plugins/lib_netmap/placement.c (revision 29715) +++ trunk/src_plugins/lib_netmap/placement.c (revision 29716) @@ -61,7 +61,7 @@ } if (tr.on_bottom) { int n; - pcb_data_mirror(proto->data, 0, PCB_TXM_SIDE, 1); + pcb_data_mirror(proto->data, 0, PCB_TXM_SIDE, 1, 0); for(n = 0; n < proto->data->LayerN; n++) { pcb_layer_t *ly = proto->data->Layer + n; ly->meta.bound.type = pcb_layer_mirror_type(ly->meta.bound.type);