void rsvg_text_render_text (RsvgDrawingCtx * ctx, const char *text, gdouble * x, gdouble * y) { PangoContext *context; PangoLayout *layout; PangoLayoutIter *iter; RsvgState *state; gint w, h, baseline; state = rsvg_current_state (ctx); /* Do not render the text if the font size is zero. See bug #581491. */ if (state->font_size.length == 0) return; context = ctx->render->create_pango_context (ctx); layout = rsvg_text_create_layout (ctx, state, text, context); pango_layout_get_size (layout, &w, &h); iter = pango_layout_get_iter (layout); baseline = pango_layout_iter_get_baseline (iter) / (double)PANGO_SCALE; pango_layout_iter_free (iter); ctx->render->render_pango_layout (ctx, layout, *x, *y - baseline); *x += w / (double)PANGO_SCALE; g_object_unref (layout); g_object_unref (context); }
static void draw_text (RsvgDrawingCtx * ctx, cairo_t *cr, double *x, double *y, const char *text) { PangoContext *context; PangoLayout *layout; RsvgState *state; PangoLayoutLine *line; int w, h; state = rsvg_current_state (ctx); if (state->font_size.length == 0) return; context = ctx->render->create_pango_context (ctx); layout = rsvg_text_create_layout (ctx, state, text, context); pango_layout_get_size(layout, &w, &h); // From pango example // http://git.gnome.org/browse/pango/tree/examples/cairotwisted.c line = pango_layout_get_line_readonly (layout, 0); cairo_move_to (cr, *x, *y); pango_cairo_layout_line_path (cr, line); // Update x, y based on dimensions of text drawn if (PANGO_GRAVITY_IS_VERTICAL (state->text_gravity)) *y += w / (double)PANGO_SCALE; else *x += w / (double)PANGO_SCALE; g_object_unref (layout); g_object_unref (context); }
static RsvgTextLayout * rsvg_text_layout_new (RsvgDrawingCtx * ctx, RsvgState * state, const char *text) { RsvgTextLayout *layout; if (ctx->pango_context == NULL) ctx->pango_context = ctx->render->create_pango_context (ctx); layout = g_new0 (RsvgTextLayout, 1); layout->layout = rsvg_text_create_layout (ctx, state, text, ctx->pango_context); layout->ctx = ctx; layout->anchor = state->text_anchor; return layout; }
void rsvg_text_render_text (RsvgDrawingCtx * ctx, const char *text, gdouble * x, gdouble * y) { PangoContext *context; PangoLayout *layout; PangoLayoutIter *iter; RsvgState *state; gint w, h, offsetX, offsetY; state = rsvg_current_state (ctx); /* Do not render the text if the font size is zero. See bug #581491. */ if (state->font_size.length == 0) return; context = ctx->render->create_pango_context (ctx); layout = rsvg_text_create_layout (ctx, state, text, context); pango_layout_get_size (layout, &w, &h); iter = pango_layout_get_iter (layout); if (PANGO_GRAVITY_IS_VERTICAL (state->text_gravity)) { offsetX = -pango_layout_iter_get_baseline (iter) / (double)PANGO_SCALE; offsetY = 0; } else { offsetX = 0; offsetY = pango_layout_iter_get_baseline (iter) / (double)PANGO_SCALE; } pango_layout_iter_free (iter); ctx->render->render_pango_layout (ctx, layout, *x - offsetX, *y - offsetY); if (PANGO_GRAVITY_IS_VERTICAL (state->text_gravity)) *y += w / (double)PANGO_SCALE; else *x += w / (double)PANGO_SCALE; g_object_unref (layout); g_object_unref (context); }