void ge_cairo_transform_for_layout (cairo_t *cr, PangoLayout *layout, int x, int y) { const PangoMatrix *matrix; matrix = pango_context_get_matrix (pango_layout_get_context (layout)); if (matrix) { cairo_matrix_t cairo_matrix; PangoRectangle rect; cairo_matrix_init (&cairo_matrix, matrix->xx, matrix->yx, matrix->xy, matrix->yy, matrix->x0, matrix->y0); pango_layout_get_extents (layout, NULL, &rect); pango_matrix_transform_rectangle (matrix, &rect); pango_extents_to_pixels (&rect, NULL); cairo_matrix.x0 += x - rect.x; cairo_matrix.y0 += y - rect.y; cairo_set_matrix (cr, &cairo_matrix); } else cairo_translate (cr, x, y); }
/** * pango_renderer_draw_layout: * @renderer: a #PangoRenderer * @layout: a #PangoLayout * @x: X position of left edge of baseline, in user space coordinates * in Pango units. * @y: Y position of left edge of baseline, in user space coordinates * in Pango units. * * Draws @layout with the specified #PangoRenderer. * * Since: 1.8 **/ void pango_renderer_draw_layout (PangoRenderer *renderer, PangoLayout *layout, int x, int y) { PangoLayoutIter *iter; g_return_if_fail (PANGO_IS_RENDERER (renderer)); g_return_if_fail (PANGO_IS_LAYOUT (layout)); /* We only change the matrix if the renderer isn't already * active. */ if (!renderer->active_count) { PangoContext *context = pango_layout_get_context (layout); pango_renderer_set_matrix (renderer, pango_context_get_matrix (context)); } pango_renderer_activate (renderer); iter = pango_layout_get_iter (layout); do { PangoRectangle logical_rect; PangoLayoutLine *line; int baseline; line = pango_layout_iter_get_line_readonly (iter); pango_layout_iter_get_line_extents (iter, NULL, &logical_rect); baseline = pango_layout_iter_get_baseline (iter); pango_renderer_draw_layout_line (renderer, line, x + logical_rect.x, y + baseline); } while (pango_layout_iter_next_line (iter)); pango_layout_iter_free (iter); pango_renderer_deactivate (renderer); }
static void prepare_context_for_layout (cairo_t *cr, gdouble x, gdouble y, PangoLayout *layout) { const PangoMatrix *matrix; matrix = pango_context_get_matrix (pango_layout_get_context (layout)); cairo_move_to (cr, x, y); if (matrix) { cairo_matrix_t cairo_matrix; cairo_matrix_init (&cairo_matrix, matrix->xx, matrix->yx, matrix->xy, matrix->yy, matrix->x0, matrix->y0); cairo_transform (cr, &cairo_matrix); } }