summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBehdad Esfahbod <behdad@behdad.org>2015-04-30 18:00:14 -0400
committerBehdad Esfahbod <behdad@behdad.org>2015-04-30 18:00:14 -0400
commit4ad91ff6754f99d8c4f3ca1e09e2cc3005edb857 (patch)
treec111ed2f4bab45e42a0a6a626ede11acd55d6f60
parentd4e0fb667815ad80bff60491a2125321ee88d1b7 (diff)
downloadpango-4ad91ff6754f99d8c4f3ca1e09e2cc3005edb857.tar.gz
Bug 547671 - Add pango_fc_font_map_[gs]et_fc_config()
-rw-r--r--docs/pango-sections.txt2
-rw-r--r--pango/pangofc-fontmap.c73
-rw-r--r--pango/pangofc-fontmap.h6
-rw-r--r--pango/pangoft2.c2
-rw-r--r--pango/pangoft2.def2
5 files changed, 79 insertions, 6 deletions
diff --git a/docs/pango-sections.txt b/docs/pango-sections.txt
index d8ac758a..96cdd3c0 100644
--- a/docs/pango-sections.txt
+++ b/docs/pango-sections.txt
@@ -916,6 +916,8 @@ pango_fc_font_map_add_decoder_find_func
pango_fc_font_map_find_decoder
pango_fc_font_map_cache_clear
pango_fc_font_map_shutdown
+pango_fc_font_map_set_fc_config
+pango_fc_font_map_get_fc_config
pango_fc_font_description_from_pattern
PANGO_FC_FONT_FEATURES
PANGO_FC_GRAVITY
diff --git a/pango/pangofc-fontmap.c b/pango/pangofc-fontmap.c
index 3fcc0c51..d4ff2dd6 100644
--- a/pango/pangofc-fontmap.c
+++ b/pango/pangofc-fontmap.c
@@ -150,6 +150,8 @@ struct _PangoFcFontMapPrivate
GSList *findfuncs;
guint closed : 1;
+
+ FcConfig *fc_config;
};
struct _PangoFcFontFaceData
@@ -780,7 +782,7 @@ pango_fc_patterns_get_font_pattern (PangoFcPatterns *pats, int i, gboolean *prep
FcResult result;
if (!pats->match && !pats->fontset)
{
- pats->match = FcFontMatch (NULL, pats->pattern, &result);
+ pats->match = FcFontMatch (pats->fontmap->priv->fc_config, pats->pattern, &result);
#ifdef FC_PATTERN
/* The FC_PATTERN element, which points back to our the original
* pattern defeats our hash tables.
@@ -800,7 +802,7 @@ pango_fc_patterns_get_font_pattern (PangoFcPatterns *pats, int i, gboolean *prep
if (!pats->fontset)
{
FcResult result;
- pats->fontset = FcFontSort (NULL, pats->pattern, FcTrue, NULL, &result);
+ pats->fontset = FcFontSort (pats->fontmap->priv->fc_config, pats->pattern, FcTrue, NULL, &result);
if (pats->match)
{
FcPatternDestroy (pats->match);
@@ -1312,7 +1314,7 @@ pango_fc_font_map_list_families (PangoFontMap *fontmap,
* the same family have different spacing values */
GHashTable *temp_family_hash;
- fontset = FcFontList (NULL, pat, os);
+ fontset = FcFontList (priv->fc_config, pat, os);
FcPatternDestroy (pat);
FcObjectSetDestroy (os);
@@ -1809,6 +1811,63 @@ pango_fc_font_map_cache_clear (PangoFcFontMap *fcfontmap)
pango_font_map_changed (PANGO_FONT_MAP (fcfontmap));
}
+/**
+ * pango_fc_font_map_set_fc_config:
+ * @fcfontmap: a #PangoFcFontMap
+ * @fcconfig: (nullable) a #FcConfig, or %NULL
+ *
+ * Set the FcConfig for this font map to use. The default value
+ * is %NULL, which causes Fontconfig to use its global "current config".
+ * You can create a new FcConfig object and use this API to attach it
+ * to a font map.
+ *
+ * This is particularly useful for example, if you want to use application
+ * fonts with Pango. For that, you would create a fresh FcConfig, add your
+ * app fonts to it, and attach it to a new Pango font map.
+ *
+ * This function acquires a reference to the FcConfig object; the caller
+ * does NOT need to retain a reference.
+ *
+ * Since: 1.38
+ **/
+void
+pango_fc_font_map_set_fc_config (PangoFcFontMap *fcfontmap,
+ FcConfig *fcconfig)
+{
+ FcConfig *oldconfig;
+
+ g_return_if_fail (PANGO_IS_FC_FONT_MAP (fcfontmap));
+
+ oldconfig = fcfontmap->priv->fc_config;
+
+ if (fcconfig)
+ FcConfigReference (fcconfig);
+
+ fcfontmap->priv->fc_config = fcconfig;
+
+ if (oldconfig)
+ FcConfigDestroy (oldconfig);
+}
+
+/**
+ * pango_fc_font_map_get_fc_config:
+ * @fcfontmap: a #PangoFcFontMap
+ *
+ * Fetches FcConfig attached to a font map. See pango_fc_font_map_set_fc_config().
+ *
+ * Returns: (nullable): the #FcConfig object attached to @fcfontmap, which
+ * might be %NULL.
+ *
+ * Since: 1.38
+ **/
+FcConfig *
+pango_fc_font_map_get_fc_config (PangoFcFontMap *fcfontmap)
+{
+ g_return_val_if_fail (PANGO_IS_FC_FONT_MAP (fcfontmap), NULL);
+
+ return fcfontmap->priv->fc_config;
+}
+
static PangoFcFontFaceData *
pango_fc_font_map_get_font_face_data (PangoFcFontMap *fcfontmap,
FcPattern *font_pattern)
@@ -2238,6 +2297,7 @@ pango_fc_face_describe (PangoFontFace *face)
FcResult res;
FcPattern *match_pattern;
FcPattern *result_pattern;
+ FcConfig *fc_config = NULL;
if (G_UNLIKELY (!fcfamily))
return pango_font_description_new ();
@@ -2264,7 +2324,10 @@ pango_fc_face_describe (PangoFontFace *face)
FcConfigSubstitute (NULL, match_pattern, FcMatchPattern);
FcDefaultSubstitute (match_pattern);
- result_pattern = FcFontMatch (NULL, match_pattern, &res);
+ if (fcface->family && fcface->family->fontmap)
+ fc_config = fcface->family->fontmap->priv->fc_config;
+
+ result_pattern = FcFontMatch (fc_config, match_pattern, &res);
if (result_pattern)
{
desc = pango_fc_font_description_from_pattern (result_pattern, FALSE);
@@ -2484,7 +2547,7 @@ pango_fc_family_list_faces (PangoFontFamily *family,
PangoFcFace **faces;
gint num = 0;
- fontset = FcFontList (NULL, pat, os);
+ fontset = FcFontList (priv->fc_config, pat, os);
FcPatternDestroy (pat);
FcObjectSetDestroy (os);
diff --git a/pango/pangofc-fontmap.h b/pango/pangofc-fontmap.h
index fee5faa5..3f81348d 100644
--- a/pango/pangofc-fontmap.h
+++ b/pango/pangofc-fontmap.h
@@ -197,6 +197,12 @@ GType pango_fc_font_map_get_type (void) G_GNUC_CONST;
void pango_fc_font_map_cache_clear (PangoFcFontMap *fcfontmap);
+void
+pango_fc_font_map_set_fc_config (PangoFcFontMap *fcfontmap,
+ FcConfig *fcconfig);
+FcConfig *
+pango_fc_font_map_get_fc_config (PangoFcFontMap *fcfontmap);
+
/**
* PangoFcDecoderFindFunc:
* @pattern: a fully resolved #FcPattern specifying the font on the system
diff --git a/pango/pangoft2.c b/pango/pangoft2.c
index 186424d4..ec476856 100644
--- a/pango/pangoft2.c
+++ b/pango/pangoft2.c
@@ -110,7 +110,7 @@ load_fallback_face (PangoFT2Font *ft2font,
_pango_ft2_font_map_default_substitute ((PangoFcFontMap *)fcfont->fontmap, sans);
- matched = FcFontMatch (NULL, sans, &result);
+ matched = FcFontMatch (pango_fc_font_map_get_fc_config (fcfont->fontmap), sans, &result);
if (FcPatternGetString (matched, FC_FILE, 0, &filename2) != FcResultMatch)
goto bail1;
diff --git a/pango/pangoft2.def b/pango/pangoft2.def
index f2082ccb..1f5ec90a 100644
--- a/pango/pangoft2.def
+++ b/pango/pangoft2.def
@@ -18,7 +18,9 @@ EXPORTS
pango_fc_font_map_cache_clear
pango_fc_font_map_create_context
pango_fc_font_map_find_decoder
+ pango_fc_font_map_get_fc_config
pango_fc_font_map_get_type
+ pango_fc_font_map_set_fc_config
pango_fc_font_map_shutdown
pango_fc_font_unlock_face
pango_fc_fontset_key_get_absolute_size