/*! \todo Finish function documentation!!! * \brief * \par Function Description * */ int o_text_get_rendered_bounds (void *user_data, OBJECT *o_current, int *min_x, int *min_y, int *max_x, int *max_y) { TOPLEVEL *toplevel; EdaRenderer *renderer; cairo_t *cr; cairo_matrix_t render_mtx; int result, render_flags = 0; double t, l, r, b; GschemToplevel *w_current = (GschemToplevel *) user_data; g_return_val_if_fail ((w_current != NULL), FALSE); GschemPageView *page_view = gschem_toplevel_get_current_page_view (w_current); g_return_val_if_fail ((page_view != NULL), FALSE); toplevel = gschem_toplevel_get_toplevel (w_current); g_return_val_if_fail ((toplevel != NULL), FALSE); cr = gdk_cairo_create (gtk_widget_get_window (GTK_WIDGET(page_view))); /* Set up renderer based on configuration in w_current. Note that we * *don't* enable hinting, because if its enabled the calculated * bounds are zoom-level-dependent. */ if (toplevel->show_hidden_text) render_flags |= EDA_RENDERER_FLAG_TEXT_HIDDEN; renderer = g_object_ref (w_current->renderer); g_object_set (G_OBJECT (renderer), "cairo-context", cr, "render-flags", render_flags, NULL); /* We need to transform the cairo context to approximate world * coordinates. */ cairo_matrix_init (&render_mtx, 1, 0, 0, -1, -1, 1); cairo_set_matrix (cr, &render_mtx); /* Use the renderer to calculate text bounds */ result = eda_renderer_get_user_bounds (renderer, o_current, &l, &t, &r, &b); /* Clean up */ eda_renderer_destroy (renderer); cairo_destroy (cr); /* Round bounds to nearest integer */ *min_x = lrint (fmin (l, r)); *min_y = lrint (fmin (t, b)); *max_x = lrint (fmax (l, r)); *max_y = lrint (fmax (t, b)); return result; }
/* Callback function registered with libgeda to allow the libgeda * "bounds" functions to get text bounds using the renderer. If a * "rendered bounds" function isn't provided, text objects don't get * used when calculating the extents of the drawing. */ static gboolean export_text_rendered_bounds (void *user_data, const GedaObject *object, gint *left, gint *top, gint *right, gint *bottom) { int result; double t, l, r, b; EdaRenderer *renderer = EDA_RENDERER (user_data); result = eda_renderer_get_user_bounds (renderer, object, &l, &t, &r, &b); *left = lrint (fmin (l,r)); *top = lrint (fmin (t, b)); *right = lrint (fmax (l, r)); *bottom = lrint (fmax (t, b)); return result; }