summaryrefslogtreecommitdiff
path: root/pango
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2020-09-18 19:10:32 +0000
committerMatthias Clasen <mclasen@redhat.com>2020-09-18 19:10:32 +0000
commitd3d211a0e8ce537da876ddce7c442b2d4a6197a6 (patch)
tree1797062567908a85ed035afda69481cbb787142d /pango
parent296711130ef90d9555bd6ada5b258bb75d622c12 (diff)
parent87b99bbbbaed141e05268f87eb2928eee780c3d7 (diff)
downloadpango-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.c36
-rw-r--r--pango/pango-language.h3
-rw-r--r--pango/pango-version-macros.h24
-rw-r--r--pango/pangofc-font.c32
-rw-r--r--pango/pangofc-font.h4
-rw-r--r--pango/pangofc-fontmap.c56
-rw-r--r--pango/pangofc-private.h3
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__ */