pango r2804 - in trunk: . docs docs/tmpl pango
- From: behdad svn gnome org
- To: svn-commits-list gnome org
- Subject: pango r2804 - in trunk: . docs docs/tmpl pango
- Date: Wed, 28 Jan 2009 22:07:39 +0000 (UTC)
Author: behdad
Date: Wed Jan 28 22:07:38 2009
New Revision: 2804
URL: http://svn.gnome.org/viewvc/pango?rev=2804&view=rev
Log:
2009-01-09 Behdad Esfahbod <behdad gnome org>
* docs/pango-sections.txt:
* docs/tmpl/pangofc-fontmap.sgml:
* docs/tmpl/text-attributes.sgml:
* pango/pangocairo-fc.h:
* pango/pangocairo-fcfont.c (get_font_size), (get_gravity_class),
(get_gravity), (_pango_cairo_fc_font_new):
* pango/pangocairo-fcfontmap.c
(pango_cairo_fc_font_map_font_key_substitute),
(pango_cairo_fc_font_map_create_font),
(pango_cairo_fc_font_map_class_init):
* pango/pangofc-font.c (_pango_fc_font_get_font_key),
(_pango_fc_font_set_font_key):
* pango/pangofc-fontmap.c (pango_fc_font_key_equal),
(pango_fc_font_key_hash), (pango_fc_font_key_free),
(pango_fc_font_key_copy), (get_context_matrix),
(pango_fc_font_key_init), (pango_fc_font_key_get_pattern),
(pango_fc_font_key_get_matrix),
(pango_fc_font_key_get_context_key), (pango_fc_font_map_init),
(pango_fc_font_map_class_init), (pango_fc_font_map_add),
(_pango_fc_font_map_remove), (pango_fc_make_pattern),
(pango_fc_font_map_new_font), (pango_fc_default_substitute),
(pango_fc_font_map_get_patterns), (pango_fc_font_map_load_fontset):
* pango/pangofc-fontmap.h:
* pango/pangofc-private.h:
Change PangoFc font loading API such that PangoContext is not passed
down. We use a new opaque struct called PangoFcFontKey. This struct
is in fact our font hash key. This avoids problems where previously
we were using context members that were not necessarily considered
by the pangofc layer when caching.
This is in preparation for lazy loading of fonts in the pangofc fontmap.
Modified:
trunk/ChangeLog
trunk/docs/pango-sections.txt
trunk/docs/tmpl/pangofc-fontmap.sgml
trunk/docs/tmpl/text-attributes.sgml
trunk/pango/pangocairo-fc.h
trunk/pango/pangocairo-fcfont.c
trunk/pango/pangocairo-fcfontmap.c
trunk/pango/pangofc-font.c
trunk/pango/pangofc-fontmap.c
trunk/pango/pangofc-fontmap.h
trunk/pango/pangofc-private.h
Modified: trunk/docs/pango-sections.txt
==============================================================================
--- trunk/docs/pango-sections.txt (original)
+++ trunk/docs/pango-sections.txt Wed Jan 28 22:07:38 2009
@@ -933,11 +933,18 @@
PANGO_IS_FC_FONT_MAP_CLASS
PANGO_FC_FONT_MAP_GET_CLASS
+<SUBSECTION>
+PangoFcFontKey
+pango_fc_font_key_get_context_key
+pango_fc_font_key_get_matrix
+pango_fc_font_key_get_pattern
+
<SUBSECTION Private>
PangoFcFontMapPrivate
pango_fc_font_map_get_type
</SECTION>
+
<SECTION>
<FILE>pangofc-font</FILE>
<TITLE>PangoFcFont</TITLE>
Modified: trunk/docs/tmpl/pangofc-fontmap.sgml
==============================================================================
--- trunk/docs/tmpl/pangofc-fontmap.sgml (original)
+++ trunk/docs/tmpl/pangofc-fontmap.sgml Wed Jan 28 22:07:38 2009
@@ -53,7 +53,7 @@
@context_key_free:
@context_key_hash:
@context_key_equal:
- context_substitute:
+ font_key_substitute:
@create_font:
<!-- ##### FUNCTION pango_fc_font_map_create_context ##### -->
@@ -133,3 +133,36 @@
+<!-- ##### STRUCT PangoFcFontKey ##### -->
+<para>
+
+</para>
+
+
+<!-- ##### FUNCTION pango_fc_font_key_get_context_key ##### -->
+<para>
+
+</para>
+
+ key:
+ Returns:
+
+
+<!-- ##### FUNCTION pango_fc_font_key_get_matrix ##### -->
+<para>
+
+</para>
+
+ key:
+ Returns:
+
+
+<!-- ##### FUNCTION pango_fc_font_key_get_pattern ##### -->
+<para>
+
+</para>
+
+ key:
+ Returns:
+
+
Modified: trunk/docs/tmpl/text-attributes.sgml
==============================================================================
--- trunk/docs/tmpl/text-attributes.sgml (original)
+++ trunk/docs/tmpl/text-attributes.sgml Wed Jan 28 22:07:38 2009
@@ -99,6 +99,7 @@
Since: 1.24
+
<!-- ##### MACRO PANGO_ATTR_INDEX_TO_TEXT_END ##### -->
<para>
This value can be used to set the end_index member of a #PangoAttribute
Modified: trunk/pango/pangocairo-fc.h
==============================================================================
--- trunk/pango/pangocairo-fc.h (original)
+++ trunk/pango/pangocairo-fc.h Wed Jan 28 22:07:38 2009
@@ -44,10 +44,8 @@
GType pango_cairo_fc_font_map_get_type (void) G_GNUC_CONST;
-PangoFcFont *_pango_cairo_fc_font_new (PangoCairoFcFontMap *cffontmap,
- PangoContext *context,
- const PangoFontDescription *desc,
- FcPattern *pattern);
+PangoFcFont *_pango_cairo_fc_font_new (PangoCairoFcFontMap *cffontmap,
+ PangoFcFontKey *key);
FT_Library _pango_cairo_fc_font_map_get_library (PangoCairoFcFontMap *fontmap);
G_END_DECLS
Modified: trunk/pango/pangocairo-fcfont.c
==============================================================================
--- trunk/pango/pangocairo-fcfont.c (original)
+++ trunk/pango/pangocairo-fcfont.c Wed Jan 28 22:07:38 2009
@@ -169,52 +169,59 @@
********************/
static double
-get_font_size (PangoCairoFcFontMap *cffontmap,
- PangoContext *context,
- const PangoFontDescription *desc,
- FcPattern *pattern)
+get_font_size (const FcPattern *pattern)
{
double size;
-
- /* The reason why we read FC_PIXEL_SIZE here rather than just
- * using the specified size is to support operations like clamping
- * a font to a minimal readable size in fonts.conf. This is pretty weird,
- * since it could mean that changing the Cairo CTM doesn't change the
- * font size, but it's just a more radical version of the non-linear
- * font scaling we already have due to hinting and due to bitmap
- * fonts being only available at a few sizes.
- *
- * If honoring FC_PIXEL_SIZE gets in the way of more useful features
- * it should be removed since it only matters in the unusual case
- * of people doing exotic stuff in fonts.conf.
- */
+ double dpi;
if (FcPatternGetDouble (pattern, FC_PIXEL_SIZE, 0, &size) == FcResultMatch)
- return size * PANGO_SCALE / pango_matrix_get_font_scale_factor (pango_context_get_matrix (context));
+ return size * PANGO_SCALE;
/* Just in case FC_PIXEL_SIZE got unset between pango_fc_make_pattern()
- * and here.
+ * and here. That would be very weird.
*/
- if (pango_font_description_get_size_is_absolute (desc))
- return pango_font_description_get_size (desc);
- else
- {
- double dpi = pango_cairo_context_get_resolution (context);
- if (dpi <= 0)
- dpi = cffontmap->dpi;
+ if (FcPatternGetDouble (pattern, FC_DPI, 0, &dpi) != FcResultMatch)
+ dpi = 72;
+
+ if (FcPatternGetDouble (pattern, FC_SIZE, 0, &size) == FcResultMatch)
+ return size * dpi / 72.;
+
+ /* Whatever */
+ return 18.;
+}
+
+static gpointer
+get_gravity_class (void)
+{
+ static GEnumClass *class = NULL;
- return dpi * pango_font_description_get_size (desc) / 72.;
+ if (G_UNLIKELY (!class))
+ class = g_type_class_ref (PANGO_TYPE_GRAVITY);
+
+ return class;
+}
+
+static PangoGravity
+get_gravity (const FcPattern *pattern)
+{
+ char *s;
+
+ if (FcPatternGetString (pattern, PANGO_FC_GRAVITY, 0, (FcChar8 **)(void *)&s) == FcResultMatch)
+ {
+ GEnumValue *value = g_enum_get_value_by_nick (get_gravity_class (), s);
+ return value->value;
}
+
+ return PANGO_GRAVITY_SOUTH;
}
PangoFcFont *
-_pango_cairo_fc_font_new (PangoCairoFcFontMap *cffontmap,
- PangoContext *context,
- const PangoFontDescription *desc,
- FcPattern *pattern)
+_pango_cairo_fc_font_new (PangoCairoFcFontMap *cffontmap,
+ PangoFcFontKey *key)
{
PangoCairoFcFont *cffont;
+ const FcPattern *pattern = pango_fc_font_key_get_pattern (key);
cairo_matrix_t font_matrix;
FcMatrix *fc_matrix;
double size;
@@ -226,7 +233,8 @@
"pattern", pattern,
NULL);
- size = get_font_size (cffontmap, context, desc, pattern);
+ size = get_font_size (pattern) /
+ pango_matrix_get_font_scale_factor (pango_fc_font_key_get_matrix (key));
if (FcPatternGetMatrix (pattern,
FC_MATRIX, 0, &fc_matrix) == FcResultMatch)
@@ -244,9 +252,9 @@
_pango_cairo_font_private_initialize (&cffont->cf_priv,
(PangoCairoFont *) cffont,
- pango_font_description_get_gravity (desc),
- _pango_cairo_context_get_merged_font_options (context),
- pango_context_get_matrix (context),
+ get_gravity (pattern),
+ pango_fc_font_key_get_context_key (key),
+ pango_fc_font_key_get_matrix (key),
&font_matrix);
((PangoFcFont *)(cffont))->is_hinted = _pango_cairo_font_private_is_metrics_hinted (&cffont->cf_priv);
Modified: trunk/pango/pangocairo-fcfontmap.c
==============================================================================
--- trunk/pango/pangocairo-fcfontmap.c (original)
+++ trunk/pango/pangocairo-fcfontmap.c Wed Jan 28 22:07:38 2009
@@ -80,14 +80,14 @@
}
static void
-pango_cairo_fc_font_map_context_substitute (PangoFcFontMap *fcfontmap G_GNUC_UNUSED,
- PangoContext *context,
- FcPattern *pattern)
+pango_cairo_fc_font_map_font_key_substitute (PangoFcFontMap *fcfontmap G_GNUC_UNUSED,
+ PangoFcFontKey *fontkey,
+ FcPattern *pattern)
{
FcConfigSubstitute (NULL, pattern, FcMatchPattern);
- if (context)
- cairo_ft_font_options_substitute (_pango_cairo_context_get_merged_font_options (context),
+ if (fontkey)
+ cairo_ft_font_options_substitute (pango_fc_font_key_get_context_key (fontkey),
pattern);
FcDefaultSubstitute (pattern);
@@ -151,13 +151,11 @@
}
static PangoFcFont *
-pango_cairo_fc_font_map_create_font (PangoFcFontMap *fcfontmap,
- PangoContext *context,
- const PangoFontDescription *desc,
- FcPattern *pattern)
+pango_cairo_fc_font_map_create_font (PangoFcFontMap *fcfontmap,
+ PangoFcFontKey *key)
{
return _pango_cairo_fc_font_new ((PangoCairoFcFontMap *) (fcfontmap),
- context, desc, pattern);
+ key);
}
static void
@@ -168,7 +166,7 @@
gobject_class->finalize = pango_cairo_fc_font_map_finalize;
- fcfontmap_class->context_substitute = pango_cairo_fc_font_map_context_substitute;
+ fcfontmap_class->font_key_substitute = pango_cairo_fc_font_map_font_key_substitute;
fcfontmap_class->get_resolution = pango_cairo_fc_font_map_get_resolution_fc;
fcfontmap_class->context_key_get = pango_cairo_fc_font_map_context_key_get;
Modified: trunk/pango/pangofc-font.c
==============================================================================
--- trunk/pango/pangofc-font.c (original)
+++ trunk/pango/pangofc-font.c Wed Jan 28 22:07:38 2009
@@ -57,7 +57,7 @@
struct _PangoFcFontPrivate
{
PangoFcDecoder *decoder;
- gpointer context_key;
+ PangoFcFontKey *key;
GUnicharToGlyphCacheEntry *char_to_glyph_cache;
};
@@ -855,21 +855,21 @@
g_object_ref (priv->decoder);
}
-gpointer
-_pango_fc_font_get_context_key (PangoFcFont *fcfont)
+PangoFcFontKey *
+_pango_fc_font_get_font_key (PangoFcFont *fcfont)
{
PangoFcFontPrivate *priv = fcfont->priv;
- return priv->context_key;
+ return priv->key;
}
void
-_pango_fc_font_set_context_key (PangoFcFont *fcfont,
- gpointer context_key)
+_pango_fc_font_set_font_key (PangoFcFont *fcfont,
+ PangoFcFontKey *key)
{
PangoFcFontPrivate *priv = fcfont->priv;
- priv->context_key = context_key;
+ priv->key = key;
}
static FT_Glyph_Metrics *
Modified: trunk/pango/pangofc-fontmap.c
==============================================================================
--- trunk/pango/pangofc-fontmap.c (original)
+++ trunk/pango/pangofc-fontmap.c Wed Jan 28 22:07:38 2009
@@ -38,7 +38,6 @@
typedef struct _PangoFcPatternSet PangoFcPatternSet;
typedef struct _PangoFcFindFuncInfo PangoFcFindFuncInfo;
typedef struct _FontsetHashKey FontsetHashKey;
-typedef struct _FontHashKey FontHashKey;
#define PANGO_FC_TYPE_FAMILY (pango_fc_family_get_type ())
#define PANGO_FC_FAMILY(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), PANGO_FC_TYPE_FAMILY, PangoFcFamily))
@@ -136,6 +135,9 @@
PangoFontFamily ***families,
int *n_families);
+static double pango_fc_font_map_get_resolution (PangoFcFontMap *fcfontmap,
+ PangoContext *context);
+
static void pango_fc_font_map_cache_fontset (PangoFcFontMap *fcfontmap,
PangoFcPatternSet *patterns);
@@ -148,72 +150,16 @@
static gboolean pango_fc_coverage_key_equal (PangoFcCoverageKey *key1,
PangoFcCoverageKey *key2);
-static guint font_hash_key_hash (const FontHashKey *key);
-static gboolean font_hash_key_equal (const FontHashKey *key_a,
- const FontHashKey *key_b);
-static void font_hash_key_free (FontHashKey *key);
+static guint pango_fc_font_key_hash (const PangoFcFontKey *key);
+static gboolean pango_fc_font_key_equal (const PangoFcFontKey *key_a,
+ const PangoFcFontKey *key_b);
+static void pango_fc_font_key_free (PangoFcFontKey *key);
static guint fontset_hash_key_hash (const FontsetHashKey *key);
static gboolean fontset_hash_key_equal (const FontsetHashKey *key_a,
const FontsetHashKey *key_b);
static void fontset_hash_key_free (FontsetHashKey *key);
-G_DEFINE_ABSTRACT_TYPE (PangoFcFontMap, pango_fc_font_map, PANGO_TYPE_FONT_MAP)
-
-static void
-pango_fc_font_map_init (PangoFcFontMap *fcfontmap)
-{
- static gboolean registered_modules = FALSE;
- PangoFcFontMapPrivate *priv;
-
- priv = fcfontmap->priv = G_TYPE_INSTANCE_GET_PRIVATE (fcfontmap,
- PANGO_TYPE_FC_FONT_MAP,
- PangoFcFontMapPrivate);
-
- if (!registered_modules)
- {
- int i;
-
- registered_modules = TRUE;
-
- for (i = 0; _pango_included_fc_modules[i].list; i++)
- pango_module_register (&_pango_included_fc_modules[i]);
- }
-
- priv->n_families = -1;
-
- priv->font_hash = g_hash_table_new_full ((GHashFunc)font_hash_key_hash,
- (GEqualFunc)font_hash_key_equal,
- (GDestroyNotify)font_hash_key_free,
- NULL);
- priv->fontset_hash = g_hash_table_new_full ((GHashFunc)fontset_hash_key_hash,
- (GEqualFunc)fontset_hash_key_equal,
- (GDestroyNotify)fontset_hash_key_free,
- (GDestroyNotify)pango_fc_pattern_set_free);
-
- priv->coverage_hash = g_hash_table_new_full ((GHashFunc)pango_fc_coverage_key_hash,
- (GEqualFunc)pango_fc_coverage_key_equal,
- (GDestroyNotify)g_free,
- (GDestroyNotify)pango_coverage_unref);
- priv->fontset_cache = g_queue_new ();
- priv->dpi = -1;
-}
-
-static void
-pango_fc_font_map_class_init (PangoFcFontMapClass *class)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (class);
- PangoFontMapClass *fontmap_class = PANGO_FONT_MAP_CLASS (class);
-
- object_class->finalize = pango_fc_font_map_finalize;
- fontmap_class->load_font = pango_fc_font_map_load_font;
- fontmap_class->load_fontset = pango_fc_font_map_load_fontset;
- fontmap_class->list_families = pango_fc_font_map_list_families;
- fontmap_class->shape_engine_type = PANGO_RENDER_TYPE_FC;
-
- g_type_class_add_private (object_class, sizeof (PangoFcFontMapPrivate));
-}
-
static gpointer
get_gravity_class (void)
{
@@ -283,10 +229,10 @@
gpointer context_key;
};
-struct _FontHashKey {
+struct _PangoFcFontKey {
PangoFcFontMap *fontmap;
+ const FcPattern *pattern;
PangoMatrix matrix;
- FcPattern *pattern;
gpointer context_key;
};
@@ -378,15 +324,16 @@
return key;
}
+/*
+ * PangoFcFontKey
+ */
+
static gboolean
-font_hash_key_equal (const FontHashKey *key_a,
- const FontHashKey *key_b)
+pango_fc_font_key_equal (const PangoFcFontKey *key_a,
+ const PangoFcFontKey *key_b)
{
- if (key_a->matrix.xx == key_b->matrix.xx &&
- key_a->matrix.xy == key_b->matrix.xy &&
- key_a->matrix.yx == key_b->matrix.yx &&
- key_a->matrix.yy == key_b->matrix.yy &&
- key_a->pattern == key_b->pattern)
+ if (key_a->pattern == key_b->pattern &&
+ 0 == memcmp (&key_a->matrix, &key_b->matrix, 4 * sizeof (double)))
{
if (key_a->context_key && key_b->context_key)
return PANGO_FC_FONT_MAP_GET_CLASS (key_a->fontmap)->context_key_equal (key_a->fontmap,
@@ -400,7 +347,7 @@
}
static guint
-font_hash_key_hash (const FontHashKey *key)
+pango_fc_font_key_hash (const PangoFcFontKey *key)
{
guint32 hash = FNV1_32_INIT;
@@ -417,23 +364,23 @@
}
static void
-font_hash_key_free (FontHashKey *key)
+pango_fc_font_key_free (PangoFcFontKey *key)
{
if (key->context_key)
PANGO_FC_FONT_MAP_GET_CLASS (key->fontmap)->context_key_free (key->fontmap,
key->context_key);
- g_slice_free (FontHashKey, key);
+ g_slice_free (PangoFcFontKey, key);
}
-static FontHashKey *
-font_hash_key_copy (FontHashKey *old)
+static PangoFcFontKey *
+pango_fc_font_key_copy (PangoFcFontKey *old)
{
- FontHashKey *key = g_slice_new (FontHashKey);
+ PangoFcFontKey *key = g_slice_new (PangoFcFontKey);
key->fontmap = old->fontmap;
- key->matrix = old->matrix;
key->pattern = old->pattern;
+ key->matrix = old->matrix;
if (old->context_key)
key->context_key = PANGO_FC_FONT_MAP_GET_CLASS (key->fontmap)->context_key_copy (key->fontmap,
old->context_key);
@@ -443,6 +390,147 @@
return key;
}
+static void
+get_context_matrix (PangoContext *context,
+ PangoMatrix *matrix)
+{
+ const PangoMatrix *set_matrix;
+ static const PangoMatrix identity = PANGO_MATRIX_INIT;
+
+ set_matrix = context ? pango_context_get_matrix (context) : NULL;
+ *matrix = set_matrix ? *set_matrix : identity;
+}
+
+static void
+pango_fc_font_key_init (PangoFcFontKey *key,
+ PangoFcFontMap *fcfontmap,
+ PangoContext *context,
+ const FcPattern *pattern)
+{
+ key->fontmap = fcfontmap;
+ key->pattern = pattern;
+
+ get_context_matrix (context, &key->matrix);
+ key->matrix.x0 = key->matrix.y0 = 0.;
+
+ if (PANGO_FC_FONT_MAP_GET_CLASS (fcfontmap)->context_key_get)
+ key->context_key = (gpointer)PANGO_FC_FONT_MAP_GET_CLASS (fcfontmap)->context_key_get (fcfontmap, context);
+ else
+ key->context_key = NULL;
+}
+
+/* Public API */
+
+/**
+ * pango_fc_font_key_get_pattern:
+ * @key: the font key
+ *
+ * Gets the fontconfig pattern member of @key.
+ *
+ * Returns: the pattern, which is owned by @key and should not be modified.
+ *
+ * Since: 1.24
+ **/
+const FcPattern *
+pango_fc_font_key_get_pattern (const PangoFcFontKey *key)
+{
+ return key->pattern;
+}
+
+/**
+ * pango_fc_font_key_get_matrix:
+ * @key: the font key
+ *
+ * Gets the matrix member of @key.
+ *
+ * Returns: the matrix, which is owned by @key and should not be modified.
+ *
+ * Since: 1.24
+ **/
+const PangoMatrix *
+pango_fc_font_key_get_matrix (const PangoFcFontKey *key)
+{
+ return &key->matrix;
+}
+
+/**
+ * pango_fc_font_key_get_context_key:
+ * @key: the font key
+ *
+ * Gets the context key member of @key.
+ *
+ * Returns: the context key, which is owned by @key and should not be modified.
+ *
+ * Since: 1.24
+ **/
+gpointer
+pango_fc_font_key_get_context_key (const PangoFcFontKey *key)
+{
+ return key->context_key;
+}
+
+
+/*
+ * PangoFcFontMap
+ */
+
+G_DEFINE_ABSTRACT_TYPE (PangoFcFontMap, pango_fc_font_map, PANGO_TYPE_FONT_MAP)
+
+static void
+pango_fc_font_map_init (PangoFcFontMap *fcfontmap)
+{
+ static gboolean registered_modules = FALSE;
+ PangoFcFontMapPrivate *priv;
+
+ priv = fcfontmap->priv = G_TYPE_INSTANCE_GET_PRIVATE (fcfontmap,
+ PANGO_TYPE_FC_FONT_MAP,
+ PangoFcFontMapPrivate);
+
+ if (!registered_modules)
+ {
+ int i;
+
+ registered_modules = TRUE;
+
+ for (i = 0; _pango_included_fc_modules[i].list; i++)
+ pango_module_register (&_pango_included_fc_modules[i]);
+ }
+
+ priv->n_families = -1;
+
+ priv->font_hash = g_hash_table_new_full ((GHashFunc)pango_fc_font_key_hash,
+ (GEqualFunc)pango_fc_font_key_equal,
+ (GDestroyNotify)pango_fc_font_key_free,
+ NULL);
+ priv->fontset_hash = g_hash_table_new_full ((GHashFunc)fontset_hash_key_hash,
+ (GEqualFunc)fontset_hash_key_equal,
+ (GDestroyNotify)fontset_hash_key_free,
+ (GDestroyNotify)pango_fc_pattern_set_free);
+
+ priv->coverage_hash = g_hash_table_new_full ((GHashFunc)pango_fc_coverage_key_hash,
+ (GEqualFunc)pango_fc_coverage_key_equal,
+ (GDestroyNotify)g_free,
+ (GDestroyNotify)pango_coverage_unref);
+ priv->fontset_cache = g_queue_new ();
+ priv->dpi = -1;
+}
+
+static void
+pango_fc_font_map_class_init (PangoFcFontMapClass *class)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (class);
+ PangoFontMapClass *fontmap_class = PANGO_FONT_MAP_CLASS (class);
+
+ object_class->finalize = pango_fc_font_map_finalize;
+ fontmap_class->load_font = pango_fc_font_map_load_font;
+ fontmap_class->load_fontset = pango_fc_font_map_load_fontset;
+ fontmap_class->list_families = pango_fc_font_map_list_families;
+ fontmap_class->shape_engine_type = PANGO_RENDER_TYPE_FC;
+
+ g_type_class_add_private (object_class, sizeof (PangoFcFontMapPrivate));
+}
+
+
/**
* pango_fc_font_map_add_decoder_find_func:
* @fcfontmap: The #PangoFcFontMap to add this method to.
@@ -515,47 +603,14 @@
G_OBJECT_CLASS (pango_fc_font_map_parent_class)->finalize (object);
}
-static void
-get_context_matrix (PangoContext *context,
- PangoMatrix *matrix)
-{
- const PangoMatrix *set_matrix;
- static const PangoMatrix identity = PANGO_MATRIX_INIT;
-
- if (context)
- set_matrix = pango_context_get_matrix (context);
- else
- set_matrix = NULL;
-
- if (set_matrix)
- *matrix = *set_matrix;
- else
- *matrix = identity;
-}
-
-static void
-font_hash_key_for_context (PangoFcFontMap *fcfontmap,
- PangoContext *context,
- FontHashKey *key)
-{
- key->fontmap = fcfontmap;
- get_context_matrix (context, &key->matrix);
-
- if (PANGO_FC_FONT_MAP_GET_CLASS (fcfontmap)->context_key_get)
- key->context_key = (gpointer)PANGO_FC_FONT_MAP_GET_CLASS (fcfontmap)->context_key_get (fcfontmap, context);
- else
- key->context_key = NULL;
-}
-
/* Add a mapping from fcfont->font_pattern to fcfont */
static void
pango_fc_font_map_add (PangoFcFontMap *fcfontmap,
- PangoContext *context,
+ PangoFcFontKey *key,
PangoFcFont *fcfont)
{
PangoFcFontMapPrivate *priv = fcfontmap->priv;
- FontHashKey key;
- FontHashKey *key_copy;
+ PangoFcFontKey *key_copy;
g_assert (fcfont->fontmap == NULL);
fcfont->fontmap = (PangoFontMap *) fcfontmap;
@@ -564,46 +619,26 @@
* here though as PangoFcFontMap already cleans up fcfont->fontmap
* as part of it's caching scheme. */
- font_hash_key_for_context (fcfontmap, context, &key);
- key.pattern = fcfont->font_pattern;
-
- key_copy = font_hash_key_copy (&key);
- _pango_fc_font_set_context_key (fcfont, key_copy->context_key);
- fcfont->matrix = key.matrix;
+ key_copy = pango_fc_font_key_copy (key);
+ _pango_fc_font_set_font_key (fcfont, key_copy);
+ fcfont->matrix = key_copy->matrix;
g_hash_table_insert (priv->font_hash, key_copy, fcfont);
}
-static PangoFcFont *
-pango_fc_font_map_lookup (PangoFcFontMap *fcfontmap,
- PangoContext *context,
- FcPattern *pattern)
-{
- PangoFcFontMapPrivate *priv = fcfontmap->priv;
- FontHashKey key;
-
- font_hash_key_for_context (fcfontmap, context, &key);
- key.pattern = pattern;
-
- return g_hash_table_lookup (priv->font_hash, &key);
-}
-
/* Remove mapping from fcfont->font_pattern to fcfont */
void
_pango_fc_font_map_remove (PangoFcFontMap *fcfontmap,
PangoFcFont *fcfont)
{
PangoFcFontMapPrivate *priv = fcfontmap->priv;
- FontHashKey key;
+ PangoFcFontKey *key;
- key.fontmap = fcfontmap;
- key.matrix = fcfont->matrix;
- key.pattern = fcfont->font_pattern;
- key.context_key = _pango_fc_font_get_context_key (fcfont);
+ key = _pango_fc_font_get_font_key (fcfont);
- g_hash_table_remove (priv->font_hash, &key);
+ g_hash_table_remove (priv->font_hash, key);
fcfont->fontmap = NULL;
- _pango_fc_font_set_context_key (fcfont, NULL);
+ _pango_fc_font_set_font_key (fcfont, NULL);
}
static PangoFcFamily *
@@ -832,6 +867,7 @@
#ifdef FC_VERTICAL_LAYOUT
FC_VERTICAL_LAYOUT, FcTypeBool, vertical,
#endif
+ FC_DPI, FcTypeDouble, dpi,
FC_SIZE, FcTypeDouble, pixel_size * (72. / dpi),
FC_PIXEL_SIZE, FcTypeDouble, pixel_size,
NULL);
@@ -861,7 +897,6 @@
static PangoFont *
pango_fc_font_map_new_font (PangoFontMap *fontmap,
PangoContext *context,
- const PangoFontDescription *description,
FcPattern *match)
{
PangoFcFontMapClass *class;
@@ -870,11 +905,14 @@
FcPattern *pattern;
PangoFcFont *fcfont;
GSList *l;
+ PangoFcFontKey key;
if (priv->closed)
return NULL;
- fcfont = pango_fc_font_map_lookup (fcfontmap, context, match);
+ pango_fc_font_key_init (&key, fcfontmap, context, match);
+
+ fcfont = g_hash_table_lookup (priv->font_hash, &key);
if (fcfont)
return g_object_ref (fcfont);
@@ -883,9 +921,7 @@
if (class->create_font)
{
fcfont = PANGO_FC_FONT_MAP_GET_CLASS (fontmap)->create_font (fcfontmap,
- context,
- description,
- match);
+ &key);
}
else
{
@@ -922,7 +958,7 @@
if (!fcfont)
return NULL;
- pango_fc_font_map_add (fcfontmap, context, fcfont);
+ pango_fc_font_map_add (fcfontmap, &key, fcfont);
/*
* Give any custom decoders a crack at this font now that it's been
@@ -974,16 +1010,16 @@
static void
pango_fc_default_substitute (PangoFcFontMap *fontmap,
- PangoContext *context,
+ PangoFcFontKey *fontkey,
FcPattern *pattern)
{
- if (PANGO_FC_FONT_MAP_GET_CLASS (fontmap)->context_substitute)
- PANGO_FC_FONT_MAP_GET_CLASS (fontmap)->context_substitute (fontmap, context, pattern);
+ if (PANGO_FC_FONT_MAP_GET_CLASS (fontmap)->font_key_substitute)
+ PANGO_FC_FONT_MAP_GET_CLASS (fontmap)->font_key_substitute (fontmap, fontkey, pattern);
else if (PANGO_FC_FONT_MAP_GET_CLASS (fontmap)->default_substitute)
PANGO_FC_FONT_MAP_GET_CLASS (fontmap)->default_substitute (fontmap, pattern);
}
-static gdouble
+static double
pango_fc_font_map_get_resolution (PangoFcFontMap *fcfontmap,
PangoContext *context)
{
@@ -1064,11 +1100,14 @@
if (patterns == NULL)
{
+ PangoFcFontKey fontkey;
+
pattern = pango_fc_make_pattern (desc, language,
key.scaled_size / 1024.,
pango_fc_font_map_get_resolution (fcfontmap, context));
- pango_fc_default_substitute (fcfontmap, context, pattern);
+ pango_fc_font_key_init (&fontkey, fcfontmap, context, pattern);
+ pango_fc_default_substitute (fcfontmap, &fontkey, pattern);
font_patterns = FcFontSort (NULL, pattern, FcTrue, NULL, &res);
@@ -1238,8 +1277,7 @@
{
PangoFont *font;
- font = pango_fc_font_map_new_font (fontmap, context, desc,
- patterns->patterns[i]);
+ font = pango_fc_font_map_new_font (fontmap, context, patterns->patterns[i]);
if (font)
pango_fontset_simple_append (simple, font);
}
Modified: trunk/pango/pangofc-fontmap.h
==============================================================================
--- trunk/pango/pangofc-fontmap.h (original)
+++ trunk/pango/pangofc-fontmap.h Wed Jan 28 22:07:38 2009
@@ -29,6 +29,24 @@
G_BEGIN_DECLS
+/**
+ * PangoFcFontKey:
+ *
+ * An opaque structure containing all the information needed for
+ * loading a font #PangoFcFont.
+ *
+ * Since: 1.24
+ **/
+typedef struct _PangoFcFontKey PangoFcFontKey;
+
+const FcPattern *pango_fc_font_key_get_pattern (const PangoFcFontKey *key);
+const PangoMatrix *pango_fc_font_key_get_matrix (const PangoFcFontKey *key);
+gpointer pango_fc_font_key_get_context_key (const PangoFcFontKey *key);
+
+/*
+ * PangoFcFontMap
+ */
+
#define PANGO_TYPE_FC_FONT_MAP (pango_fc_font_map_get_type ())
#define PANGO_FC_FONT_MAP(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), PANGO_TYPE_FC_FONT_MAP, PangoFcFontMap))
#define PANGO_IS_FC_FONT_MAP(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), PANGO_TYPE_FC_FONT_MAP))
@@ -64,7 +82,7 @@
* @default_substitute: Substitutes in default values for
* unspecified fields in a #FcPattern. This will be called
* prior to creating a font for the pattern. May be %NULL.
- * Deprecated in favor of @context_substitute().
+ * Deprecated in favor of @font_key_substitute().
* @new_font: Creates a new #PangoFcFont for the specified
* pattern of the appropriate type for this font map. The
* @pattern argument must be passed to the "pattern" property
@@ -87,15 +105,18 @@
* @context_key_copy.
* @context_key_hash: Gets a hash value for a context key
* @context_key_equal: Compares two context keys for equality.
- * @create_font: Creates a new #PangoFcFont for the specified
- * pattern of the appropriate type for this font map using
- * information from the context that is passed in. The
- * @pattern argument must be passed to the "pattern" property
- * of #PangoFcFont when you call g_object_new(). Deprecated
- * in favor of @create_font(). If %NULL, new_font() is used.
- * @context_substitute: Substitutes in default values for
+ * @font_key_substitute: Substitutes in default values for
* unspecified fields in a #FcPattern. This will be called
* prior to creating a font for the pattern. May be %NULL.
+ * (Since: 1.24)
+ * @create_font: Creates a new #PangoFcFont for the specified
+ * pattern of the appropriate type for this font map using
+ * information from the font key that is passed in. The
+ * @pattern member of @font_key can be retrieved using
+ * pango_fc_font_key_get_pattern() and must be passed to
+ * the "pattern" property of #PangoFcFont when you call
+ * g_object_new(). If %NULL, new_font() is used.
+ * (Since: 1.24)
*
* Class structure for #PangoFcFontMap.
**/
@@ -105,7 +126,7 @@
PangoFontMapClass parent_class;
/*< public >*/
- /* Deprecated in favor of context_substitute */
+ /* Deprecated in favor of font_key_substitute */
void (*default_substitute) (PangoFcFontMap *fontmap,
FcPattern *pattern);
/* Deprecated in favor of create_font */
@@ -127,13 +148,11 @@
gconstpointer key_a,
gconstpointer key_b);
- void (*context_substitute) (PangoFcFontMap *fontmap,
- PangoContext *context,
+ void (*font_key_substitute)(PangoFcFontMap *fontmap,
+ PangoFcFontKey *fontkey,
FcPattern *pattern);
PangoFcFont *(*create_font) (PangoFcFontMap *fontmap,
- PangoContext *context,
- const PangoFontDescription *desc,
- FcPattern *pattern);
+ PangoFcFontKey *fontkey);
/*< private >*/
/* Padding for future expansion */
Modified: trunk/pango/pangofc-private.h
==============================================================================
--- trunk/pango/pangofc-private.h (original)
+++ trunk/pango/pangofc-private.h Wed Jan 28 22:07:38 2009
@@ -54,9 +54,9 @@
void _pango_fc_font_set_decoder (PangoFcFont *font,
PangoFcDecoder *decoder);
-gpointer _pango_fc_font_get_context_key (PangoFcFont *font);
-void _pango_fc_font_set_context_key (PangoFcFont *font,
- gpointer context_key);
+PangoFcFontKey *_pango_fc_font_get_font_key (PangoFcFont *fcfont);
+void _pango_fc_font_set_font_key (PangoFcFont *fcfont,
+ PangoFcFontKey *key);
void pango_fc_font_get_raw_extents (PangoFcFont *font,
FT_Int32 load_flags,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]