[pango/hb-getters: 26/26] Rely on harfbuzz for font funcs
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [pango/hb-getters: 26/26] Rely on harfbuzz for font funcs
- Date: Fri, 24 May 2019 15:17:51 +0000 (UTC)
commit 2e4fc6046bd2e5cdb9061e01599afff2c79a86f3
Author: Matthias Clasen <mclasen redhat com>
Date: Fri May 24 15:10:59 2019 +0000
Rely on harfbuzz for font funcs
This is unnecessary code, and lets use drop
many uses of FT_Face.
pango/pangofc-font.c | 231 ++-------------------------------------------------
1 file changed, 6 insertions(+), 225 deletions(-)
---
diff --git a/pango/pangofc-font.c b/pango/pangofc-font.c
index 5c12250b..bdfdff41 100644
--- a/pango/pangofc-font.c
+++ b/pango/pangofc-font.c
@@ -1068,215 +1068,6 @@ pango_fc_font_get_raw_extents (PangoFcFont *fcfont,
PANGO_FC_FONT_UNLOCK_FACE (fcfont);
}
-typedef struct _PangoFcHbContext {
- FT_Face ft_face;
- PangoFcFont *fc_font;
- gboolean vertical;
- double x_scale, y_scale; /* CTM scales. */
-} PangoFcHbContext;
-
-static hb_bool_t
-pango_fc_hb_font_get_nominal_glyph (hb_font_t *font, void *font_data,
- hb_codepoint_t unicode,
- hb_codepoint_t *glyph,
- void *user_data G_GNUC_UNUSED)
-{
- PangoFcHbContext *context = (PangoFcHbContext *) font_data;
- PangoFcFont *fc_font = context->fc_font;
-
- *glyph = pango_fc_font_get_glyph (fc_font, unicode);
- if (G_LIKELY (*glyph))
- return TRUE;
-
- *glyph = PANGO_GET_UNKNOWN_GLYPH (unicode);
-
- /* We draw our own invalid-Unicode shape, so prevent HarfBuzz
- * from using REPLACEMENT CHARACTER. */
- if (unicode > 0x10FFFF)
- return TRUE;
-
- return FALSE;
-}
-
-static hb_bool_t
-pango_fc_hb_font_get_variation_glyph (hb_font_t *font,
- void *font_data,
- hb_codepoint_t unicode,
- hb_codepoint_t variation_selector,
- hb_codepoint_t *glyph,
- void *user_data G_GNUC_UNUSED)
-{
- PangoFcHbContext *context = (PangoFcHbContext *) font_data;
- FT_Face ft_face = context->ft_face;
- unsigned int g;
-
- g = FT_Face_GetCharVariantIndex (ft_face, unicode, variation_selector);
-
- if (G_UNLIKELY (!g))
- return FALSE;
-
- *glyph = g;
- return TRUE;
-}
-
-static hb_bool_t
-pango_fc_hb_font_get_glyph_contour_point (hb_font_t *font, void *font_data,
- hb_codepoint_t glyph, unsigned int point_index,
- hb_position_t *x, hb_position_t *y,
- void *user_data G_GNUC_UNUSED)
-{
- return FALSE;
-#if 0
- FT_Face ft_face = (FT_Face) font_data;
- int load_flags = FT_LOAD_DEFAULT;
-
- /* TODO: load_flags, embolden, etc */
-
- if (HB_UNLIKELY (FT_Load_Glyph (ft_face, glyph, load_flags)))
- return FALSE;
-
- if (HB_UNLIKELY (ft_face->glyph->format != FT_GLYPH_FORMAT_OUTLINE))
- return FALSE;
-
- if (HB_UNLIKELY (point_index >= (unsigned int) ft_face->glyph->outline.n_points))
- return FALSE;
-
- *x = ft_face->glyph->outline.points[point_index].x;
- *y = ft_face->glyph->outline.points[point_index].y;
-
- return TRUE;
-#endif
-}
-
-static hb_position_t
-pango_fc_hb_font_get_glyph_advance (hb_font_t *font, void *font_data,
- hb_codepoint_t glyph,
- void *user_data G_GNUC_UNUSED)
-{
- PangoFcHbContext *context = (PangoFcHbContext *) font_data;
- PangoFcFont *fc_font = context->fc_font;
- PangoRectangle logical;
-
- pango_font_get_glyph_extents ((PangoFont *) fc_font, glyph, NULL, &logical);
-
- return logical.width;
-}
-
-static hb_bool_t
-pango_fc_hb_font_get_glyph_extents (hb_font_t *font, void *font_data,
- hb_codepoint_t glyph,
- hb_glyph_extents_t *extents,
- void *user_data G_GNUC_UNUSED)
-{
- PangoFcHbContext *context = (PangoFcHbContext *) font_data;
- PangoFcFont *fc_font = context->fc_font;
- PangoRectangle ink;
-
- pango_font_get_glyph_extents ((PangoFont *) fc_font, glyph, &ink, NULL);
-
- if (G_LIKELY (!context->vertical)) {
- extents->x_bearing = ink.x;
- extents->y_bearing = ink.y;
- extents->width = ink.width;
- extents->height = ink.height;
- } else {
- /* XXX */
- extents->x_bearing = ink.x;
- extents->y_bearing = ink.y;
- extents->width = ink.height;
- extents->height = ink.width;
- }
-
- return TRUE;
-}
-
-static hb_bool_t
-pango_fc_hb_font_get_glyph_h_origin (hb_font_t *font, void *font_data,
- hb_codepoint_t glyph,
- hb_position_t *x, hb_position_t *y,
- void *user_data G_GNUC_UNUSED)
-{
- PangoFcHbContext *context = (PangoFcHbContext *) font_data;
- FT_Face ft_face = context->ft_face;
- int load_flags = FT_LOAD_DEFAULT;
-
- if (!context->vertical) return TRUE;
-
- if (FT_Load_Glyph (ft_face, glyph, load_flags))
- return FALSE;
-
- /* Note: FreeType's vertical metrics grows downward while other FreeType coordinates
- * have a Y growing upward. Hence the extra negations. */
- *x = -PANGO_UNITS_26_6 (ft_face->glyph->metrics.horiBearingX - ft_face->glyph->metrics.vertBearingX);
- *y = +PANGO_UNITS_26_6 (ft_face->glyph->metrics.horiBearingY - (-ft_face->glyph->metrics.vertBearingY));
-
- return TRUE;
-}
-
-static hb_bool_t
-pango_fc_hb_font_get_glyph_v_origin (hb_font_t *font, void *font_data,
- hb_codepoint_t glyph,
- hb_position_t *x, hb_position_t *y,
- void *user_data G_GNUC_UNUSED)
-{
- PangoFcHbContext *context = (PangoFcHbContext *) font_data;
- FT_Face ft_face = context->ft_face;
- int load_flags = FT_LOAD_DEFAULT;
-
- /* pangocairo-fc configures font in vertical origin for vertical writing. */
- if (context->vertical) return TRUE;
-
- if (FT_Load_Glyph (ft_face, glyph, load_flags))
- return FALSE;
-
- /* Note: FreeType's vertical metrics grows downward while other FreeType coordinates
- * have a Y growing upward. Hence the extra negation. */
- *x = PANGO_UNITS_26_6 (ft_face->glyph->metrics.horiBearingX - ft_face->glyph->metrics.vertBearingX);
- *y = PANGO_UNITS_26_6 (ft_face->glyph->metrics.horiBearingY - (-ft_face->glyph->metrics.vertBearingY));
-
- /* XXX */
-
- return TRUE;
-}
-
-static hb_position_t
-pango_fc_hb_font_get_h_kerning (hb_font_t *font, void *font_data,
- hb_codepoint_t left_glyph, hb_codepoint_t right_glyph,
- void *user_data G_GNUC_UNUSED)
-{
- PangoFcHbContext *context = (PangoFcHbContext *) font_data;
- FT_Face ft_face = context->ft_face;
- FT_Vector kerning;
-
- if (FT_Get_Kerning (ft_face, left_glyph, right_glyph, FT_KERNING_DEFAULT, &kerning))
- return 0;
-
- return PANGO_UNITS_26_6 (kerning.x * context->x_scale);
-}
-
-static hb_font_funcs_t *
-pango_fc_get_hb_font_funcs (void)
-{
- static hb_font_funcs_t *funcs;
-
- if (G_UNLIKELY (!funcs)) {
- funcs = hb_font_funcs_create ();
- hb_font_funcs_set_nominal_glyph_func (funcs, pango_fc_hb_font_get_nominal_glyph, NULL, NULL);
- hb_font_funcs_set_variation_glyph_func (funcs, pango_fc_hb_font_get_variation_glyph, NULL, NULL);
- hb_font_funcs_set_glyph_h_advance_func (funcs, pango_fc_hb_font_get_glyph_advance, NULL, NULL);
- hb_font_funcs_set_glyph_v_advance_func (funcs, pango_fc_hb_font_get_glyph_advance, NULL, NULL);
- hb_font_funcs_set_glyph_h_origin_func (funcs, pango_fc_hb_font_get_glyph_h_origin, NULL, NULL);
- hb_font_funcs_set_glyph_v_origin_func (funcs, pango_fc_hb_font_get_glyph_v_origin, NULL, NULL);
- hb_font_funcs_set_glyph_h_kerning_func (funcs, pango_fc_hb_font_get_h_kerning, NULL, NULL);
- /* Don't need v_kerning. */
- hb_font_funcs_set_glyph_extents_func (funcs, pango_fc_hb_font_get_glyph_extents, NULL, NULL);
- hb_font_funcs_set_glyph_contour_point_func (funcs, pango_fc_hb_font_get_glyph_contour_point, NULL, NULL);
- /* Don't need glyph_name / glyph_from_name */
- }
-
- return funcs;
-}
-
extern gpointer get_gravity_class (void);
static PangoGravity
@@ -1334,10 +1125,10 @@ pango_fc_font_create_hb_font (PangoFont *font)
{
PangoFcFont *fc_font = PANGO_FC_FONT (font);
PangoFcFontKey *key;
- PangoFcHbContext *context;
FT_Face ft_face;
hb_face_t *hb_face;
hb_font_t *hb_font;
+ double x_scale, y_scale;
double x_scale_inv, y_scale_inv;
PangoGravity gravity;
@@ -1354,28 +1145,18 @@ pango_fc_font_create_hb_font (PangoFont *font)
y_scale_inv = -y_scale_inv;
}
+ x_scale = 1. / x_scale_inv;
+ y_scale = 1. / y_scale_inv;
gravity = pango_fc_font_key_get_gravity (key);
- context = g_new0 (PangoFcHbContext, 1);
-
hb_face = pango_fc_font_map_get_hb_face (PANGO_FC_FONT_MAP (fc_font->fontmap), fc_font);
ft_face = pango_fc_font_map_get_ft_face (PANGO_FC_FONT_MAP (fc_font->fontmap), fc_font);
- context->x_scale = 1. / x_scale_inv;
- context->y_scale = 1. / y_scale_inv;
- context->ft_face = ft_face;
- context->fc_font = fc_font;
- context->vertical = PANGO_GRAVITY_IS_VERTICAL (gravity);
- g_object_set_data_full (G_OBJECT (fc_font), "hb-context", context, g_free);
-
hb_font = hb_font_create (hb_face);
- hb_font_set_funcs (hb_font,
- pango_fc_get_hb_font_funcs (),
- context,
- NULL);
+ hb_ot_font_set_funcs (hb_font);
hb_font_set_scale (hb_font,
- +(((gint64) ft_face->size->metrics.x_scale * ft_face->units_per_EM) >> 12) *
context->x_scale,
- -(((gint64) ft_face->size->metrics.y_scale * ft_face->units_per_EM) >> 12) *
context->y_scale);
+ +(((gint64) ft_face->size->metrics.x_scale * ft_face->units_per_EM) >> 12) * x_scale,
+ -(((gint64) ft_face->size->metrics.y_scale * ft_face->units_per_EM) >> 12) * y_scale);
hb_font_set_ppem (hb_font,
fc_font->is_hinted ? ft_face->size->metrics.x_ppem : 0,
fc_font->is_hinted ? ft_face->size->metrics.y_ppem : 0);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]