summaryrefslogtreecommitdiff
path: root/pango/pangocairo-font.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2019-08-10 17:46:21 -0400
committerMatthias Clasen <mclasen@redhat.com>2019-08-12 07:41:38 -0400
commitc5d86c368128bb9a0be913829da79649fb81f486 (patch)
treebc6061c5bc9a319223e281af1c78ec3bd7278711 /pango/pangocairo-font.c
parent1f74d46424f493e9c8ff699688e1ce89f466fd72 (diff)
downloadpango-c5d86c368128bb9a0be913829da79649fb81f486.tar.gz
Drop cairo metrics implementation
We can use the hb-based implementation in pangofc-font.c.
Diffstat (limited to 'pango/pangocairo-font.c')
-rw-r--r--pango/pangocairo-font.c194
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