Index: trunk/src/buffer.c =================================================================== --- trunk/src/buffer.c (revision 5575) +++ trunk/src/buffer.c (revision 5576) @@ -86,7 +86,7 @@ */ void pcb_set_buffer_bbox(pcb_buffer_t *Buffer) { - pcb_box_t *box = pcb_data_bbox(Buffer->Data); + pcb_box_t tmp, *box = pcb_data_bbox(&tmp, Buffer->Data); if (box) Buffer->BoundingBox = *box; Index: trunk/src/data.c =================================================================== --- trunk/src/data.c (revision 5575) +++ trunk/src/data.c (revision 5576) @@ -263,79 +263,74 @@ return (hasNoObjects); } -/* --------------------------------------------------------------------------- - * gets minimum and maximum coordinates - * returns NULL if layout is empty - */ -pcb_box_t *pcb_data_bbox(pcb_data_t *Data) +pcb_box_t *pcb_data_bbox(pcb_box_t *out, pcb_data_t *Data) { - static pcb_box_t box; /* FIX ME: use r_search to do this much faster */ /* preset identifiers with highest and lowest possible values */ - box.X1 = box.Y1 = PCB_MAX_COORD; - box.X2 = box.Y2 = -PCB_MAX_COORD; + out->X1 = out->Y1 = PCB_MAX_COORD; + out->X2 = out->Y2 = -PCB_MAX_COORD; /* now scan for the lowest/highest X and Y coordinate */ PCB_VIA_LOOP(Data); { - box.X1 = MIN(box.X1, via->X - via->Thickness / 2); - box.Y1 = MIN(box.Y1, via->Y - via->Thickness / 2); - box.X2 = MAX(box.X2, via->X + via->Thickness / 2); - box.Y2 = MAX(box.Y2, via->Y + via->Thickness / 2); + out->X1 = MIN(out->X1, via->X - via->Thickness / 2); + out->Y1 = MIN(out->Y1, via->Y - via->Thickness / 2); + out->X2 = MAX(out->X2, via->X + via->Thickness / 2); + out->Y2 = MAX(out->Y2, via->Y + via->Thickness / 2); } PCB_END_LOOP; PCB_ELEMENT_LOOP(Data); { - box.X1 = MIN(box.X1, element->BoundingBox.X1); - box.Y1 = MIN(box.Y1, element->BoundingBox.Y1); - box.X2 = MAX(box.X2, element->BoundingBox.X2); - box.Y2 = MAX(box.Y2, element->BoundingBox.Y2); + out->X1 = MIN(out->X1, element->BoundingBox.X1); + out->Y1 = MIN(out->Y1, element->BoundingBox.Y1); + out->X2 = MAX(out->X2, element->BoundingBox.X2); + out->Y2 = MAX(out->Y2, element->BoundingBox.Y2); { pcb_text_t *text = &PCB_ELEM_TEXT_REFDES(element); - box.X1 = MIN(box.X1, text->BoundingBox.X1); - box.Y1 = MIN(box.Y1, text->BoundingBox.Y1); - box.X2 = MAX(box.X2, text->BoundingBox.X2); - box.Y2 = MAX(box.Y2, text->BoundingBox.Y2); + out->X1 = MIN(out->X1, text->BoundingBox.X1); + out->Y1 = MIN(out->Y1, text->BoundingBox.Y1); + out->X2 = MAX(out->X2, text->BoundingBox.X2); + out->Y2 = MAX(out->Y2, text->BoundingBox.Y2); }; } PCB_END_LOOP; PCB_LINE_ALL_LOOP(Data); { - box.X1 = MIN(box.X1, line->Point1.X - line->Thickness / 2); - box.Y1 = MIN(box.Y1, line->Point1.Y - line->Thickness / 2); - box.X1 = MIN(box.X1, line->Point2.X - line->Thickness / 2); - box.Y1 = MIN(box.Y1, line->Point2.Y - line->Thickness / 2); - box.X2 = MAX(box.X2, line->Point1.X + line->Thickness / 2); - box.Y2 = MAX(box.Y2, line->Point1.Y + line->Thickness / 2); - box.X2 = MAX(box.X2, line->Point2.X + line->Thickness / 2); - box.Y2 = MAX(box.Y2, line->Point2.Y + line->Thickness / 2); + out->X1 = MIN(out->X1, line->Point1.X - line->Thickness / 2); + out->Y1 = MIN(out->Y1, line->Point1.Y - line->Thickness / 2); + out->X1 = MIN(out->X1, line->Point2.X - line->Thickness / 2); + out->Y1 = MIN(out->Y1, line->Point2.Y - line->Thickness / 2); + out->X2 = MAX(out->X2, line->Point1.X + line->Thickness / 2); + out->Y2 = MAX(out->Y2, line->Point1.Y + line->Thickness / 2); + out->X2 = MAX(out->X2, line->Point2.X + line->Thickness / 2); + out->Y2 = MAX(out->Y2, line->Point2.Y + line->Thickness / 2); } PCB_ENDALL_LOOP; PCB_ARC_ALL_LOOP(Data); { - box.X1 = MIN(box.X1, arc->BoundingBox.X1); - box.Y1 = MIN(box.Y1, arc->BoundingBox.Y1); - box.X2 = MAX(box.X2, arc->BoundingBox.X2); - box.Y2 = MAX(box.Y2, arc->BoundingBox.Y2); + out->X1 = MIN(out->X1, arc->BoundingBox.X1); + out->Y1 = MIN(out->Y1, arc->BoundingBox.Y1); + out->X2 = MAX(out->X2, arc->BoundingBox.X2); + out->Y2 = MAX(out->Y2, arc->BoundingBox.Y2); } PCB_ENDALL_LOOP; PCB_TEXT_ALL_LOOP(Data); { - box.X1 = MIN(box.X1, text->BoundingBox.X1); - box.Y1 = MIN(box.Y1, text->BoundingBox.Y1); - box.X2 = MAX(box.X2, text->BoundingBox.X2); - box.Y2 = MAX(box.Y2, text->BoundingBox.Y2); + out->X1 = MIN(out->X1, text->BoundingBox.X1); + out->Y1 = MIN(out->Y1, text->BoundingBox.Y1); + out->X2 = MAX(out->X2, text->BoundingBox.X2); + out->Y2 = MAX(out->Y2, text->BoundingBox.Y2); } PCB_ENDALL_LOOP; PCB_POLY_ALL_LOOP(Data); { - box.X1 = MIN(box.X1, polygon->BoundingBox.X1); - box.Y1 = MIN(box.Y1, polygon->BoundingBox.Y1); - box.X2 = MAX(box.X2, polygon->BoundingBox.X2); - box.Y2 = MAX(box.Y2, polygon->BoundingBox.Y2); + out->X1 = MIN(out->X1, polygon->BoundingBox.X1); + out->Y1 = MIN(out->Y1, polygon->BoundingBox.Y1); + out->X2 = MAX(out->X2, polygon->BoundingBox.X2); + out->Y2 = MAX(out->Y2, polygon->BoundingBox.Y2); } PCB_ENDALL_LOOP; - return (pcb_data_is_empty(Data) ? NULL : &box); + return (pcb_data_is_empty(Data) ? NULL : out); } Index: trunk/src/data.h =================================================================== --- trunk/src/data.h (revision 5575) +++ trunk/src/data.h (revision 5576) @@ -111,6 +111,9 @@ void pcb_data_free(pcb_data_t *); pcb_bool pcb_data_is_empty(pcb_data_t *); -pcb_box_t *pcb_data_bbox(pcb_data_t *Data); +/* gets minimum and maximum coordinates + * returns NULL if layout is empty */ +pcb_box_t *pcb_data_bbox(pcb_box_t *out, pcb_data_t *Data); + #endif Index: trunk/src_plugins/autocrop/autocrop.c =================================================================== --- trunk/src_plugins/autocrop/autocrop.c (revision 5575) +++ trunk/src_plugins/autocrop/autocrop.c (revision 5576) @@ -182,9 +182,9 @@ static int autocrop(int argc, const char **argv, pcb_coord_t x, pcb_coord_t y) { pcb_coord_t dx, dy, pad; - pcb_box_t *box; + pcb_box_t tmp, *box; - box = pcb_data_bbox(PCB->Data); /* handy! */ + box = pcb_data_bbox(&tmp, PCB->Data); /* handy! */ if (!box || (box->X1 == box->X2 || box->Y1 == box->Y2)) { /* board would become degenerate */ return 0; Index: trunk/src_plugins/export_png/png.c =================================================================== --- trunk/src_plugins/export_png/png.c (revision 5575) +++ trunk/src_plugins/export_png/png.c (revision 5576) @@ -428,7 +428,7 @@ void png_hid_export_to_file(FILE * the_file, pcb_hid_attr_val_t * options) { static int saved_layer_stack[PCB_MAX_LAYER]; - pcb_box_t region; + pcb_box_t tmp, region; f = the_file; @@ -438,7 +438,7 @@ region.Y2 = PCB->MaxHeight; if (options[HA_only_visible].int_value) - bounds = pcb_data_bbox(PCB->Data); + bounds = pcb_data_bbox(&tmp, PCB->Data); else bounds = ®ion; @@ -584,7 +584,7 @@ { int save_ons[PCB_MAX_LAYER + 2]; int i; - pcb_box_t *bbox; + pcb_box_t tmp, *bbox; int w, h; int xmax, ymax, dpi; const char *fmt; @@ -630,7 +630,7 @@ /* figure out width and height of the board */ if (options[HA_only_visible].int_value) { - bbox = pcb_data_bbox(PCB->Data); + bbox = pcb_data_bbox(&tmp, PCB->Data); x_shift = bbox->X1; y_shift = bbox->Y1; h = bbox->Y2 - bbox->Y1; Index: trunk/src_plugins/export_ps/eps.c =================================================================== --- trunk/src_plugins/export_ps/eps.c (revision 5575) +++ trunk/src_plugins/export_ps/eps.c (revision 5576) @@ -182,7 +182,7 @@ { int i; static int saved_layer_stack[PCB_MAX_LAYER]; - pcb_box_t region; + pcb_box_t tmp, region; conf_force_set_bool(conf_core.editor.thin_draw, 0); conf_force_set_bool(conf_core.editor.thin_draw_poly, 0); @@ -196,7 +196,7 @@ region.Y2 = PCB->MaxHeight; if (options[HA_only_visible].int_value) - bounds = pcb_data_bbox(PCB->Data); + bounds = pcb_data_bbox(&tmp, PCB->Data); else bounds = ®ion;