Index: trunk/src/obj_poly.c =================================================================== --- trunk/src/obj_poly.c (revision 9187) +++ trunk/src/obj_poly.c (revision 9188) @@ -230,10 +230,17 @@ pcb_polygon_t *pcb_poly_dup(pcb_layer_t *dst, pcb_polygon_t *src) { pcb_polygon_t *p = pcb_poly_new(dst, src->Flags); - pcb_poly_copy(p, src); + pcb_poly_copy(p, src, 0, 0); return p; } +pcb_polygon_t *pcb_poly_dup_at(pcb_layer_t *dst, pcb_polygon_t *src, pcb_coord_t dx, pcb_coord_t dy) +{ + pcb_polygon_t *p = pcb_poly_new(dst, src->Flags); + pcb_poly_copy(p, src, dx, dy); + return p; +} + /* creates a new point in a polygon */ pcb_point_t *pcb_poly_point_new(pcb_polygon_t *Polygon, pcb_coord_t X, pcb_coord_t Y) { @@ -255,7 +262,7 @@ } /* copies data from one polygon to another; 'Dest' has to exist */ -pcb_polygon_t *pcb_poly_copy(pcb_polygon_t *Dest, pcb_polygon_t *Src) +pcb_polygon_t *pcb_poly_copy(pcb_polygon_t *Dest, pcb_polygon_t *Src, pcb_coord_t dx, pcb_coord_t dy) { pcb_cardinal_t hole = 0; pcb_cardinal_t n; @@ -265,7 +272,7 @@ pcb_poly_hole_new(Dest); hole++; } - pcb_poly_point_new(Dest, Src->Points[n].X, Src->Points[n].Y); + pcb_poly_point_new(Dest, Src->Points[n].X+dy, Src->Points[n].Y+dx); } pcb_poly_bbox(Dest); Dest->Flags = Src->Flags; @@ -317,7 +324,7 @@ pcb_polygon_t *polygon; polygon = pcb_poly_new(layer, Polygon->Flags); - pcb_poly_copy(polygon, Polygon); + pcb_poly_copy(polygon, Polygon, 0, 0); /* Update the polygon r-tree. Unlike similarly named functions for * other objects, CreateNewPolygon does not do this as it creates a @@ -712,8 +719,7 @@ pcb_polygon_t *polygon; polygon = pcb_poly_new(Layer, pcb_no_flags()); - pcb_poly_copy(polygon, Polygon); - pcb_poly_move(polygon, ctx->copy.DeltaX, ctx->copy.DeltaY); + pcb_poly_copy(polygon, Polygon, ctx->copy.DeltaX, ctx->copy.DeltaY); if (!Layer->polygon_tree) Layer->polygon_tree = pcb_r_create_tree(NULL, 0, 0); pcb_r_insert_entry(Layer->polygon_tree, (pcb_box_t *) polygon, 0); Index: trunk/src/obj_poly.h =================================================================== --- trunk/src/obj_poly.h (revision 9187) +++ trunk/src/obj_poly.h (revision 9188) @@ -58,6 +58,7 @@ pcb_polygon_t *pcb_poly_new_from_rectangle(pcb_layer_t *Layer, pcb_coord_t X1, pcb_coord_t Y1, pcb_coord_t X2, pcb_coord_t Y2, pcb_flag_t Flags); pcb_polygon_t *pcb_poly_new(pcb_layer_t *Layer, pcb_flag_t Flags); pcb_polygon_t *pcb_poly_dup(pcb_layer_t *dst, pcb_polygon_t *src); +pcb_polygon_t *pcb_poly_dup_at(pcb_layer_t *dst, pcb_polygon_t *src, pcb_coord_t dx, pcb_coord_t dy); pcb_point_t *pcb_poly_point_new(pcb_polygon_t *Polygon, pcb_coord_t X, pcb_coord_t Y); pcb_polygon_t *pcb_poly_hole_new(pcb_polygon_t * Polygon); void *pcb_poly_remove(pcb_layer_t *Layer, pcb_polygon_t *Polygon); @@ -68,7 +69,7 @@ void pcb_poly_flip_side(pcb_layer_t *layer, pcb_polygon_t *polygon); void pcb_poly_move(pcb_polygon_t *Polygon, pcb_coord_t DX, pcb_coord_t DY); -pcb_polygon_t *pcb_poly_copy(pcb_polygon_t *Dest, pcb_polygon_t *Src); +pcb_polygon_t *pcb_poly_copy(pcb_polygon_t *Dest, pcb_polygon_t *Src, pcb_coord_t dx, pcb_coord_t dy); /* Add objects without creating them or making any "sanity modifications" to them */ void pcb_add_polygon_on_layer(pcb_layer_t *Layer, pcb_polygon_t *polygon); Index: trunk/src_plugins/fontmode/fontmode.c =================================================================== --- trunk/src_plugins/fontmode/fontmode.c (revision 9187) +++ trunk/src_plugins/fontmode/fontmode.c (revision 9188) @@ -87,14 +87,8 @@ /* alloc */ np = pcb_poly_new(layer, pcb_no_flags()); - pcb_poly_copy(np, poly); + pcb_poly_copy(np, poly, ox, oy); - /* transform */ - for(n = 0, pnt = np->Points; n < np->PointN; n++,pnt++) { - pnt->X += ox; - pnt->Y += oy; - } - /* add */ pcb_add_polygon_on_layer(layer, np); pcb_poly_init_clip(PCB->Data, layer, np);