diff options
author | Owen Taylor <otaylor@redhat.com> | 2003-04-14 23:48:34 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 2003-04-14 23:48:34 +0000 |
commit | 402f2625c2c779df20470ed0f758999db494e4dc (patch) | |
tree | 6667e384ed0c39a22a6e3f731c062311fa7b3e9a /pango | |
parent | f6fdd34661bd9fe23452b5eb98ece8488a12ce8f (diff) | |
download | pango-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.am | 4 | ||||
-rw-r--r-- | pango/pango-engine.h | 18 | ||||
-rw-r--r-- | pango/pangofc-font.c | 175 | ||||
-rw-r--r-- | pango/pangofc-font.h | 94 | ||||
-rw-r--r-- | pango/pangoft2.c | 125 | ||||
-rw-r--r-- | pango/pangoft2.h | 5 | ||||
-rw-r--r-- | pango/pangoxft-font.c | 137 | ||||
-rw-r--r-- | pango/pangoxft-private.h | 2 | ||||
-rw-r--r-- | pango/pangoxft.h | 5 |
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 |