/** Set the diagram extents field to the union of the extents of the layers. * @param data The diagram to get the extents for. */ static void data_get_layers_extents_union(DiagramData *data) { guint i; gboolean first = TRUE; Rectangle new_extents; for ( i = 0 ; i<data->layers->len; i++) { Layer *layer = g_ptr_array_index(data->layers, i); if (!layer->visible) continue; layer_update_extents(layer); if (first) { new_extents = layer->extents; first = rectangle_equals(&new_extents,&invalid_extents); } else { if (!rectangle_equals(&layer->extents,&invalid_extents)) { rectangle_union(&new_extents, &layer->extents); } } } data->extents = new_extents; }
/** Adjust the extents field of a diagram. * @param data The diagram to adjust. * @return TRUE if the extents changed. */ static gboolean data_compute_extents(DiagramData *data) { Rectangle old_extents = data->extents; if (!data_has_visible_layers(data)) { if (data->layers->len > 0) { Layer *layer = g_ptr_array_index(data->layers, 0); layer_update_extents(layer); data->extents = layer->extents; } else { data->extents = invalid_extents; } } else { data_get_layers_extents_union(data); } if (rectangle_equals(&data->extents,&invalid_extents)) { data->extents.left = 0.0; data->extents.right = 10.0; data->extents.top = 0.0; data->extents.bottom = 10.0; } return (!rectangle_equals(&data->extents,&old_extents)); }
/*! * \brief Recalculation of the bounding box containing all objects in the layer * \memberof _Layer */ int layer_update_extents(Layer *layer) { GList *l; DiaObject *obj; Rectangle new_extents; l = layer->objects; if (l!=NULL) { obj = (DiaObject *) l->data; new_extents = obj->bounding_box; l = g_list_next(l); while(l!=NULL) { const Rectangle *bbox; obj = (DiaObject *) l->data; /* don't consider empty (or broken) objects in the overall extents */ bbox = &obj->bounding_box; if (bbox->right > bbox->left && bbox->bottom > bbox->top) rectangle_union(&new_extents, &obj->bounding_box); l = g_list_next(l); } } else { new_extents = invalid_extents; } if (rectangle_equals(&new_extents,&layer->extents)) return FALSE; layer->extents = new_extents; return TRUE; }