diff options
Diffstat (limited to 'pango/pangocairo-font.c')
-rw-r--r-- | pango/pangocairo-font.c | 194 |
1 files changed, 0 insertions, 194 deletions
diff --git a/pango/pangocairo-font.c b/pango/pangocairo-font.c index a49d14d4..cfe9cb45 100644 --- a/pango/pangocairo-font.c +++ b/pango/pangocairo-font.c @@ -185,188 +185,6 @@ _pango_cairo_font_install (PangoFont *font, return TRUE; } - -static int -max_glyph_width (PangoLayout *layout) -{ - int max_width = 0; - GSList *l, *r; - - for (l = pango_layout_get_lines_readonly (layout); l; l = l->next) - { - PangoLayoutLine *line = l->data; - - for (r = line->runs; r; r = r->next) - { - PangoGlyphString *glyphs = ((PangoGlyphItem *)r->data)->glyphs; - int i; - - for (i = 0; i < glyphs->num_glyphs; i++) - if (glyphs->glyphs[i].geometry.width > max_width) - max_width = glyphs->glyphs[i].geometry.width; - } - } - - return max_width; -} - -typedef struct _PangoCairoFontMetricsInfo -{ - const char *sample_str; - PangoFontMetrics *metrics; -} PangoCairoFontMetricsInfo; - -PangoFontMetrics * -_pango_cairo_font_get_metrics (PangoFont *font, - PangoLanguage *language) -{ - PangoCairoFont *cfont = (PangoCairoFont *) font; - PangoCairoFontPrivate *cf_priv = PANGO_CAIRO_FONT_PRIVATE (font); - PangoCairoFontMetricsInfo *info = NULL; /* Quiet gcc */ - GSList *tmp_list; - static int in_get_metrics; - - const char *sample_str = pango_language_get_sample_string (language); - - tmp_list = cf_priv->metrics_by_lang; - while (tmp_list) - { - info = tmp_list->data; - - if (info->sample_str == sample_str) /* We _don't_ need strcmp */ - break; - - tmp_list = tmp_list->next; - } - - if (!tmp_list) - { - PangoFontMap *fontmap; - PangoContext *context; - cairo_font_options_t *font_options; - PangoLayout *layout; - PangoRectangle extents; - PangoFontDescription *desc; - cairo_scaled_font_t *scaled_font; - cairo_matrix_t cairo_matrix; - PangoMatrix pango_matrix; - PangoMatrix identity = PANGO_MATRIX_INIT; - glong sample_str_width; - - int height, shift; - - /* XXX this is racy. need a ref'ing getter... */ - fontmap = pango_font_get_font_map (font); - if (!fontmap) - return pango_font_metrics_new (); - fontmap = g_object_ref (fontmap); - - info = g_slice_new0 (PangoCairoFontMetricsInfo); - - cf_priv->metrics_by_lang = g_slist_prepend (cf_priv->metrics_by_lang, info); - - info->sample_str = sample_str; - - scaled_font = _pango_cairo_font_private_get_scaled_font (cf_priv); - - context = pango_font_map_create_context (fontmap); - pango_context_set_language (context, language); - - font_options = cairo_font_options_create (); - cairo_scaled_font_get_font_options (scaled_font, font_options); - pango_cairo_context_set_font_options (context, font_options); - cairo_font_options_destroy (font_options); - - info->metrics = (* PANGO_CAIRO_FONT_GET_IFACE (font)->create_base_metrics_for_context) (cfont, context); - - /* We now need to adjust the base metrics for ctm */ - cairo_scaled_font_get_ctm (scaled_font, &cairo_matrix); - pango_matrix.xx = cairo_matrix.xx; - pango_matrix.yx = cairo_matrix.yx; - pango_matrix.xy = cairo_matrix.xy; - pango_matrix.yy = cairo_matrix.yy; - pango_matrix.x0 = 0; - pango_matrix.y0 = 0; - if (G_UNLIKELY (0 != memcmp (&identity, &pango_matrix, 4 * sizeof (double)))) - { - double xscale = pango_matrix_get_font_scale_factor (&pango_matrix); - if (xscale) xscale = 1 / xscale; - - info->metrics->ascent *= xscale; - info->metrics->descent *= xscale; - info->metrics->height *= xscale; - info->metrics->underline_position *= xscale; - info->metrics->underline_thickness *= xscale; - info->metrics->strikethrough_position *= xscale; - info->metrics->strikethrough_thickness *= xscale; - } - - /* Set the matrix on the context so we don't have to adjust the derived - * metrics. */ - pango_context_set_matrix (context, &pango_matrix); - - /* Ugly. We need to prevent recursion when we call into - * PangoLayout to determine approximate char width. - */ - if (!in_get_metrics) - { - in_get_metrics = 1; - - /* Update approximate_*_width now */ - layout = pango_layout_new (context); - desc = pango_font_describe_with_absolute_size (font); - pango_layout_set_font_description (layout, desc); - pango_font_description_free (desc); - - pango_layout_set_text (layout, sample_str, -1); - pango_layout_get_extents (layout, NULL, &extents); - - sample_str_width = pango_utf8_strwidth (sample_str); - g_assert (sample_str_width > 0); - info->metrics->approximate_char_width = extents.width / sample_str_width; - - pango_layout_set_text (layout, "0123456789", -1); - info->metrics->approximate_digit_width = max_glyph_width (layout); - - g_object_unref (layout); - in_get_metrics = 0; - } - - /* We may actually reuse ascent/descent we got from cairo here. that's - * in cf_priv->font_extents. - */ - height = info->metrics->ascent + info->metrics->descent; - switch (cf_priv->gravity) - { - default: - case PANGO_GRAVITY_AUTO: - case PANGO_GRAVITY_SOUTH: - break; - case PANGO_GRAVITY_NORTH: - info->metrics->ascent = info->metrics->descent; - break; - case PANGO_GRAVITY_EAST: - case PANGO_GRAVITY_WEST: - { - int ascent = height / 2; - if (cf_priv->is_hinted) - ascent = PANGO_UNITS_ROUND (ascent); - info->metrics->ascent = ascent; - } - } - shift = (height - info->metrics->ascent) - info->metrics->descent; - info->metrics->descent += shift; - info->metrics->underline_position -= shift; - info->metrics->strikethrough_position -= shift; - info->metrics->ascent = height - info->metrics->descent; - - g_object_unref (context); - g_object_unref (fontmap); - } - - return pango_font_metrics_ref (info->metrics); -} - static PangoCairoFontHexBoxInfo * _pango_cairo_font_private_get_hex_box_info (PangoCairoFontPrivate *cf_priv) { @@ -634,14 +452,6 @@ _pango_cairo_font_private_initialize (PangoCairoFontPrivate *cf_priv, cf_priv->scaled_font = NULL; cf_priv->hbi = NULL; cf_priv->glyph_extents_cache = NULL; - cf_priv->metrics_by_lang = NULL; -} - -static void -free_metrics_info (PangoCairoFontMetricsInfo *info) -{ - pango_font_metrics_unref (info->metrics); - g_slice_free (PangoCairoFontMetricsInfo, info); } void @@ -659,10 +469,6 @@ _pango_cairo_font_private_finalize (PangoCairoFontPrivate *cf_priv) if (cf_priv->glyph_extents_cache) g_free (cf_priv->glyph_extents_cache); cf_priv->glyph_extents_cache = NULL; - - g_slist_foreach (cf_priv->metrics_by_lang, (GFunc)free_metrics_info, NULL); - g_slist_free (cf_priv->metrics_by_lang); - cf_priv->metrics_by_lang = NULL; } gboolean |