summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBehdad Esfahbod <behdad@behdad.org>2009-03-10 08:08:19 -0400
committerBehdad Esfahbod <behdad@behdad.org>2009-03-13 18:03:42 -0400
commit9305b9a9995e84ace3818a90346820ef8c47a3ce (patch)
tree8713cdaf24e1eb5c7b380c005cce45a719a222e5
parented941ddf131cbdd8f5e1e1efabd6e92c37010735 (diff)
downloadpango-9305b9a9995e84ace3818a90346820ef8c47a3ce.tar.gz
[pangofc] Add a "fontmap" property to PangoFcFont
Gecko uses its own PangoFcFontMap subclass with its own PangoFontSet. Previously we were setting font->fontmap in our own private PangoFcFontSet. Now it's up to the PangoFcFont subclass to set it when creating the new font object. Also adds the following backend-public symbol: pango_fc_font_map_find_decoder()
-rw-r--r--docs/pango-sections.txt1
-rw-r--r--docs/tmpl/pangofc-font.sgml5
-rw-r--r--docs/tmpl/pangofc-fontmap.sgml10
-rw-r--r--pango/pangocairo-fcfont.c1
-rw-r--r--pango/pangofc-font.c42
-rw-r--r--pango/pangofc-fontmap.c79
-rw-r--r--pango/pangofc-fontmap.h2
-rw-r--r--pango/pangoft2.c1
-rw-r--r--pango/pangoft2.def1
-rw-r--r--pango/pangoxft-font.c1
10 files changed, 109 insertions, 34 deletions
diff --git a/docs/pango-sections.txt b/docs/pango-sections.txt
index 7ed853c3..0fbdc22e 100644
--- a/docs/pango-sections.txt
+++ b/docs/pango-sections.txt
@@ -919,6 +919,7 @@ PangoFcFontMapClass
pango_fc_font_map_create_context
PangoFcDecoderFindFunc
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_description_from_pattern
diff --git a/docs/tmpl/pangofc-font.sgml b/docs/tmpl/pangofc-font.sgml
index 95ac1dd3..a1b055c2 100644
--- a/docs/tmpl/pangofc-font.sgml
+++ b/docs/tmpl/pangofc-font.sgml
@@ -40,6 +40,11 @@ Fontconfig-based backend involves deriving from both
</para>
+<!-- ##### ARG PangoFcFont:fontmap ##### -->
+<para>
+
+</para>
+
<!-- ##### ARG PangoFcFont:pattern ##### -->
<para>
diff --git a/docs/tmpl/pangofc-fontmap.sgml b/docs/tmpl/pangofc-fontmap.sgml
index bcfae81f..ee6cca06 100644
--- a/docs/tmpl/pangofc-fontmap.sgml
+++ b/docs/tmpl/pangofc-fontmap.sgml
@@ -86,6 +86,16 @@ Fontconfig-based backend involves deriving from both
@dnotify:
+<!-- ##### FUNCTION pango_fc_font_map_find_decoder ##### -->
+<para>
+
+</para>
+
+@fcfontmap:
+@pattern:
+@Returns:
+
+
<!-- ##### FUNCTION pango_fc_font_map_cache_clear ##### -->
<para>
diff --git a/pango/pangocairo-fcfont.c b/pango/pangocairo-fcfont.c
index 3039f9ff..3ac166e6 100644
--- a/pango/pangocairo-fcfont.c
+++ b/pango/pangocairo-fcfont.c
@@ -223,6 +223,7 @@ _pango_cairo_fc_font_new (PangoCairoFcFontMap *cffontmap,
cffont = g_object_new (PANGO_TYPE_CAIRO_FC_FONT,
"pattern", pattern,
+ "fontmap", cffontmap,
NULL);
size = get_font_size (pattern) /
diff --git a/pango/pangofc-font.c b/pango/pangofc-font.c
index 133a4df4..9c5b9ed1 100644
--- a/pango/pangofc-font.c
+++ b/pango/pangofc-font.c
@@ -34,7 +34,8 @@
enum {
PROP_0,
- PROP_PATTERN
+ PROP_PATTERN,
+ PROP_FONTMAP
};
typedef struct _GUnicharToGlyphCacheEntry GUnicharToGlyphCacheEntry;
@@ -121,6 +122,13 @@ pango_fc_font_class_init (PangoFcFontClass *class)
"The fontconfig pattern for this font",
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (object_class, PROP_FONTMAP,
+ g_param_spec_object ("fontmap",
+ "Font Map",
+ "The PangoFc font map this font is associated with (Since: 1.26)",
+ PANGO_TYPE_FC_FONT_MAP,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS));
g_type_class_add_private (object_class, sizeof (PangoFcFontPrivate));
}
@@ -203,11 +211,12 @@ pango_fc_font_set_property (GObject *object,
const GValue *value,
GParamSpec *pspec)
{
+ PangoFcFont *fcfont = PANGO_FC_FONT (object);
+
switch (prop_id)
{
case PROP_PATTERN:
{
- PangoFcFont *fcfont = PANGO_FC_FONT (object);
FcPattern *pattern = g_value_get_pointer (value);
g_return_if_fail (pattern != NULL);
@@ -219,11 +228,30 @@ pango_fc_font_set_property (GObject *object,
fcfont->is_hinted = pattern_is_hinted (pattern);
fcfont->is_transformed = pattern_is_transformed (pattern);
}
- break;
+ goto set_decoder;
+
+ case PROP_FONTMAP:
+ {
+ PangoFcFontMap *fcfontmap = PANGO_FC_FONT_MAP (g_value_get_object (value));
+
+ g_return_if_fail (fcfont->fontmap == NULL);
+ fcfont->fontmap = (PangoFontMap *) fcfontmap;
+ if (fcfont->fontmap)
+ g_object_add_weak_pointer (G_OBJECT (fcfont->fontmap), (gpointer *) (gpointer) &fcfont->fontmap);
+ }
+ goto set_decoder;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
+ return;
}
+
+set_decoder:
+ /* set decoder if both pattern and fontmap are set now */
+ if (fcfont->font_pattern && fcfont->fontmap)
+ _pango_fc_font_set_decoder (fcfont,
+ pango_fc_font_map_find_decoder ((PangoFcFontMap *) fcfont->fontmap,
+ fcfont->font_pattern));
}
static void
@@ -240,6 +268,12 @@ pango_fc_font_get_property (GObject *object,
g_value_set_pointer (value, fcfont->font_pattern);
}
break;
+ case PROP_FONTMAP:
+ {
+ PangoFcFont *fcfont = PANGO_FC_FONT (object);
+ g_value_set_object (value, fcfont->fontmap);
+ }
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
diff --git a/pango/pangofc-fontmap.c b/pango/pangofc-fontmap.c
index 07328b65..c3786e1d 100644
--- a/pango/pangofc-fontmap.c
+++ b/pango/pangofc-fontmap.c
@@ -1058,9 +1058,13 @@ pango_fc_font_map_add_decoder_find_func (PangoFcFontMap *fcfontmap,
gpointer user_data,
GDestroyNotify dnotify)
{
- PangoFcFontMapPrivate *priv = fcfontmap->priv;
+ PangoFcFontMapPrivate *priv;
PangoFcFindFuncInfo *info;
+ g_return_val_if_fail (PANGO_IS_FC_FONT_MAP (fcfontmap), NULL);
+
+ priv = fcfontmap->priv;
+
info = g_slice_new (PangoFcFindFuncInfo);
info->findfunc = findfunc;
@@ -1070,6 +1074,41 @@ pango_fc_font_map_add_decoder_find_func (PangoFcFontMap *fcfontmap,
priv->findfuncs = g_slist_append (priv->findfuncs, info);
}
+/**
+ * pango_fc_font_map_find_decoder:
+ * @fcfontmap: The #PangoFcFontMap to use.
+ * @pattern: The #FcPattern to find the decoder for.
+ *
+ * Finds the decoder to use for @pattern. Decoders can be added to
+ * a font map using pango_fc_font_map_add_decoder_find_func().
+ *
+ * Returns: a newly created #PangoFcDecoder object or %NULL if
+ * no decoder is set for @pattern.
+ *
+ * Since: 1.26.
+ **/
+PangoFcDecoder *
+pango_fc_font_map_find_decoder (PangoFcFontMap *fcfontmap,
+ FcPattern *pattern)
+{
+ GSList *l;
+
+ g_return_val_if_fail (PANGO_IS_FC_FONT_MAP (fcfontmap), NULL);
+ g_return_val_if_fail (pattern != NULL, NULL);
+
+ for (l = fcfontmap->priv->findfuncs; l && l->data; l = l->next)
+ {
+ PangoFcFindFuncInfo *info = l->data;
+ PangoFcDecoder *decoder;
+
+ decoder = info->findfunc (pattern, info->user_data);
+ if (decoder)
+ return decoder;
+ }
+
+ return NULL;
+}
+
static void
pango_fc_font_map_finalize (GObject *object)
{
@@ -1089,13 +1128,6 @@ pango_fc_font_map_add (PangoFcFontMap *fcfontmap,
PangoFcFontMapPrivate *priv = fcfontmap->priv;
PangoFcFontKey *key_copy;
- g_assert (fcfont->fontmap == NULL);
- fcfont->fontmap = (PangoFontMap *) fcfontmap;
- /* In other fontmaps we add a weak pointer on ->fontmap so the
- * field is unset when fontmap is finalized. We don't need it
- * here though as PangoFcFontMap already cleans up fcfont->fontmap
- * as part of it's caching scheme. */
-
key_copy = pango_fc_font_key_copy (key);
_pango_fc_font_set_font_key (fcfont, key_copy);
g_hash_table_insert (priv->font_hash, key_copy, fcfont);
@@ -1109,8 +1141,6 @@ _pango_fc_font_map_remove (PangoFcFontMap *fcfontmap,
PangoFcFontMapPrivate *priv = fcfontmap->priv;
PangoFcFontKey *key;
- fcfont->fontmap = NULL;
-
key = _pango_fc_font_get_font_key (fcfont);
if (key)
{
@@ -1411,7 +1441,6 @@ pango_fc_font_map_new_font (PangoFcFontMap *fcfontmap,
PangoFcFontMapPrivate *priv = fcfontmap->priv;
FcPattern *pattern;
PangoFcFont *fcfont;
- GSList *l;
PangoFcFontKey key;
if (priv->closed)
@@ -1462,25 +1491,9 @@ pango_fc_font_map_new_font (PangoFcFontMap *fcfontmap,
fcfont->matrix = key.matrix;
+ /* cache it on fontmap */
pango_fc_font_map_add (fcfontmap, &key, fcfont);
- /*
- * Give any custom decoders a crack at this font now that it's been
- * created.
- */
- for (l = priv->findfuncs; l && l->data; l = l->next)
- {
- PangoFcFindFuncInfo *info = l->data;
- PangoFcDecoder *decoder;
-
- decoder = info->findfunc (match, info->user_data);
- if (decoder)
- {
- _pango_fc_font_set_decoder (fcfont, decoder);
- break;
- }
- }
-
return (PangoFont *)fcfont;
}
@@ -1825,9 +1838,15 @@ pango_fc_font_map_create_context (PangoFcFontMap *fcfontmap)
static void
shutdown_font (gpointer key G_GNUC_UNUSED,
- PangoFcFont *fcfont)
+ PangoFcFont *fcfont,
+ PangoFcFontMap *fcfontmap)
{
_pango_fc_font_shutdown (fcfont);
+
+ /* While _pango_fc_font_shutdown() tries to call the following
+ * function, it's too late as the fontmap weakref has already
+ * NULL'ed fcfont->fontmap, so we do it ourselves. */
+ _pango_fc_font_map_remove (fcfontmap, fcfont);
}
/**
@@ -1852,7 +1871,7 @@ pango_fc_font_map_shutdown (PangoFcFontMap *fcfontmap)
if (priv->closed)
return;
- g_hash_table_foreach (priv->font_hash, (GHFunc) shutdown_font, NULL);
+ g_hash_table_foreach (priv->font_hash, (GHFunc) shutdown_font, fcfontmap);
for (i = 0; i < priv->n_families; i++)
priv->families[i]->fontmap = NULL;
diff --git a/pango/pangofc-fontmap.h b/pango/pangofc-fontmap.h
index d3f113a9..8d496eb2 100644
--- a/pango/pangofc-fontmap.h
+++ b/pango/pangofc-fontmap.h
@@ -213,6 +213,8 @@ void pango_fc_font_map_add_decoder_find_func (PangoFcFontMap *fcfontmap,
PangoFcDecoderFindFunc findfunc,
gpointer user_data,
GDestroyNotify dnotify);
+PangoFcDecoder *pango_fc_font_map_find_decoder (PangoFcFontMap *fcfontmap,
+ FcPattern *pattern);
PangoFontDescription *pango_fc_font_description_from_pattern (FcPattern *pattern,
gboolean include_size);
diff --git a/pango/pangoft2.c b/pango/pangoft2.c
index d13dc694..224f6a0c 100644
--- a/pango/pangoft2.c
+++ b/pango/pangoft2.c
@@ -73,6 +73,7 @@ _pango_ft2_font_new (PangoFT2FontMap *ft2fontmap,
ft2font = (PangoFT2Font *)g_object_new (PANGO_TYPE_FT2_FONT,
"pattern", pattern,
+ "fontmap", fontmap,
NULL);
if (FcPatternGetDouble (pattern, FC_PIXEL_SIZE, 0, &d) == FcResultMatch)
diff --git a/pango/pangoft2.def b/pango/pangoft2.def
index ba78cd47..4cfa0d1e 100644
--- a/pango/pangoft2.def
+++ b/pango/pangoft2.def
@@ -17,6 +17,7 @@ EXPORTS
pango_fc_font_map_add_decoder_find_func
pango_fc_font_map_cache_clear
pango_fc_font_map_create_context
+ pango_fc_font_map_find_decoder
pango_fc_font_map_get_type
pango_fc_font_map_shutdown
pango_fc_font_unlock_face
diff --git a/pango/pangoxft-font.c b/pango/pangoxft-font.c
index ce633f70..68654908 100644
--- a/pango/pangoxft-font.c
+++ b/pango/pangoxft-font.c
@@ -92,6 +92,7 @@ _pango_xft_font_new (PangoXftFontMap *xftfontmap,
xfont = (PangoXftFont *)g_object_new (PANGO_TYPE_XFT_FONT,
"pattern", pattern,
+ "fontmap", fontmap,
NULL);
/* Hack to force hinting of vertical metrics; hinting off for