summaryrefslogtreecommitdiff
path: root/pango/pangofc-font.c
diff options
context:
space:
mode:
authorChristopher Blizzard <blizzard@redhat.com>2004-06-09 22:03:18 +0000
committerChristopher Blizzard <blizzard@src.gnome.org>2004-06-09 22:03:18 +0000
commit5ca931f88a431fa7158a8e406d3bf92a1bdafd07 (patch)
treeef7933a8755cd870fa96267cab67ce9d0f4d280f /pango/pangofc-font.c
parentd2f58271eab023e452d84a8dd855ad06151d0eb6 (diff)
downloadpango-5ca931f88a431fa7158a8e406d3bf92a1bdafd07.tar.gz
Add export of pangofc-decoder.h. Build pangofc-decoder.c.
Wed Jun 9 17:32:59 2004 Christopher Blizzard <blizzard@redhat.com> * pango/Makefile.am: Add export of pangofc-decoder.h. Build pangofc-decoder.c. * pango/pangofc-decoder.h pango/pangofc-decoder.c: New files. Virtual base class for any custom font decoders. * pango/pangofc-font.c: Add new PangoFcFontPrivate structure. * pango/pangofc-font.c (pango_fc_font_class_init): Attach new private structure using g_type_class_add_private(). * pango/pangofc-font.c (pango_fc_font_finalize): Make sure to unset any decoders that are attached to the font. * pango/pangofc-font.c (pango_fc_font_get_coverage): When determining coverage, use a custom decoder if available. * pango/pangofc-font.c (pango_fc_font_has_char): When determining if a font has a character, use a custom decoder if available. * pango/pangofc-font.c (pango_fc_font_get_glyph): When doing single character to glyph convertions, use a custom decoder if available. * pango/pangofc-font.c (_pango_fc_font_get_decoder): New function. Get the custom decoder for the given font. * pango/pangofc-font.c (_pango_fc_font_set_decoder): New function. Set a custom decoder for the given font. * pango/pangofc-fontmap.c: Add structure PangoFcFindFuncInfo to keep track of callbacks to create custom decoders. Modify PangoFcFontMapPrivate by adding a list of PangoFcFontFuncInfo callbacks that have been registered. * pango/pangofc-fontmap.c (pango_fc_font_map_add_find_func): New function. Add callbacks to the fontmap that will create custom decoders when pango creates new fonts. * pango/pangofc-fontmap.c (pango_fc_font_map_finalize): Clear out any findfuncs that have been registered and notify them about destruction. * pango/pangofc-fontmap.c (pango_fc_font_map_new_font): When creating new fonts, call back to any registered find functions so they can create custom decoders for those fonts. Attach those custom decoders to the newly created fonts. * pango/pangofc-fontmap.c (_pango_fc_font_map_get_coverage): Change the argument to take a PangoFcFont instead of an FcPattern. Call _pango_fc_font_map_fc_to_coverage instead of doing the conversion inline. * pango/pangofc-fontmap.c (_pango_fc_font_map_fc_to_coverage): New function. Convert an FcCharSet to a PangoCoverage object. * pango/pangofc-fontmap.h: New declarations for pango_fc_font_map_add_decoder_find_func and PangoFcDecoderFindFunc. * pango/pangofc-private.h: New declarations for _pango_fc_font_map_fc_to_coverage, _pango_fc_font_get_decoder and _pango_fc_font_set_decoder.
Diffstat (limited to 'pango/pangofc-font.c')
-rw-r--r--pango/pangofc-font.c84
1 files changed, 83 insertions, 1 deletions
diff --git a/pango/pangofc-font.c b/pango/pangofc-font.c
index de43513d..a7e35ebf 100644
--- a/pango/pangofc-font.c
+++ b/pango/pangofc-font.c
@@ -48,6 +48,15 @@ enum {
PROP_PATTERN
};
+typedef struct _PangoFcFontPrivate PangoFcFontPrivate;
+
+#define PANGO_FC_FONT_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), PANGO_TYPE_FC_FONT, PangoFcFontPrivate))
+
+struct _PangoFcFontPrivate
+{
+ PangoFcDecoder *decoder;
+};
+
static void pango_fc_font_class_init (PangoFcFontClass *class);
static void pango_fc_font_finalize (GObject *object);
static void pango_fc_font_set_property (GObject *object,
@@ -114,6 +123,8 @@ pango_fc_font_class_init (PangoFcFontClass *class)
"Pattern",
"The fontconfig pattern for this font",
G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
+
+ g_type_class_add_private (object_class, sizeof (PangoFcFontPrivate));
}
static void
@@ -127,6 +138,7 @@ static void
pango_fc_font_finalize (GObject *object)
{
PangoFcFont *fcfont = PANGO_FC_FONT (object);
+ PangoFcFontPrivate *priv = PANGO_FC_FONT_GET_PRIVATE (fcfont);
g_slist_foreach (fcfont->metrics_by_lang, (GFunc)free_metrics_info, NULL);
g_slist_free (fcfont->metrics_by_lang);
@@ -137,6 +149,9 @@ pango_fc_font_finalize (GObject *object)
FcPatternDestroy (fcfont->font_pattern);
pango_font_description_free (fcfont->description);
+ if (priv->decoder)
+ _pango_fc_font_set_decoder (fcfont, NULL);
+
parent_class->finalize (object);
}
@@ -206,9 +221,17 @@ pango_fc_font_get_coverage (PangoFont *font,
PangoLanguage *language)
{
PangoFcFont *fcfont = (PangoFcFont *)font;
+ PangoFcFontPrivate *priv = PANGO_FC_FONT_GET_PRIVATE (fcfont);
+ FcCharSet *charset;
+
+ if (priv->decoder)
+ {
+ charset = pango_fc_decoder_get_charset (priv->decoder, fcfont);
+ return _pango_fc_font_map_fc_to_coverage (charset);
+ }
return _pango_fc_font_map_get_coverage (PANGO_FC_FONT_MAP (fcfont->fontmap),
- fcfont->font_pattern);
+ fcfont);
}
static void
@@ -472,8 +495,17 @@ gboolean
pango_fc_font_has_char (PangoFcFont *font,
gunichar wc)
{
+ PangoFcFontPrivate *priv = PANGO_FC_FONT_GET_PRIVATE (font);
+ FcCharSet *charset;
+
g_return_val_if_fail (PANGO_IS_FC_FONT (font), FALSE);
+ if (priv->decoder)
+ {
+ charset = pango_fc_decoder_get_charset (priv->decoder, font);
+ return FcCharSetHasChar (charset, wc);
+ }
+
return PANGO_FC_FONT_GET_CLASS (font)->has_char (font, wc);
}
@@ -495,8 +527,13 @@ PangoGlyph
pango_fc_font_get_glyph (PangoFcFont *font,
gunichar wc)
{
+ PangoFcFontPrivate *priv = PANGO_FC_FONT_GET_PRIVATE (font);
+
g_return_val_if_fail (PANGO_IS_FC_FONT (font), 0);
+ if (priv->decoder)
+ return pango_fc_decoder_get_glyph (priv->decoder, font, wc);
+
return PANGO_FC_FONT_GET_CLASS (font)->get_glyph (font, wc);
}
@@ -577,3 +614,48 @@ pango_fc_font_kern_glyphs (PangoFcFont *font,
pango_fc_font_unlock_face (font);
}
+
+/**
+ * _pango_fc_font_get_decoder
+ * @font: a #PangoFcFont
+ *
+ * This will return any custom decoder set on this font.
+ *
+ * Returns: The custom decoder
+ *
+ * Since: 1.6
+ **/
+
+PangoFcDecoder *
+_pango_fc_font_get_decoder (PangoFcFont *font)
+{
+ PangoFcFontPrivate *priv = PANGO_FC_FONT_GET_PRIVATE (font);
+
+ return priv->decoder;
+}
+
+/**
+ * _pango_fc_font_set_decoder
+ * @font: a #PangoFcFont
+ * @decoder: a #PangoFcDecoder to set for this font
+ *
+ * This sets a custom decoder for this font. Any previous decoder
+ * will be released before this one is set.
+ *
+ * Since: 1.6
+ **/
+
+void
+_pango_fc_font_set_decoder (PangoFcFont *font,
+ PangoFcDecoder *decoder)
+{
+ PangoFcFontPrivate *priv = PANGO_FC_FONT_GET_PRIVATE (font);
+
+ if (priv->decoder)
+ g_object_unref (priv->decoder);
+
+ priv->decoder = decoder;
+
+ if (priv->decoder)
+ g_object_ref (priv->decoder);
+}