summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2012-12-05 13:29:48 +0100
committerAlexander Larsson <alexl@redhat.com>2012-12-06 16:36:19 +0100
commit3f3a095a1809375ef600dc3a947b3ff2df08f22c (patch)
tree5d7d2cb3ada7f3fe92fb4525eea7907f185165e1
parentb359bb484bc7d27a835cfd6d9ffcaed582ebf2ae (diff)
downloadpango-3f3a095a1809375ef600dc3a947b3ff2df08f22c.tar.gz
Track changes in FontMaps using a serial
This adds the pango_font_map_get_serial method that lets you see if a fontmap has changes since the last check. It adds implementations to all current fontmaps. https://bugzilla.gnome.org/show_bug.cgi?id=340066
-rw-r--r--docs/pango-sections.txt1
-rw-r--r--docs/tmpl/fonts.sgml13
-rw-r--r--pango/pango-fontmap.c30
-rw-r--r--pango/pango-fontmap.h8
-rw-r--r--pango/pango.def1
-rw-r--r--pango/pangocairo-coretext.h1
-rw-r--r--pango/pangocairo-coretextfontmap.c15
-rw-r--r--pango/pangocairo-fc.h1
-rw-r--r--pango/pangocairo-fcfontmap.c22
-rw-r--r--pango/pangocairo-win32.h1
-rw-r--r--pango/pangocairo-win32fontmap.c14
-rw-r--r--pango/pangocoretext-fontmap.c10
-rw-r--r--pango/pangocoretext-private.h1
-rw-r--r--pango/pangoft2-fontmap.c20
-rw-r--r--pango/pangoxft-fontmap.c25
15 files changed, 156 insertions, 7 deletions
diff --git a/docs/pango-sections.txt b/docs/pango-sections.txt
index 5f6ba73c..bce6cf48 100644
--- a/docs/pango-sections.txt
+++ b/docs/pango-sections.txt
@@ -259,6 +259,7 @@ pango_font_map_load_font
pango_font_map_load_fontset
pango_font_map_list_families
pango_font_map_get_shape_engine_type
+pango_font_map_get_serial
<SUBSECTION>
PangoFontset
PANGO_TYPE_FONTSET
diff --git a/docs/tmpl/fonts.sgml b/docs/tmpl/fonts.sgml
index 5e7402d7..ef83dd0f 100644
--- a/docs/tmpl/fonts.sgml
+++ b/docs/tmpl/fonts.sgml
@@ -826,11 +826,13 @@ a particular #PangoFontMap implementation.
pango_font_map_load_font().
@list_families: A function to list available font families. See
pango_font_map_list_families().
-@load_fontset: a function to load a fontset with a given given description
+@load_fontset: a function to load a fontset with a given description
suitable for a particular language. See
pango_font_map_load_fontset().
@shape_engine_type: the type of rendering-system-dependent engines that
can handle fonts of this fonts loaded with this fontmap.
+@get_serial: a function to get the serial number of the fontmap.
+ See pango_font_map_get_serial().
<!-- ##### MACRO PANGO_FONT_MAP_CLASS ##### -->
<para>
@@ -907,6 +909,15 @@ Returns the type of a #PangoFontMap.
@Returns:
+<!-- ##### FUNCTION pango_font_map_get_serial ##### -->
+<para>
+
+</para>
+
+@fontmap:
+@Returns:
+
+
<!-- ##### STRUCT PangoFontset ##### -->
<para>
A #PangoFontset represents a set of #PangoFont to use
diff --git a/pango/pango-fontmap.c b/pango/pango-fontmap.c
index 6e90ada1..e1d6bb0f 100644
--- a/pango/pango-fontmap.c
+++ b/pango/pango-fontmap.c
@@ -284,3 +284,33 @@ pango_font_map_get_shape_engine_type (PangoFontMap *fontmap)
return PANGO_FONT_MAP_GET_CLASS (fontmap)->shape_engine_type;
}
+/**
+ * pango_font_map_get_serial:
+ * @fontmap: a #PangoFontMap
+ *
+ * Returns the current serial number of @fontmap. The serial number is
+ * initialized to an small number larger than zero when a new fontmap
+ * is created and is increased whenever the fontmap is changed. It may
+ * wrap, but will never have the value 0. Since it can wrap, never compare
+ * it with "less than", always use "not equals".
+ *
+ * The fontmap can only be changed using backend-specific API, like changing
+ * fontmap resolution.
+ *
+ * This can be used to automatically detect changes to a #PangoFontMap, like
+ * in #PangoContext.
+ *
+ * Return value: The current serial number of @fontmap.
+ *
+ * Since: 1.32.4
+ **/
+guint
+pango_font_map_get_serial (PangoFontMap *fontmap)
+{
+ g_return_val_if_fail (PANGO_IS_FONT_MAP (fontmap), 0);
+
+ if (PANGO_FONT_MAP_GET_CLASS (fontmap)->get_serial)
+ return PANGO_FONT_MAP_GET_CLASS (fontmap)->get_serial (fontmap);
+ else
+ return 1;
+}
diff --git a/pango/pango-fontmap.h b/pango/pango-fontmap.h
index 602ec9fe..0f028baa 100644
--- a/pango/pango-fontmap.h
+++ b/pango/pango-fontmap.h
@@ -45,6 +45,7 @@ PangoFontset *pango_font_map_load_fontset (PangoFontMap *fontma
void pango_font_map_list_families (PangoFontMap *fontmap,
PangoFontFamily ***families,
int *n_families);
+guint pango_font_map_get_serial (PangoFontMap *fontmap);
#ifdef PANGO_ENABLE_BACKEND
@@ -76,7 +77,9 @@ struct _PangoFontMapClass
const PangoFontDescription *desc,
PangoLanguage *language);
- const char *shape_engine_type;
+ const char *shape_engine_type;
+
+ guint (*get_serial) (PangoFontMap *fontmap);
/*< private >*/
@@ -84,10 +87,9 @@ struct _PangoFontMapClass
void (*_pango_reserved1) (void);
void (*_pango_reserved2) (void);
void (*_pango_reserved3) (void);
- void (*_pango_reserved4) (void);
};
-const char *pango_font_map_get_shape_engine_type (PangoFontMap *fontmap);
+G_CONST_RETURN char *pango_font_map_get_shape_engine_type (PangoFontMap *fontmap);
#endif /* PANGO_ENABLE_BACKEND */
diff --git a/pango/pango.def b/pango/pango.def
index ba1289ce..66e70d3b 100644
--- a/pango/pango.def
+++ b/pango/pango.def
@@ -151,6 +151,7 @@ EXPORTS
pango_font_get_type
pango_font_map_create_context
pango_font_map_get_shape_engine_type
+ pango_font_map_get_serial
pango_font_map_get_type
pango_font_map_list_families
pango_font_map_load_font
diff --git a/pango/pangocairo-coretext.h b/pango/pangocairo-coretext.h
index 4310f45f..31faf9be 100644
--- a/pango/pangocairo-coretext.h
+++ b/pango/pangocairo-coretext.h
@@ -39,6 +39,7 @@ struct _PangoCairoCoreTextFontMap
{
PangoCoreTextFontMap parent_instance;
+ guint serial;
gdouble dpi;
};
diff --git a/pango/pangocairo-coretextfontmap.c b/pango/pangocairo-coretextfontmap.c
index cd1f3f25..5561358b 100644
--- a/pango/pangocairo-coretextfontmap.c
+++ b/pango/pangocairo-coretextfontmap.c
@@ -34,12 +34,23 @@ struct _PangoCairoCoreTextFontMapClass
PangoCoreTextFontMapClass parent_class;
};
+static guint
+pango_cairo_core_text_font_map_get_serial (PangoFontMap *fontmap)
+{
+ PangoCairoCoreTextFontMap *cafontmap = PANGO_CAIRO_CORE_TEXT_FONT_MAP (fontmap);
+
+ return cafontmap->serial;
+}
+
static void
pango_cairo_core_text_font_map_set_resolution (PangoCairoFontMap *cfontmap,
double dpi)
{
PangoCairoCoreTextFontMap *cafontmap = PANGO_CAIRO_CORE_TEXT_FONT_MAP (cfontmap);
+ cafontmap->serial++;
+ if (cafontmap->serial == 0)
+ cafontmap->serial++;
cafontmap->dpi = dpi;
}
@@ -144,10 +155,13 @@ static void
pango_cairo_core_text_font_map_class_init (PangoCairoCoreTextFontMapClass *class)
{
PangoCoreTextFontMapClass *ctfontmapclass = (PangoCoreTextFontMapClass *)class;
+ PangoFontMapClass *fontmap_class = PANGO_FONT_MAP_CLASS (class);
GObjectClass *object_class = (GObjectClass *)class;
object_class->finalize = pango_cairo_core_text_font_map_finalize;
+ fontmap_class->get_serial = pango_cairo_core_text_font_map_get_serial;
+
ctfontmapclass->get_resolution = pango_cairo_core_text_font_map_get_resolution_core_text;
ctfontmapclass->create_font = pango_cairo_core_text_font_map_create_font;
ctfontmapclass->context_key_get = pango_cairo_core_text_font_map_context_key_get;
@@ -160,5 +174,6 @@ pango_cairo_core_text_font_map_class_init (PangoCairoCoreTextFontMapClass *class
static void
pango_cairo_core_text_font_map_init (PangoCairoCoreTextFontMap *cafontmap)
{
+ cafontmap->serial = 1;
cafontmap->dpi = 72.;
}
diff --git a/pango/pangocairo-fc.h b/pango/pangocairo-fc.h
index ea4fccbc..8873d5b3 100644
--- a/pango/pangocairo-fc.h
+++ b/pango/pangocairo-fc.h
@@ -37,6 +37,7 @@ struct _PangoCairoFcFontMap
{
PangoFcFontMap parent_instance;
+ guint serial;
double dpi;
FT_Library library;
diff --git a/pango/pangocairo-fcfontmap.c b/pango/pangocairo-fcfontmap.c
index c2b410ee..69fe4929 100644
--- a/pango/pangocairo-fcfontmap.c
+++ b/pango/pangocairo-fcfontmap.c
@@ -33,15 +33,29 @@ struct _PangoCairoFcFontMapClass
PangoFcFontMapClass parent_class;
};
+static guint
+pango_cairo_fc_font_map_get_serial (PangoFontMap *fontmap)
+{
+ PangoCairoFcFontMap *cffontmap = (PangoCairoFcFontMap *) (fontmap);
+
+ return cffontmap->serial;
+}
+
static void
pango_cairo_fc_font_map_set_resolution (PangoCairoFontMap *cfontmap,
double dpi)
{
PangoCairoFcFontMap *cffontmap = (PangoCairoFcFontMap *) (cfontmap);
- cffontmap->dpi = dpi;
+ if (dpi != cffontmap->dpi)
+ {
+ cffontmap->serial++;
+ if (cffontmap->serial == 0)
+ cffontmap->serial++;
+ cffontmap->dpi = dpi;
- pango_fc_font_map_cache_clear ((PangoFcFontMap *) (cfontmap));
+ pango_fc_font_map_cache_clear ((PangoFcFontMap *) (cfontmap));
+ }
}
static double
@@ -162,10 +176,13 @@ static void
pango_cairo_fc_font_map_class_init (PangoCairoFcFontMapClass *class)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (class);
+ PangoFontMapClass *fontmap_class = PANGO_FONT_MAP_CLASS (class);
PangoFcFontMapClass *fcfontmap_class = PANGO_FC_FONT_MAP_CLASS (class);
gobject_class->finalize = pango_cairo_fc_font_map_finalize;
+ fontmap_class->get_serial = pango_cairo_fc_font_map_get_serial;
+
fcfontmap_class->fontset_key_substitute = pango_cairo_fc_font_map_fontset_key_substitute;
fcfontmap_class->get_resolution = pango_cairo_fc_font_map_get_resolution_fc;
@@ -188,6 +205,7 @@ pango_cairo_fc_font_map_init (PangoCairoFcFontMap *cffontmap)
if (error != FT_Err_Ok)
g_critical ("pango_cairo_font_map_init: Could not initialize freetype");
+ cffontmap->serial = 1;
cffontmap->dpi = 96.0;
}
diff --git a/pango/pangocairo-win32.h b/pango/pangocairo-win32.h
index 7a71c0a2..33d0ee45 100644
--- a/pango/pangocairo-win32.h
+++ b/pango/pangocairo-win32.h
@@ -38,6 +38,7 @@ struct _PangoCairoWin32FontMap
{
PangoWin32FontMap parent_instance;
+ guint serial;
double dpi;
};
diff --git a/pango/pangocairo-win32fontmap.c b/pango/pangocairo-win32fontmap.c
index c5ec6cd2..cd4e12ee 100644
--- a/pango/pangocairo-win32fontmap.c
+++ b/pango/pangocairo-win32fontmap.c
@@ -33,12 +33,23 @@ struct _PangoCairoWin32FontMapClass
PangoWin32FontMapClass parent_class;
};
+static guint
+pango_cairo_win32_font_map_get_serial (PangoFontMap *fontmap)
+{
+ PangoCairoWin32FontMap *cwfontmap = PANGO_CAIRO_WIN32_FONT_MAP (fontmap);
+
+ return cwfontmap->serial;
+}
+
static void
pango_cairo_win32_font_map_set_resolution (PangoCairoFontMap *cfontmap,
double dpi)
{
PangoCairoWin32FontMap *cwfontmap = PANGO_CAIRO_WIN32_FONT_MAP (cfontmap);
+ cwfontmap->serial++;
+ if (cwfontmap->serial == 0)
+ cwfontmap->serial++;
cwfontmap->dpi = dpi;
}
@@ -89,14 +100,17 @@ static void
pango_cairo_win32_font_map_class_init (PangoCairoWin32FontMapClass *class)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (class);
+ PangoFontMapClass *fontmap_class = PANGO_FONT_MAP_CLASS (class);
PangoWin32FontMapClass *win32fontmap_class = PANGO_WIN32_FONT_MAP_CLASS (class);
gobject_class->finalize = pango_cairo_win32_font_map_finalize;
+ fontmap_class->get_serial = pango_cairo_win32_font_map_get_serial;
win32fontmap_class->find_font = pango_cairo_win32_font_map_find_font;
}
static void
pango_cairo_win32_font_map_init (PangoCairoWin32FontMap *cwfontmap)
{
+ cwfontmap->serial = 1;
cwfontmap->dpi = GetDeviceCaps (pango_win32_get_dc (), LOGPIXELSY);
}
diff --git a/pango/pangocoretext-fontmap.c b/pango/pangocoretext-fontmap.c
index a8a9b518..7993d59e 100644
--- a/pango/pangocoretext-fontmap.c
+++ b/pango/pangocoretext-fontmap.c
@@ -1191,6 +1191,14 @@ get_first_font (PangoFontset *fontset G_GNUC_UNUSED,
return TRUE;
}
+static guint
+pango_core_text_font_map_get_serial (PangoFontMap *fontmap)
+{
+ PangoCoreTextFontMap *ctfontmap = PANGO_CORE_TEXT_FONT_MAP (fontmap);
+
+ return ctfontmap->serial;
+}
+
static PangoFont *
pango_core_text_font_map_load_font (PangoFontMap *fontmap,
PangoContext *context,
@@ -1370,6 +1378,7 @@ pango_core_text_font_map_init (PangoCoreTextFontMap *ctfontmap)
CFArrayRef ctfaces;
CFIndex i, count;
+ ctfontmap->serial = 1;
ctfontmap->families = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, g_object_unref);
@@ -1461,6 +1470,7 @@ pango_core_text_font_map_class_init (PangoCoreTextFontMapClass *class)
fontmap_class->list_families = pango_core_text_font_map_list_families;
fontmap_class->load_fontset = pango_core_text_font_map_load_fontset;
fontmap_class->shape_engine_type = PANGO_RENDER_TYPE_CORE_TEXT;
+ fontmap_class->get_serial = pango_core_text_font_map_get_serial;
}
/*
diff --git a/pango/pangocoretext-private.h b/pango/pangocoretext-private.h
index 3e0dafdc..8076eaea 100644
--- a/pango/pangocoretext-private.h
+++ b/pango/pangocoretext-private.h
@@ -51,6 +51,7 @@ struct _PangoCoreTextFontMap
{
PangoFontMap parent_instance;
+ guint serial;
GHashTable *fontset_hash;
GHashTable *font_hash;
diff --git a/pango/pangoft2-fontmap.c b/pango/pangoft2-fontmap.c
index 662b8ad9..996bbb1f 100644
--- a/pango/pangoft2-fontmap.c
+++ b/pango/pangoft2-fontmap.c
@@ -43,6 +43,7 @@ struct _PangoFT2FontMap
FT_Library library;
+ guint serial;
double dpi_x;
double dpi_y;
@@ -66,6 +67,7 @@ static PangoFcFont * pango_ft2_font_map_new_font (PangoFcFontMap
FcPattern *pattern);
static double pango_ft2_font_map_get_resolution (PangoFcFontMap *fcfontmap,
PangoContext *context);
+static guint pango_ft2_font_map_get_serial (PangoFontMap *fontmap);
static PangoFT2FontMap *pango_ft2_global_fontmap = NULL; /* MT-safe */
@@ -75,9 +77,11 @@ static void
pango_ft2_font_map_class_init (PangoFT2FontMapClass *class)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (class);
+ PangoFontMapClass *fontmap_class = PANGO_FONT_MAP_CLASS (class);
PangoFcFontMapClass *fcfontmap_class = PANGO_FC_FONT_MAP_CLASS (class);
gobject_class->finalize = pango_ft2_font_map_finalize;
+ fontmap_class->get_serial = pango_ft2_font_map_get_serial;
fcfontmap_class->default_substitute = _pango_ft2_font_map_default_substitute;
fcfontmap_class->new_font = pango_ft2_font_map_new_font;
fcfontmap_class->get_resolution = pango_ft2_font_map_get_resolution;
@@ -86,6 +90,7 @@ pango_ft2_font_map_class_init (PangoFT2FontMapClass *class)
static void
pango_ft2_font_map_init (PangoFT2FontMap *fontmap)
{
+ fontmap->serial = 1;
fontmap->library = NULL;
fontmap->dpi_x = 72.0;
fontmap->dpi_y = 72.0;
@@ -139,6 +144,14 @@ pango_ft2_font_map_new (void)
return (PangoFontMap *)ft2fontmap;
}
+static guint
+pango_ft2_font_map_get_serial (PangoFontMap *fontmap)
+{
+ PangoFT2FontMap *ft2fontmap = PANGO_FT2_FONT_MAP (fontmap);
+
+ return ft2fontmap->serial;
+}
+
/**
* pango_ft2_font_map_set_default_substitute:
* @fontmap: a #PangoFT2FontMap
@@ -160,6 +173,10 @@ pango_ft2_font_map_set_default_substitute (PangoFT2FontMap *fontmap,
gpointer data,
GDestroyNotify notify)
{
+ fontmap->serial++;
+ if (fontmap->serial == 0)
+ fontmap->serial++;
+
if (fontmap->substitute_destroy)
fontmap->substitute_destroy (fontmap->substitute_data);
@@ -185,6 +202,9 @@ pango_ft2_font_map_set_default_substitute (PangoFT2FontMap *fontmap,
void
pango_ft2_font_map_substitute_changed (PangoFT2FontMap *fontmap)
{
+ fontmap->serial++;
+ if (fontmap->serial == 0)
+ fontmap->serial++;
pango_fc_font_map_cache_clear (PANGO_FC_FONT_MAP (fontmap));
}
diff --git a/pango/pangoxft-fontmap.c b/pango/pangoxft-fontmap.c
index 9d210b50..aa891c54 100644
--- a/pango/pangoxft-fontmap.c
+++ b/pango/pangoxft-fontmap.c
@@ -41,6 +41,8 @@ struct _PangoXftFontMap
{
PangoFcFontMap parent_instance;
+ guint serial;
+
Display *display;
int screen;
@@ -59,6 +61,7 @@ struct _PangoXftFontMapClass
PangoFcFontMapClass parent_class;
};
+static guint pango_xft_font_map_get_serial (PangoFontMap *fontmap);
static void pango_xft_font_map_default_substitute (PangoFcFontMap *fcfontmap,
FcPattern *pattern);
static PangoFcFont * pango_xft_font_map_new_font (PangoFcFontMap *fcfontmap,
@@ -74,16 +77,21 @@ static void
pango_xft_font_map_class_init (PangoXftFontMapClass *class)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (class);
+ PangoFontMapClass *fontmap_class = PANGO_FONT_MAP_CLASS (class);
PangoFcFontMapClass *fcfontmap_class = PANGO_FC_FONT_MAP_CLASS (class);
gobject_class->finalize = pango_xft_font_map_finalize;
+
+ fontmap_class->get_serial = pango_xft_font_map_get_serial;
+
fcfontmap_class->default_substitute = pango_xft_font_map_default_substitute;
fcfontmap_class->new_font = pango_xft_font_map_new_font;
}
static void
-pango_xft_font_map_init (PangoXftFontMap *xftfontmap G_GNUC_UNUSED)
+pango_xft_font_map_init (PangoXftFontMap *xftfontmap)
{
+ xftfontmap->serial = 1;
}
static void
@@ -105,6 +113,14 @@ pango_xft_font_map_finalize (GObject *object)
}
+static guint
+pango_xft_font_map_get_serial (PangoFontMap *fontmap)
+{
+ PangoXftFontMap *xftfontmap = PANGO_XFT_FONT_MAP (fontmap);
+
+ return xftfontmap->serial;
+}
+
static PangoFontMap *
pango_xft_find_font_map (Display *display,
int screen)
@@ -283,6 +299,10 @@ pango_xft_set_default_substitute (Display *display,
{
PangoXftFontMap *xftfontmap = (PangoXftFontMap *)pango_xft_get_font_map (display, screen);
+ xftfontmap->serial++;
+ if (xftfontmap->serial == 0)
+ xftfontmap->serial++;
+
if (xftfontmap->substitute_destroy)
xftfontmap->substitute_destroy (xftfontmap->substitute_data);
@@ -312,6 +332,9 @@ pango_xft_substitute_changed (Display *display,
{
PangoXftFontMap *xftfontmap = (PangoXftFontMap *)pango_xft_get_font_map (display, screen);
+ xftfontmap->serial++;
+ if (xftfontmap->serial == 0)
+ xftfontmap->serial++;
pango_fc_font_map_cache_clear (PANGO_FC_FONT_MAP (xftfontmap));
}