diff options
author | Matthias Clasen <mclasen@redhat.com> | 2021-08-02 01:29:03 +0000 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2021-08-02 01:29:03 +0000 |
commit | 626c131eaf3c040cf01da573e4c265144aeaa78d (patch) | |
tree | 199b590a2e956892477bf65450b2c2667b348ff0 /pango | |
parent | 524f0d78b37b7ad9c074d35e1e1ebbab68d35ecc (diff) | |
parent | a2e14a48b21f22db08237c20d2f9d1521417c6e3 (diff) | |
download | pango-626c131eaf3c040cf01da573e4c265144aeaa78d.tar.gz |
Merge branch 'private-vfuncs' into 'main'
Start using private vfuncs
See merge request GNOME/pango!383
Diffstat (limited to 'pango')
-rw-r--r-- | pango/fonts.c | 75 | ||||
-rw-r--r-- | pango/pango-font-private.h | 16 | ||||
-rw-r--r-- | pango/pango-font.h | 3 | ||||
-rw-r--r-- | pango/pango-glyph.h | 2 | ||||
-rw-r--r-- | pango/pango-version-macros.h | 24 | ||||
-rw-r--r-- | pango/pangofc-font.c | 43 | ||||
-rw-r--r-- | pango/pangofc-font.h | 3 | ||||
-rw-r--r-- | pango/shape.c | 80 |
8 files changed, 187 insertions, 59 deletions
diff --git a/pango/fonts.c b/pango/fonts.c index 79cf1251..cd30811c 100644 --- a/pango/fonts.c +++ b/pango/fonts.c @@ -1688,7 +1688,13 @@ typedef struct { hb_font_t *hb_font; } PangoFontPrivate; -G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (PangoFont, pango_font, G_TYPE_OBJECT) +#define PANGO_FONT_GET_CLASS_PRIVATE(font) ((PangoFontClassPrivate *) \ + g_type_class_get_private ((GTypeClass *) PANGO_FONT_GET_CLASS (font), \ + PANGO_TYPE_FONT)) + +G_DEFINE_ABSTRACT_TYPE_WITH_CODE (PangoFont, pango_font, G_TYPE_OBJECT, + G_ADD_PRIVATE (PangoFont) + g_type_add_class_private (g_define_type_id, sizeof (PangoFontClassPrivate))) static void pango_font_finalize (GObject *object) @@ -1701,12 +1707,39 @@ pango_font_finalize (GObject *object) G_OBJECT_CLASS (pango_font_parent_class)->finalize (object); } +static PangoLanguage ** +pango_font_default_get_languages (PangoFont *font) +{ + return NULL; +} + +static gboolean +pango_font_default_is_hinted (PangoFont *font) +{ + return FALSE; +} + +static void +pango_font_default_get_scale_factors (PangoFont *font, + double *x_scale, + double *y_scale) +{ + *x_scale = *y_scale = 1.0; +} + static void pango_font_class_init (PangoFontClass *class G_GNUC_UNUSED) { GObjectClass *object_class = G_OBJECT_CLASS (class); + PangoFontClassPrivate *pclass; object_class->finalize = pango_font_finalize; + + pclass = g_type_class_get_private ((GTypeClass *) class, PANGO_TYPE_FONT); + + pclass->get_languages = pango_font_default_get_languages; + pclass->is_hinted = pango_font_default_is_hinted; + pclass->get_scale_factors = pango_font_default_get_scale_factors; } static void @@ -2625,3 +2658,43 @@ pango_font_get_features (PangoFont *font, if (PANGO_FONT_GET_CLASS (font)->get_features) PANGO_FONT_GET_CLASS (font)->get_features (font, features, len, num_features); } + +/** + * pango_font_get_languages: + * @font: a `PangoFont` + * + * Returns the languages that are supported by @font. + * + * If the font backend does not provide this information, + * %NULL is returned. For the fontconfig backend, this + * corresponds to the FC_LANG member of the FcPattern. + * + * The returned array is only valid as long as the font + * and its fontmap are valid. + * + * Returns: (transfer none) (nullable): a %NULL-terminated + * array of `PangoLanguage`* + * + * Since: 1.50 + */ +PangoLanguage ** +pango_font_get_languages (PangoFont *font) +{ + PangoFontClassPrivate *pclass = PANGO_FONT_GET_CLASS_PRIVATE (font); + + return pclass->get_languages (font); +} + +gboolean +pango_font_is_hinted (PangoFont *font) +{ + return PANGO_FONT_GET_CLASS_PRIVATE (font)->is_hinted (font); +} + +void +pango_font_get_scale_factors (PangoFont *font, + double *x_scale, + double *y_scale) +{ + PANGO_FONT_GET_CLASS_PRIVATE (font)->get_scale_factors (font, x_scale, y_scale); +} diff --git a/pango/pango-font-private.h b/pango/pango-font-private.h index befa1b94..d9845fab 100644 --- a/pango/pango-font-private.h +++ b/pango/pango-font-private.h @@ -33,6 +33,22 @@ G_BEGIN_DECLS PANGO_AVAILABLE_IN_ALL PangoFontMetrics *pango_font_metrics_new (void); +typedef struct { + PangoLanguage ** (* get_languages) (PangoFont *font); + + gboolean (* is_hinted) (PangoFont *font); + + void (* get_scale_factors) (PangoFont *font, + double *x_scale, + double *y_scale); + +} PangoFontClassPrivate; + +gboolean pango_font_is_hinted (PangoFont *font); +void pango_font_get_scale_factors (PangoFont *font, + double *x_scale, + double *y_scale); + G_END_DECLS #endif /* __PANGO_FONT_PRIVATE_H__ */ diff --git a/pango/pango-font.h b/pango/pango-font.h index 13f8a222..498338b2 100644 --- a/pango/pango-font.h +++ b/pango/pango-font.h @@ -601,6 +601,9 @@ void pango_font_get_features (PangoFont *font, PANGO_AVAILABLE_IN_1_44 hb_font_t * pango_font_get_hb_font (PangoFont *font); +PANGO_AVAILABLE_IN_1_50 +PangoLanguage ** pango_font_get_languages (PangoFont *font); + /** * PANGO_GLYPH_EMPTY: * diff --git a/pango/pango-glyph.h b/pango/pango-glyph.h index abab5572..3674d6b7 100644 --- a/pango/pango-glyph.h +++ b/pango/pango-glyph.h @@ -79,7 +79,7 @@ struct _PangoGlyphGeometry * A `PangoGlyphVisAttr` structure communicates information between * the shaping and rendering phases. * - * Currently, it contains only cluster start information. yMore attributes + * Currently, it contains only cluster start information. More attributes * may be added in the future. */ struct _PangoGlyphVisAttr diff --git a/pango/pango-version-macros.h b/pango/pango-version-macros.h index 4008579c..84130ca3 100644 --- a/pango/pango-version-macros.h +++ b/pango/pango-version-macros.h @@ -272,6 +272,16 @@ */ #define PANGO_VERSION_1_48 (G_ENCODE_VERSION (1, 48)) +/** + * PANGO_VERSION_1_50: + * + * A macro that evaluates to the 1.50 version of Pango, in a format + * that can be used by the C pre-processor. + * + * Since: 1.50 + */ +#define PANGO_VERSION_1_50 (G_ENCODE_VERSION (1, 50)) + /* evaluates to the current stable version; for development cycles, * this means the next stable target */ @@ -705,4 +715,18 @@ # define PANGO_AVAILABLE_IN_1_48 _PANGO_EXTERN #endif +#if PANGO_VERSION_MIN_REQUIRED >= PANGO_VERSION_1_50 +# define PANGO_DEPRECATED_IN_1_50 PANGO_DEPRECATED +# define PANGO_DEPRECATED_IN_1_50_FOR(f) PANGO_DEPRECATED_FOR(f) +#else +# define PANGO_DEPRECATED_IN_1_50 _PANGO_EXTERN +# define PANGO_DEPRECATED_IN_1_50_FOR(f) _PANGO_EXTERN +#endif + +#if PANGO_VERSION_MAX_ALLOWED < PANGO_VERSION_1_50 +# define PANGO_AVAILABLE_IN_1_50 PANGO_UNAVAILABLE(1, 50) +#else +# define PANGO_AVAILABLE_IN_1_50 _PANGO_EXTERN +#endif + #endif /* __PANGO_VERSION_H__ */ diff --git a/pango/pangofc-font.c b/pango/pangofc-font.c index cd063854..8543b85e 100644 --- a/pango/pangofc-font.c +++ b/pango/pangofc-font.c @@ -21,6 +21,7 @@ #include "config.h" +#include "pango-font-private.h" #include "pangofc-font-private.h" #include "pangofc-fontmap.h" #include "pangofc-private.h" @@ -69,6 +70,11 @@ static void pango_fc_font_get_features (PangoFont *font, guint len, guint *num_features); static hb_font_t * pango_fc_font_create_hb_font (PangoFont *font); +static PangoLanguage ** _pango_fc_font_get_languages (PangoFont *font); +static gboolean _pango_fc_font_is_hinted (PangoFont *font); +static void _pango_fc_font_get_scale_factors (PangoFont *font, + double *x_scale, + double *y_scale); #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)) @@ -81,6 +87,7 @@ pango_fc_font_class_init (PangoFcFontClass *class) { GObjectClass *object_class = G_OBJECT_CLASS (class); PangoFontClass *font_class = PANGO_FONT_CLASS (class); + PangoFontClassPrivate *pclass; class->has_char = pango_fc_font_real_has_char; class->get_glyph = pango_fc_font_real_get_glyph; @@ -98,6 +105,12 @@ pango_fc_font_class_init (PangoFcFontClass *class) font_class->create_hb_font = pango_fc_font_create_hb_font; font_class->get_features = pango_fc_font_get_features; + pclass = g_type_class_get_private ((GTypeClass *) class, PANGO_TYPE_FONT); + + 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; + /** * PangoFcFont:pattern: * @@ -1046,18 +1059,26 @@ done: * array of `PangoLanguage`* * * Since: 1.48 + * Deprecated: 1.50: Use pango_font_get_language() */ PangoLanguage ** pango_fc_font_get_languages (PangoFcFont *font) { + return pango_font_get_languages (PANGO_FONT (font)); +} + +static PangoLanguage ** +_pango_fc_font_get_languages (PangoFont *font) +{ + PangoFcFont * fcfont = PANGO_FC_FONT (font); PangoFcFontMap *fontmap; PangoLanguage **languages; - fontmap = g_weak_ref_get ((GWeakRef *) &font->fontmap); + fontmap = g_weak_ref_get ((GWeakRef *) &fcfont->fontmap); if (!fontmap) return NULL; - languages = _pango_fc_font_map_get_languages (fontmap, font); + languages = _pango_fc_font_map_get_languages (fontmap, fcfont); g_object_unref (fontmap); return languages; @@ -1078,3 +1099,21 @@ pango_fc_font_get_pattern (PangoFcFont *font) { return font->font_pattern; } + +gboolean +_pango_fc_font_is_hinted (PangoFont *font) +{ + PangoFcFont *fcfont = PANGO_FC_FONT (font); + + return fcfont->is_hinted; +} + +void +_pango_fc_font_get_scale_factors (PangoFont *font, + double *x_scale, + double *y_scale) +{ + PangoFcFont *fcfont = PANGO_FC_FONT (font); + + pango_matrix_get_font_scale_factors (&fcfont->matrix, x_scale, y_scale); +} diff --git a/pango/pangofc-font.h b/pango/pangofc-font.h index b4aa399e..89b0cc79 100644 --- a/pango/pangofc-font.h +++ b/pango/pangofc-font.h @@ -95,7 +95,8 @@ gboolean pango_fc_font_has_char (PangoFcFont *font, PANGO_AVAILABLE_IN_1_4 guint pango_fc_font_get_glyph (PangoFcFont *font, gunichar wc); -PANGO_AVAILABLE_IN_1_48 + +PANGO_DEPRECATED_IN_1_50_FOR(pango_font_get_language) PangoLanguage ** pango_fc_font_get_languages (PangoFcFont *font); diff --git a/pango/shape.c b/pango/shape.c index b870ecad..f8ac3691 100644 --- a/pango/shape.c +++ b/pango/shape.c @@ -25,6 +25,7 @@ #include "pango-glyph.h" #include "pangohb-private.h" +#include "pango-font-private.h" #include <string.h> @@ -151,32 +152,6 @@ fallback_shape (const char *text, pango_glyph_string_reverse_range (glyphs, 0, glyphs->num_glyphs); } -/* FIXME: This is very ugly. We are out of room for vfuncs, so we can't - * easily add api to get is_hinted and the matrix from the PangoFcFont. - * - * Keep in sync with pangofc-font.h! - */ -struct _PangoFcFont -{ - PangoFont parent_instance; - - gpointer font_pattern; /* fully resolved pattern */ - PangoFontMap *fontmap; /* associated map */ - gpointer priv; /* used internally */ - PangoMatrix matrix; /* used internally */ - PangoFontDescription *description; - - GSList *metrics_by_lang; - - guint is_hinted : 1; - guint is_transformed : 1; -}; -typedef struct _PangoFcFont PangoFcFont; - -#define PANGO_IS_FC_FONT(obj) \ - g_type_is_a (((GTypeInstance*)obj)->g_class->g_type, \ - g_type_from_name ("PangoFcFont")) - /** * pango_shape_with_flags: * @item_text: valid UTF-8 text to shape @@ -320,31 +295,29 @@ pango_shape_with_flags (const gchar *item_text, if (flags & PANGO_SHAPE_ROUND_POSITIONS) { - if (PANGO_IS_FC_FONT (analysis->font)) + if (pango_font_is_hinted (analysis->font)) { - PangoFcFont *fc_font = (PangoFcFont *)analysis->font; - if (fc_font->is_hinted) + double x_scale_inv, y_scale_inv; + double x_scale, y_scale; + + pango_font_get_scale_factors (analysis->font, &x_scale_inv, &y_scale_inv); + + if (PANGO_GRAVITY_IS_IMPROPER (analysis->gravity)) { - double x_scale_inv, y_scale_inv; - double x_scale, y_scale; + x_scale_inv = -x_scale_inv; + y_scale_inv = -y_scale_inv; + } - x_scale_inv = y_scale_inv = 1.0; - pango_matrix_get_font_scale_factors (&fc_font->matrix, &x_scale_inv, &y_scale_inv); - if (PANGO_GRAVITY_IS_IMPROPER (analysis->gravity)) - { - x_scale_inv = -x_scale_inv; - y_scale_inv = -y_scale_inv; - } - x_scale = 1. / x_scale_inv; - y_scale = 1. / y_scale_inv; + x_scale = 1.0 / x_scale_inv; + y_scale = 1.0 / y_scale_inv; - if (x_scale == 1.0 && y_scale == 1.0) - { - for (i = 0; i < glyphs->num_glyphs; i++) - glyphs->glyphs[i].geometry.width = PANGO_UNITS_ROUND (glyphs->glyphs[i].geometry.width); - } - else - { + if (x_scale == 1.0 && y_scale == 1.0) + { + for (i = 0; i < glyphs->num_glyphs; i++) + glyphs->glyphs[i].geometry.width = PANGO_UNITS_ROUND (glyphs->glyphs[i].geometry.width); + } + else + { #if 0 if (PANGO_GRAVITY_IS_VERTICAL (analysis->gravity)) { @@ -357,16 +330,15 @@ pango_shape_with_flags (const gchar *item_text, #define HINT(value, scale_inv, scale) (PANGO_UNITS_ROUND ((int) ((value) * scale)) * scale_inv) #define HINT_X(value) HINT ((value), x_scale, x_scale_inv) #define HINT_Y(value) HINT ((value), y_scale, y_scale_inv) - for (i = 0; i < glyphs->num_glyphs; i++) - { - glyphs->glyphs[i].geometry.width = HINT_X (glyphs->glyphs[i].geometry.width); - glyphs->glyphs[i].geometry.x_offset = HINT_X (glyphs->glyphs[i].geometry.x_offset); - glyphs->glyphs[i].geometry.y_offset = HINT_Y (glyphs->glyphs[i].geometry.y_offset); - } + for (i = 0; i < glyphs->num_glyphs; i++) + { + glyphs->glyphs[i].geometry.width = HINT_X (glyphs->glyphs[i].geometry.width); + glyphs->glyphs[i].geometry.x_offset = HINT_X (glyphs->glyphs[i].geometry.x_offset); + glyphs->glyphs[i].geometry.y_offset = HINT_Y (glyphs->glyphs[i].geometry.y_offset); + } #undef HINT_Y #undef HINT_X #undef HINT - } } } } |