From c4fe95cc313bab3eac480425f822a0eeebf9b686 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 24 Nov 2021 12:19:42 -0500 Subject: Add a way to get the font matrix Add some private api for the serializer to get the font matrix. This is needed to let the serializer write a unique fingerprint for the font. --- pango/fonts.c | 17 +++++++++++++++++ pango/pango-font-private.h | 5 +++++ pango/pangofc-font.c | 22 ++++++++++++++++++++++ 3 files changed, 44 insertions(+) diff --git a/pango/fonts.c b/pango/fonts.c index 9d3c1bf3..d94feaf8 100644 --- a/pango/fonts.c +++ b/pango/fonts.c @@ -1751,6 +1751,13 @@ pango_font_default_get_face (PangoFont *font) return PANGO_FONT_MAP_GET_CLASS (map)->get_face (map,font); } +static void +pango_font_default_get_matrix (PangoFont *font, + PangoMatrix *matrix) +{ + *matrix = (PangoMatrix) PANGO_MATRIX_INIT; +} + static void pango_font_class_init (PangoFontClass *class G_GNUC_UNUSED) { @@ -1766,6 +1773,7 @@ pango_font_class_init (PangoFontClass *class G_GNUC_UNUSED) pclass->get_scale_factors = pango_font_default_get_scale_factors; pclass->has_char = pango_font_default_has_char; pclass->get_face = pango_font_default_get_face; + pclass->get_matrix = pango_font_default_get_matrix; } static void @@ -2717,6 +2725,15 @@ pango_font_get_languages (PangoFont *font) return pclass->get_languages (font); } +void +pango_font_get_matrix (PangoFont *font, + PangoMatrix *matrix) +{ + PangoFontClassPrivate *pclass = PANGO_FONT_GET_CLASS_PRIVATE (font); + + pclass->get_matrix (font, matrix); +} + gboolean pango_font_is_hinted (PangoFont *font) { diff --git a/pango/pango-font-private.h b/pango/pango-font-private.h index 93ce27aa..1e38371d 100644 --- a/pango/pango-font-private.h +++ b/pango/pango-font-private.h @@ -45,12 +45,17 @@ typedef struct { gboolean (* has_char) (PangoFont *font, gunichar wc); PangoFontFace * (* get_face) (PangoFont *font); + void (* get_matrix) (PangoFont *font, + PangoMatrix *matrix); } PangoFontClassPrivate; gboolean pango_font_is_hinted (PangoFont *font); void pango_font_get_scale_factors (PangoFont *font, double *x_scale, double *y_scale); +void pango_font_get_matrix (PangoFont *font, + PangoMatrix *matrix); + G_END_DECLS diff --git a/pango/pangofc-font.c b/pango/pangofc-font.c index 74503b91..5635e0be 100644 --- a/pango/pangofc-font.c +++ b/pango/pangofc-font.c @@ -75,6 +75,8 @@ static gboolean _pango_fc_font_is_hinted (PangoFont *fon static void _pango_fc_font_get_scale_factors (PangoFont *font, double *x_scale, double *y_scale); +static void pango_fc_font_get_matrix (PangoFont *font, + PangoMatrix *matrix); #define PANGO_FC_FONT_LOCK_FACE(font) (PANGO_FC_FONT_GET_CLASS (font)->lock_face (font)) #define PANGO_FC_FONT_UNLOCK_FACE(font) (PANGO_FC_FONT_GET_CLASS (font)->unlock_face (font)) @@ -109,6 +111,7 @@ pango_fc_font_class_init (PangoFcFontClass *class) pclass->get_languages = _pango_fc_font_get_languages; pclass->is_hinted = _pango_fc_font_is_hinted; pclass->get_scale_factors = _pango_fc_font_get_scale_factors; + pclass->get_matrix = pango_fc_font_get_matrix; /** * PangoFcFont:pattern: @@ -1110,3 +1113,22 @@ _pango_fc_font_get_scale_factors (PangoFont *font, pango_matrix_get_font_scale_factors (&fcfont->matrix, x_scale, y_scale); } + +static void +pango_fc_font_get_matrix (PangoFont *font, + PangoMatrix *matrix) +{ + PangoFcFont *fcfont = PANGO_FC_FONT (font); + FcMatrix fc_matrix, *fc_matrix_val; + + FcMatrixInit (&fc_matrix); + for (int i = 0; FcPatternGetMatrix (fcfont->font_pattern, FC_MATRIX, i, &fc_matrix_val) == FcResultMatch; i++) + FcMatrixMultiply (&fc_matrix, &fc_matrix, fc_matrix_val); + + matrix->xx = fc_matrix.xx; + matrix->xy = - fc_matrix.xy; + matrix->yx = - fc_matrix.yx; + matrix->yy = fc_matrix.yy; + matrix->x0 = 0.; + matrix->y0 = 0.; +} -- cgit v1.2.1