void _pango_cairo_font_private_initialize (PangoCairoFontPrivate *cf_priv, PangoCairoFont *cfont, PangoGravity gravity, const cairo_font_options_t *font_options, const PangoMatrix *pango_ctm, const cairo_matrix_t *font_matrix) { cairo_matrix_t gravity_matrix; cf_priv->cfont = cfont; cf_priv->gravity = gravity; cf_priv->data = _pango_cairo_font_private_scaled_font_data_create (); /* first apply gravity rotation, then font_matrix, such that * vertical italic text comes out "correct". we don't do anything * like baseline adjustment etc though. should be specially * handled when we support italic correction. */ cairo_matrix_init_rotate(&gravity_matrix, pango_gravity_to_rotation (cf_priv->gravity)); cairo_matrix_multiply (&cf_priv->data->font_matrix, font_matrix, &gravity_matrix); if (pango_ctm) cairo_matrix_init (&cf_priv->data->ctm, pango_ctm->xx, pango_ctm->yx, pango_ctm->xy, pango_ctm->yy, 0., 0.); else cairo_matrix_init_identity (&cf_priv->data->ctm); cf_priv->data->options = cairo_font_options_copy (font_options); cf_priv->is_hinted = cairo_font_options_get_hint_metrics (font_options) != CAIRO_HINT_METRICS_OFF; cf_priv->scaled_font = NULL; cf_priv->hbi = NULL; cf_priv->glyph_extents_cache = NULL; cf_priv->metrics_by_lang = NULL; }
static void rsvg_cairo_clip_render_pango_layout (RsvgDrawingCtx * ctx, PangoLayout * layout, double x, double y) { RsvgCairoClipRender *render = RSVG_CAIRO_CLIP_RENDER (ctx->render); RsvgCairoRender *cairo_render = &render->super; cairo_matrix_t affine; PangoGravity gravity = pango_context_get_gravity (pango_layout_get_context (layout)); double rotation; affine = ctx->state->affine; rsvg_cairo_clip_apply_affine (render, &affine); rotation = pango_gravity_to_rotation (gravity); cairo_save (cairo_render->cr); cairo_move_to (cairo_render->cr, x, y); if (rotation != 0.) cairo_rotate (cairo_render->cr, -rotation); pango_cairo_update_layout (cairo_render->cr, layout); pango_cairo_layout_path (cairo_render->cr, layout); cairo_restore (cairo_render->cr); }