Index: trunk/src/board.c =================================================================== --- trunk/src/board.c (revision 11698) +++ trunk/src/board.c (revision 11699) @@ -321,7 +321,6 @@ int pcb_board_normalize(pcb_board_t *pcb) { pcb_box_t b; - pcb_coord_t dx = 0, dy = 0; int chg = 0; if (pcb_data_bbox(&b, pcb->Data) == NULL) @@ -337,15 +336,7 @@ chg++; } - if (b.X1 < 0) - dx = -b.X1; - if (b.Y1 < 0) - dy = -b.Y1; + chg += pcb_data_normalize_(pcb->Data, &b); - if ((dx > 0) || (dy > 0)) { - pcb_data_move(pcb->Data, dx, dy); - chg++; - } - return chg; } Index: trunk/src/data.c =================================================================== --- trunk/src/data.c (revision 11698) +++ trunk/src/data.c (revision 11699) @@ -434,6 +434,36 @@ PCB_ENDALL_LOOP; } +int pcb_data_normalize_(pcb_data_t *data, pcb_box_t *data_bbox) +{ + pcb_box_t tmp; + pcb_coord_t dx = 0, dy = 0; + + if (data_bbox == NULL) { + data_bbox = &tmp; + if (pcb_data_bbox(data_bbox, data) == NULL) + return -1; + } + + if (data_bbox->X1 < 0) + dx = -data_bbox->X1; + if (data_bbox->Y1 < 0) + dy = -data_bbox->Y1; + + if ((dx > 0) || (dy > 0)) { + pcb_data_move(data, dx, dy); + return 1; + } + + return 0; +} + +int pcb_data_normalize(pcb_data_t *data) +{ + return pcb_data_normalize_(data, NULL); +} + + extern pcb_opfunc_t MoveFunctions; void pcb_data_move(pcb_data_t *data, pcb_coord_t dx, pcb_coord_t dy) { Index: trunk/src/data.h =================================================================== --- trunk/src/data.h (revision 11698) +++ trunk/src/data.h (revision 11699) @@ -130,7 +130,12 @@ /* Set up all data layers as bound layers to pcb's Data */ void pcb_data_bind_board_layers(pcb_board_t *pcb, pcb_data_t *data, int share_rtrees); +/* Make sure there are no negative coords in data, knowing the bbox of the data */ +int pcb_data_normalize_(pcb_data_t *data, pcb_box_t *data_bbox); +/* Make sure there are no negative coords in data (calculates the bbox of the data) */ +int pcb_data_normalize(pcb_data_t *data); + /* Returns the top level pcb related to a data, or NULL if the data is floating (e.g. is a global buffer) */ pcb_board_t *pcb_data_get_top(pcb_data_t *data);