diff options
author | Matthias Clasen <mclasen@redhat.com> | 2020-09-18 19:10:32 +0000 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2020-09-18 19:10:32 +0000 |
commit | d3d211a0e8ce537da876ddce7c442b2d4a6197a6 (patch) | |
tree | 1797062567908a85ed035afda69481cbb787142d /pango | |
parent | 296711130ef90d9555bd6ada5b258bb75d622c12 (diff) | |
parent | 87b99bbbbaed141e05268f87eb2928eee780c3d7 (diff) | |
download | pango-d3d211a0e8ce537da876ddce7c442b2d4a6197a6.tar.gz |
Merge branch 'preferred-languages' into 'master'
Preferred languages
See merge request GNOME/pango!232
Diffstat (limited to 'pango')
-rw-r--r-- | pango/pango-language.c | 36 | ||||
-rw-r--r-- | pango/pango-language.h | 3 | ||||
-rw-r--r-- | pango/pango-version-macros.h | 24 | ||||
-rw-r--r-- | pango/pangofc-font.c | 32 | ||||
-rw-r--r-- | pango/pangofc-font.h | 4 | ||||
-rw-r--r-- | pango/pangofc-fontmap.c | 56 | ||||
-rw-r--r-- | pango/pangofc-private.h | 3 |
7 files changed, 153 insertions, 5 deletions
diff --git a/pango/pango-language.c b/pango/pango-language.c index 410ca0bf..04c3e0ca 100644 --- a/pango/pango-language.c +++ b/pango/pango-language.c @@ -791,13 +791,14 @@ parse_default_languages (void) return (PangoLanguage **) g_array_free (langs, FALSE); } +G_LOCK_DEFINE_STATIC (languages); +static gboolean initialized = FALSE; /* MT-safe */ +static PangoLanguage * const * languages = NULL; /* MT-safe */ +static GHashTable *hash = NULL; /* MT-safe */ + static PangoLanguage * _pango_script_get_default_language (PangoScript script) { - G_LOCK_DEFINE_STATIC (languages); - static gboolean initialized = FALSE; /* MT-safe */ - static PangoLanguage * const * languages = NULL; /* MT-safe */ - static GHashTable *hash = NULL; /* MT-safe */ PangoLanguage *result, * const * p; G_LOCK (languages); @@ -835,6 +836,33 @@ out: } /** + * pango_language_get_preferred: + * + * Returns the list of languages that the user prefers, as specified + * by the PANGO_LANGUAGE or LANGUAGE environment variables, in order + * of preference. Note that this list does not necessarily include + * the language returned by pango_language_get_default(). + * + * When choosing language-specific resources, such as the sample + * text returned by pango_language_get_sample_string(), you should + * first try the default language, followed by the languages returned + * by this function. + * + * Returns: (transfer none) (nullable): a %NULL-terminated array of + * PangoLanguage* + * + * Since: 1.48 + */ +PangoLanguage ** +pango_language_get_preferred (void) +{ + /* We call this just for its side-effect of initializing languages */ + _pango_script_get_default_language (PANGO_SCRIPT_COMMON); + + return languages; +} + +/** * pango_script_get_sample_language: * @script: a #PangoScript * diff --git a/pango/pango-language.h b/pango/pango-language.h index 2ab07bc0..16e6512c 100644 --- a/pango/pango-language.h +++ b/pango/pango-language.h @@ -53,6 +53,9 @@ const char *pango_language_get_sample_string (PangoLanguage *language) G_GNUC PANGO_AVAILABLE_IN_1_16 PangoLanguage *pango_language_get_default (void) G_GNUC_CONST; +PANGO_AVAILABLE_IN_1_48 +PangoLanguage **pango_language_get_preferred (void) G_GNUC_CONST; + PANGO_AVAILABLE_IN_ALL gboolean pango_language_matches (PangoLanguage *language, const char *range_list) G_GNUC_PURE; diff --git a/pango/pango-version-macros.h b/pango/pango-version-macros.h index 52b37049..4008579c 100644 --- a/pango/pango-version-macros.h +++ b/pango/pango-version-macros.h @@ -262,6 +262,16 @@ */ #define PANGO_VERSION_1_46 (G_ENCODE_VERSION (1, 46)) +/** + * PANGO_VERSION_1_48: + * + * A macro that evaluates to the 1.48 version of Pango, in a format + * that can be used by the C pre-processor. + * + * Since: 1.48 + */ +#define PANGO_VERSION_1_48 (G_ENCODE_VERSION (1, 48)) + /* evaluates to the current stable version; for development cycles, * this means the next stable target */ @@ -681,4 +691,18 @@ # define PANGO_AVAILABLE_IN_1_46 _PANGO_EXTERN #endif +#if PANGO_VERSION_MIN_REQUIRED >= PANGO_VERSION_1_48 +# define PANGO_DEPRECATED_IN_1_48 PANGO_DEPRECATED +# define PANGO_DEPRECATED_IN_1_48_FOR(f) PANGO_DEPRECATED_FOR(f) +#else +# define PANGO_DEPRECATED_IN_1_48 _PANGO_EXTERN +# define PANGO_DEPRECATED_IN_1_48_FOR(f) _PANGO_EXTERN +#endif + +#if PANGO_VERSION_MAX_ALLOWED < PANGO_VERSION_1_48 +# define PANGO_AVAILABLE_IN_1_48 PANGO_UNAVAILABLE(1, 48) +#else +# define PANGO_AVAILABLE_IN_1_48 _PANGO_EXTERN +#endif + #endif /* __PANGO_VERSION_H__ */ diff --git a/pango/pangofc-font.c b/pango/pangofc-font.c index 7456cd9e..6c5492ad 100644 --- a/pango/pangofc-font.c +++ b/pango/pangofc-font.c @@ -1035,3 +1035,35 @@ pango_fc_font_create_hb_font (PangoFont *font) done: return hb_font; } + +/** + * pango_fc_font_get_languages: + * @font: a #PangoFcFont + * + * Returns the languages that are supported by @font. + * + * 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.48 + */ +PangoLanguage ** +pango_fc_font_get_languages (PangoFcFont *font) +{ + PangoFcFontMap *fontmap; + PangoLanguage **languages; + + fontmap = g_weak_ref_get ((GWeakRef *) &font->fontmap); + if (!fontmap) + return NULL; + + languages = _pango_fc_font_map_get_languages (fontmap, font); + g_object_unref (fontmap); + + return languages; +} diff --git a/pango/pangofc-font.h b/pango/pangofc-font.h index 25a0277c..aa4fd3b0 100644 --- a/pango/pangofc-font.h +++ b/pango/pangofc-font.h @@ -94,6 +94,10 @@ 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 +PangoLanguage ** + pango_fc_font_get_languages (PangoFcFont *font); + PANGO_DEPRECATED_FOR(PANGO_GET_UNKNOWN_GLYPH) PangoGlyph pango_fc_font_get_unknown_glyph (PangoFcFont *font, gunichar wc); diff --git a/pango/pangofc-fontmap.c b/pango/pangofc-fontmap.c index eed0960a..bd15bf2a 100644 --- a/pango/pangofc-fontmap.c +++ b/pango/pangofc-fontmap.c @@ -166,8 +166,9 @@ struct _PangoFcFontFaceData int id; /* needed to handle TTC files with multiple faces */ /* Data */ - FcPattern *pattern; /* Referenced pattern that owns filename */ + FcPattern *pattern; /* Referenced pattern that owns filename */ PangoCoverage *coverage; + PangoLanguage **languages; hb_face_t *hb_face; }; @@ -307,6 +308,8 @@ pango_fc_font_face_data_free (PangoFcFontFaceData *data) if (data->coverage) pango_coverage_unref (data->coverage); + g_free (data->languages); + hb_face_destroy (data->hb_face); g_slice_free (PangoFcFontFaceData, data); @@ -2245,6 +2248,57 @@ _pango_fc_font_map_fc_to_coverage (FcCharSet *charset) return (PangoCoverage *)coverage; } +static PangoLanguage ** +_pango_fc_font_map_fc_to_languages (FcLangSet *langset) +{ + FcStrSet *strset; + FcStrList *list; + FcChar8 *s; + GArray *langs; + + langs = g_array_new (TRUE, FALSE, sizeof (PangoLanguage *)); + + strset = FcLangSetGetLangs (langset); + list = FcStrListCreate (strset); + + FcStrListFirst (list); + while ((s = FcStrListNext (list))) + { + PangoLanguage *l = pango_language_from_string ((const char *)s); + g_array_append_val (langs, l); + } + + FcStrListDone (list); + FcStrSetDestroy (strset); + + return (PangoLanguage **) g_array_free (langs, FALSE); +} + +PangoLanguage ** +_pango_fc_font_map_get_languages (PangoFcFontMap *fcfontmap, + PangoFcFont *fcfont) +{ + PangoFcFontFaceData *data; + FcLangSet *langset; + + data = pango_fc_font_map_get_font_face_data (fcfontmap, fcfont->font_pattern); + if (G_UNLIKELY (!data)) + return NULL; + + if (G_UNLIKELY (data->languages == NULL)) + { + /* + * Pull the languages out of the pattern, this + * doesn't require loading the font + */ + if (FcPatternGetLangSet (fcfont->font_pattern, FC_LANG, 0, &langset) != FcResultMatch) + return NULL; + + data->languages = _pango_fc_font_map_fc_to_languages (langset); + } + + return data->languages; +} /** * pango_fc_font_map_create_context: * @fcfontmap: a #PangoFcFontMap diff --git a/pango/pangofc-private.h b/pango/pangofc-private.h index 27b96df4..7e216ed9 100644 --- a/pango/pangofc-private.h +++ b/pango/pangofc-private.h @@ -78,6 +78,9 @@ _PANGO_EXTERN PangoFontMetrics *pango_fc_font_create_base_metrics_for_context (PangoFcFont *font, PangoContext *context); +PangoLanguage **_pango_fc_font_map_get_languages (PangoFcFontMap *fcfontmap, + PangoFcFont *fcfont); + G_END_DECLS #endif /* __PANGOFC_PRIVATE_H__ */ |