Index: trunk/src/buffer.c =================================================================== --- trunk/src/buffer.c (revision 12977) +++ trunk/src/buffer.c (revision 12978) @@ -351,7 +351,11 @@ } PCB_END_LOOP; -#warning subc TODO + PCB_SUBC_LOOP(Buffer->Data); + { + pcb_subc_rotate(subc, Buffer->X, Buffer->Y, cosa, sina, angle); + } + PCB_END_LOOP; /* all layer related objects */ PCB_LINE_ALL_LOOP(Buffer->Data); Index: trunk/src/obj_subc.c =================================================================== --- trunk/src/obj_subc.c (revision 12977) +++ trunk/src/obj_subc.c (revision 12978) @@ -886,10 +886,26 @@ void *pcb_subcop_rotate(pcb_opctx_t *ctx, pcb_subc_t *sc) { - pcb_board_t *pcb = pcb_data_get_top(sc->data); - return pcb_subc_op((pcb != NULL ? pcb->Data : NULL), sc, &RotateFunctions, ctx); + pcb_data_t *data; + + ctx->rotate.pcb = pcb_data_get_top(sc->data); + data = (ctx->rotate.pcb != NULL ? ctx->rotate.pcb->Data : NULL); + return pcb_subc_op(data, sc, &RotateFunctions, ctx); } +void pcb_subc_rotate(pcb_subc_t *subc, pcb_coord_t cx, pcb_coord_t cy, double cosa, double sina, double angle) +{ + pcb_opctx_t ctx; + + ctx.rotate.center_x = cx; + ctx.rotate.center_y = cy; + ctx.rotate.angle = angle; + ctx.rotate.cosa = cosa; + ctx.rotate.sina = sina; + pcb_subcop_rotate(&ctx, subc); +} + + static int subc_relocate_layer_objs(pcb_layer_t *dl, pcb_data_t *src_data, pcb_layer_t *sl, int src_has_real_layer, int dst_is_pcb) { pcb_line_t *line; Index: trunk/src/obj_subc.h =================================================================== --- trunk/src/obj_subc.h (revision 12977) +++ trunk/src/obj_subc.h (revision 12978) @@ -65,6 +65,7 @@ /* changes the side of the board an element is on; returns pcb_true if done */ pcb_bool pcb_subc_change_side(pcb_subc_t **subc, pcb_coord_t yoff); +void pcb_subc_rotate(pcb_subc_t *subc, pcb_coord_t cx, pcb_coord_t cy, double cosa, double sina, double angle); void XORDrawSubc(pcb_subc_t *sc, pcb_coord_t DX, pcb_coord_t DY);