diff options
Diffstat (limited to 'pango/pangofc-fontmap.c')
-rw-r--r-- | pango/pangofc-fontmap.c | 53 |
1 files changed, 48 insertions, 5 deletions
diff --git a/pango/pangofc-fontmap.c b/pango/pangofc-fontmap.c index 4c39ea1f..3ed1b4d2 100644 --- a/pango/pangofc-fontmap.c +++ b/pango/pangofc-fontmap.c @@ -248,6 +248,10 @@ static PangoFontFace *pango_fc_font_map_get_face (PangoFontMap *fontmap, static void pango_fc_font_map_changed (PangoFontMap *fontmap); + +PangoLanguage **_pango_fc_font_map_get_languages (PangoFcFontMap *fcfontmap, + PangoFcFace *fcface); + static guint pango_fc_font_face_data_hash (PangoFcFontFaceData *key); static gboolean pango_fc_font_face_data_equal (PangoFcFontFaceData *key1, PangoFcFontFaceData *key2); @@ -1683,6 +1687,7 @@ ensure_families (PangoFcFontMap *fcfontmap) FcObjectSet *os = FcObjectSetBuild (FC_FAMILY, FC_SPACING, FC_STYLE, FC_WEIGHT, FC_WIDTH, FC_SLANT, FC_VARIABLE, FC_FONTFORMAT, + FC_FILE, FC_INDEX, FC_LANG, NULL); FcPattern *pat = FcPatternCreate (); GHashTable *temp_family_hash; @@ -2052,9 +2057,10 @@ pango_fc_font_map_get_face (PangoFontMap *fontmap, family = pango_font_map_get_family (fontmap, s); res = FcPatternGetString (fcfont->font_pattern, FC_STYLE, 0, (FcChar8 **)(void*)&s); - g_assert (res == FcResultMatch); + if (res == FcResultMatch) + return pango_font_family_get_face (family, s); - return pango_font_family_get_face (family, s); + return PANGO_FONT_FACE (PANGO_FC_FAMILY (family)->faces[0]); } static void @@ -2593,14 +2599,18 @@ _pango_fc_font_map_fc_to_languages (FcLangSet *langset) return (PangoLanguage **) g_ptr_array_free (langs, FALSE); } + PangoLanguage ** _pango_fc_font_map_get_languages (PangoFcFontMap *fcfontmap, - PangoFcFont *fcfont) + PangoFcFace *fcface) { PangoFcFontFaceData *data; FcLangSet *langset; - data = pango_fc_font_map_get_font_face_data (fcfontmap, fcfont->font_pattern); + if (!fcface->pattern) + return NULL; + + data = pango_fc_font_map_get_font_face_data (fcfontmap, fcface->pattern); if (G_UNLIKELY (!data)) return NULL; @@ -2610,7 +2620,7 @@ _pango_fc_font_map_get_languages (PangoFcFontMap *fcfontmap, * Pull the languages out of the pattern, this * doesn't require loading the font */ - if (FcPatternGetLangSet (fcfont->font_pattern, FC_LANG, 0, &langset) != FcResultMatch) + if (FcPatternGetLangSet (fcface->pattern, FC_LANG, 0, &langset) != FcResultMatch) return NULL; data->languages = _pango_fc_font_map_fc_to_languages (langset); @@ -3099,10 +3109,38 @@ pango_fc_face_init (PangoFcFace *self) { } +static gboolean +pango_fc_face_supports_language (PangoFontFace *face, + PangoLanguage *language) +{ + PangoFcFace *fcface = PANGO_FC_FACE (face); + FcLangSet *langs; + + if (!fcface->pattern) + return TRUE; + + if (FcPatternGetLangSet (fcface->pattern, FC_LANG, 0, &langs) != FcResultMatch) + return TRUE; + + return FcLangSetHasLang (langs, (FcChar8 *) pango_language_to_string (language)) != FcLangDifferentLang; +} + +static PangoLanguage ** +pango_fc_face_get_languages (PangoFontFace *face) +{ + PangoFcFace *fcface = PANGO_FC_FACE (face); + + if (!fcface->family->fontmap) + return NULL; + + return _pango_fc_font_map_get_languages (fcface->family->fontmap, fcface); +} + static void pango_fc_face_class_init (PangoFcFaceClass *class) { GObjectClass *object_class = G_OBJECT_CLASS (class); + PangoFontFaceClassPrivate *pclass; object_class->finalize = pango_fc_face_finalize; @@ -3111,6 +3149,11 @@ pango_fc_face_class_init (PangoFcFaceClass *class) class->list_sizes = pango_fc_face_list_sizes; class->is_synthesized = pango_fc_face_is_synthesized; class->get_family = pango_fc_face_get_family; + + pclass = g_type_class_get_private ((GTypeClass *) class, PANGO_TYPE_FONT_FACE); + + pclass->supports_language = pango_fc_face_supports_language; + pclass->get_languages = pango_fc_face_get_languages; } |