예제 #1
0
파일: o_text.c 프로젝트: rlutz/geda-gaf
/*! \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;
}
예제 #2
0
파일: export.c 프로젝트: SayCV/geda-gaf
/* 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;
}