summaryrefslogtreecommitdiff
path: root/pango
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>2003-04-14 23:48:34 +0000
committerOwen Taylor <otaylor@src.gnome.org>2003-04-14 23:48:34 +0000
commit402f2625c2c779df20470ed0f758999db494e4dc (patch)
tree6667e384ed0c39a22a6e3f731c062311fa7b3e9a /pango
parentf6fdd34661bd9fe23452b5eb98ece8488a12ce8f (diff)
downloadpango-402f2625c2c779df20470ed0f758999db494e4dc.tar.gz
Switch over the way that module entry points work, taking advantage of the
Mon Apr 14 06:02:34 2003 Owen Taylor <otaylor@redhat.com> * modules/thai/{thai-fc.c,thai-shaper.c,thai-x.c}: * modules/*/*-{xft,x,win32.c} pango/pango-engine.h modules/*/Makefile.am: Switch over the way that module entry points work, taking advantage of the new automake capability for per-target CFLAGS for shared sources. * pango/pangofc-font.[ch] pango/pangoxft-font.c pango/pangoft2.c: Add a base class for PangoXft and PangoFT2 font classes so code can be shared between FT2 and Xft backends. * configure.in modules/*/Makefile.am modules/{arabic,basic,hangul,hebrew,indic,thai}: Move *-xft.c to *-fc.c and share between Xft and FT2 backends; adds FT2 backend capabilities for hangul/indic/thai. * pango/pangoxft.h pango/pangoft2.h: Deprecate APIs that moved into PangoFcFont * modules/basic/basic-fc.c (set_glyph): Add kerning handling from FT2 backend.
Diffstat (limited to 'pango')
-rw-r--r--pango/Makefile.am4
-rw-r--r--pango/pango-engine.h18
-rw-r--r--pango/pangofc-font.c175
-rw-r--r--pango/pangofc-font.h94
-rw-r--r--pango/pangoft2.c125
-rw-r--r--pango/pangoft2.h5
-rw-r--r--pango/pangoxft-font.c137
-rw-r--r--pango/pangoxft-private.h2
-rw-r--r--pango/pangoxft.h5
9 files changed, 514 insertions, 51 deletions
diff --git a/pango/Makefile.am b/pango/Makefile.am
index b0702b26..66d5d9e9 100644
--- a/pango/Makefile.am
+++ b/pango/Makefile.am
@@ -78,6 +78,7 @@ libpango_1_0_la_SOURCES = \
pango-markup.c \
pango-tabs.c \
pango-utils.c \
+ pangofc-font.c \
reorder-items.c \
shape.c \
pango-enum-types.c
@@ -100,7 +101,8 @@ pango_headers = \
pango-modules.h \
pango-tabs.h \
pango-types.h \
- pango-utils.h
+ pango-utils.h \
+ pangofc-font.h
pangoinclude_HEADERS = \
$(pango_headers) \
diff --git a/pango/pango-engine.h b/pango/pango-engine.h
index 1c33b9df..0a7ada25 100644
--- a/pango/pango-engine.h
+++ b/pango/pango-engine.h
@@ -94,6 +94,24 @@ void script_engine_list (PangoEngineInfo **engines,
PangoEngine *script_engine_load (const char *id);
void script_engine_unload (PangoEngine *engine);
+/* Macro used for possibly builtin Pango modules. Not useful
+ * for externally build modules. If we are compiling a module standaline,
+ * then we name the entry points script_engine_list, etc. But if we
+ * are compiling it for inclusion directly in Pango, then we need them to
+ * to have distinct names for this module, so we prepend a prefix.
+ *
+ * The two intermediate macros are to deal with details of the C
+ * preprocessor; token pasting tokens must be function arguments,
+ * and macro substitution isn't used on function arguments that
+ * are used for token pasting.
+ */
+#ifdef PANGO_MODULE_PREFIX
+#define PANGO_MODULE_ENTRY(func) _PANGO_MODULE_ENTRY2(PANGO_MODULE_PREFIX,func)
+#define _PANGO_MODULE_ENTRY2(prefix,func) _PANGO_MODULE_ENTRY3(prefix,func)
+#define _PANGO_MODULE_ENTRY3(prefix,func) prefix##_script_engine_##func
+#else
+#define PANGO_MODULE_ENTRY(func) script_engine_##func
+#endif
#endif /* PANGO_ENABLE_ENGINE */
diff --git a/pango/pangofc-font.c b/pango/pangofc-font.c
new file mode 100644
index 00000000..64d20ab8
--- /dev/null
+++ b/pango/pangofc-font.c
@@ -0,0 +1,175 @@
+/* Pango
+ * pangofc-font.c: Shared interfaces for fontconfig-based backends
+ *
+ * Copyright (C) 2003 Red Hat Software
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "pangofc-font.h"
+
+GType
+pango_fc_font_get_type (void)
+{
+ static GType object_type = 0;
+
+ if (!object_type)
+ {
+ static const GTypeInfo object_info =
+ {
+ sizeof (PangoFcFontClass),
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
+ NULL, /* class_init */
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof (PangoFcFont),
+ 0, /* n_preallocs */
+ NULL /* init */
+ };
+
+ object_type = g_type_register_static (PANGO_TYPE_FONT,
+ "PangoFcFont",
+ &object_info, 0);
+ }
+
+ return object_type;
+}
+
+/**
+ * pango_fc_font_lock_face:
+ * @font: a #PangoFcFont.
+ *
+ * Gets the FreeType FT_Face associated with a font,
+ * This face will be kept around until you call
+ * pango_fc_font_unlock_face().
+ *
+ * Returns: the FreeType FT_Face associated with @font.
+ *
+ * Since: 1.4
+ **/
+FT_Face
+pango_fc_font_lock_face (PangoFcFont *font)
+{
+ g_return_val_if_fail (PANGO_IS_FC_FONT (font), NULL);
+
+ return PANGO_FC_FONT_GET_CLASS (font)->lock_face (font);
+}
+
+/**
+ * pango_fc_font_unlock_face:
+ * @font: a #PangoFcFont.
+ *
+ * Releases a font previously obtained with
+ * pango_fc_font_lock_face().
+ *
+ * Since: 1.4
+ **/
+void
+pango_fc_font_unlock_face (PangoFcFont *font)
+{
+ g_return_if_fail (PANGO_IS_FC_FONT (font));
+
+ PANGO_FC_FONT_GET_CLASS (font)->unlock_face (font);
+}
+
+/**
+ * pango_fc_font_has_char:
+ * @font: a #PangoFcFont
+ * @wc: Unicode codepoint to look up
+ *
+ * Determines whether @font has a glyph for the codepoint @wc.
+ *
+ * Return value: %TRUE if @font has the requested codepoint.
+ *
+ * Since: 1.4
+ **/
+gboolean
+pango_fc_font_has_char (PangoFcFont *font,
+ gunichar wc)
+{
+ g_return_val_if_fail (PANGO_IS_FC_FONT (font), FALSE);
+
+ return PANGO_FC_FONT_GET_CLASS (font)->has_char (font, wc);
+}
+
+/**
+ * pango_fc_font_get_glyph:
+ * @font: a #PangoFcFont
+ * @wc: Unicode codepoint to look up
+ *
+ * Gets the glyph index for a given unicode codepoint
+ * for @font. If you only want to determine
+ * whether the font has the glyph, use pango_fc_font_has_char().
+ *
+ * Return value: the glyph index, or 0, if the unicode
+ * codepoint doesn't exist in the font.
+ *
+ * Since: 1.4
+ **/
+PangoGlyph
+pango_fc_font_get_glyph (PangoFcFont *font,
+ gunichar wc)
+{
+ g_return_val_if_fail (PANGO_IS_FC_FONT (font), 0);
+
+ return PANGO_FC_FONT_GET_CLASS (font)->get_glyph (font, wc);
+}
+
+
+/**
+ * pango_fc_font_get_unknown_glyph:
+ * @font: a #PangoFcFont
+ * @wc: the Unicode character for which a glyph is needed.
+ *
+ * Returns the index of a glyph suitable for drawing @wc as an
+ * unknown character.
+ *
+ * Return value: a glyph index into @font.
+ *
+ * Since: 1.4
+ **/
+PangoGlyph
+pango_fc_font_get_unknown_glyph (PangoFcFont *font,
+ gunichar wc)
+{
+ g_return_val_if_fail (PANGO_IS_FC_FONT (font), 0);
+
+ return PANGO_FC_FONT_GET_CLASS (font)->get_unknown_glyph (font, wc);
+}
+
+/**
+ * pango_fc_font_get_kerning:
+ * @font: a #PangoFcFont.
+ * @left: the left #PangoGlyph
+ * @right: the right #PangoGlyph
+ *
+ * Retrieves kerning information for a combination of two glyphs.
+ *
+ * Return value: The amount of kerning (in Pango units) to apply for
+ * the given combination of glyphs.
+ *
+ * Since: 1.4
+ **/
+int
+pango_fc_font_get_kerning (PangoFcFont *font,
+ PangoGlyph left,
+ PangoGlyph right)
+{
+ g_return_val_if_fail (PANGO_IS_FC_FONT (font), 0);
+
+ return PANGO_FC_FONT_GET_CLASS (font)->get_kerning (font, left, right);
+}
diff --git a/pango/pangofc-font.h b/pango/pangofc-font.h
new file mode 100644
index 00000000..3bd3fd19
--- /dev/null
+++ b/pango/pangofc-font.h
@@ -0,0 +1,94 @@
+/* Pango
+ * pangofc-font.h: Shared interfaces for fontconfig-based backends
+ *
+ * Copyright (C) 2003 Red Hat Software
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __PANGO_FC_FONT_H__
+#define __PANGO_FC_FONT_H__
+
+#if defined(PANGO_ENABLE_ENGINE) || defined(PANGO_ENABLE_BACKEND)
+
+#include <freetype/freetype.h>
+#include <pango/pango-font.h>
+
+G_BEGIN_DECLS
+
+#define PANGO_TYPE_FC_FONT (pango_fc_font_get_type ())
+#define PANGO_FC_FONT(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), PANGO_TYPE_FC_FONT, PangoFcFont))
+#define PANGO_IS_FC_FONT(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), PANGO_TYPE_FC_FONT))
+
+typedef struct _PangoFcFont PangoFcFont;
+typedef struct _PangoFcFontClass PangoFcFontClass;
+
+#ifdef PANGO_ENABLE_BACKEND
+
+#define PANGO_FC_FONT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PANGO_TYPE_FC_FONT, PangoFcFontClass))
+#define PANGO_IS_FC_FONT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PANGO_TYPE_FC_FONT))
+#define PANGO_FC_FONT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PANGO_TYPE_FC_FONT, PangoFcFontClass))
+
+struct _PangoFcFont
+{
+ PangoFont parent_instance;
+};
+
+struct _PangoFcFontClass
+{
+ PangoFontClass parent_class;
+
+ /*< public >*/
+ FT_Face (*lock_face) (PangoFcFont *font);
+ void (*unlock_face) (PangoFcFont *font);
+ gboolean (*has_char) (PangoFcFont *font,
+ gunichar wc);
+ guint (*get_glyph) (PangoFcFont *font,
+ gunichar wc);
+ PangoGlyph (*get_unknown_glyph) (PangoFcFont *font,
+ gunichar wc);
+ int (*get_kerning) (PangoFcFont *font,
+ PangoGlyph left,
+ PangoGlyph right);
+ /*< private >*/
+
+ /* Padding for future expansion */
+ void (*_pango_reserved1) (void);
+ void (*_pango_reserved2) (void);
+ void (*_pango_reserved3) (void);
+ void (*_pango_reserved4) (void);
+};
+
+#endif /* PANGO_ENABLE_BACKEND */
+
+GType pango_fc_font_get_type (void);
+
+FT_Face pango_fc_font_lock_face (PangoFcFont *font);
+void pango_fc_font_unlock_face (PangoFcFont *font);
+gboolean pango_fc_font_has_char (PangoFcFont *font,
+ gunichar wc);
+guint pango_fc_font_get_glyph (PangoFcFont *font,
+ gunichar wc);
+PangoGlyph pango_fc_font_get_unknown_glyph (PangoFcFont *font,
+ gunichar wc);
+int pango_fc_font_get_kerning (PangoFcFont *font,
+ PangoGlyph left,
+ PangoGlyph right);
+G_END_DECLS
+
+#endif /* PANGO_ENABLE_ENGINE || PANGO_ENABLE_BACKEND */
+
+#endif /* __PANGO_FC_FONT_H__ */
diff --git a/pango/pangoft2.c b/pango/pangoft2.c
index d4ffdfa6..100a51d4 100644
--- a/pango/pangoft2.c
+++ b/pango/pangoft2.c
@@ -87,6 +87,18 @@ static void pango_ft2_font_get_glyph_extents (PangoFont
static PangoFontMetrics * pango_ft2_font_get_metrics (PangoFont *font,
PangoLanguage *language);
+static FT_Face pango_ft2_font_real_lock_face (PangoFcFont *font);
+static void pango_ft2_font_real_unlock_face (PangoFcFont *font);
+static gboolean pango_ft2_font_real_has_char (PangoFcFont *font,
+ gunichar wc);
+static guint pango_ft2_font_real_get_glyph (PangoFcFont *font,
+ gunichar wc);
+static PangoGlyph pango_ft2_font_real_get_unknown_glyph (PangoFcFont *font,
+ gunichar wc);
+static int pango_ft2_font_real_get_kerning (PangoFcFont *font,
+ PangoGlyph left,
+ PangoGlyph right);
+
static void pango_ft2_get_item_properties (PangoItem *item,
PangoUnderline *uline,
PangoAttrColor *fg_color,
@@ -197,6 +209,8 @@ load_fallback_face (PangoFT2Font *ft2font,
*
* Returns the native FreeType2 FT_Face structure used for this PangoFont.
* This may be useful if you want to use FreeType2 functions directly.
+ *
+ * Use pango_fc_font_get_face() instead.
*
* Return value: a pointer to a #FT_Face structure, with the size set correctly
**/
@@ -301,7 +315,7 @@ pango_ft2_font_get_type (void)
};
object_type = g_type_register_static (PANGO_TYPE_FONT,
- "PangoFT2Font",
+ "PangoFcFont",
&object_info, 0);
}
@@ -325,7 +339,8 @@ pango_ft2_font_class_init (PangoFT2FontClass *class)
{
GObjectClass *object_class = G_OBJECT_CLASS (class);
PangoFontClass *font_class = PANGO_FONT_CLASS (class);
-
+ PangoFcFontClass *fc_font_class = PANGO_FC_FONT_CLASS (class);
+
parent_class = g_type_class_peek_parent (class);
object_class->finalize = pango_ft2_font_finalize;
@@ -335,6 +350,13 @@ pango_ft2_font_class_init (PangoFT2FontClass *class)
font_class->find_shaper = pango_ft2_font_find_shaper;
font_class->get_glyph_extents = pango_ft2_font_get_glyph_extents;
font_class->get_metrics = pango_ft2_font_get_metrics;
+
+ fc_font_class->lock_face = pango_ft2_font_real_lock_face;
+ fc_font_class->unlock_face = pango_ft2_font_real_unlock_face;
+ fc_font_class->has_char = pango_ft2_font_real_has_char;
+ fc_font_class->get_glyph = pango_ft2_font_real_get_glyph;
+ fc_font_class->get_unknown_glyph = pango_ft2_font_real_get_unknown_glyph;
+ fc_font_class->get_kerning = pango_ft2_font_real_get_kerning;
}
static void
@@ -586,6 +608,8 @@ pango_ft2_font_get_glyph_extents (PangoFont *font,
* @right: the right #PangoGlyph
*
* Retrieves kerning information for a combination of two glyphs.
+ *
+ * Use pango_fc_font_get_kerning() instead.
*
* Return value: The amount of kerning (in Pango units) to apply for
* the given combination of glyphs.
@@ -595,27 +619,7 @@ pango_ft2_font_get_kerning (PangoFont *font,
PangoGlyph left,
PangoGlyph right)
{
- FT_Face face;
- FT_Error error;
- FT_Vector kerning;
-
- face = pango_ft2_font_get_face (font);
- if (!face)
- return 0;
-
- if (!FT_HAS_KERNING (face))
- return 0;
-
- if (!left || !right)
- return 0;
-
- error = FT_Get_Kerning (face, left, right,
- ft_kerning_default, &kerning);
- if (error != FT_Err_Ok)
- g_warning ("FT_Get_Kerning returns error: %s",
- _pango_ft2_ft_strerror (error));
-
- return PANGO_UNITS_26_6 (kerning.x);
+ return pango_fc_font_get_kerning (PANGO_FC_FONT (font), left, right);
}
static PangoFontMetrics *
@@ -683,6 +687,79 @@ pango_ft2_font_get_metrics (PangoFont *font,
return pango_font_metrics_ref (info->metrics);
}
+static FT_Face
+pango_ft2_font_real_lock_face (PangoFcFont *font)
+{
+ return pango_ft2_font_get_face ((PangoFont *)font);
+}
+
+static void
+pango_ft2_font_real_unlock_face (PangoFcFont *font)
+{
+}
+
+static gboolean
+pango_ft2_font_real_has_char (PangoFcFont *font,
+ gunichar wc)
+{
+ FT_Face face;
+ FT_UInt index;
+
+ face = pango_ft2_font_get_face ((PangoFont *)font);
+ index = FT_Get_Char_Index (face, wc);
+ return (index && index <= face->num_glyphs);
+}
+
+static guint
+pango_ft2_font_real_get_glyph (PangoFcFont *font,
+ gunichar wc)
+{
+ FT_Face face;
+ FT_UInt index;
+
+ face = pango_ft2_font_get_face ((PangoFont *)font);
+ index = FT_Get_Char_Index (face, wc);
+ if (index && index <= face->num_glyphs)
+ return index;
+
+ return 0;
+}
+
+static PangoGlyph
+pango_ft2_font_real_get_unknown_glyph (PangoFcFont *font,
+ gunichar wc)
+{
+ return 0;
+}
+
+static int
+pango_ft2_font_real_get_kerning (PangoFcFont *font,
+ PangoGlyph left,
+ PangoGlyph right)
+{
+ FT_Face face;
+ FT_Error error;
+ FT_Vector kerning;
+
+ face = pango_ft2_font_get_face ((PangoFont *)font);
+ if (!face)
+ return 0;
+
+ if (!FT_HAS_KERNING (face))
+ return 0;
+
+ if (!left || !right)
+ return 0;
+
+ error = FT_Get_Kerning (face, left, right,
+ ft_kerning_default, &kerning);
+ if (error != FT_Err_Ok)
+ g_warning ("FT_Get_Kerning returns error: %s",
+ _pango_ft2_ft_strerror (error));
+
+ return PANGO_UNITS_26_6 (kerning.x);
+}
+
static gboolean
pango_ft2_free_glyph_info_callback (gpointer key, gpointer value, gpointer data)
{
@@ -795,6 +872,8 @@ pango_ft2_font_find_shaper (PangoFont *font,
*
* Return the index of a glyph suitable for drawing unknown characters.
*
+ * Use pango_fc_font_get_unknown_glyph() instead.
+ *
* Return value: a glyph index into @font
**/
PangoGlyph
diff --git a/pango/pangoft2.h b/pango/pangoft2.h
index 10dc143c..2bb7db8d 100644
--- a/pango/pangoft2.h
+++ b/pango/pangoft2.h
@@ -23,11 +23,10 @@
#ifndef __PANGOFT2_H__
#define __PANGOFT2_H__
-#include <freetype/freetype.h>
-
#include <fontconfig/fontconfig.h>
#include <pango/pango-layout.h>
+#include <pango/pangofc-font.h>
G_BEGIN_DECLS
@@ -79,6 +78,7 @@ PangoContext *pango_ft2_font_map_create_context (PangoFT2FontMap
/* API for rendering modules
*/
+#ifndef PANGO_DISABLE_DEPRECATED
PangoGlyph pango_ft2_get_unknown_glyph (PangoFont *font);
int pango_ft2_font_get_kerning (PangoFont *font,
PangoGlyph left,
@@ -86,6 +86,7 @@ int pango_ft2_font_get_kerning (PangoFont *font,
FT_Face pango_ft2_font_get_face (PangoFont *font);
PangoCoverage *pango_ft2_font_get_coverage (PangoFont *font,
PangoLanguage *language);
+#endif /* PANGO_DISABLE_DEPRECATED */
G_END_DECLS
diff --git a/pango/pangoxft-font.c b/pango/pangoxft-font.c
index 262cbb05..a404c1ab 100644
--- a/pango/pangoxft-font.c
+++ b/pango/pangoxft-font.c
@@ -35,12 +35,19 @@
#define PANGO_XFT_UNKNOWN_FLAG 0x10000000
+#define PANGO_SCALE_26_6 (PANGO_SCALE / (1<<6))
+#define PANGO_PIXELS_26_6(d) \
+ (((d) >= 0) ? \
+ ((d) + PANGO_SCALE_26_6 / 2) / PANGO_SCALE_26_6 : \
+ ((d) - PANGO_SCALE_26_6 / 2) / PANGO_SCALE_26_6)
+#define PANGO_UNITS_26_6(d) (PANGO_SCALE_26_6 * (d))
+
typedef struct _PangoXftFontClass PangoXftFontClass;
typedef struct _PangoXftMetricsInfo PangoXftMetricsInfo;
struct _PangoXftFontClass
{
- PangoFontClass parent_class;
+ PangoFcFontClass parent_class;
};
struct _PangoXftMetricsInfo
@@ -68,6 +75,18 @@ static void pango_xft_font_get_glyph_extents (PangoFont
static PangoFontMetrics * pango_xft_font_get_metrics (PangoFont *font,
PangoLanguage *language);
+static FT_Face pango_xft_font_real_lock_face (PangoFcFont *font);
+static void pango_xft_font_real_unlock_face (PangoFcFont *font);
+static gboolean pango_xft_font_real_has_char (PangoFcFont *font,
+ gunichar wc);
+static guint pango_xft_font_real_get_glyph (PangoFcFont *font,
+ gunichar wc);
+static PangoGlyph pango_xft_font_real_get_unknown_glyph (PangoFcFont *font,
+ gunichar wc);
+static int pango_xft_font_real_get_kerning (PangoFcFont *font,
+ PangoGlyph left,
+ PangoGlyph right);
+
static XftFont *xft_font_get_font (PangoFont *font);
GType
@@ -90,7 +109,7 @@ pango_xft_font_get_type (void)
(GInstanceInitFunc) pango_xft_font_init,
};
- object_type = g_type_register_static (PANGO_TYPE_FONT,
+ object_type = g_type_register_static (PANGO_TYPE_FC_FONT,
"PangoXftFont",
&object_info, 0);
}
@@ -109,6 +128,7 @@ pango_xft_font_class_init (PangoXftFontClass *class)
{
GObjectClass *object_class = G_OBJECT_CLASS (class);
PangoFontClass *font_class = PANGO_FONT_CLASS (class);
+ PangoFcFontClass *fc_font_class = PANGO_FC_FONT_CLASS (class);
parent_class = g_type_class_peek_parent (class);
@@ -119,6 +139,13 @@ pango_xft_font_class_init (PangoXftFontClass *class)
font_class->find_shaper = pango_xft_font_find_shaper;
font_class->get_glyph_extents = pango_xft_font_get_glyph_extents;
font_class->get_metrics = pango_xft_font_get_metrics;
+
+ fc_font_class->lock_face = pango_xft_font_real_lock_face;
+ fc_font_class->unlock_face = pango_xft_font_real_unlock_face;
+ fc_font_class->has_char = pango_xft_font_real_has_char;
+ fc_font_class->get_glyph = pango_xft_font_real_get_glyph;
+ fc_font_class->get_unknown_glyph = pango_xft_font_real_get_unknown_glyph;
+ fc_font_class->get_kerning = pango_xft_font_real_get_kerning;
}
PangoXftFont *
@@ -716,6 +743,76 @@ xft_font_get_font (PangoFont *font)
return xfont->xft_font;
}
+static FT_Face
+pango_xft_font_real_lock_face (PangoFcFont *font)
+{
+ XftFont *xft_font = xft_font_get_font ((PangoFont *)font);
+
+ return XftLockFace (xft_font);
+}
+
+static void
+pango_xft_font_real_unlock_face (PangoFcFont *font)
+{
+ XftFont *xft_font = xft_font_get_font ((PangoFont *)font);
+
+ XftUnlockFace (xft_font);
+}
+
+static gboolean
+pango_xft_font_real_has_char (PangoFcFont *font,
+ gunichar wc)
+{
+ XftFont *xft_font = xft_font_get_font ((PangoFont *)font);
+
+ return XftCharExists (NULL, xft_font, wc);
+}
+
+static guint
+pango_xft_font_real_get_glyph (PangoFcFont *font,
+ gunichar wc)
+{
+ XftFont *xft_font = xft_font_get_font ((PangoFont *)font);
+
+ return XftCharIndex (NULL, xft_font, wc);
+}
+
+static PangoGlyph
+pango_xft_font_real_get_unknown_glyph (PangoFcFont *font,
+ gunichar wc)
+{
+ return wc | PANGO_XFT_UNKNOWN_FLAG;
+}
+
+static int
+pango_xft_font_real_get_kerning (PangoFcFont *font,
+ PangoGlyph left,
+ PangoGlyph right)
+{
+ FT_Face face;
+ FT_Error error;
+ FT_Vector kerning;
+
+ face = pango_fc_font_lock_face (font);
+ if (!face)
+ return 0;
+
+ if (!FT_HAS_KERNING (face))
+ return 0;
+
+ if (!left || !right)
+ return 0;
+
+ error = FT_Get_Kerning (face, left, right,
+ ft_kerning_default, &kerning);
+ if (error != FT_Err_Ok)
+ kerning.x = 0;
+
+ pango_fc_font_unlock_face (font);
+
+ return PANGO_UNITS_26_6 (kerning.x);
+}
+
/**
* pango_xft_font_get_font:
* @font: a #PangoFont.
@@ -762,6 +859,8 @@ pango_xft_font_get_display (PangoFont *font)
* Returns the index of a glyph suitable for drawing @wc as an
* unknown character.
*
+ * Use pango_fc_font_get_unknown_glyph() instead.
+ *
* Return value: a glyph index into @font.
**/
PangoGlyph
@@ -770,7 +869,7 @@ pango_xft_font_get_unknown_glyph (PangoFont *font,
{
g_return_val_if_fail (PANGO_XFT_IS_FONT (font), -1);
- return wc | PANGO_XFT_UNKNOWN_FLAG;
+ return pango_fc_font_get_unknown_glyph (PANGO_FC_FONT (font), wc);
}
/**
@@ -781,6 +880,8 @@ pango_xft_font_get_unknown_glyph (PangoFont *font,
* This face will be kept around until you call
* pango_xft_font_unlock_face().
*
+ * Use pango_fc_font_lock_face() instead.
+ *
* Returns: the FreeType FT_Face associated with @font.
*
* Since: 1.2
@@ -788,13 +889,9 @@ pango_xft_font_get_unknown_glyph (PangoFont *font,
FT_Face
pango_xft_font_lock_face (PangoFont *font)
{
- XftFont *xft_font;
-
g_return_val_if_fail (PANGO_XFT_IS_FONT (font), NULL);
- xft_font = xft_font_get_font (font);
-
- return XftLockFace (xft_font);
+ return pango_fc_font_lock_face (PANGO_FC_FONT (font));
}
/**
@@ -804,18 +901,16 @@ pango_xft_font_lock_face (PangoFont *font)
* Releases a font previously obtained with
* pango_xft_font_lock_face().
*
+ * Use pango_fc_font_unlock_face() instead.
+ *
* Since: 1.2
**/
void
pango_xft_font_unlock_face (PangoFont *font)
{
- XftFont *xft_font;
-
g_return_if_fail (PANGO_XFT_IS_FONT (font));
- xft_font = xft_font_get_font (font);
-
- XftUnlockFace (xft_font);
+ pango_fc_font_unlock_face (PANGO_FC_FONT (font));
}
/**
@@ -827,6 +922,8 @@ pango_xft_font_unlock_face (PangoFont *font)
* for @font. If you only want to determine
* whether the font has the glyph, use pango_xft_font_has_char().
*
+ * Use pango_fc_font_get_glyph() instead.
+ *
* Return value: the glyph index, or 0, if the unicode
* codepoint doesn't exist in the font.
*
@@ -836,13 +933,9 @@ guint
pango_xft_font_get_glyph (PangoFont *font,
gunichar wc)
{
- XftFont *xft_font;
-
g_return_val_if_fail (PANGO_XFT_IS_FONT (font), 0);
- xft_font = xft_font_get_font (font);
-
- return XftCharIndex (NULL, xft_font, wc);
+ return pango_fc_font_get_glyph (PANGO_FC_FONT (font), wc);
}
/**
@@ -852,6 +945,8 @@ pango_xft_font_get_glyph (PangoFont *font,
*
* Determines whether @font has a glyph for the codepoint @wc.
*
+ * Use pango_fc_font_has_char() instead.
+ *
* Return value: %TRUE if @font has the requested codepoint.
*
* Since: 1.2
@@ -860,11 +955,7 @@ gboolean
pango_xft_font_has_char (PangoFont *font,
gunichar wc)
{
- XftFont *xft_font;
-
g_return_val_if_fail (PANGO_XFT_IS_FONT (font), 0);
- xft_font = xft_font_get_font (font);
-
- return XftCharExists (NULL, xft_font, wc);
+ return pango_fc_font_has_char (PANGO_FC_FONT (font), wc);
}
diff --git a/pango/pangoxft-private.h b/pango/pangoxft-private.h
index 787caff5..0d42ae16 100644
--- a/pango/pangoxft-private.h
+++ b/pango/pangoxft-private.h
@@ -31,7 +31,7 @@ typedef struct _PangoXftFont PangoXftFont;
struct _PangoXftFont
{
- PangoFont parent_instance;
+ PangoFcFont parent_instance;
FcPattern *font_pattern; /* fully resolved pattern */
XftFont *xft_font; /* created on demand */
diff --git a/pango/pangoxft.h b/pango/pangoxft.h
index 25cb30b5..bb5ce511 100644
--- a/pango/pangoxft.h
+++ b/pango/pangoxft.h
@@ -25,6 +25,7 @@
#include <pango/pango-context.h>
#include <pango/pango-ot.h>
+#include <pango/pangofc-font.h>
G_BEGIN_DECLS
@@ -83,15 +84,17 @@ GType pango_xft_font_get_type (void);
#ifdef PANGO_ENABLE_ENGINE
XftFont * pango_xft_font_get_font (PangoFont *font);
+Display * pango_xft_font_get_display (PangoFont *font);
+#ifndef PANGO_DISABLE_DEPRECATED
FT_Face pango_xft_font_lock_face (PangoFont *font);
void pango_xft_font_unlock_face (PangoFont *font);
guint pango_xft_font_get_glyph (PangoFont *font,
gunichar wc);
gboolean pango_xft_font_has_char (PangoFont *font,
gunichar wc);
-Display * pango_xft_font_get_display (PangoFont *font);
PangoGlyph pango_xft_font_get_unknown_glyph (PangoFont *font,
gunichar wc);
+#endif /* PANGO_DISABLE_DEPRECATED */
#endif /* PANGO_ENABLE_ENGINE */
G_END_DECLS