summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog25
-rw-r--r--ChangeLog.pre-1-1025
-rw-r--r--ChangeLog.pre-1-425
-rw-r--r--ChangeLog.pre-1-625
-rw-r--r--ChangeLog.pre-1-825
-rw-r--r--configure.in90
-rw-r--r--docs/Makefile.am15
-rw-r--r--docs/pango-docs.sgml6
-rw-r--r--docs/pango-sections.txt59
-rw-r--r--docs/pango.types10
-rw-r--r--docs/tmpl/freetype-fonts.sgml4
-rw-r--r--docs/tmpl/pango-indic.sgml98
-rw-r--r--docs/tmpl/xft-fonts.sgml4
-rw-r--r--modules/arabic/Makefile.am43
-rw-r--r--modules/arabic/arabic-fc.c12
-rw-r--r--modules/basic/Makefile.am35
-rw-r--r--modules/basic/basic-fc.c12
-rw-r--r--modules/hangul/Makefile.am40
-rw-r--r--modules/hangul/hangul-fc.c12
-rw-r--r--modules/hebrew/Makefile.am40
-rw-r--r--modules/hebrew/hebrew-fc.c12
-rw-r--r--modules/indic/Makefile.am46
-rw-r--r--modules/indic/indic-fc.c12
-rw-r--r--modules/tamil/.cvsignore6
-rw-r--r--modules/thai/Makefile.am40
-rw-r--r--modules/thai/thai-fc.c12
-rw-r--r--pango/Makefile.am24
-rw-r--r--pango/modules.h3
-rw-r--r--pango/pangofc-font.c320
-rw-r--r--pango/pangofc-font.h66
-rw-r--r--pango/pangofc-fontmap.c386
-rw-r--r--pango/pangofc-fontmap.cI1138
-rw-r--r--pango/pangofc-fontmap.h106
-rw-r--r--pango/pangofc-private.h39
-rw-r--r--pango/pangoft2-fontmap.c166
-rw-r--r--pango/pangoft2-private.h18
-rw-r--r--pango/pangoft2.c221
-rw-r--r--pango/pangoft2.h2
-rw-r--r--pango/pangoxft-font.c285
-rw-r--r--pango/pangoxft-fontmap.c181
-rw-r--r--pango/pangoxft-private.h27
-rw-r--r--pango/pangoxft.h2
42 files changed, 1347 insertions, 2370 deletions
diff --git a/ChangeLog b/ChangeLog
index 9bca605c..6e3ffa29 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,28 @@
+Sat Aug 2 14:33:28 2003 Owen Taylor <otaylor@redhat.com>
+
+ * pango/Makefile.am (libpangoxft_1_0_la_LIBADD): Make
+ pangoxft depend on pangoft2.
+
+ * pango/pangofc-fontmap.[ch]: Make pangofc-fontmap.cI
+ into a real base class.
+
+ * pango/pangofc-font.[ch]: Move some of the pangoxft/
+ pangoft2 implementation here.
+
+ * pango/pangoft2.c pango/pangoft2-fontmap.c
+ pango/pangoft2-private.h pango/pangoxft-font.c
+ pango/pangoxft2-fontmap.c pango/pangoxft-private.h: Adapt
+ to the new scheme
+
+ * modules/*/Makefile.am Modules/*/*/*-fc.c: Don't build
+ separate FT2 and Xft shapers, just build one Fc shaper.
+
+ * docs/pango-sections.txt docs/pango-docs.sgml
+ docs/tmpl/pangofc-font{,map}.sgml: Basic docs for
+ the new stuff.
+
+ * configure.in: Up pango_module_version to 1.4.0.
+
Sat Aug 2 14:18:20 2003 Owen Taylor <otaylor@redhat.com>
* modules/hangul/Makefile.am (EXTRA_DIST): Remove some
diff --git a/ChangeLog.pre-1-10 b/ChangeLog.pre-1-10
index 9bca605c..6e3ffa29 100644
--- a/ChangeLog.pre-1-10
+++ b/ChangeLog.pre-1-10
@@ -1,3 +1,28 @@
+Sat Aug 2 14:33:28 2003 Owen Taylor <otaylor@redhat.com>
+
+ * pango/Makefile.am (libpangoxft_1_0_la_LIBADD): Make
+ pangoxft depend on pangoft2.
+
+ * pango/pangofc-fontmap.[ch]: Make pangofc-fontmap.cI
+ into a real base class.
+
+ * pango/pangofc-font.[ch]: Move some of the pangoxft/
+ pangoft2 implementation here.
+
+ * pango/pangoft2.c pango/pangoft2-fontmap.c
+ pango/pangoft2-private.h pango/pangoxft-font.c
+ pango/pangoxft2-fontmap.c pango/pangoxft-private.h: Adapt
+ to the new scheme
+
+ * modules/*/Makefile.am Modules/*/*/*-fc.c: Don't build
+ separate FT2 and Xft shapers, just build one Fc shaper.
+
+ * docs/pango-sections.txt docs/pango-docs.sgml
+ docs/tmpl/pangofc-font{,map}.sgml: Basic docs for
+ the new stuff.
+
+ * configure.in: Up pango_module_version to 1.4.0.
+
Sat Aug 2 14:18:20 2003 Owen Taylor <otaylor@redhat.com>
* modules/hangul/Makefile.am (EXTRA_DIST): Remove some
diff --git a/ChangeLog.pre-1-4 b/ChangeLog.pre-1-4
index 9bca605c..6e3ffa29 100644
--- a/ChangeLog.pre-1-4
+++ b/ChangeLog.pre-1-4
@@ -1,3 +1,28 @@
+Sat Aug 2 14:33:28 2003 Owen Taylor <otaylor@redhat.com>
+
+ * pango/Makefile.am (libpangoxft_1_0_la_LIBADD): Make
+ pangoxft depend on pangoft2.
+
+ * pango/pangofc-fontmap.[ch]: Make pangofc-fontmap.cI
+ into a real base class.
+
+ * pango/pangofc-font.[ch]: Move some of the pangoxft/
+ pangoft2 implementation here.
+
+ * pango/pangoft2.c pango/pangoft2-fontmap.c
+ pango/pangoft2-private.h pango/pangoxft-font.c
+ pango/pangoxft2-fontmap.c pango/pangoxft-private.h: Adapt
+ to the new scheme
+
+ * modules/*/Makefile.am Modules/*/*/*-fc.c: Don't build
+ separate FT2 and Xft shapers, just build one Fc shaper.
+
+ * docs/pango-sections.txt docs/pango-docs.sgml
+ docs/tmpl/pangofc-font{,map}.sgml: Basic docs for
+ the new stuff.
+
+ * configure.in: Up pango_module_version to 1.4.0.
+
Sat Aug 2 14:18:20 2003 Owen Taylor <otaylor@redhat.com>
* modules/hangul/Makefile.am (EXTRA_DIST): Remove some
diff --git a/ChangeLog.pre-1-6 b/ChangeLog.pre-1-6
index 9bca605c..6e3ffa29 100644
--- a/ChangeLog.pre-1-6
+++ b/ChangeLog.pre-1-6
@@ -1,3 +1,28 @@
+Sat Aug 2 14:33:28 2003 Owen Taylor <otaylor@redhat.com>
+
+ * pango/Makefile.am (libpangoxft_1_0_la_LIBADD): Make
+ pangoxft depend on pangoft2.
+
+ * pango/pangofc-fontmap.[ch]: Make pangofc-fontmap.cI
+ into a real base class.
+
+ * pango/pangofc-font.[ch]: Move some of the pangoxft/
+ pangoft2 implementation here.
+
+ * pango/pangoft2.c pango/pangoft2-fontmap.c
+ pango/pangoft2-private.h pango/pangoxft-font.c
+ pango/pangoxft2-fontmap.c pango/pangoxft-private.h: Adapt
+ to the new scheme
+
+ * modules/*/Makefile.am Modules/*/*/*-fc.c: Don't build
+ separate FT2 and Xft shapers, just build one Fc shaper.
+
+ * docs/pango-sections.txt docs/pango-docs.sgml
+ docs/tmpl/pangofc-font{,map}.sgml: Basic docs for
+ the new stuff.
+
+ * configure.in: Up pango_module_version to 1.4.0.
+
Sat Aug 2 14:18:20 2003 Owen Taylor <otaylor@redhat.com>
* modules/hangul/Makefile.am (EXTRA_DIST): Remove some
diff --git a/ChangeLog.pre-1-8 b/ChangeLog.pre-1-8
index 9bca605c..6e3ffa29 100644
--- a/ChangeLog.pre-1-8
+++ b/ChangeLog.pre-1-8
@@ -1,3 +1,28 @@
+Sat Aug 2 14:33:28 2003 Owen Taylor <otaylor@redhat.com>
+
+ * pango/Makefile.am (libpangoxft_1_0_la_LIBADD): Make
+ pangoxft depend on pangoft2.
+
+ * pango/pangofc-fontmap.[ch]: Make pangofc-fontmap.cI
+ into a real base class.
+
+ * pango/pangofc-font.[ch]: Move some of the pangoxft/
+ pangoft2 implementation here.
+
+ * pango/pangoft2.c pango/pangoft2-fontmap.c
+ pango/pangoft2-private.h pango/pangoxft-font.c
+ pango/pangoxft2-fontmap.c pango/pangoxft-private.h: Adapt
+ to the new scheme
+
+ * modules/*/Makefile.am Modules/*/*/*-fc.c: Don't build
+ separate FT2 and Xft shapers, just build one Fc shaper.
+
+ * docs/pango-sections.txt docs/pango-docs.sgml
+ docs/tmpl/pangofc-font{,map}.sgml: Basic docs for
+ the new stuff.
+
+ * configure.in: Up pango_module_version to 1.4.0.
+
Sat Aug 2 14:18:20 2003 Owen Taylor <otaylor@redhat.com>
* modules/hangul/Makefile.am (EXTRA_DIST): Remove some
diff --git a/configure.in b/configure.in
index ea557062..9bab8977 100644
--- a/configure.in
+++ b/configure.in
@@ -36,7 +36,7 @@ dnl This is the last version with which we have compatibility with
dnl with the modules for; it isn't the same as
dnl PANGO_API_VERSION.'PANGO_MICRO_VERSION - PANGO_BINARY_AGE' since we have
dnl engine only API
-m4_define([pango_module_version], [1.2.0])
+m4_define([pango_module_version], [1.4.0])
AC_INIT(pango, [pango_version],
@@ -313,15 +313,14 @@ AC_ARG_WITH(included_modules,
[ --with-included-modules=MODULE1,MODULE2,...
build the given modules into Pango])
-arabic_modules="arabic-ft2,arabic-x,arabic-xft"
-basic_modules="basic-ft2,basic-win32,basic-x,basic-xft"
-hangul_modules="hangul-ft2,hangul-x,hangul-xft"
-hebrew_modules="hebrew-ft2,hebrew-x,hebrew-xft"
-indic_modules="bengali-x,devanagari-x,gurmukhi-x,gujarati-x,myanmar-x,indic-ft2,indic-xft"
-tamil_modules="tamil-x"
-thai_modules="thai-ft2,thai-x,thai-xft"
+arabic_modules="arabic-fc"
+basic_modules="basic-fc,basic-win32,basic-x"
+hangul_modules="hangul-fc"
+hebrew_modules="hebrew-fc"
+indic_modules="indic-fc"
+thai_modules="thai-fc"
-all_modules="$arabic_modules,$basic_modules,$hangul_modules,$hebrew_modules,$indic_modules,$tamil_modules,$thai_modules"
+all_modules="$arabic_modules,$basic_modules,$hangul_modules,$hebrew_modules,$indic_modules,$thai_modules"
included_modules=""
if test "x$with_included_modules" != xno || test "x$with_included_modules" = x ; then
@@ -338,8 +337,7 @@ AC_MSG_RESULT($included_modules)
AM_CONDITIONAL(HAVE_INCLUDED_MODULES, test "x$included_modules" != x)
INCLUDED_X_MODULES=
-INCLUDED_XFT_MODULES=
-INCLUDED_FT2_MODULES=
+INCLUDED_FC_MODULES=
INCLUDED_WIN32_MODULES=
IFS="${IFS= }"; pango_save_ifs="$IFS"; IFS=","
for module in $included_modules; do
@@ -349,10 +347,8 @@ for module in $included_modules; do
dir=`echo $module | sed "s/-.*//"`
fi
- if echo $module | egrep -- "-xft($|,)" > /dev/null; then
- INCLUDED_XFT_MODULES="$INCLUDED_XFT_MODULES \$(top_builddir)/modules/$dir/libpango-$module.la"
- elif echo $module | egrep -- "-ft2($|,)" > /dev/null; then
- INCLUDED_FT2_MODULES="$INCLUDED_FT2_MODULES \$(top_builddir)/modules/$dir/libpango-$module.la"
+ if echo $module | egrep -- "-fc($|,)" > /dev/null; then
+ INCLUDED_FC_MODULES="$INCLUDED_FC_MODULES \$(top_builddir)/modules/$dir/libpango-$module.la"
elif echo $module | egrep -- "-x($|,)" > /dev/null; then
INCLUDED_X_MODULES="$INCLUDED_X_MODULES \$(top_builddir)/modules/$dir/libpango-$module.la"
elif echo $module | egrep -- "-win32($|,)" > /dev/null; then
@@ -364,29 +360,22 @@ done
IFS="$pango_save_ifs"
AC_SUBST(INCLUDED_X_MODULES)
-AC_SUBST(INCLUDED_XFT_MODULES)
-AC_SUBST(INCLUDED_FT2_MODULES)
+AC_SUBST(INCLUDED_FC_MODULES)
AC_SUBST(INCLUDED_WIN32_MODULES)
-AM_CONDITIONAL(INCLUDE_ARABIC_FT2,echo $included_modules | egrep '(^|,)arabic-ft2($|,)' > /dev/null)
-AM_CONDITIONAL(INCLUDE_ARABIC_XFT,echo $included_modules | egrep '(^|,)arabic-xft($|,)' > /dev/null)
+AM_CONDITIONAL(INCLUDE_ARABIC_FC,echo $included_modules | egrep '(^|,)arabic-fc($|,)' > /dev/null)
-AM_CONDITIONAL(INCLUDE_BASIC_FT2,echo $included_modules | egrep '(^|,)basic-ft2($|,)' > /dev/null)
+AM_CONDITIONAL(INCLUDE_BASIC_FC,echo $included_modules | egrep '(^|,)basic-fc($|,)' > /dev/null)
AM_CONDITIONAL(INCLUDE_BASIC_WIN32,echo $included_modules | egrep '(^|,)basic-win32($|,)' > /dev/null)
-AM_CONDITIONAL(INCLUDE_BASIC_XFT,echo $included_modules | egrep '(^|,)basic-xft($|,)' > /dev/null)
AM_CONDITIONAL(INCLUDE_BASIC_X,echo $included_modules | egrep '(^|,)basic-x($|,)' > /dev/null)
-AM_CONDITIONAL(INCLUDE_HANGUL_FT2,echo $included_modules | egrep '(^|,)hangul-ft2($|,)' > /dev/null)
-AM_CONDITIONAL(INCLUDE_HANGUL_XFT,echo $included_modules | egrep '(^|,)hangul-xft($|,)' > /dev/null)
+AM_CONDITIONAL(INCLUDE_HANGUL_FC,echo $included_modules | egrep '(^|,)hangul-fc($|,)' > /dev/null)
-AM_CONDITIONAL(INCLUDE_HEBREW_FT2,echo $included_modules | egrep '(^|,)hebrew-ft2($|,)' > /dev/null)
-AM_CONDITIONAL(INCLUDE_HEBREW_XFT,echo $included_modules | egrep '(^|,)hebrew-xft($|,)' > /dev/null)
+AM_CONDITIONAL(INCLUDE_HEBREW_FC,echo $included_modules | egrep '(^|,)hebrew-fc($|,)' > /dev/null)
-AM_CONDITIONAL(INCLUDE_THAI_FT2,echo $included_modules | egrep '(^|,)thai-ft2($|,)' > /dev/null)
-AM_CONDITIONAL(INCLUDE_THAI_XFT,echo $included_modules | egrep '(^|,)thai-xft($|,)' > /dev/null)
+AM_CONDITIONAL(INCLUDE_THAI_FC,echo $included_modules | egrep '(^|,)thai-fc($|,)' > /dev/null)
-AM_CONDITIONAL(INCLUDE_INDIC_FT2,echo $included_modules | egrep '(^|,)indic-ft2($|,)' > /dev/null)
-AM_CONDITIONAL(INCLUDE_INDIC_XFT,echo $included_modules | egrep '(^|,)indic-xft($|,)' > /dev/null)
+AM_CONDITIONAL(INCLUDE_INDIC_FC,echo $included_modules | egrep '(^|,)indic-fc($|,)' > /dev/null)
#
# We use flockfile to implement pango_getline() - should be moved to GLib
@@ -555,22 +544,22 @@ cat >> pango/module-defs-x.c <<EOTEXT
EOTEXT
])
-AC_CONFIG_COMMANDS([pango/module-defs-xft.c],
+AC_CONFIG_COMMANDS([pango/module-defs-fc.c],
[
-### XFT modules
-cat > pango/module-defs-xft.c <<EOTEXT
+### FC modules
+cat > pango/module-defs-fc.c <<EOTEXT
/* Autogenerated by configure. Do not edit */
#include "module-defs.h"
-PangoIncludedModule _pango_included_xft_modules@<:@@:>@ = {
+PangoIncludedModule _pango_included_fc_modules@<:@@:>@ = {
EOTEXT
IFS="${IFS= }"; pango_save_ifs="$IFS"; IFS=","
for module in $included_modules; do
- if echo $module | egrep -- "-xft($|,)" > /dev/null; then
+ if echo $module | egrep -- "-fc($|,)" > /dev/null; then
module_c=`echo $module | sed s/-/_/`
- cat >> pango/module-defs-xft.c <<EOTEXT
+ cat >> pango/module-defs-fc.c <<EOTEXT
{ _pango_${module_c}_script_engine_list, _pango_${module_c}_script_engine_load,_pango_${module_c}_script_engine_unload },
EOTEXT
fi
@@ -578,36 +567,7 @@ done
IFS="$pango_save_ifs"
-cat >> pango/module-defs-xft.c <<EOTEXT
- { NULL, NULL, NULL },
-};
-EOTEXT
-])
-
-AC_CONFIG_COMMANDS([pango/module-defs-ft2.c],
-[
-### FT2 modules
-cat > pango/module-defs-ft2.c <<EOTEXT
-/* Autogenerated by configure. Do not edit */
-
-#include "module-defs.h"
-
-PangoIncludedModule _pango_included_ft2_modules@<:@@:>@ = {
-EOTEXT
-
-IFS="${IFS= }"; pango_save_ifs="$IFS"; IFS=","
-for module in $included_modules; do
- if echo $module | egrep -- "-ft2($|,)" > /dev/null; then
- module_c=`echo $module | sed s/-/_/`
- cat >> pango/module-defs-ft2.c <<EOTEXT
- { _pango_${module_c}_script_engine_list, _pango_${module_c}_script_engine_load,_pango_${module_c}_script_engine_unload },
-EOTEXT
- fi
-done
-
-IFS="$pango_save_ifs"
-
-cat >> pango/module-defs-ft2.c <<EOTEXT
+cat >> pango/module-defs-fc.c <<EOTEXT
{ NULL, NULL, NULL },
};
EOTEXT
diff --git a/docs/Makefile.am b/docs/Makefile.am
index 6650dea9..e7948401 100644
--- a/docs/Makefile.am
+++ b/docs/Makefile.am
@@ -26,6 +26,7 @@ IGNORE_HFILES= \
modules.h \
pango-intset.h \
pango-utils.h \
+ pangofc-private.h \
pangoft2-private.h \
pangowin32-private.h \
pangox-private.h \
@@ -36,9 +37,17 @@ IGNORE_HFILES= \
INCLUDES = \
-DPANGO_ENABLE_BACKEND \
-I$(top_srcdir) \
- $(GLIB_CFLAGS)
-
-GTKDOC_LIBS = $(top_builddir)/pango/libpango-1.0.la
+ $(GLIB_CFLAGS) \
+ $(XFT_CFLAGS) \
+ $(FREETYPE_CFLAGS) \
+ $(X_CFLAGS)
+
+# libpangoxft.la pulls in libpango.la and libpangoft2.la;
+# We're assuming here that we'll only regenerate the
+# HTML docs on Unix. We don't get introspection on Win32
+# specific types, but that isn't a bug deal.
+GTKDOC_LIBS = \
+ $(top_builddir)/pango/libpangoxft-1.0.la
# Extra options to supply to gtkdoc-mkdb
diff --git a/docs/pango-docs.sgml b/docs/pango-docs.sgml
index f78a86dd..79cdf112 100644
--- a/docs/pango-docs.sgml
+++ b/docs/pango-docs.sgml
@@ -9,12 +9,13 @@
<!ENTITY pango-Tab-Stops SYSTEM "xml/tab-stops.xml">
<!ENTITY pango-Layout-Objects SYSTEM "xml/layout.xml">
<!ENTITY pango-Engines SYSTEM "xml/engines.xml">
-<!ENTITY pango-Indic-Engine-Support SYSTEM "xml/pango-indic.xml">
<!ENTITY pango-Modules SYSTEM "xml/modules.xml">
<!ENTITY pango-X-Fonts-and-Rendering SYSTEM "xml/x-fonts.xml">
<!ENTITY pango-Win32-Fonts-and-Rendering SYSTEM "xml/win32-fonts.xml">
<!ENTITY pango-FreeType-Fonts-and-Rendering SYSTEM "xml/freetype-fonts.xml">
<!ENTITY pango-Xft-Fonts-and-Rendering SYSTEM "xml/xft-fonts.xml">
+<!ENTITY PangoFcFontMap SYSTEM "xml/pangofc-fontmap.xml">
+<!ENTITY PangoFcFont SYSTEM "xml/pangofc-font.xml">
<!ENTITY pango-OpenType-Font-Handling SYSTEM "xml/opentype.xml">
<!ENTITY markup-format SYSTEM "pango_markup.sgml">
<!ENTITY pango-querymodules SYSTEM "pango-querymodules.xml">
@@ -47,10 +48,11 @@
<chapter id="lowlevel">
<title>Low Level Functionality</title>
+ &PangoFcFontMap;
+ &PangoFcFont;
&pango-OpenType-Font-Handling;
&pango-Coverage-Maps;
&pango-Engines;
- &pango-Indic-Engine-Support;
&pango-Modules;
</chapter>
diff --git a/docs/pango-sections.txt b/docs/pango-sections.txt
index ec11c070..27c9bb9c 100644
--- a/docs/pango-sections.txt
+++ b/docs/pango-sections.txt
@@ -463,6 +463,8 @@ PANGO_RENDER_TYPE_NONE
script_engine_list
script_engine_load
script_engine_unload
+<SUBSECTION Private>
+PANGO_MODULE_ENTRY
</SECTION>
<SECTION>
@@ -478,18 +480,6 @@ pango_module_register
</SECTION>
<SECTION>
-<FILE>pango-indic</FILE>
-<TITLE>Indic Engine Support</TITLE>
-PANGO_ZERO_WIDTH_NON_JOINER
-PANGO_ZERO_WIDTH_JOINER
-PangoIndicScript
-pango_indic_shift_vowels
-pango_indic_compact
-pango_indic_convert_vowels
-pango_indic_split_out_characters
-</SECTION>
-
-<SECTION>
<TITLE>X Fonts and Rendering</TITLE>
<FILE>x-fonts</FILE>
PANGO_RENDER_TYPE_X
@@ -608,6 +598,51 @@ pango_xft_font_get_type
</SECTION>
<SECTION>
+<FILE>pangofc-fontmap</FILE>
+<TITLE>PangoFcFontMap</TITLE>
+PangoFcFontMap
+PangoFcFontMapClass
+pango_fc_font_description_from_pattern
+pango_fc_font_map_cache_clear
+pango_fc_font_map_create_context
+pango_fc_font_map_shutdown
+<SUBSECTION Standard>
+PANGO_FC_FONT_MAP
+PANGO_IS_FC_FONT_MAP
+PANGO_TYPE_FC_FONT_MAP
+PANGO_FC_FONT_MAP_CLASS
+PANGO_IS_FC_FONT_MAP_CLASS
+PANGO_FC_FONT_MAP_GET_CLASS
+
+<SUBSECTION Private>
+PangoFcFontMapPrivate
+pango_fc_font_map_get_type
+</SECTION>
+
+<SECTION>
+<FILE>pangofc-font</FILE>
+<TITLE>PangoFcFont</TITLE>
+PangoFcFont
+PangoFcFontClass
+PANGO_RENDER_TYPE_FC
+pango_fc_font_lock_face
+pango_fc_font_unlock_face
+pango_fc_font_has_char
+pango_fc_font_get_glyph
+pango_fc_font_get_unknown_glyph
+pango_fc_font_kern_glyphs
+<SUBSECTION Standard>
+PANGO_FC_FONT
+PANGO_IS_FC_FONT
+PANGO_TYPE_FC_FONT
+PANGO_FC_FONT_CLASS
+PANGO_IS_FC_FONT_CLASS
+PANGO_FC_FONT_GET_CLASS
+<SUBSECTION Private>
+pango_fc_font_get_type
+</SECTION>
+
+<SECTION>
<TITLE>OpenType Font Handling</TITLE>
<FILE>opentype</FILE>
PangoOTTag
diff --git a/docs/pango.types b/docs/pango.types
index 73860fd9..ae3d2947 100644
--- a/docs/pango.types
+++ b/docs/pango.types
@@ -1,4 +1,8 @@
#include <pango/pango.h>
+#include <pango/pangofc-font.h>
+#include <pango/pangofc-fontmap.h>
+#include <pango/pangoft2.h>
+#include <pango/pangoxft.h>
pango_font_get_type
pango_font_family_get_type
@@ -7,5 +11,9 @@ pango_context_get_type
pango_font_map_get_type
pango_fontset_get_type
pango_fontset_simple_get_type
-pango_layout_get_type
+pango_fc_font_get_type
+pango_fc_font_map_get_type
+pango_ft2_font_map_get_type
+pango_xft_font_get_type
+
diff --git a/docs/tmpl/freetype-fonts.sgml b/docs/tmpl/freetype-fonts.sgml
index 8d175001..81823761 100644
--- a/docs/tmpl/freetype-fonts.sgml
+++ b/docs/tmpl/freetype-fonts.sgml
@@ -22,8 +22,8 @@ The #PangoFT2FontMap is the #PangoFontMap implementation for FreeType fonts.
<!-- ##### MACRO PANGO_RENDER_TYPE_FT2 ##### -->
<para>
-A string constant identifying the FreeType renderer. The associated quark (see
-g_quark_from_string()) is used to identify the renderer in pango_find_map().
+A string constant that was used to identify shape engines that work
+with the FreeType backend. See %PANGO_RENDER_TYPE_FC for the replacement.
</para>
diff --git a/docs/tmpl/pango-indic.sgml b/docs/tmpl/pango-indic.sgml
deleted file mode 100644
index 8409296f..00000000
--- a/docs/tmpl/pango-indic.sgml
+++ /dev/null
@@ -1,98 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-Indic Engine Support
-
-<!-- ##### SECTION Short_Description ##### -->
-Indic support for legacy shaper engines
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-The <function>pango_indic_*</function> functions are used to
-implement indic shaping support for certain legacy shaping engines,
-in particular the shaping engines for bitmap X fonts.
-These are basically internal routines and should not be
-used by applications.
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### MACRO PANGO_ZERO_WIDTH_NON_JOINER ##### -->
-<para>
-The Unicode character 'ZERO WIDTH NON-JOINER', 0x200c.
-</para>
-
-
-
-<!-- ##### MACRO PANGO_ZERO_WIDTH_JOINER ##### -->
-<para>
-The Unicode character 'ZERO WIDTH JOINER', 0x200d.
-</para>
-
-
-
-<!-- ##### STRUCT PangoIndicScript ##### -->
-<para>
-The <structname>PangoIndicScript</structname> struct contains a few
-script-dependent functions which are used by the
-<function>pango_indic_*</function> functions.
-Renderers must provide a suitable <structname>PangoIndicScript</structname>
-struct.
-</para>
-
-@name: the name of the script.
-@is_prefixing_vowel: determines whether a vowel is left-joining.
-@is_vowel_sign: determines whether the given character is a vowel sign.
-@vowel_sign_to_matra: converts a vowel sign to a matra (abbreviated form).
-@is_vowel_half: determines whether the given character is part of a two-part
-vowel. This is an optional function.
-@vowel_split: returns whether the given vowel can be split and the pieces in
-which it can be split. This is an optional function.
-
-<!-- ##### FUNCTION pango_indic_shift_vowels ##### -->
-<para>
-
-</para>
-
-@script:
-@chars:
-@end:
-
-
-<!-- ##### FUNCTION pango_indic_compact ##### -->
-<para>
-
-</para>
-
-@script:
-@num:
-@chars:
-@cluster:
-
-
-<!-- ##### FUNCTION pango_indic_convert_vowels ##### -->
-<para>
-
-</para>
-
-@script:
-@in_middle:
-@num:
-@chars:
-@has_standalone_vowels:
-
-
-<!-- ##### FUNCTION pango_indic_split_out_characters ##### -->
-<para>
-
-</para>
-
-@script:
-@text:
-@n_chars:
-@wc:
-@n_glyph:
-@glyphs:
-
-
diff --git a/docs/tmpl/xft-fonts.sgml b/docs/tmpl/xft-fonts.sgml
index 954ed04e..ef0b635b 100644
--- a/docs/tmpl/xft-fonts.sgml
+++ b/docs/tmpl/xft-fonts.sgml
@@ -16,8 +16,8 @@ Functions for shape engines to manipulate Xft fonts
<!-- ##### MACRO PANGO_RENDER_TYPE_XFT ##### -->
<para>
-A string constant identifying the Xft renderer. The associated quark (see
-g_quark_from_string()) is used to identify the renderer in pango_find_map().
+A string constant that was used to identify shape engines that work
+with the Xft backend. See %PANGO_RENDER_TYPE_FC for the replacement.
</para>
diff --git a/modules/arabic/Makefile.am b/modules/arabic/Makefile.am
index c6229ba4..3fe6fd38 100644
--- a/modules/arabic/Makefile.am
+++ b/modules/arabic/Makefile.am
@@ -1,8 +1,6 @@
## Process this file with automake to create Makefile.in.
pangolibs = $(top_builddir)/pango/libpango-$(PANGO_API_VERSION).la $(GLIB_LIBS)
-pangoxlibs = $(top_builddir)/pango/libpangox-$(PANGO_API_VERSION).la $(X_LIBS) $(pangolibs)
-pangoxftlibs = $(top_builddir)/pango/libpangoxft-$(PANGO_API_VERSION).la $(XFT_LIBS) $(pangolibs)
pangoft2libs = $(top_builddir)/pango/libpangoft2-$(PANGO_API_VERSION).la $(FREETYPE_LIBS) $(pangolibs)
INCLUDES = \
@@ -22,48 +20,25 @@ no_undefined = -no-undefined
endif
-if HAVE_XFT
-INCLUDES += $(XFT_CFLAGS)
-if INCLUDE_ARABIC_XFT
-noinst_LTLIBRARIES += libpango-arabic-xft.la
-else
-module_LTLIBRARIES += pango-arabic-xft.la
-endif
-endif
-
-xft_sources = \
- arabic-fc.c \
- arabic-ot.c \
- arabic-ot.h
-
-pango_arabic_xft_la_LDFLAGS = -export-dynamic -avoid-version -module
-pango_arabic_xft_la_LIBADD = $(pangoxftlibs)
-pango_arabic_xft_la_SOURCES = $(xft_sources)
-pango_arabic_xft_la_CFLAGS = -DBUILD_XFT
-libpango_arabic_xft_la_SOURCES = $(xft_sources)
-libpango_arabic_xft_la_CFLAGS = -DBUILD_XFT -DPANGO_MODULE_PREFIX=_pango_arabic_xft
-
-
if HAVE_FREETYPE
INCLUDES += $(FREETYPE_CFLAGS)
-if INCLUDE_ARABIC_FT2
-noinst_LTLIBRARIES += libpango-arabic-ft2.la
+if INCLUDE_ARABIC_FC
+noinst_LTLIBRARIES += libpango-arabic-fc.la
else
-module_LTLIBRARIES += pango-arabic-ft2.la
+module_LTLIBRARIES += pango-arabic-fc.la
endif
endif
-ft2_sources = \
+fc_sources = \
arabic-fc.c \
arabic-ot.c \
arabic-ot.h
-pango_arabic_ft2_la_LDFLAGS = -export-dynamic -avoid-version -module $(no_undefined)
-pango_arabic_ft2_la_LIBADD = $(pangoft2libs)
-pango_arabic_ft2_la_SOURCES = $(ft2_sources)
-pango_arabic_ft2_la_CFLAGS = -DBUILD_FT2
-libpango_arabic_ft2_la_SOURCES = $(ft2_sources)
-libpango_arabic_ft2_la_CFLAGS = -DBUILD_FT2 -DPANGO_MODULE_PREFIX=_pango_arabic_ft2
+pango_arabic_fc_la_LDFLAGS = -export-dynamic -avoid-version -module $(no_undefined)
+pango_arabic_fc_la_LIBADD = $(pangoft2libs)
+pango_arabic_fc_la_SOURCES = $(fc_sources)
+libpango_arabic_fc_la_SOURCES = $(fc_sources)
+libpango_arabic_fc_la_CFLAGS = -DPANGO_MODULE_PREFIX=_pango_arabic_fc
included-modules: $(noinst_LTLIBRARIES)
diff --git a/modules/arabic/arabic-fc.c b/modules/arabic/arabic-fc.c
index c94b2626..80c9ae81 100644
--- a/modules/arabic/arabic-fc.c
+++ b/modules/arabic/arabic-fc.c
@@ -27,15 +27,9 @@
#include "pango-engine.h"
#include "pango-utils.h"
-#ifdef BUILD_XFT
-#include "pangoxft.h"
-#define SCRIPT_ENGINE_NAME "ArabicScriptEngineXft"
-#define RENDER_TYPE PANGO_RENDER_TYPE_XFT
-#else
-#include "pangoft2.h"
-#define SCRIPT_ENGINE_NAME "ArabicScriptEngineFt2"
-#define RENDER_TYPE PANGO_RENDER_TYPE_FT2
-#endif
+#include "pangofc-font.h"
+#define SCRIPT_ENGINE_NAME "ArabicScriptEngineFc"
+#define RENDER_TYPE PANGO_RENDER_TYPE_FC
static PangoEngineRange arabic_ranges[] = {
/* Language characters */
diff --git a/modules/basic/Makefile.am b/modules/basic/Makefile.am
index b5ec7b1e..765e8d42 100644
--- a/modules/basic/Makefile.am
+++ b/modules/basic/Makefile.am
@@ -4,7 +4,6 @@ basic_sources = basic-x.c
pangolibs = $(top_builddir)/pango/libpango-$(PANGO_API_VERSION).la $(GLIB_LIBS)
pangoxlibs = $(top_builddir)/pango/libpangox-$(PANGO_API_VERSION).la $(X_LIBS) $(pangolibs)
-pangoxftlibs = $(top_builddir)/pango/libpangoxft-$(PANGO_API_VERSION).la $(XFT_LIBS) $(pangolibs)
pangoft2libs = $(top_builddir)/pango/libpangoft2-$(PANGO_API_VERSION).la $(FREETYPE_LIBS) $(pangolibs)
pangowin32libs = $(top_builddir)/pango/libpangowin32-$(PANGO_API_VERSION).la $(pangolibs)
@@ -40,38 +39,20 @@ libpango_basic_x_la_SOURCES = basic-x.c
libpango_basic_x_la_CFLAGS = -DPANGO_MODULE_PREFIX=_pango_basic_x
-if HAVE_XFT
-INCLUDES += $(XFT_CFLAGS)
-if INCLUDE_BASIC_XFT
-noinst_LTLIBRARIES += libpango-basic-xft.la
-else
-module_LTLIBRARIES += pango-basic-xft.la
-endif
-endif
-
-pango_basic_xft_la_LDFLAGS = -export-dynamic -avoid-version -module
-pango_basic_xft_la_LIBADD = $(pangoxftlibs)
-pango_basic_xft_la_SOURCES = basic-fc.c
-pango_basic_xft_la_CFLAGS = -DBUILD_XFT
-libpango_basic_xft_la_SOURCES = basic-fc.c
-libpango_basic_xft_la_CFLAGS = -DBUILD_XFT -DPANGO_MODULE_PREFIX=_pango_basic_xft
-
-
if HAVE_FREETYPE
INCLUDES += $(FREETYPE_CFLAGS)
-if INCLUDE_BASIC_FT2
-noinst_LTLIBRARIES += libpango-basic-ft2.la
+if INCLUDE_BASIC_FC
+noinst_LTLIBRARIES += libpango-basic-fc.la
else
-module_LTLIBRARIES += pango-basic-ft2.la
+module_LTLIBRARIES += pango-basic-fc.la
endif
endif
-pango_basic_ft2_la_LDFLAGS = -export-dynamic -avoid-version -module $(no_undefined)
-pango_basic_ft2_la_LIBADD = $(pangoft2libs)
-pango_basic_ft2_la_SOURCES = basic-fc.c
-pango_basic_ft2_la_CFLAGS = -DBUILD_FT2
-libpango_basic_ft2_la_SOURCES = basic-fc.c
-libpango_basic_ft2_la_CFLAGS = -DBUILD_FT2 -DPANGO_MODULE_PREFIX=_pango_basic_ft2
+pango_basic_fc_la_LDFLAGS = -export-dynamic -avoid-version -module $(no_undefined)
+pango_basic_fc_la_LIBADD = $(pangoft2libs)
+pango_basic_fc_la_SOURCES = basic-fc.c
+libpango_basic_fc_la_SOURCES = basic-fc.c
+libpango_basic_fc_la_CFLAGS = -DPANGO_MODULE_PREFIX=_pango_basic_fc
if HAVE_WIN32
diff --git a/modules/basic/basic-fc.c b/modules/basic/basic-fc.c
index 99e8c361..7af2d3af 100644
--- a/modules/basic/basic-fc.c
+++ b/modules/basic/basic-fc.c
@@ -28,15 +28,9 @@
#include "basic-common.h"
-#ifdef BUILD_XFT
-#include "pangoxft.h"
-#define SCRIPT_ENGINE_NAME "BasicScriptEngineXft"
-#define RENDER_TYPE PANGO_RENDER_TYPE_XFT
-#else /* FT2 */
-#include "pangoft2.h"
-#define SCRIPT_ENGINE_NAME "BasicScriptEngineFt2"
-#define RENDER_TYPE PANGO_RENDER_TYPE_FT2
-#endif
+#include "pangofc-font.h"
+#define SCRIPT_ENGINE_NAME "BasicScriptEngineFc"
+#define RENDER_TYPE PANGO_RENDER_TYPE_FC
static PangoEngineRange basic_ranges[] = {
/* Basic Latin, Latin-1 Supplement, Latin Extended-A, Latin Extended-B,
diff --git a/modules/hangul/Makefile.am b/modules/hangul/Makefile.am
index 1faac747..e6f82b45 100644
--- a/modules/hangul/Makefile.am
+++ b/modules/hangul/Makefile.am
@@ -1,8 +1,6 @@
## Process this file with automake to create Makefile.in.
pangolibs = $(top_builddir)/pango/libpango-$(PANGO_API_VERSION).la $(GLIB_LIBS)
-pangoxlibs = $(top_builddir)/pango/libpangox-$(PANGO_API_VERSION).la $(X_LIBS) $(pangolibs)
-pangoxftlibs = $(top_builddir)/pango/libpangoxft-$(PANGO_API_VERSION).la $(XFT_LIBS) $(pangolibs)
pangoft2libs = $(top_builddir)/pango/libpangoft2-$(PANGO_API_VERSION).la $(FREETYPE_LIBS) $(pangolibs)
INCLUDES = \
@@ -22,42 +20,22 @@ module_LTLIBRARIES =
noinst_LTLIBRARIES =
-if HAVE_XFT
-INCLUDES += $(XFT_CFLAGS)
-if INCLUDE_HANGUL_XFT
-noinst_LTLIBRARIES += libpango-hangul-xft.la
-else
-module_LTLIBRARIES += pango-hangul-xft.la
-endif
-endif
-
-xft_sources = hangul-fc.c hangul-defs.h
-
-pango_hangul_xft_la_LDFLAGS = -export-dynamic -avoid-version -module
-pango_hangul_xft_la_LIBADD = $(pangoxftlibs)
-pango_hangul_xft_la_SOURCES = $(xft_sources)
-pango_hangul_xft_la_CFLAGS = -DBUILD_XFT
-libpango_hangul_xft_la_SOURCES = $(xft_sources)
-libpango_hangul_xft_la_CFLAGS = -DBUILD_XFT -DPANGO_MODULE_PREFIX=_pango_hangul_xft
-
-
if HAVE_FREETYPE
INCLUDES += $(FREETYPE_CFLAGS)
-if INCLUDE_HANGUL_FT2
-noinst_LTLIBRARIES += libpango-hangul-ft2.la
+if INCLUDE_HANGUL_FC
+noinst_LTLIBRARIES += libpango-hangul-fc.la
else
-module_LTLIBRARIES += pango-hangul-ft2.la
+module_LTLIBRARIES += pango-hangul-fc.la
endif
endif
-ft2_sources = hangul-fc.c hangul-defs.h
+fc_sources = hangul-fc.c hangul-defs.h
-pango_hangul_ft2_la_LDFLAGS = -export-dynamic -avoid-version -module $(no_undefined)
-pango_hangul_ft2_la_LIBADD = $(pangoft2libs)
-pango_hangul_ft2_la_SOURCES = $(ft2_sources)
-pango_hangul_ft2_la_CFLAGS = -DBUILD_FT2
-libpango_hangul_ft2_la_SOURCES = $(ft2_sources)
-libpango_hangul_ft2_la_CFLAGS = -DBUILD_FT2 -DPANGO_MODULE_PREFIX=_pango_hangul_ft2
+pango_hangul_fc_la_LDFLAGS = -export-dynamic -avoid-version -module $(no_undefined)
+pango_hangul_fc_la_LIBADD = $(pangoft2libs)
+pango_hangul_fc_la_SOURCES = $(fc_sources)
+libpango_hangul_fc_la_SOURCES = $(fc_sources)
+libpango_hangul_fc_la_CFLAGS = -DPANGO_MODULE_PREFIX=_pango_hangul_fc
EXTRA_DIST = \
diff --git a/modules/hangul/hangul-fc.c b/modules/hangul/hangul-fc.c
index 0008ba08..3ba6a479 100644
--- a/modules/hangul/hangul-fc.c
+++ b/modules/hangul/hangul-fc.c
@@ -28,15 +28,9 @@
#include "hangul-defs.h"
#include "tables-jamos.i"
-#ifdef BUILD_XFT
-#include "pangoxft.h"
-#define SCRIPT_ENGINE_NAME "HangulScriptEngineXft"
-#define RENDER_TYPE PANGO_RENDER_TYPE_XFT
-#else
-#include "pangoft2.h"
-#define SCRIPT_ENGINE_NAME "HangulScriptEngineFT2"
-#define RENDER_TYPE PANGO_RENDER_TYPE_FT2
-#endif
+#include "pangofc-font.h"
+#define SCRIPT_ENGINE_NAME "HangulScriptEngineFc"
+#define RENDER_TYPE PANGO_RENDER_TYPE_FC
static PangoEngineRange hangul_ranges[] = {
/* Language characters */
diff --git a/modules/hebrew/Makefile.am b/modules/hebrew/Makefile.am
index f4480151..7f9297d1 100644
--- a/modules/hebrew/Makefile.am
+++ b/modules/hebrew/Makefile.am
@@ -1,8 +1,6 @@
## Process this file with automake to create Makefile.in.
pangolibs = $(top_builddir)/pango/libpango-$(PANGO_API_VERSION).la $(GLIB_LIBS)
-pangoxlibs = $(top_builddir)/pango/libpangox-$(PANGO_API_VERSION).la $(X_LIBS) $(pangolibs)
-pangoxftlibs = $(top_builddir)/pango/libpangoxft-$(PANGO_API_VERSION).la $(XFT_LIBS) $(pangolibs)
pangoft2libs = $(top_builddir)/pango/libpangoft2-$(PANGO_API_VERSION).la $(FREETYPE_LIBS) $(pangolibs)
INCLUDES = \
@@ -20,31 +18,12 @@ noinst_LTLIBRARIES =
common_sources = hebrew-shaper.c hebrew-shaper.h
-if HAVE_XFT
-INCLUDES += $(XFT_CFLAGS)
-if INCLUDE_HEBREW_XFT
-noinst_LTLIBRARIES += libpango-hebrew-xft.la
-else
-module_LTLIBRARIES += pango-hebrew-xft.la
-endif
-endif
-
-hebrew_xft_sources = $(common_sources) hebrew-fc.c
-
-pango_hebrew_xft_la_LDFLAGS = -export-dynamic -avoid-version -module
-pango_hebrew_xft_la_LIBADD = $(pangoxftlibs)
-pango_hebrew_xft_la_SOURCES = $(hebrew_xft_sources)
-pango_hebrew_xft_la_CFLAGS = -DBUILD_XFT
-libpango_hebrew_xft_la_SOURCES = $(hebrew_xft_sources)
-libpango_hebrew_xft_la_CFLAGS = -DBUILD_XFT -DPANGO_MODULE_PREFIX=_pango_hebrew_xft
-
-
if HAVE_FREETYPE
INCLUDES += $(FREETYPE_CFLAGS)
-if INCLUDE_HEBREW_FT2
-noinst_LTLIBRARIES += libpango-hebrew-ft2.la
+if INCLUDE_HEBREW_FC
+noinst_LTLIBRARIES += libpango-hebrew-fc.la
else
-module_LTLIBRARIES += pango-hebrew-ft2.la
+module_LTLIBRARIES += pango-hebrew-fc.la
endif
endif
@@ -52,14 +31,13 @@ if PLATFORM_WIN32
no_undefined = -no-undefined
endif
-hebrew_ft2_sources = $(common_sources) hebrew-fc.c
+hebrew_fc_sources = $(common_sources) hebrew-fc.c
-pango_hebrew_ft2_la_LDFLAGS = -export-dynamic -avoid-version -module $(no_undefined)
-pango_hebrew_ft2_la_LIBADD = $(pangoft2libs)
-pango_hebrew_ft2_la_SOURCES = $(hebrew_ft2_sources)
-pango_hebrew_ft2_la_CFLAGS = -DBUILD_FT2
-libpango_hebrew_ft2_la_SOURCES = $(hebrew_ft2_sources)
-libpango_hebrew_ft2_la_CFLAGS = -DBUILD_FT2 -DPANGO_MODULE_PREFIX=_pango_hebrew_ft2
+pango_hebrew_fc_la_LDFLAGS = -export-dynamic -avoid-version -module $(no_undefined)
+pango_hebrew_fc_la_LIBADD = $(pangoft2libs)
+pango_hebrew_fc_la_SOURCES = $(hebrew_fc_sources)
+libpango_hebrew_fc_la_SOURCES = $(hebrew_fc_sources)
+libpango_hebrew_fc_la_CFLAGS = -DPANGO_MODULE_PREFIX=_pango_hebrew_fc
included-modules: $(noinst_LTLIBRARIES)
diff --git a/modules/hebrew/hebrew-fc.c b/modules/hebrew/hebrew-fc.c
index a18e3d09..273755e4 100644
--- a/modules/hebrew/hebrew-fc.c
+++ b/modules/hebrew/hebrew-fc.c
@@ -34,15 +34,9 @@ static PangoEngineRange hebrew_ranges[] = {
{ 0xfb1d, 0xfb4f, "*" } /* Hebrew presentation forms */
};
-#ifdef BUILD_XFT2
-#include "pangoxft.h"
-#define SCRIPT_ENGINE_NAME "HebrewScriptEngineXft"
-#define RENDER_TYPE PANGO_RENDER_TYPE_XFT
-#else
-#include "pangoft2.h"
-#define SCRIPT_ENGINE_NAME "HebrewScriptEngineFt2"
-#define RENDER_TYPE PANGO_RENDER_TYPE_FT2
-#endif
+#include "pangofc-font.h"
+#define SCRIPT_ENGINE_NAME "HebrewScriptEngineFc"
+#define RENDER_TYPE PANGO_RENDER_TYPE_FC
static PangoEngineInfo script_engines[] = {
{
diff --git a/modules/indic/Makefile.am b/modules/indic/Makefile.am
index 4da765d1..38614d72 100644
--- a/modules/indic/Makefile.am
+++ b/modules/indic/Makefile.am
@@ -1,8 +1,6 @@
## Process this file with automake to create Makefile.in.
pangolibs = $(top_builddir)/pango/libpango-$(PANGO_API_VERSION).la $(GLIB_LIBS)
-pangoxlibs = $(top_builddir)/pango/libpangox-$(PANGO_API_VERSION).la $(X_LIBS) $(pangolibs)
-pangoxftlibs = $(top_builddir)/pango/libpangoxft-$(PANGO_API_VERSION).la $(XFT_LIBS) $(pangolibs)
pangoft2libs = $(top_builddir)/pango/libpangoft2-$(PANGO_API_VERSION).la $(FREETYPE_LIBS) $(pangolibs)
INCLUDES = \
@@ -22,41 +20,16 @@ module_LTLIBRARIES =
noinst_LTLIBRARIES =
-if HAVE_XFT
-INCLUDES += $(XFT_CFLAGS)
-if INCLUDE_INDIC_XFT
-noinst_LTLIBRARIES += libpango-indic-xft.la
-else
-module_LTLIBRARIES += pango-indic-xft.la
-endif
-endif
-
-xft_sources = \
- indic-fc.c \
- indic-ot-class-tables.c \
- indic-ot.c \
- indic-ot.h \
- mprefixups.c \
- mprefixups.h
-
-pango_indic_xft_la_LDFLAGS = -export-dynamic -avoid-version -module
-pango_indic_xft_la_LIBADD = $(pangoxftlibs)
-pango_indic_xft_la_SOURCES = $(xft_sources)
-pango_indic_xft_la_CFLAGS = -DBUILD_XFT
-libpango_indic_xft_la_SOURCES = $(xft_sources)
-libpango_indic_xft_la_CFLAGS = -DBUILD_FT2 -DPANGO_MODULE_PREFIX=_pango_indic_xft
-
-
if HAVE_FREETYPE
INCLUDES += $(FREETYPE_CFLAGS)
-if INCLUDE_INDIC_FT2
-noinst_LTLIBRARIES += libpango-indic-ft2.la
+if INCLUDE_INDIC_FC
+noinst_LTLIBRARIES += libpango-indic-fc.la
else
-module_LTLIBRARIES += pango-indic-ft2.la
+module_LTLIBRARIES += pango-indic-fc.la
endif
endif
-ft2_sources = \
+fc_sources = \
indic-fc.c \
indic-ot-class-tables.c \
indic-ot.c \
@@ -64,12 +37,11 @@ ft2_sources = \
mprefixups.c \
mprefixups.h
-pango_indic_ft2_la_LDFLAGS = -export-dynamic -avoid-version -module $(no_undefined)
-pango_indic_ft2_la_LIBADD = $(pangoft2libs)
-pango_indic_ft2_la_SOURCES = $(ft2_sources)
-pango_indic_ft2_la_CFLAGS = -DBUILD_FT2
-libpango_indic_ft2_la_SOURCES = $(ft2_sources)
-libpango_indic_ft2_la_CFLAGS = -DBUILD_FT2 -DPANGO_MODULE_PREFIX=_pango_indic_ft2
+pango_indic_fc_la_LDFLAGS = -export-dynamic -avoid-version -module $(no_undefined)
+pango_indic_fc_la_LIBADD = $(pangoft2libs)
+pango_indic_fc_la_SOURCES = $(fc_sources)
+libpango_indic_fc_la_SOURCES = $(fc_sources)
+libpango_indic_fc_la_CFLAGS = -DPANGO_MODULE_PREFIX=_pango_indic_fc
included-modules: $(noinst_LTLIBRARIES)
diff --git a/modules/indic/indic-fc.c b/modules/indic/indic-fc.c
index 44832304..bd4c8f4b 100644
--- a/modules/indic/indic-fc.c
+++ b/modules/indic/indic-fc.c
@@ -46,15 +46,9 @@ struct _PangoIndicInfo
gchar *gposQuarkName;
};
-#ifdef BUILD_XFT
-#include "pangoxft.h"
-#define ENGINE_SUFFIX "ScriptEngineXft"
-#define RENDER_TYPE PANGO_RENDER_TYPE_XFT
-#else
-#include "pangoft2.h"
-#define ENGINE_SUFFIX "ScriptEngineFT2"
-#define RENDER_TYPE PANGO_RENDER_TYPE_FT2
-#endif
+#include "pangofc-font.h"
+#define ENGINE_SUFFIX "ScriptEngineFc"
+#define RENDER_TYPE PANGO_RENDER_TYPE_FC
#define INDIC_ENGINE_INFO(script) {#script ENGINE_SUFFIX, PANGO_ENGINE_TYPE_SHAPE, RENDER_TYPE, script##_ranges, G_N_ELEMENTS(script##_ranges)}
diff --git a/modules/tamil/.cvsignore b/modules/tamil/.cvsignore
deleted file mode 100644
index 6e5ca7ed..00000000
--- a/modules/tamil/.cvsignore
+++ /dev/null
@@ -1,6 +0,0 @@
-Makefile
-Makefile.in
-.deps
-.libs
-*.lo
-*.la
diff --git a/modules/thai/Makefile.am b/modules/thai/Makefile.am
index d093c6f2..bfa4a78e 100644
--- a/modules/thai/Makefile.am
+++ b/modules/thai/Makefile.am
@@ -1,8 +1,6 @@
## Process this file with automake to create Makefile.in.
pangolibs = $(top_builddir)/pango/libpango-$(PANGO_API_VERSION).la $(GLIB_LIBS)
-pangoxlibs = $(top_builddir)/pango/libpangox-$(PANGO_API_VERSION).la $(X_LIBS) $(pangolibs)
-pangoxftlibs = $(top_builddir)/pango/libpangoxft-$(PANGO_API_VERSION).la $(XFT_LIBS) $(pangolibs)
pangoft2libs = $(top_builddir)/pango/libpangoft2-$(PANGO_API_VERSION).la $(FREETYPE_LIBS) $(pangolibs)
INCLUDES = \
@@ -24,42 +22,22 @@ noinst_LTLIBRARIES =
common_sources = thai-shaper.c thai-shaper.h
-if HAVE_XFT
-INCLUDES += $(XFT_CFLAGS)
-if INCLUDE_THAI_XFT
-noinst_LTLIBRARIES += libpango-thai-xft.la
-else
-module_LTLIBRARIES += pango-thai-xft.la
-endif
-endif
-
-thai_xft_sources = $(common_sources) thai-fc.c
-
-pango_thai_xft_la_LDFLAGS = -export-dynamic -avoid-version -module
-pango_thai_xft_la_LIBADD = $(pangoxftlibs)
-pango_thai_xft_la_SOURCES = $(thai_xft_sources)
-pango_thai_xft_la_CFLAGS = -DBUILD_XFT
-libpango_thai_xft_la_SOURCES = $(thai_xft_sources)
-libpango_thai_xft_la_CFLAGS = -DBUILD_XFT -DPANGO_MODULE_PREFIX=_pango_thai_xft
-
-
if HAVE_FREETYPE
INCLUDES += $(FREETYPE_CFLAGS)
-if INCLUDE_THAI_FT2
-noinst_LTLIBRARIES += libpango-thai-ft2.la
+if INCLUDE_THAI_FC
+noinst_LTLIBRARIES += libpango-thai-fc.la
else
-module_LTLIBRARIES += pango-thai-ft2.la
+module_LTLIBRARIES += pango-thai-fc.la
endif
endif
-thai_ft2_sources = $(common_sources) thai-fc.c
+thai_fc_sources = $(common_sources) thai-fc.c
-pango_thai_ft2_la_LDFLAGS = -export-dynamic -avoid-version -module $(no_undefined)
-pango_thai_ft2_la_LIBADD = $(pangoft2libs)
-pango_thai_ft2_la_SOURCES = $(thai_ft2_sources)
-pango_thai_ft2_la_CFLAGS = -DBUILD_FT2
-libpango_thai_ft2_la_SOURCES = $(thai_ft2_sources)
-libpango_thai_ft2_la_CFLAGS = -DBUILD_FT2 -DPANGO_MODULE_PREFIX=_pango_thai_ft2
+pango_thai_fc_la_LDFLAGS = -export-dynamic -avoid-version -module $(no_undefined)
+pango_thai_fc_la_LIBADD = $(pangoft2libs)
+pango_thai_fc_la_SOURCES = $(thai_fc_sources)
+libpango_thai_fc_la_SOURCES = $(thai_fc_sources)
+libpango_thai_fc_la_CFLAGS = -DPANGO_MODULE_PREFIX=_pango_thai_fc
included-modules: $(noinst_LTLIBRARIES)
diff --git a/modules/thai/thai-fc.c b/modules/thai/thai-fc.c
index a8e3ef3a..6c537639 100644
--- a/modules/thai/thai-fc.c
+++ b/modules/thai/thai-fc.c
@@ -33,15 +33,9 @@
#include "pango-engine.h"
#include "thai-shaper.h"
-#ifdef BUILD_XFT
-#include "pangoxft.h"
-#define SCRIPT_ENGINE_NAME "ThaiScriptEngineXft"
-#define RENDER_TYPE PANGO_RENDER_TYPE_XFT
-#else
-#include "pangoft2.h"
-#define SCRIPT_ENGINE_NAME "ThaiScriptEngineFT2"
-#define RENDER_TYPE PANGO_RENDER_TYPE_FT2
-#endif
+#include "pangofc-font.h"
+#define SCRIPT_ENGINE_NAME "ThaiScriptEngineFc"
+#define RENDER_TYPE PANGO_RENDER_TYPE_FC
/* We handle the range U+0e01 to U+0e5b exactly
*/
diff --git a/pango/Makefile.am b/pango/Makefile.am
index ac541e05..a7de4dba 100644
--- a/pango/Makefile.am
+++ b/pango/Makefile.am
@@ -67,7 +67,6 @@ 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
@@ -90,7 +89,8 @@ pango_headers = \
pango-tabs.h \
pango-types.h \
pango-utils.h \
- pangofc-font.h
+ pangofc-font.h \
+ pangofc-fontmap.h
pangoinclude_HEADERS = \
$(pango_headers) \
@@ -152,14 +152,13 @@ lib_LTLIBRARIES += libpangoxft-1.0.la
endif
libpangoxft_1_0_la_LDFLAGS = -version-info $(LT_VERSION_INFO)
-libpangoxft_1_0_la_LIBADD = opentype/libpango-ot.la libpango-$(PANGO_API_VERSION).la $(INCLUDED_XFT_MODULES) $(XFT_LIBS)
+libpangoxft_1_0_la_LIBADD = libpangoft2-$(PANGO_API_VERSION).la libpango-$(PANGO_API_VERSION).la $(INCLUDED_XFT_MODULES) $(XFT_LIBS)
libpangoxft_1_0_la_DEPENDENCIES = libpango-$(PANGO_API_VERSION).la $(INCLUDED_XFT_MODULES)
libpangoxft_1_0_la_SOURCES = \
pangoxft-font.c \
pangoxft-fontmap.c \
- pangoxft-private.h \
- module-defs-xft.c
+ pangoxft-private.h
# ------------------- libpangoft2 -------------------
@@ -174,11 +173,14 @@ libpangoft2_1_0_la_LIBADD = opentype/libpango-ot.la libpango-$(PANGO_API_VERSION
libpangoft2_1_0_la_DEPENDENCIES = libpango-$(PANGO_API_VERSION).la $(INCLUDED_FT2_MODULES)
libpangoft2_1_0_la_SOURCES = \
+ pangofc-font.c \
+ pangofc-fontmap.c \
+ pangofc-private.h \
pangoft2.h \
pangoft2.c \
pangoft2-private.h \
pangoft2-fontmap.c \
- module-defs-ft2.c
+ module-defs-fc.c
if OS_WIN32
libpangoft2_1_0_la_LDFLAGS += -export-symbols pangoft2.def
@@ -292,10 +294,9 @@ pango_querymodules_LDADD += libpango-$(PANGO_API_VERSION).la $(GLIB_LIBS)
EXTRA_DIST = \
pango-enum-types.h \
- module-defs-ft2.c.win32 \
+ module-defs-fc.c.win32 \
module-defs-win32.c.win32 \
module-defs.h \
- pangofc-fontmap.cI \
pango.def \
pangowin32.def \
pangoft2.def \
@@ -322,9 +323,7 @@ module-defs.h: $(top_builddir)/config.status
cd $(top_builddir) && $(SHELL) ./config.status pango/$@
module-defs-x.c: $(top_builddir)/config.status
cd $(top_builddir) && $(SHELL) ./config.status pango/$@
-module-defs-xft.c: $(top_builddir)/config.status
- cd $(top_builddir) && $(SHELL) ./config.status pango/$@
-module-defs-ft2.c: $(top_builddir)/config.status
+module-defs-fc.c: $(top_builddir)/config.status
cd $(top_builddir) && $(SHELL) ./config.status pango/$@
module-defs-win32.c: $(top_builddir)/config.status
cd $(top_builddir) && $(SHELL) ./config.status pango/$@
@@ -336,8 +335,7 @@ CLEANFILES = \
s-enum-types-c \
module-defs.h \
module-defs-x.c \
- module-defs-xft.c \
- module-defs-ft2.c \
+ module-defs-fc.c \
module-defs-win32.c
diff --git a/pango/modules.h b/pango/modules.h
index 56707b06..c8f306df 100644
--- a/pango/modules.h
+++ b/pango/modules.h
@@ -26,8 +26,7 @@
#define __MODULES_H__
extern PangoIncludedModule _pango_included_x_modules[];
-extern PangoIncludedModule _pango_included_xft_modules[];
-extern PangoIncludedModule _pango_included_ft2_modules[];
+extern PangoIncludedModule _pango_included_fc_modules[];
extern PangoIncludedModule _pango_included_win32_modules[];
#endif /* __MODULES_H__ */
diff --git a/pango/pangofc-font.c b/pango/pangofc-font.c
index aadb2e08..bf218f73 100644
--- a/pango/pangofc-font.c
+++ b/pango/pangofc-font.c
@@ -20,6 +20,48 @@
*/
#include "pangofc-font.h"
+#include "pangofc-fontmap.h"
+#include "pangofc-private.h"
+#include "pango-layout.h"
+#include "pango-modules.h"
+#include "pango-utils.h"
+
+#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 _PangoFcMetricsInfo PangoFcMetricsInfo;
+
+struct _PangoFcMetricsInfo
+{
+ const char *sample_str;
+ PangoFontMetrics *metrics;
+};
+
+enum {
+ PROP_0,
+ PROP_PATTERN
+};
+
+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,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec);
+static PangoEngineShape * pango_fc_font_find_shaper (PangoFont *font,
+ PangoLanguage *language,
+ guint32 ch);
+static PangoCoverage * pango_fc_font_get_coverage (PangoFont *font,
+ PangoLanguage *language);
+static PangoFontMetrics * pango_fc_font_get_metrics (PangoFont *font,
+ PangoLanguage *language);
+static PangoFontDescription *pango_fc_font_describe (PangoFont *font);
+
+static GObjectClass *parent_class;
GType
pango_fc_font_get_type (void)
@@ -33,7 +75,7 @@ pango_fc_font_get_type (void)
sizeof (PangoFcFontClass),
(GBaseInitFunc) NULL,
(GBaseFinalizeFunc) NULL,
- NULL, /* class_init */
+ (GClassInitFunc) pango_fc_font_class_init,
NULL, /* class_finalize */
NULL, /* class_data */
sizeof (PangoFcFont),
@@ -43,12 +85,245 @@ pango_fc_font_get_type (void)
object_type = g_type_register_static (PANGO_TYPE_FONT,
"PangoFcFont",
- &object_info, 0);
+ &object_info,
+ G_TYPE_FLAG_ABSTRACT);
}
return object_type;
}
+static void
+pango_fc_font_class_init (PangoFcFontClass *class)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (class);
+ PangoFontClass *font_class = PANGO_FONT_CLASS (class);
+
+ parent_class = g_type_class_peek_parent (class);
+
+ object_class->finalize = pango_fc_font_finalize;
+ object_class->set_property = pango_fc_font_set_property;
+ font_class->describe = pango_fc_font_describe;
+ font_class->find_shaper = pango_fc_font_find_shaper;
+ font_class->get_coverage = pango_fc_font_get_coverage;
+ font_class->get_metrics = pango_fc_font_get_metrics;
+
+ g_object_class_install_property (object_class, PROP_PATTERN,
+ g_param_spec_pointer ("pattern",
+ "Pattern",
+ "The fontconfig pattern for this font",
+ G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
+}
+
+static void
+free_metrics_info (PangoFcMetricsInfo *info)
+{
+ pango_font_metrics_unref (info->metrics);
+ g_free (info);
+}
+
+static void
+pango_fc_font_finalize (GObject *object)
+{
+ PangoFcFont *fcfont = PANGO_FC_FONT (object);
+
+ g_slist_foreach (fcfont->metrics_by_lang, (GFunc)free_metrics_info, NULL);
+ g_slist_free (fcfont->metrics_by_lang);
+
+ if (fcfont->fontmap)
+ _pango_fc_font_map_remove (PANGO_FC_FONT_MAP (fcfont->fontmap), fcfont);
+
+ FcPatternDestroy (fcfont->font_pattern);
+ pango_font_description_free (fcfont->description);
+
+ parent_class->finalize (object);
+}
+
+static void
+pango_fc_font_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ switch (prop_id)
+ {
+ case PROP_PATTERN:
+ {
+ PangoFcFont *fcfont = PANGO_FC_FONT (object);
+ FcPattern *pattern = g_value_get_pointer (value);
+
+ g_return_if_fail (pattern != NULL);
+ g_return_if_fail (fcfont->font_pattern == NULL);
+
+ FcPatternReference (pattern);
+ fcfont->font_pattern = pattern;
+ fcfont->description = pango_fc_font_description_from_pattern (pattern, TRUE);
+ }
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static PangoFontDescription *
+pango_fc_font_describe (PangoFont *font)
+{
+ PangoFcFont *fcfont = (PangoFcFont *)font;
+
+ return pango_font_description_copy (fcfont->description);
+}
+
+static PangoMap *
+pango_fc_get_shaper_map (PangoLanguage *language)
+{
+ static guint engine_type_id = 0;
+ static guint render_type_id = 0;
+
+ if (engine_type_id == 0)
+ {
+ engine_type_id = g_quark_from_static_string (PANGO_ENGINE_TYPE_SHAPE);
+ render_type_id = g_quark_from_static_string (PANGO_RENDER_TYPE_FC);
+ }
+
+ return pango_find_map (language, engine_type_id, render_type_id);
+}
+
+static PangoEngineShape *
+pango_fc_font_find_shaper (PangoFont *font,
+ PangoLanguage *language,
+ guint32 ch)
+{
+ PangoMap *shaper_map = NULL;
+
+ shaper_map = pango_fc_get_shaper_map (language);
+ return (PangoEngineShape *)pango_map_get_engine (shaper_map, ch);
+}
+
+static PangoCoverage *
+pango_fc_font_get_coverage (PangoFont *font,
+ PangoLanguage *language)
+{
+ PangoFcFont *fcfont = (PangoFcFont *)font;
+
+ return _pango_fc_font_map_get_coverage (PANGO_FC_FONT_MAP (fcfont->fontmap),
+ fcfont->font_pattern);
+}
+
+/* For Xft, it would be slightly more efficient to simply to
+ * call Xft, and also more robust against changes in Xft.
+ * But for now, we simply use the same code for all backends.
+ *
+ * The code in this function is partly based on code from Xft,
+ * Copyright 2000 Keith Packard
+ */
+static void
+get_face_metrics (PangoFcFont *fcfont,
+ PangoFontMetrics *metrics)
+{
+ FT_Face face = pango_fc_font_lock_face (fcfont);
+ FcMatrix *fc_matrix;
+ FT_Matrix ft_matrix;
+ gboolean have_transform = FALSE;
+
+ if (FcPatternGetMatrix (fcfont->font_pattern,
+ FC_MATRIX, 0, &fc_matrix) == FcResultMatch)
+ {
+ ft_matrix.xx = 0x10000L * fc_matrix->xx;
+ ft_matrix.yy = 0x10000L * fc_matrix->yy;
+ ft_matrix.xy = 0x10000L * fc_matrix->xy;
+ ft_matrix.yx = 0x10000L * fc_matrix->yx;
+
+ have_transform = (ft_matrix.xx != 0x10000 || ft_matrix.xy != 0 ||
+ ft_matrix.yx != 0 || ft_matrix.yy != 0x10000);
+ }
+
+ if (have_transform)
+ {
+ FT_Vector vector;
+
+ vector.x = 0;
+ vector.y = face->size->metrics.descender;
+ FT_Vector_Transform (&vector, &ft_matrix);
+ metrics->descent = PANGO_UNITS_26_6 (vector.y);
+
+ vector.x = 0;
+ vector.y = face->size->metrics.ascender;
+ FT_Vector_Transform (&vector, &ft_matrix);
+ metrics->ascent = PANGO_UNITS_26_6 (vector.y);
+ }
+ else
+ {
+ metrics->descent = PANGO_UNITS_26_6 (face->size->metrics.descender);
+ metrics->ascent = PANGO_UNITS_26_6 (face->size->metrics.ascender);
+ }
+
+ pango_fc_font_unlock_face (fcfont);
+}
+
+
+static PangoFontMetrics *
+pango_fc_font_get_metrics (PangoFont *font,
+ PangoLanguage *language)
+{
+ PangoFcFont *fcfont = PANGO_FC_FONT (font);
+ PangoFcMetricsInfo *info = NULL; /* Quiet gcc */
+ GSList *tmp_list;
+
+ const char *sample_str = pango_language_get_sample_string (language);
+
+ tmp_list = fcfont->metrics_by_lang;
+ while (tmp_list)
+ {
+ info = tmp_list->data;
+
+ if (info->sample_str == sample_str) /* We _don't_ need strcmp */
+ break;
+
+ tmp_list = tmp_list->next;
+ }
+
+ if (!tmp_list)
+ {
+ PangoLayout *layout;
+ PangoRectangle extents;
+ PangoContext *context;
+
+ info = g_new0 (PangoFcMetricsInfo, 1);
+ fcfont->metrics_by_lang = g_slist_prepend (fcfont->metrics_by_lang,
+ info);
+
+ if (fcfont->fontmap)
+ {
+ info->sample_str = sample_str;
+ info->metrics = pango_font_metrics_new ();
+
+ get_face_metrics (fcfont, info->metrics);
+
+ context = pango_fc_font_map_create_context (PANGO_FC_FONT_MAP (fcfont->fontmap));
+ pango_context_set_language (context, language);
+
+ layout = pango_layout_new (context);
+ pango_layout_set_font_description (layout, fcfont->description);
+
+ pango_layout_set_text (layout, sample_str, -1);
+ pango_layout_get_extents (layout, NULL, &extents);
+
+ info->metrics->approximate_char_width =
+ extents.width / g_utf8_strlen (sample_str, -1);
+
+ pango_layout_set_text (layout, "0123456789", -1);
+ pango_layout_get_extents (layout, NULL, &extents);
+
+ info->metrics->approximate_digit_width = extents.width / 10;
+
+ g_object_unref (layout);
+ g_object_unref (context);
+ }
+ }
+
+ return pango_font_metrics_ref (info->metrics);
+}
+
/**
* pango_fc_font_lock_face:
* @font: a #PangoFcFont.
@@ -151,6 +426,15 @@ pango_fc_font_get_unknown_glyph (PangoFcFont *font,
return PANGO_FC_FONT_GET_CLASS (font)->get_unknown_glyph (font, wc);
}
+void
+_pango_fc_font_shutdown (PangoFcFont *font)
+{
+ g_return_if_fail (PANGO_IS_FC_FONT (font));
+
+ if (PANGO_FC_FONT_GET_CLASS (font)->shutdown)
+ PANGO_FC_FONT_GET_CLASS (font)->shutdown (font);
+}
+
/**
* pango_fc_font_kern_glyphs
* @font: a #PangoFcFont
@@ -165,5 +449,35 @@ void
pango_fc_font_kern_glyphs (PangoFcFont *font,
PangoGlyphString *glyphs)
{
- PANGO_FC_FONT_GET_CLASS (font)->kern_glyphs (font, glyphs);
+ FT_Face face;
+ FT_Error error;
+ FT_Vector kerning;
+ int i;
+
+ g_return_if_fail (PANGO_IS_FC_FONT (font));
+ g_return_if_fail (glyphs != NULL);
+
+ face = pango_fc_font_lock_face (font);
+ if (!face)
+ return;
+
+ if (!FT_HAS_KERNING (face))
+ {
+ pango_fc_font_unlock_face (font);
+ return;
+ }
+
+ for (i = 1; i < glyphs->num_glyphs; ++i)
+ {
+ error = FT_Get_Kerning (face,
+ glyphs->glyphs[i-1].glyph,
+ glyphs->glyphs[i].glyph,
+ ft_kerning_default,
+ &kerning);
+
+ if (error == FT_Err_Ok)
+ glyphs->glyphs[i-1].geometry.width += PANGO_UNITS_26_6 (kerning.x);
+ }
+
+ pango_fc_font_unlock_face (font);
}
diff --git a/pango/pangofc-font.h b/pango/pangofc-font.h
index 6e666542..315abd2e 100644
--- a/pango/pangofc-font.h
+++ b/pango/pangofc-font.h
@@ -1,5 +1,5 @@
/* Pango
- * pangofc-font.h: Shared interfaces for fontconfig-based backends
+ * pangofc-font.h: Base fontmap type for fontconfig-based backends
*
* Copyright (C) 2003 Red Hat Software
*
@@ -23,11 +23,11 @@
#define __PANGO_FC_FONT_H__
#include <freetype/freetype.h>
+#include <fontconfig/fontconfig.h>
#include <pango/pango-font.h>
+#include <pango/pango-fontmap.h>
#include <pango/pango-glyph.h>
-#if defined(PANGO_ENABLE_ENGINE) || defined(PANGO_ENABLE_BACKEND)
-
G_BEGIN_DECLS
#define PANGO_TYPE_FC_FONT (pango_fc_font_get_type ())
@@ -37,19 +37,68 @@ G_BEGIN_DECLS
typedef struct _PangoFcFont PangoFcFont;
typedef struct _PangoFcFontClass PangoFcFontClass;
+#if defined(PANGO_ENABLE_ENGINE) || defined(PANGO_ENABLE_BACKEND)
+
+/**
+ * PANGO_RENDER_TYPE_FC:
+ *
+ * A string constant used to identify shape engines that work
+ * with the fontconfig based backends. See the @engine_type field
+ * of #PangoEngineInfo.
+ **/
+#define PANGO_RENDER_TYPE_FC "PangoRenderFc"
+
#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))
+/**
+ * PangoFcFont:
+ *
+ * #PangoFcFontMap is a base class for font implementations
+ * using the FontConfig and FreeType libraries and is used in
+ * conjunction with #PangoFcFontMap. When deriving from this
+ * class, you need to implement all of its virtual functions
+ * other than shutdown() along with the get_glyph_extents()
+ * virtual function from #PangoFont.
+ **/
struct _PangoFcFont
{
PangoFont parent_instance;
+
+ FcPattern *font_pattern; /* fully resolved pattern */
+ PangoFontMap *fontmap; /* associated map */
+ PangoFontDescription *description;
+
+ GSList *metrics_by_lang;
};
+/**
+ * PangoFcFontClass:
+ * @lock_face: Returns the FT_Face of the font and increases
+ * the reference count for the face by one.
+ * @unlock_face: Decreases the reference count for the
+ * FT_Face of the font by one. When the count is zero,
+ * the #PangoFcFont subclass is allowed to free the
+ * FT_Face.
+ * @has_char: Return %TRUE if the the font contains a glyph
+ * corresponding to the specified character.
+ * @get_glyph: Gets the glyph that corresponds to the given
+ * Unicode character.
+ * @get_unknown_glyph: Gets the glyph that should be used to
+ * display an unknown-glyph indication for the specified
+ * unicode character.
+ * @shutdown: Performs any font-specific shutdown code that
+ * needs to be done when pango_fc_font_map_shutdown is called.
+ * May be %NULL.
+ *
+ * Class structure for #PangoFcFont.
+ **/
struct _PangoFcFontClass
{
+ /*< private >*/
PangoFontClass parent_class;
/*< public >*/
@@ -61,8 +110,7 @@ struct _PangoFcFontClass
gunichar wc);
PangoGlyph (*get_unknown_glyph) (PangoFcFont *font,
gunichar wc);
- void (*kern_glyphs) (PangoFcFont *font,
- PangoGlyphString *glyphs);
+ void (*shutdown) (PangoFcFont *font);
/*< private >*/
/* Padding for future expansion */
@@ -74,8 +122,6 @@ struct _PangoFcFontClass
#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,
@@ -87,8 +133,10 @@ PangoGlyph pango_fc_font_get_unknown_glyph (PangoFcFont *font,
void pango_fc_font_kern_glyphs (PangoFcFont *font,
PangoGlyphString *glyphs);
-G_END_DECLS
-
#endif /* PANGO_ENABLE_ENGINE || PANGO_ENABLE_BACKEND */
+GType pango_fc_font_get_type (void);
+
+G_END_DECLS
+
#endif /* __PANGO_FC_FONT_H__ */
diff --git a/pango/pangofc-fontmap.c b/pango/pangofc-fontmap.c
index 28d5fa20..7607d39a 100644
--- a/pango/pangofc-fontmap.c
+++ b/pango/pangofc-fontmap.c
@@ -1,7 +1,7 @@
/* Pango
- * pangofc-fontmap.cI: Common font handling between Xft and FT2
+ * pangofc-fontmap.c: Base fontmap type for fontconfig-based backends
*
- * Copyright (C) 2000,2001,2002 Red Hat, Inc.
+ * Copyright (C) 2000-2003 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -19,16 +19,20 @@
* Boston, MA 02111-1307, USA.
*/
-/*
- * This file is included by both pangoxft-fontmap.c and pangoft2-fontmap.c
- * after making appropriate #defines for public symbols.
- */
-
/* Size of fontset cache */
#define FONTSET_CACHE_SIZE 16
-typedef struct _PangoFcCoverageKey PangoFcCoverageKey;
+#include "pango-context.h"
+#include "pangofc-fontmap.h"
+#include "pangofc-private.h"
+#include "modules.h"
+
+/* Currently broken */
+#undef INSTANCE_PRIVATE_DATA_WORKS
+
+typedef struct _PangoFcCoverageKey PangoFcCoverageKey;
typedef struct _PangoFcFace PangoFcFace;
+typedef struct _PangoFcFamily PangoFcFamily;
typedef struct _PangoFcPatternSet PangoFcPatternSet;
#define PANGO_FC_TYPE_FAMILY (pango_fc_family_get_type ())
@@ -39,6 +43,29 @@ typedef struct _PangoFcPatternSet PangoFcPatternSet;
#define PANGO_FC_FACE(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), PANGO_FC_TYPE_FACE, PangoFcFace))
#define PANGO_FC_IS_FACE(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), PANGO_FC_TYPE_FACE))
+struct _PangoFcFontMapPrivate
+{
+ /* We have one map from PangoFontDescription -> PangoXftPatternSet
+ * per language tag.
+ */
+ GList *fontset_hash_list;
+ /* pattern_hash is used to make sure we only store one copy of
+ * each identical pattern. (Speeds up lookup).
+ */
+ GHashTable *pattern_hash;
+ GHashTable *coverage_hash; /* Maps font file name/id -> PangoCoverage */
+
+ GHashTable *fonts; /* Maps XftPattern -> PangoXftFont */
+
+ GQueue *fontset_cache; /* Recently used fontsets */
+
+ /* List of all families availible */
+ PangoFcFamily **families;
+ int n_families; /* -1 == uninitialized */
+
+ guint closed : 1;
+};
+
struct _PangoFcCoverageKey
{
char *filename;
@@ -72,8 +99,7 @@ struct _PangoFcPatternSet
GList *cache_link;
};
-GType pango_fc_font_map_get_type (void);
-static GType pango_fc_family_get_type (void);
+static GType pango_fc_family_get_type (void);
static GType pango_fc_face_get_type (void);
static void pango_fc_font_map_init (PangoFcFontMap *fontmap);
@@ -93,11 +119,6 @@ static void pango_fc_font_map_list_families (PangoFontMap
static void pango_fc_pattern_set_free (PangoFcPatternSet *patterns);
-static void pango_fc_font_map_cache_clear (PangoFcFontMap *fcfontmap);
-static void pango_fc_default_substitute (PangoFcFontMap *fontmap,
- FcPattern *pattern);
-static void pango_fc_do_finalize (PangoFcFontMap *fontmap);
-
static guint pango_fc_pattern_hash (FcPattern *pattern);
static gboolean pango_fc_pattern_equal (FcPattern *pattern1,
FcPattern *pattern2);
@@ -105,7 +126,7 @@ static guint pango_fc_coverage_key_hash (PangoFcCoverageKey *key);
static gboolean pango_fc_coverage_key_equal (PangoFcCoverageKey *key1,
PangoFcCoverageKey *key2);
-static PangoFontClass *parent_class; /* Parent class structure for PangoFcFontMap */
+static PangoFontClass *parent_class;
GType
pango_fc_font_map_get_type (void)
@@ -116,7 +137,7 @@ pango_fc_font_map_get_type (void)
{
static const GTypeInfo object_info =
{
- sizeof (PangoFontMapClass),
+ sizeof (PangoFcFontMapClass),
(GBaseInitFunc) NULL,
(GBaseFinalizeFunc) NULL,
(GClassInitFunc) pango_fc_font_map_class_init,
@@ -128,7 +149,7 @@ pango_fc_font_map_get_type (void)
};
object_type = g_type_register_static (PANGO_TYPE_FONT_MAP,
- PANGO_FC_NAME "FontMap",
+ "PangoFcFontMap",
&object_info, 0);
}
@@ -138,15 +159,37 @@ pango_fc_font_map_get_type (void)
static void
pango_fc_font_map_init (PangoFcFontMap *fcfontmap)
{
- fcfontmap->n_families = -1;
-
- fcfontmap->fonts = g_hash_table_new ((GHashFunc)g_direct_hash, NULL);
- fcfontmap->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);
- fcfontmap->fontset_cache = g_queue_new ();
+ static gboolean registered_modules = FALSE;
+ PangoFcFontMapPrivate *priv = fcfontmap->priv;
+
+#if INSTANCE_PRIVATE_DATA_WORKS
+ priv = fcfontmap->priv = G_TYPE_INSTANCE_GET_PRIVATE (fcfontmap,
+ PANGO_TYPE_FC_FONT_MAP,
+ PangoFcFontMapPrivate);
+#else
+ priv = fcfontmap->priv = g_new0 (PangoFcFontMapPrivate, 1);
+#endif
+
+ 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->fonts = g_hash_table_new ((GHashFunc)g_direct_hash, NULL);
+ 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 ();
}
+
static void
pango_fc_font_map_class_init (PangoFontMapClass *class)
{
@@ -158,9 +201,11 @@ pango_fc_font_map_class_init (PangoFontMapClass *class)
class->load_font = pango_fc_font_map_load_font;
class->load_fontset = pango_fc_font_map_load_fontset;
class->list_families = pango_fc_font_map_list_families;
-}
-static GSList *fontmaps = NULL;
+#ifdef INSTANCE_PRIVATE_DATA_WORKS
+ g_type_class_add_private (object_class, sizeof (PangoFontMapClass));
+#endif
+}
static guint
pango_fc_pattern_hash (FcPattern *pattern)
@@ -224,27 +269,29 @@ struct _FontsetHashListNode {
*/
static GHashTable *
pango_fc_get_fontset_hash (PangoFcFontMap *fcfontmap,
- PangoLanguage *language)
+ PangoLanguage *language)
{
+ PangoFcFontMapPrivate *priv = fcfontmap->priv;
+
/* We treat NULL as a distinct language tag, but
* we should actually determine the real language
* tag it corresponds to to avoid duplicate entries
* in the list.
*/
- GList *tmp_list = fcfontmap->fontset_hash_list;
+ GList *tmp_list = priv->fontset_hash_list;
while (tmp_list)
{
FontsetHashListNode *node = tmp_list->data;
if (node->language == language)
{
- if (tmp_list != fcfontmap->fontset_hash_list)
+ if (tmp_list != priv->fontset_hash_list)
{
/* Put the found node at the beginning
*/
- fcfontmap->fontset_hash_list = g_list_remove_link (fcfontmap->fontset_hash_list, tmp_list);
- fcfontmap->fontset_hash_list->prev = tmp_list;
- tmp_list->next = fcfontmap->fontset_hash_list;
- fcfontmap->fontset_hash_list = tmp_list;
+ priv->fontset_hash_list = g_list_remove_link (priv->fontset_hash_list, tmp_list);
+ priv->fontset_hash_list->prev = tmp_list;
+ tmp_list->next = priv->fontset_hash_list;
+ priv->fontset_hash_list = tmp_list;
}
return node->fontset_hash;
@@ -255,7 +302,7 @@ pango_fc_get_fontset_hash (PangoFcFontMap *fcfontmap,
{
FontsetHashListNode *node = g_new (FontsetHashListNode, 1);
- fcfontmap->fontset_hash_list = g_list_prepend (fcfontmap->fontset_hash_list, node);
+ priv->fontset_hash_list = g_list_prepend (priv->fontset_hash_list, node);
node->fontset_hash =
g_hash_table_new_full ((GHashFunc)pango_font_description_hash,
@@ -271,9 +318,10 @@ pango_fc_get_fontset_hash (PangoFcFontMap *fcfontmap,
static void
pango_fc_clear_pattern_hashes (PangoFcFontMap *fcfontmap)
{
+ PangoFcFontMapPrivate *priv = fcfontmap->priv;
GList *tmp_list;
- tmp_list = fcfontmap->fontset_hash_list;
+ tmp_list = priv->fontset_hash_list;
while (tmp_list)
{
FontsetHashListNode *node = tmp_list->data;
@@ -284,57 +332,60 @@ pango_fc_clear_pattern_hashes (PangoFcFontMap *fcfontmap)
tmp_list = tmp_list->next;
}
- g_list_free (fcfontmap->fontset_hash_list);
- fcfontmap->fontset_hash_list = NULL;
+ g_list_free (priv->fontset_hash_list);
+ priv->fontset_hash_list = NULL;
}
static void
pango_fc_font_map_finalize (GObject *object)
{
PangoFcFontMap *fcfontmap = PANGO_FC_FONT_MAP (object);
-
- fontmaps = g_slist_remove (fontmaps, object);
-
- if (fcfontmap->substitute_destroy)
- fcfontmap->substitute_destroy (fcfontmap->substitute_data);
+ PangoFcFontMapPrivate *priv = fcfontmap->priv;
pango_fc_font_map_cache_clear (fcfontmap);
- g_queue_free (fcfontmap->fontset_cache);
- g_hash_table_destroy (fcfontmap->coverage_hash);
+ g_queue_free (priv->fontset_cache);
+ g_hash_table_destroy (priv->coverage_hash);
- if (fcfontmap->fonts)
- g_hash_table_destroy (fcfontmap->fonts);
+ if (priv->fonts)
+ g_hash_table_destroy (priv->fonts);
- if (fcfontmap->pattern_hash)
- g_hash_table_destroy (fcfontmap->pattern_hash);
-
- pango_fc_do_finalize (fcfontmap);
+ if (priv->pattern_hash)
+ g_hash_table_destroy (priv->pattern_hash);
+
+#ifndef INSTANCE_PRIVATE_DATA_WORKS
+ g_free (priv);
+#endif
G_OBJECT_CLASS (parent_class)->finalize (object);
}
/* Add a mapping from xfont->font_pattern to xfont */
-void
-_pango_fc_font_map_add (PangoFontMap *fontmap,
- PangoFcFont *xfont)
+static void
+pango_fc_font_map_add (PangoFcFontMap *fcfontmap,
+ PangoFcFont *fcfont)
{
- PangoFcFontMap *fcfontmap = PANGO_FC_FONT_MAP (fontmap);
+ PangoFcFontMapPrivate *priv = fcfontmap->priv;
- g_hash_table_insert (fcfontmap->fonts,
- xfont->font_pattern,
- xfont);
+ g_assert (fcfont->fontmap == NULL);
+
+ fcfont->fontmap = g_object_ref (fcfontmap);
+ g_hash_table_insert (priv->fonts,
+ fcfont->font_pattern,
+ fcfont);
}
/* Remove mapping from xfont->font_pattern to xfont */
void
-_pango_fc_font_map_remove (PangoFontMap *fontmap,
- PangoFcFont *xfont)
+_pango_fc_font_map_remove (PangoFcFontMap *fcfontmap,
+ PangoFcFont *fcfont)
{
- PangoFcFontMap *fcfontmap = PANGO_FC_FONT_MAP (fontmap);
-
- g_hash_table_remove (fcfontmap->fonts,
- xfont->font_pattern);
+ PangoFcFontMapPrivate *priv = fcfontmap->priv;
+
+ g_hash_table_remove (priv->fonts,
+ fcfont->font_pattern);
+ fcfont->fontmap = NULL;
+ g_object_unref (fcfontmap);
}
static PangoFcFamily *
@@ -366,16 +417,17 @@ is_alias_family (const char *family_name)
}
static void
-pango_fc_font_map_list_families (PangoFontMap *fontmap,
- PangoFontFamily ***families,
- int *n_families)
+pango_fc_font_map_list_families (PangoFontMap *fontmap,
+ PangoFontFamily ***families,
+ int *n_families)
{
PangoFcFontMap *fcfontmap = PANGO_FC_FONT_MAP (fontmap);
+ PangoFcFontMapPrivate *priv = fcfontmap->priv;
FcFontSet *fontset;
int i;
int count;
- if (fcfontmap->closed)
+ if (priv->closed)
{
if (families)
*families = NULL;
@@ -385,7 +437,7 @@ pango_fc_font_map_list_families (PangoFontMap *fontmap,
return;
}
- if (fcfontmap->n_families < 0)
+ if (priv->n_families < 0)
{
FcObjectSet *os = FcObjectSetBuild (FC_FAMILY, NULL);
FcPattern *pat = FcPatternCreate ();
@@ -395,7 +447,7 @@ pango_fc_font_map_list_families (PangoFontMap *fontmap,
FcPatternDestroy (pat);
FcObjectSetDestroy (os);
- fcfontmap->families = g_new (PangoFcFamily *, fontset->nfont + 3); /* 3 standard aliases */
+ priv->families = g_new (PangoFcFamily *, fontset->nfont + 3); /* 3 standard aliases */
count = 0;
for (i = 0; i < fontset->nfont; i++)
@@ -407,23 +459,23 @@ pango_fc_font_map_list_families (PangoFontMap *fontmap,
g_assert (res == FcResultMatch);
if (!is_alias_family (s))
- fcfontmap->families[count++] = create_family (fcfontmap, s);
+ priv->families[count++] = create_family (fcfontmap, s);
}
FcFontSetDestroy (fontset);
- fcfontmap->families[count++] = create_family (fcfontmap, "Sans");
- fcfontmap->families[count++] = create_family (fcfontmap, "Serif");
- fcfontmap->families[count++] = create_family (fcfontmap, "Monospace");
+ priv->families[count++] = create_family (fcfontmap, "Sans");
+ priv->families[count++] = create_family (fcfontmap, "Serif");
+ priv->families[count++] = create_family (fcfontmap, "Monospace");
- fcfontmap->n_families = count;
+ priv->n_families = count;
}
if (n_families)
- *n_families = fcfontmap->n_families;
+ *n_families = priv->n_families;
if (families)
- *families = g_memdup (fcfontmap->families, fcfontmap->n_families * sizeof (PangoFontFamily *));
+ *families = g_memdup (priv->families, priv->n_families * sizeof (PangoFontFamily *));
}
static int
@@ -494,10 +546,11 @@ pango_fc_make_pattern (const PangoFontDescription *description)
static PangoFont *
pango_fc_font_map_new_font (PangoFontMap *fontmap,
- FcPattern *match)
+ FcPattern *match)
{
PangoFcFontMap *fcfontmap = (PangoFcFontMap *)fontmap;
- PangoFcFont *font;
+ PangoFcFontMapPrivate *priv = fcfontmap->priv;
+ PangoFcFont *fcfont;
/* Returning NULL here actually violates a contract
* that loading load_font() will never return NULL.
@@ -505,32 +558,36 @@ pango_fc_font_map_new_font (PangoFontMap *fontmap,
* font that doesn't draw anything and has empty
* metrics.
*/
- if (fcfontmap->closed)
+ if (priv->closed)
return NULL;
/* Look up cache */
- font = g_hash_table_lookup (fcfontmap->fonts, match);
+ fcfont = g_hash_table_lookup (priv->fonts, match);
- if (font)
- return g_object_ref (font);
+ if (fcfont)
+ return g_object_ref (fcfont);
+
+ fcfont = PANGO_FC_FONT_MAP_GET_CLASS (fontmap)->new_font (fcfontmap, match);
+
+ pango_fc_font_map_add (fcfontmap, fcfont);
- FcPatternReference (match);
- return (PangoFont *)_pango_fc_font_new (fontmap, match);
+ return (PangoFont *)fcfont;
}
static FcPattern *
uniquify_pattern (PangoFcFontMap *fcfontmap,
FcPattern *pattern)
{
+ PangoFcFontMapPrivate *priv = fcfontmap->priv;
FcPattern *old_pattern;
- if (!fcfontmap->pattern_hash)
- fcfontmap->pattern_hash =
+ if (!priv->pattern_hash)
+ priv->pattern_hash =
g_hash_table_new_full ((GHashFunc)pango_fc_pattern_hash,
(GEqualFunc)pango_fc_pattern_equal,
(GDestroyNotify)FcPatternDestroy, NULL);
- old_pattern = g_hash_table_lookup (fcfontmap->pattern_hash, pattern);
+ old_pattern = g_hash_table_lookup (priv->pattern_hash, pattern);
if (old_pattern)
{
FcPatternDestroy (pattern);
@@ -540,11 +597,19 @@ uniquify_pattern (PangoFcFontMap *fcfontmap,
else
{
FcPatternReference (pattern);
- g_hash_table_insert (fcfontmap->pattern_hash, pattern, pattern);
+ g_hash_table_insert (priv->pattern_hash, pattern, pattern);
return pattern;
}
}
+static void
+pango_fc_default_substitute (PangoFcFontMap *fontmap,
+ FcPattern *pattern)
+{
+ if (PANGO_FC_FONT_MAP_GET_CLASS (fontmap)->default_substitute)
+ PANGO_FC_FONT_MAP_GET_CLASS (fontmap)->default_substitute (fontmap, pattern);
+}
+
static PangoFcPatternSet *
pango_fc_font_map_get_patterns (PangoFontMap *fontmap,
PangoContext *context,
@@ -659,7 +724,8 @@ static void
pango_fc_font_map_cache_fontset (PangoFcFontMap *fcfontmap,
PangoFcPatternSet *patterns)
{
- GQueue *cache = fcfontmap->fontset_cache;
+ PangoFcFontMapPrivate *priv = fcfontmap->priv;
+ GQueue *cache = priv->fontset_cache;
if (patterns->cache_link)
{
@@ -695,9 +761,11 @@ pango_fc_font_map_load_fontset (PangoFontMap *fontmap,
const PangoFontDescription *desc,
PangoLanguage *language)
{
- int i;
PangoFcPatternSet *patterns = pango_fc_font_map_get_patterns (fontmap, context, desc, language);
PangoFcFontMap *fcfontmap = PANGO_FC_FONT_MAP (fontmap);
+ PangoFcFontMapPrivate *priv = fcfontmap->priv;
+ int i;
+
if (!patterns)
return NULL;
@@ -721,7 +789,7 @@ pango_fc_font_map_load_fontset (PangoFontMap *fontmap,
g_object_ref (patterns->fontset);
if (!patterns->cache_link ||
- patterns->cache_link != fcfontmap->fontset_cache->head)
+ patterns->cache_link != priv->fontset_cache->head)
pango_fc_font_map_cache_fontset (fcfontmap, patterns);
return patterns->fontset;
@@ -734,9 +802,10 @@ uncache_patterns (PangoFcPatternSet *patterns)
}
static void
-pango_fc_font_map_clear_fontset_cache (PangoFcFontMap *fcfontmap)
+pango_fc_font_map_clear_fontset_cache (PangoFcFontMap *fcfontmap)
{
- GQueue *cache = fcfontmap->fontset_cache;
+ PangoFcFontMapPrivate *priv = fcfontmap->priv;
+ GQueue *cache = priv->fontset_cache;
g_list_foreach (cache->head, (GFunc)uncache_patterns, NULL);
g_list_free (cache->head);
@@ -745,7 +814,20 @@ pango_fc_font_map_clear_fontset_cache (PangoFcFontMap *fcfontmap)
cache->length = 0;
}
-static void
+/**
+ * pango_fc_font_map_cache_clear:
+ * @fcfontmap: a #PangoFcFontmap
+ *
+ * Clear all cached information and fontsets for this font map;
+ * this should be called whenever there is a change in the
+ * output of the default_substitute() virtual function.
+ *
+ * This function is intended to be used only by backend implementations
+ * deriving from #PangoFcFontmap.
+ *
+ * Since: 1.4
+ **/
+void
pango_fc_font_map_cache_clear (PangoFcFontMap *fcfontmap)
{
/* Clear the fontset cache first, since any entries
@@ -760,6 +842,7 @@ pango_fc_font_map_set_coverage (PangoFcFontMap *fcfontmap,
PangoFcCoverageKey *key,
PangoCoverage *coverage)
{
+ PangoFcFontMapPrivate *priv = fcfontmap->priv;
PangoFcCoverageKey *key_dup;
key_dup = g_malloc (sizeof (PangoFcCoverageKey) + strlen (key->filename) + 1);
@@ -767,15 +850,15 @@ pango_fc_font_map_set_coverage (PangoFcFontMap *fcfontmap,
key_dup->filename = (char *) (key_dup + 1);
strcpy (key_dup->filename, key->filename);
- g_hash_table_insert (fcfontmap->coverage_hash,
+ g_hash_table_insert (priv->coverage_hash,
key_dup, pango_coverage_ref (coverage));
}
PangoCoverage *
-_pango_fc_font_map_get_coverage (PangoFontMap *fontmap,
- FcPattern *pattern)
+_pango_fc_font_map_get_coverage (PangoFcFontMap *fcfontmap,
+ FcPattern *pattern)
{
- PangoFcFontMap *fcfontmap = PANGO_FC_FONT_MAP (fontmap);
+ PangoFcFontMapPrivate *priv = fcfontmap->priv;
PangoFcCoverageKey key;
PangoCoverage *coverage;
FcChar32 map[FC_CHARSET_MAP_SIZE];
@@ -794,7 +877,7 @@ _pango_fc_font_map_get_coverage (PangoFontMap *fontmap,
if (FcPatternGetInteger (pattern, FC_INDEX, 0, &key.id) != FcResultMatch)
return NULL;
- coverage = g_hash_table_lookup (fcfontmap->coverage_hash, &key);
+ coverage = g_hash_table_lookup (priv->coverage_hash, &key);
if (coverage)
return pango_coverage_ref (coverage);
@@ -848,12 +931,83 @@ _pango_fc_font_map_get_coverage (PangoFontMap *fontmap,
return coverage;
}
-/*
- * PangoFcFace
- */
+/**
+ * pango_fc_font_map_create_context:
+ * @fcfontmap: a #PangoFcFontMap
+ *
+ * Creates a new context for this fontmap. This function is intended
+ * only for backend implementations deriving from #PangoFcFontmap;
+ * it is possible that a backend will store additional information
+ * needed for correct operation on the #PangoContext after calling
+ * this function.
+ *
+ * Return value: a new #PangoContext
+ *
+ * Since: 1.4
+ **/
+PangoContext *
+pango_fc_font_map_create_context (PangoFcFontMap *fcfontmap)
+{
+ PangoContext *context = pango_context_new ();
+ pango_context_set_font_map (context, PANGO_FONT_MAP (fcfontmap));
+ return context;
+}
+
+static void
+cleanup_font (gpointer key,
+ PangoFcFont *fcfont)
+{
+ _pango_fc_font_shutdown (fcfont);
+
+ g_object_unref (fcfont->fontmap);
+ fcfont->fontmap = NULL;
+}
+
+/**
+ * pango_fc_font_map_shutdown:
+ * @fcfontmap: a #PangoFcFontmap
+ *
+ * Clears all cached information for the fontmap and marks
+ * all fonts open for the fontmap as dead. (See the shutdown()
+ * virtual function of PangoFcFont.) This function might be used
+ * by a backend when the underlying windowing system for the font
+ * map exits. This function is only intended to be called from
+ * only for backend implementations deriving from #PangoFcFontmap.
+ *
+ * Since: 1.4
+ **/
+void
+pango_fc_font_map_shutdown (PangoFcFontMap *fcfontmap)
+{
+ PangoFcFontMapPrivate *priv = fcfontmap->priv;
+
+ pango_fc_font_map_cache_clear (fcfontmap);
+
+ g_hash_table_foreach (priv->fonts, (GHFunc)cleanup_font, NULL);
+ g_hash_table_destroy (priv->fonts);
+ priv->fonts = NULL;
+ priv->closed = TRUE;
+}
+
+/**
+ * pango_fc_font_description_from_pattern:
+ * @pattern: a #FcPattern
+ * @include_size: if %TRUE, the pattern will include the size from
+ * the @pattern; otherwise the resulting pattern will be unsized.
+ *
+ * Creates a #PangoFontDescription that matches the specified
+ * Fontconfig pattern as closely as possible. Many possible Fontconfig
+ * pattern values, such as %FC_RASTERIZER or %FC_DPI, don't make sense in
+ * the context of #PangoFontDescription, so will be ignored.
+ *
+ * Return value: a new #PangoFontDescription. Free with
+ * pango_font_description_free().
+ *
+ * Since: 1.4
+ **/
PangoFontDescription *
-_pango_fc_font_desc_from_pattern (FcPattern *pattern, gboolean include_size)
+pango_fc_font_description_from_pattern (FcPattern *pattern, gboolean include_size)
{
PangoFontDescription *desc;
PangoStyle style;
@@ -912,6 +1066,10 @@ _pango_fc_font_desc_from_pattern (FcPattern *pattern, gboolean include_size)
return desc;
}
+/*
+ * PangoFcFace
+ */
+
static PangoFontDescription *
make_alias_description (PangoFcFamily *fcfamily,
gboolean bold,
@@ -943,8 +1101,8 @@ pango_fc_face_describe (PangoFontFace *face)
if (strcmp (fcface->style, "Regular") == 0)
return make_alias_description (fcfamily, FALSE, FALSE);
else if (strcmp (fcface->style, "Bold") == 0)
- return make_alias_description (fcfamily, TRUE, FALSE);
- else if (strcmp (fcface->style, "Italic") == 0)
+ return make_alias_description (fcfamily, TRUE, FALSE);
+ else if (strcmp (fcface->style, "Italic") == 0)
return make_alias_description (fcfamily, FALSE, TRUE);
else /* Bold Italic */
return make_alias_description (fcfamily, TRUE, TRUE);
@@ -960,7 +1118,7 @@ pango_fc_face_describe (PangoFontFace *face)
result_pattern = FcFontMatch (NULL, match_pattern, &res);
if (result_pattern)
{
- desc = _pango_fc_font_desc_from_pattern (result_pattern, FALSE);
+ desc = pango_fc_font_description_from_pattern (result_pattern, FALSE);
FcPatternDestroy (result_pattern);
}
@@ -1005,8 +1163,9 @@ pango_fc_face_get_type (void)
};
object_type = g_type_register_static (PANGO_TYPE_FONT_FACE,
- PANGO_FC_NAME "Face",
- &object_info, 0);
+ "PangoFcFace",
+ &object_info,
+ G_TYPE_FLAG_ABSTRACT);
}
return object_type;
@@ -1033,13 +1192,14 @@ pango_fc_family_list_faces (PangoFontFamily *family,
{
PangoFcFamily *fcfamily = PANGO_FC_FAMILY (family);
PangoFcFontMap *fcfontmap = fcfamily->fontmap;
-
+ PangoFcFontMapPrivate *priv = fcfontmap->priv;
+
if (fcfamily->n_faces < 0)
{
FcFontSet *fontset;
int i;
- if (is_alias_family (fcfamily->family_name) || fcfontmap->closed)
+ if (is_alias_family (fcfamily->family_name) || priv->closed)
{
fcfamily->n_faces = 4;
fcfamily->faces = g_new (PangoFcFace *, fcfamily->n_faces);
@@ -1130,7 +1290,7 @@ pango_fc_family_get_type (void)
};
object_type = g_type_register_static (PANGO_TYPE_FONT_FAMILY,
- PANGO_FC_NAME "Family",
+ "PangoFcFamily",
&object_info, 0);
}
diff --git a/pango/pangofc-fontmap.cI b/pango/pangofc-fontmap.cI
deleted file mode 100644
index 28d5fa20..00000000
--- a/pango/pangofc-fontmap.cI
+++ /dev/null
@@ -1,1138 +0,0 @@
-/* Pango
- * pangofc-fontmap.cI: Common font handling between Xft and FT2
- *
- * Copyright (C) 2000,2001,2002 Red Hat, Inc.
- *
- * 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.
- */
-
-/*
- * This file is included by both pangoxft-fontmap.c and pangoft2-fontmap.c
- * after making appropriate #defines for public symbols.
- */
-
-/* Size of fontset cache */
-#define FONTSET_CACHE_SIZE 16
-
-typedef struct _PangoFcCoverageKey PangoFcCoverageKey;
-typedef struct _PangoFcFace PangoFcFace;
-typedef struct _PangoFcPatternSet PangoFcPatternSet;
-
-#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))
-#define PANGO_FC_IS_FAMILY(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), PANGO_FC_TYPE_FAMILY))
-
-#define PANGO_FC_TYPE_FACE (pango_fc_face_get_type ())
-#define PANGO_FC_FACE(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), PANGO_FC_TYPE_FACE, PangoFcFace))
-#define PANGO_FC_IS_FACE(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), PANGO_FC_TYPE_FACE))
-
-struct _PangoFcCoverageKey
-{
- char *filename;
- int id; /* needed to handle TTC files with multiple faces */
-};
-
-struct _PangoFcFace
-{
- PangoFontFace parent_instance;
-
- PangoFcFamily *family;
- char *style;
-};
-
-struct _PangoFcFamily
-{
- PangoFontFamily parent_instance;
-
- PangoFcFontMap *fontmap;
- char *family_name;
-
- PangoFcFace **faces;
- int n_faces; /* -1 == uninitialized */
-};
-
-struct _PangoFcPatternSet
-{
- int n_patterns;
- FcPattern **patterns;
- PangoFontset *fontset;
- GList *cache_link;
-};
-
-GType pango_fc_font_map_get_type (void);
-static GType pango_fc_family_get_type (void);
-static GType pango_fc_face_get_type (void);
-
-static void pango_fc_font_map_init (PangoFcFontMap *fontmap);
-static void pango_fc_font_map_class_init (PangoFontMapClass *class);
-static void pango_fc_font_map_finalize (GObject *object);
-static PangoFont * pango_fc_font_map_load_font (PangoFontMap *fontmap,
- PangoContext *context,
- const PangoFontDescription *description);
-static PangoFontset *pango_fc_font_map_load_fontset (PangoFontMap *fontmap,
- PangoContext *context,
- const PangoFontDescription *desc,
- PangoLanguage *language);
-static void pango_fc_font_map_list_families (PangoFontMap *fontmap,
- PangoFontFamily ***families,
- int *n_families);
-
-
-static void pango_fc_pattern_set_free (PangoFcPatternSet *patterns);
-
-static void pango_fc_font_map_cache_clear (PangoFcFontMap *fcfontmap);
-static void pango_fc_default_substitute (PangoFcFontMap *fontmap,
- FcPattern *pattern);
-static void pango_fc_do_finalize (PangoFcFontMap *fontmap);
-
-static guint pango_fc_pattern_hash (FcPattern *pattern);
-static gboolean pango_fc_pattern_equal (FcPattern *pattern1,
- FcPattern *pattern2);
-static guint pango_fc_coverage_key_hash (PangoFcCoverageKey *key);
-static gboolean pango_fc_coverage_key_equal (PangoFcCoverageKey *key1,
- PangoFcCoverageKey *key2);
-
-static PangoFontClass *parent_class; /* Parent class structure for PangoFcFontMap */
-
-GType
-pango_fc_font_map_get_type (void)
-{
- static GType object_type = 0;
-
- if (!object_type)
- {
- static const GTypeInfo object_info =
- {
- sizeof (PangoFontMapClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) pango_fc_font_map_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (PangoFcFontMap),
- 0, /* n_preallocs */
- (GInstanceInitFunc) pango_fc_font_map_init,
- };
-
- object_type = g_type_register_static (PANGO_TYPE_FONT_MAP,
- PANGO_FC_NAME "FontMap",
- &object_info, 0);
- }
-
- return object_type;
-}
-
-static void
-pango_fc_font_map_init (PangoFcFontMap *fcfontmap)
-{
- fcfontmap->n_families = -1;
-
- fcfontmap->fonts = g_hash_table_new ((GHashFunc)g_direct_hash, NULL);
- fcfontmap->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);
- fcfontmap->fontset_cache = g_queue_new ();
-}
-static void
-pango_fc_font_map_class_init (PangoFontMapClass *class)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (class);
-
- parent_class = g_type_class_peek_parent (class);
-
- object_class->finalize = pango_fc_font_map_finalize;
- class->load_font = pango_fc_font_map_load_font;
- class->load_fontset = pango_fc_font_map_load_fontset;
- class->list_families = pango_fc_font_map_list_families;
-}
-
-static GSList *fontmaps = NULL;
-
-static guint
-pango_fc_pattern_hash (FcPattern *pattern)
-{
-#if 1
- return FcPatternHash (pattern);
-#else
- /* Hashing only part of the pattern can improve speed a bit.
- */
- char *str;
- int i;
- double d;
- guint hash = 0;
-
- FcPatternGetString (pattern, FC_FILE, 0, (FcChar8 **) &str);
- if (str)
- hash = g_str_hash (str);
-
- if (FcPatternGetInteger (pattern, FC_INDEX, 0, &i) == FcResultMatch)
- hash ^= i;
-
- if (FcPatternGetDouble (pattern, FC_PIXEL_SIZE, 0, &d) == FcResultMatch)
- hash ^= (guint) (d*1000.0);
-
- return hash;
-#endif
-}
-
-static gboolean
-pango_fc_pattern_equal (FcPattern *pattern1,
- FcPattern *pattern2)
-{
- if (pattern1 == pattern2)
- return TRUE;
- else
- return FcPatternEqual (pattern1, pattern2);
-}
-
-static guint
-pango_fc_coverage_key_hash (PangoFcCoverageKey *key)
-{
- return g_str_hash (key->filename) ^ key->id;
-}
-
-static gboolean
-pango_fc_coverage_key_equal (PangoFcCoverageKey *key1,
- PangoFcCoverageKey *key2)
-{
- return key1->id == key2->id && strcmp (key1->filename, key2->filename) == 0;
-}
-
-typedef struct _FontsetHashListNode FontsetHashListNode;
-
-struct _FontsetHashListNode {
- GHashTable *fontset_hash;
- PangoLanguage *language;
-};
-
-/* Get the description => fontset map for a particular
- * language tag.
- */
-static GHashTable *
-pango_fc_get_fontset_hash (PangoFcFontMap *fcfontmap,
- PangoLanguage *language)
-{
- /* We treat NULL as a distinct language tag, but
- * we should actually determine the real language
- * tag it corresponds to to avoid duplicate entries
- * in the list.
- */
- GList *tmp_list = fcfontmap->fontset_hash_list;
- while (tmp_list)
- {
- FontsetHashListNode *node = tmp_list->data;
- if (node->language == language)
- {
- if (tmp_list != fcfontmap->fontset_hash_list)
- {
- /* Put the found node at the beginning
- */
- fcfontmap->fontset_hash_list = g_list_remove_link (fcfontmap->fontset_hash_list, tmp_list);
- fcfontmap->fontset_hash_list->prev = tmp_list;
- tmp_list->next = fcfontmap->fontset_hash_list;
- fcfontmap->fontset_hash_list = tmp_list;
- }
-
- return node->fontset_hash;
- }
-
- tmp_list = tmp_list->next;
- }
-
- {
- FontsetHashListNode *node = g_new (FontsetHashListNode, 1);
- fcfontmap->fontset_hash_list = g_list_prepend (fcfontmap->fontset_hash_list, node);
-
- node->fontset_hash =
- g_hash_table_new_full ((GHashFunc)pango_font_description_hash,
- (GEqualFunc)pango_font_description_equal,
- (GDestroyNotify)pango_font_description_free,
- (GDestroyNotify)pango_fc_pattern_set_free);
- node->language = language;
-
- return node->fontset_hash;
- }
-}
-
-static void
-pango_fc_clear_pattern_hashes (PangoFcFontMap *fcfontmap)
-{
- GList *tmp_list;
-
- tmp_list = fcfontmap->fontset_hash_list;
- while (tmp_list)
- {
- FontsetHashListNode *node = tmp_list->data;
-
- g_hash_table_destroy (node->fontset_hash);
- g_free (node);
-
- tmp_list = tmp_list->next;
- }
-
- g_list_free (fcfontmap->fontset_hash_list);
- fcfontmap->fontset_hash_list = NULL;
-}
-
-static void
-pango_fc_font_map_finalize (GObject *object)
-{
- PangoFcFontMap *fcfontmap = PANGO_FC_FONT_MAP (object);
-
- fontmaps = g_slist_remove (fontmaps, object);
-
- if (fcfontmap->substitute_destroy)
- fcfontmap->substitute_destroy (fcfontmap->substitute_data);
-
- pango_fc_font_map_cache_clear (fcfontmap);
- g_queue_free (fcfontmap->fontset_cache);
- g_hash_table_destroy (fcfontmap->coverage_hash);
-
- if (fcfontmap->fonts)
- g_hash_table_destroy (fcfontmap->fonts);
-
- if (fcfontmap->pattern_hash)
- g_hash_table_destroy (fcfontmap->pattern_hash);
-
- pango_fc_do_finalize (fcfontmap);
-
- G_OBJECT_CLASS (parent_class)->finalize (object);
-}
-
-
-/* Add a mapping from xfont->font_pattern to xfont */
-void
-_pango_fc_font_map_add (PangoFontMap *fontmap,
- PangoFcFont *xfont)
-{
- PangoFcFontMap *fcfontmap = PANGO_FC_FONT_MAP (fontmap);
-
- g_hash_table_insert (fcfontmap->fonts,
- xfont->font_pattern,
- xfont);
-}
-
-/* Remove mapping from xfont->font_pattern to xfont */
-void
-_pango_fc_font_map_remove (PangoFontMap *fontmap,
- PangoFcFont *xfont)
-{
- PangoFcFontMap *fcfontmap = PANGO_FC_FONT_MAP (fontmap);
-
- g_hash_table_remove (fcfontmap->fonts,
- xfont->font_pattern);
-}
-
-static PangoFcFamily *
-create_family (PangoFcFontMap *fcfontmap,
- const char *family_name)
-{
- PangoFcFamily *family = g_object_new (PANGO_FC_TYPE_FAMILY, NULL);
- family->fontmap = fcfontmap;
- family->family_name = g_strdup (family_name);
-
- return family;
-}
-
-static gboolean
-is_alias_family (const char *family_name)
-{
- switch (family_name[0])
- {
- case 'm':
- case 'M':
- return (g_ascii_strcasecmp (family_name, "monospace") == 0);
- case 's':
- case 'S':
- return (g_ascii_strcasecmp (family_name, "sans") == 0 ||
- g_ascii_strcasecmp (family_name, "serif") == 0);
- }
-
- return FALSE;
-}
-
-static void
-pango_fc_font_map_list_families (PangoFontMap *fontmap,
- PangoFontFamily ***families,
- int *n_families)
-{
- PangoFcFontMap *fcfontmap = PANGO_FC_FONT_MAP (fontmap);
- FcFontSet *fontset;
- int i;
- int count;
-
- if (fcfontmap->closed)
- {
- if (families)
- *families = NULL;
- if (n_families)
- n_families = 0;
-
- return;
- }
-
- if (fcfontmap->n_families < 0)
- {
- FcObjectSet *os = FcObjectSetBuild (FC_FAMILY, NULL);
- FcPattern *pat = FcPatternCreate ();
-
- fontset = FcFontList (NULL, pat, os);
-
- FcPatternDestroy (pat);
- FcObjectSetDestroy (os);
-
- fcfontmap->families = g_new (PangoFcFamily *, fontset->nfont + 3); /* 3 standard aliases */
-
- count = 0;
- for (i = 0; i < fontset->nfont; i++)
- {
- char *s;
- FcResult res;
-
- res = FcPatternGetString (fontset->fonts[i], FC_FAMILY, 0, (FcChar8 **) &s);
- g_assert (res == FcResultMatch);
-
- if (!is_alias_family (s))
- fcfontmap->families[count++] = create_family (fcfontmap, s);
- }
-
- FcFontSetDestroy (fontset);
-
- fcfontmap->families[count++] = create_family (fcfontmap, "Sans");
- fcfontmap->families[count++] = create_family (fcfontmap, "Serif");
- fcfontmap->families[count++] = create_family (fcfontmap, "Monospace");
-
- fcfontmap->n_families = count;
- }
-
- if (n_families)
- *n_families = fcfontmap->n_families;
-
- if (families)
- *families = g_memdup (fcfontmap->families, fcfontmap->n_families * sizeof (PangoFontFamily *));
-}
-
-static int
-pango_fc_convert_weight (PangoWeight pango_weight)
-{
- int weight;
-
- if (pango_weight < (PANGO_WEIGHT_NORMAL + PANGO_WEIGHT_LIGHT) / 2)
- weight = FC_WEIGHT_LIGHT;
- else if (pango_weight < (PANGO_WEIGHT_NORMAL + 600) / 2)
- weight = FC_WEIGHT_MEDIUM;
- else if (pango_weight < (600 + PANGO_WEIGHT_BOLD) / 2)
- weight = FC_WEIGHT_DEMIBOLD;
- else if (pango_weight < (PANGO_WEIGHT_BOLD + PANGO_WEIGHT_ULTRABOLD) / 2)
- weight = FC_WEIGHT_BOLD;
- else
- weight = FC_WEIGHT_BLACK;
-
- return weight;
-}
-
-static int
-pango_fc_convert_slant (PangoStyle pango_style)
-{
- int slant;
-
- if (pango_style == PANGO_STYLE_ITALIC)
- slant = FC_SLANT_ITALIC;
- else if (pango_style == PANGO_STYLE_OBLIQUE)
- slant = FC_SLANT_OBLIQUE;
- else
- slant = FC_SLANT_ROMAN;
-
- return slant;
-}
-
-
-static FcPattern *
-pango_fc_make_pattern (const PangoFontDescription *description)
-{
- FcPattern *pattern;
- PangoStyle pango_style;
- int slant;
- int weight;
- char **families;
- int i;
-
- pango_style = pango_font_description_get_style (description);
-
- slant = pango_fc_convert_slant (pango_style);
- weight = pango_fc_convert_weight (pango_font_description_get_weight (description));
-
- pattern = FcPatternBuild (0,
- FC_WEIGHT, FcTypeInteger, weight,
- FC_SLANT, FcTypeInteger, slant,
- FC_SIZE, FcTypeDouble, (double)pango_font_description_get_size (description)/PANGO_SCALE,
- NULL);
-
- families = g_strsplit (pango_font_description_get_family (description), ",", -1);
-
- for (i = 0; families[i]; i++)
- FcPatternAddString (pattern, FC_FAMILY, families[i]);
-
- g_strfreev (families);
-
- return pattern;
-}
-
-static PangoFont *
-pango_fc_font_map_new_font (PangoFontMap *fontmap,
- FcPattern *match)
-{
- PangoFcFontMap *fcfontmap = (PangoFcFontMap *)fontmap;
- PangoFcFont *font;
-
- /* Returning NULL here actually violates a contract
- * that loading load_font() will never return NULL.
- * We probably should actually create a dummy
- * font that doesn't draw anything and has empty
- * metrics.
- */
- if (fcfontmap->closed)
- return NULL;
-
- /* Look up cache */
- font = g_hash_table_lookup (fcfontmap->fonts, match);
-
- if (font)
- return g_object_ref (font);
-
- FcPatternReference (match);
- return (PangoFont *)_pango_fc_font_new (fontmap, match);
-}
-
-static FcPattern *
-uniquify_pattern (PangoFcFontMap *fcfontmap,
- FcPattern *pattern)
-{
- FcPattern *old_pattern;
-
- if (!fcfontmap->pattern_hash)
- fcfontmap->pattern_hash =
- g_hash_table_new_full ((GHashFunc)pango_fc_pattern_hash,
- (GEqualFunc)pango_fc_pattern_equal,
- (GDestroyNotify)FcPatternDestroy, NULL);
-
- old_pattern = g_hash_table_lookup (fcfontmap->pattern_hash, pattern);
- if (old_pattern)
- {
- FcPatternDestroy (pattern);
- FcPatternReference (old_pattern);
- return old_pattern;
- }
- else
- {
- FcPatternReference (pattern);
- g_hash_table_insert (fcfontmap->pattern_hash, pattern, pattern);
- return pattern;
- }
-}
-
-static PangoFcPatternSet *
-pango_fc_font_map_get_patterns (PangoFontMap *fontmap,
- PangoContext *context,
- const PangoFontDescription *desc,
- PangoLanguage *language)
-{
- PangoFcFontMap *fcfontmap = (PangoFcFontMap *)fontmap;
- FcPattern *pattern, *font_pattern;
- FcResult res;
- int f;
- PangoFcPatternSet *patterns;
- FcFontSet *font_patterns;
- GHashTable *fontset_hash;
-
- if (!language && context)
- language = pango_context_get_language (context);
-
- fontset_hash = pango_fc_get_fontset_hash (fcfontmap, language);
- patterns = g_hash_table_lookup (fontset_hash, desc);
-
- if (patterns == NULL)
- {
- pattern = pango_fc_make_pattern (desc);
- if (language)
- FcPatternAddString (pattern, FC_LANG, (FcChar8 *) pango_language_to_string (language));
-
- pango_fc_default_substitute (fcfontmap, pattern);
-
- font_patterns = FcFontSort (NULL, pattern, FcTrue, 0, &res);
-
- if (!font_patterns)
- {
- g_printerr ("No fonts found; this probably means that the fontconfig\n"
- "library is not correctly configured. You may need to\n"
- "edit the fonts.conf configuration file. More information\n"
- "about fontconfig can be found in the fontconfig(3) manual\n"
- "page and on http://fontconfig.org\n");
-
- /* There is no point in proceeding; we'll just get a segfault later
- * on, and a bunch more possibly confusing error messages in between.
- */
-
- /* return NULL; */
- exit (1);
- }
-
- patterns = g_new (PangoFcPatternSet, 1);
- patterns->patterns = g_new (FcPattern *, font_patterns->nfont);
- patterns->n_patterns = 0;
- patterns->fontset = NULL;
- patterns->cache_link = NULL;
-
- for (f = 0; f < font_patterns->nfont; f++)
- {
- font_pattern = FcFontRenderPrepare (NULL, pattern,
- font_patterns->fonts[f]);
-#ifdef FC_PATTERN
- /* The FC_PATTERN element, which points back to our the original patterm
- * defeats our hash tables.
- */
- FcPatternDel (font_pattern, FC_PATTERN);
-#endif /* FC_PATTERN */
-
- if (font_pattern)
- patterns->patterns[patterns->n_patterns++] = uniquify_pattern (fcfontmap, font_pattern);
- }
-
- FcPatternDestroy (pattern);
-
- FcFontSetSortDestroy (font_patterns);
-
- g_hash_table_insert (fontset_hash,
- pango_font_description_copy (desc),
- patterns);
- }
-
- return patterns;
-}
-
-static PangoFont *
-pango_fc_font_map_load_font (PangoFontMap *fontmap,
- PangoContext *context,
- const PangoFontDescription *description)
-{
- PangoFcPatternSet *patterns = pango_fc_font_map_get_patterns (fontmap, context, description, NULL);
- if (!patterns)
- return NULL;
-
- if (patterns->n_patterns > 0)
- return pango_fc_font_map_new_font (fontmap, patterns->patterns[0]);
-
- return NULL;
-}
-
-static void
-pango_fc_pattern_set_free (PangoFcPatternSet *patterns)
-{
- int i;
-
- if (patterns->fontset)
- g_object_remove_weak_pointer (G_OBJECT (patterns->fontset),
- (gpointer *)&patterns->fontset);
-
- for (i = 0; i < patterns->n_patterns; i++)
- FcPatternDestroy (patterns->patterns[i]);
-
- g_free (patterns->patterns);
- g_free (patterns);
-}
-
-static void
-pango_fc_font_map_cache_fontset (PangoFcFontMap *fcfontmap,
- PangoFcPatternSet *patterns)
-{
- GQueue *cache = fcfontmap->fontset_cache;
-
- if (patterns->cache_link)
- {
- /* Already in cache, move to head
- */
- if (patterns->cache_link == cache->tail)
- cache->tail = patterns->cache_link->prev;
-
- cache->head = g_list_remove_link (cache->head, patterns->cache_link);
- cache->length--;
- }
- else
- {
- /* Add to cache initially
- */
- if (cache->length == FONTSET_CACHE_SIZE)
- {
- PangoFcPatternSet *tmp_patterns = g_queue_pop_tail (cache);
- tmp_patterns->cache_link = NULL;
- g_object_unref (tmp_patterns->fontset);
- }
-
- g_object_ref (patterns->fontset);
- patterns->cache_link = g_list_prepend (NULL, patterns);
- }
-
- g_queue_push_head_link (cache, patterns->cache_link);
-}
-
-static PangoFontset *
-pango_fc_font_map_load_fontset (PangoFontMap *fontmap,
- PangoContext *context,
- const PangoFontDescription *desc,
- PangoLanguage *language)
-{
- int i;
- PangoFcPatternSet *patterns = pango_fc_font_map_get_patterns (fontmap, context, desc, language);
- PangoFcFontMap *fcfontmap = PANGO_FC_FONT_MAP (fontmap);
- if (!patterns)
- return NULL;
-
- if (!patterns->fontset)
- {
- PangoFontsetSimple *simple;
- simple = pango_fontset_simple_new (language);
-
- for (i = 0; i < patterns->n_patterns; i++)
- {
- PangoFont *font = pango_fc_font_map_new_font (fontmap, patterns->patterns[i]);
- if (font)
- pango_fontset_simple_append (simple, font);
- }
-
- patterns->fontset = PANGO_FONTSET (simple);
- g_object_add_weak_pointer (G_OBJECT (patterns->fontset),
- (gpointer *)&patterns->fontset);
- }
- else
- g_object_ref (patterns->fontset);
-
- if (!patterns->cache_link ||
- patterns->cache_link != fcfontmap->fontset_cache->head)
- pango_fc_font_map_cache_fontset (fcfontmap, patterns);
-
- return patterns->fontset;
-}
-
-static void
-uncache_patterns (PangoFcPatternSet *patterns)
-{
- g_object_unref (patterns->fontset);
-}
-
-static void
-pango_fc_font_map_clear_fontset_cache (PangoFcFontMap *fcfontmap)
-{
- GQueue *cache = fcfontmap->fontset_cache;
-
- g_list_foreach (cache->head, (GFunc)uncache_patterns, NULL);
- g_list_free (cache->head);
- cache->head = NULL;
- cache->tail = NULL;
- cache->length = 0;
-}
-
-static void
-pango_fc_font_map_cache_clear (PangoFcFontMap *fcfontmap)
-{
- /* Clear the fontset cache first, since any entries
- * in the fontset_cache must also be in the pattern cache.
- */
- pango_fc_font_map_clear_fontset_cache (fcfontmap);
- pango_fc_clear_pattern_hashes (fcfontmap);
-}
-
-static void
-pango_fc_font_map_set_coverage (PangoFcFontMap *fcfontmap,
- PangoFcCoverageKey *key,
- PangoCoverage *coverage)
-{
- PangoFcCoverageKey *key_dup;
-
- key_dup = g_malloc (sizeof (PangoFcCoverageKey) + strlen (key->filename) + 1);
- key_dup->id = key->id;
- key_dup->filename = (char *) (key_dup + 1);
- strcpy (key_dup->filename, key->filename);
-
- g_hash_table_insert (fcfontmap->coverage_hash,
- key_dup, pango_coverage_ref (coverage));
-}
-
-PangoCoverage *
-_pango_fc_font_map_get_coverage (PangoFontMap *fontmap,
- FcPattern *pattern)
-{
- PangoFcFontMap *fcfontmap = PANGO_FC_FONT_MAP (fontmap);
- PangoFcCoverageKey key;
- PangoCoverage *coverage;
- FcChar32 map[FC_CHARSET_MAP_SIZE];
- FcChar32 ucs4, pos;
- FcCharSet *charset;
- int i;
-
- /*
- * Assume that coverage information is identified by
- * a filename/index pair; there shouldn't be any reason
- * this isn't true, but it's not specified anywhere
- */
- if (FcPatternGetString (pattern, FC_FILE, 0, (FcChar8 **) &key.filename) != FcResultMatch)
- return NULL;
-
- if (FcPatternGetInteger (pattern, FC_INDEX, 0, &key.id) != FcResultMatch)
- return NULL;
-
- coverage = g_hash_table_lookup (fcfontmap->coverage_hash, &key);
- if (coverage)
- return pango_coverage_ref (coverage);
-
- /*
- * Pull the coverage out of the pattern, this
- * doesn't require loading the font
- */
- if (FcPatternGetCharSet (pattern, FC_CHARSET, 0, &charset) != FcResultMatch)
- return NULL;
-
- /*
- * Convert an Fc CharSet into a pango coverage structure. Sure
- * would be nice to just use the Fc structure in place...
- */
- coverage = pango_coverage_new ();
- for (ucs4 = FcCharSetFirstPage (charset, map, &pos);
- ucs4 != FC_CHARSET_DONE;
- ucs4 = FcCharSetNextPage (charset, map, &pos))
- {
- for (i = 0; i < FC_CHARSET_MAP_SIZE; i++)
- {
- FcChar32 bits = map[i];
- FcChar32 base = ucs4 + i * 32;
- int b = 0;
- bits = map[i];
- while (bits)
- {
- if (bits & 1)
- pango_coverage_set (coverage, base + b, PANGO_COVERAGE_EXACT);
-
- bits >>= 1;
- b++;
- }
- }
- }
-
- /* Awful hack so Hangul Tone marks get rendered with the same
- * font and in the same run as other Hangul characters. If a font
- * covers the first composed Hangul glyph, then it is declared to cover
- * the Hangul tone marks. This hack probably needs to be formalized
- * by choosing fonts for scripts rather than individual code points.
- */
- if (pango_coverage_get (coverage, 0xac00) == PANGO_COVERAGE_EXACT)
- {
- pango_coverage_set (coverage, 0x302e, PANGO_COVERAGE_EXACT);
- pango_coverage_set (coverage, 0x302f, PANGO_COVERAGE_EXACT);
- }
-
- pango_fc_font_map_set_coverage (fcfontmap, &key, coverage);
-
- return coverage;
-}
-
-/*
- * PangoFcFace
- */
-
-PangoFontDescription *
-_pango_fc_font_desc_from_pattern (FcPattern *pattern, gboolean include_size)
-{
- PangoFontDescription *desc;
- PangoStyle style;
- PangoWeight weight;
- double size;
-
- char *s;
- int i;
-
- desc = pango_font_description_new ();
-
- g_assert (FcPatternGetString (pattern, FC_FAMILY, 0, (FcChar8 **) &s) == FcResultMatch);
-
- pango_font_description_set_family (desc, s);
-
- if (FcPatternGetInteger (pattern, FC_SLANT, 0, &i) == FcResultMatch)
- {
- if (i == FC_SLANT_ROMAN)
- style = PANGO_STYLE_NORMAL;
- else if (i == FC_SLANT_OBLIQUE)
- style = PANGO_STYLE_OBLIQUE;
- else
- style = PANGO_STYLE_ITALIC;
- }
- else
- style = PANGO_STYLE_NORMAL;
-
- pango_font_description_set_style (desc, style);
-
- if (FcPatternGetInteger (pattern, FC_WEIGHT, 0, &i) == FcResultMatch)
- {
- if (i < FC_WEIGHT_LIGHT)
- weight = PANGO_WEIGHT_ULTRALIGHT;
- else if (i < (FC_WEIGHT_LIGHT + FC_WEIGHT_MEDIUM) / 2)
- weight = PANGO_WEIGHT_LIGHT;
- else if (i < (FC_WEIGHT_MEDIUM + FC_WEIGHT_DEMIBOLD) / 2)
- weight = PANGO_WEIGHT_NORMAL;
- else if (i < (FC_WEIGHT_DEMIBOLD + FC_WEIGHT_BOLD) / 2)
- weight = 600;
- else if (i < (FC_WEIGHT_BOLD + FC_WEIGHT_BLACK) / 2)
- weight = PANGO_WEIGHT_BOLD;
- else
- weight = PANGO_WEIGHT_ULTRABOLD;
- }
- else
- weight = PANGO_WEIGHT_NORMAL;
-
- if (include_size && FcPatternGetDouble (pattern, FC_SIZE, 0, &size) == FcResultMatch)
- pango_font_description_set_size (desc, size * PANGO_SCALE);
-
- pango_font_description_set_weight (desc, weight);
-
- pango_font_description_set_variant (desc, PANGO_VARIANT_NORMAL);
- pango_font_description_set_stretch (desc, PANGO_STRETCH_NORMAL);
-
- return desc;
-}
-
-static PangoFontDescription *
-make_alias_description (PangoFcFamily *fcfamily,
- gboolean bold,
- gboolean italic)
-{
- PangoFontDescription *desc = pango_font_description_new ();
-
- pango_font_description_set_family (desc, fcfamily->family_name);
- pango_font_description_set_style (desc, italic ? PANGO_STYLE_ITALIC : PANGO_STYLE_NORMAL);
- pango_font_description_set_variant (desc, PANGO_VARIANT_NORMAL);
- pango_font_description_set_weight (desc, bold ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL);
- pango_font_description_set_stretch (desc, PANGO_STRETCH_NORMAL);
-
- return desc;
-}
-
-static PangoFontDescription *
-pango_fc_face_describe (PangoFontFace *face)
-{
- PangoFcFace *fcface = PANGO_FC_FACE (face);
- PangoFcFamily *fcfamily = fcface->family;
- PangoFontDescription *desc = NULL;
- FcResult res;
- FcPattern *match_pattern;
- FcPattern *result_pattern;
-
- if (is_alias_family (fcfamily->family_name))
- {
- if (strcmp (fcface->style, "Regular") == 0)
- return make_alias_description (fcfamily, FALSE, FALSE);
- else if (strcmp (fcface->style, "Bold") == 0)
- return make_alias_description (fcfamily, TRUE, FALSE);
- else if (strcmp (fcface->style, "Italic") == 0)
- return make_alias_description (fcfamily, FALSE, TRUE);
- else /* Bold Italic */
- return make_alias_description (fcfamily, TRUE, TRUE);
- }
-
- match_pattern = FcPatternBuild (NULL,
- FC_FAMILY, FcTypeString, fcfamily->family_name,
- FC_STYLE, FcTypeString, fcface->style,
- NULL);
-
- g_assert (match_pattern);
-
- result_pattern = FcFontMatch (NULL, match_pattern, &res);
- if (result_pattern)
- {
- desc = _pango_fc_font_desc_from_pattern (result_pattern, FALSE);
- FcPatternDestroy (result_pattern);
- }
-
- FcPatternDestroy (match_pattern);
-
- return desc;
-}
-
-static const char *
-pango_fc_face_get_face_name (PangoFontFace *face)
-{
- PangoFcFace *fcface = PANGO_FC_FACE (face);
-
- return fcface->style;
-}
-
-static void
-pango_fc_face_class_init (PangoFontFaceClass *class)
-{
- class->describe = pango_fc_face_describe;
- class->get_face_name = pango_fc_face_get_face_name;
-}
-
-static GType
-pango_fc_face_get_type (void)
-{
- static GType object_type = 0;
-
- if (!object_type)
- {
- static const GTypeInfo object_info =
- {
- sizeof (PangoFontFaceClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) pango_fc_face_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (PangoFcFace),
- 0, /* n_preallocs */
- (GInstanceInitFunc) NULL,
- };
-
- object_type = g_type_register_static (PANGO_TYPE_FONT_FACE,
- PANGO_FC_NAME "Face",
- &object_info, 0);
- }
-
- return object_type;
-}
-
-/*
- * PangoFcFamily
- */
-static PangoFcFace *
-create_face (PangoFcFamily *fcfamily,
- const char *style)
-{
- PangoFcFace *face = g_object_new (PANGO_FC_TYPE_FACE, NULL);
- face->style = g_strdup (style);
- face->family = fcfamily;
-
- return face;
-}
-
-static void
-pango_fc_family_list_faces (PangoFontFamily *family,
- PangoFontFace ***faces,
- int *n_faces)
-{
- PangoFcFamily *fcfamily = PANGO_FC_FAMILY (family);
- PangoFcFontMap *fcfontmap = fcfamily->fontmap;
-
- if (fcfamily->n_faces < 0)
- {
- FcFontSet *fontset;
- int i;
-
- if (is_alias_family (fcfamily->family_name) || fcfontmap->closed)
- {
- fcfamily->n_faces = 4;
- fcfamily->faces = g_new (PangoFcFace *, fcfamily->n_faces);
-
- i = 0;
- fcfamily->faces[i++] = create_face (fcfamily, "Regular");
- fcfamily->faces[i++] = create_face (fcfamily, "Bold");
- fcfamily->faces[i++] = create_face (fcfamily, "Italic");
- fcfamily->faces[i++] = create_face (fcfamily, "Bold Italic");
- }
- else
- {
- FcObjectSet *os = FcObjectSetBuild (FC_STYLE, NULL);
- FcPattern *pat = FcPatternBuild (NULL,
- FC_FAMILY, FcTypeString, fcfamily->family_name,
- NULL);
-
- fontset = FcFontList (NULL, pat, os);
-
- FcPatternDestroy (pat);
- FcObjectSetDestroy (os);
-
- fcfamily->n_faces = fontset->nfont;
- fcfamily->faces = g_new (PangoFcFace *, fcfamily->n_faces);
-
- for (i = 0; i < fontset->nfont; i++)
- {
- FcChar8 *s;
- FcResult res;
-
- res = FcPatternGetString (fontset->fonts[i], FC_STYLE, 0, &s);
- if (res != FcResultMatch)
- s = "Regular";
-
- fcfamily->faces[i] = create_face (fcfamily, s);
- }
-
- FcFontSetDestroy (fontset);
- }
- }
-
- if (n_faces)
- *n_faces = fcfamily->n_faces;
-
- if (faces)
- *faces = g_memdup (fcfamily->faces, fcfamily->n_faces * sizeof (PangoFontFace *));
-}
-
-static const char *
-pango_fc_family_get_name (PangoFontFamily *family)
-{
- PangoFcFamily *fcfamily = PANGO_FC_FAMILY (family);
-
- return fcfamily->family_name;
-}
-
-static void
-pango_fc_family_class_init (PangoFontFamilyClass *class)
-{
- class->list_faces = pango_fc_family_list_faces;
- class->get_name = pango_fc_family_get_name;
-}
-
-static void
-pango_fc_family_init (PangoFcFamily *fcfamily)
-{
- fcfamily->n_faces = -1;
-}
-
-static GType
-pango_fc_family_get_type (void)
-{
- static GType object_type = 0;
-
- if (!object_type)
- {
- static const GTypeInfo object_info =
- {
- sizeof (PangoFontFamilyClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) pango_fc_family_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (PangoFcFamily),
- 0, /* n_preallocs */
- (GInstanceInitFunc) pango_fc_family_init,
- };
-
- object_type = g_type_register_static (PANGO_TYPE_FONT_FAMILY,
- PANGO_FC_NAME "Family",
- &object_info, 0);
- }
-
- return object_type;
-}
diff --git a/pango/pangofc-fontmap.h b/pango/pangofc-fontmap.h
new file mode 100644
index 00000000..9d02dee9
--- /dev/null
+++ b/pango/pangofc-fontmap.h
@@ -0,0 +1,106 @@
+/* Pango
+ * pangofc-fontmap.h: Base fontmap type 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_MAP_H__
+#define __PANGO_FC_FONT_MAP_H__
+
+#include <fontconfig/fontconfig.h>
+#include <pango/pango-fontmap.h>
+#include <pango/pangofc-font.h>
+
+G_BEGIN_DECLS
+
+#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))
+
+typedef struct _PangoFcFontMap PangoFcFontMap;
+typedef struct _PangoFcFontMapClass PangoFcFontMapClass;
+typedef struct _PangoFcFontMapPrivate PangoFcFontMapPrivate;
+
+#ifdef PANGO_ENABLE_BACKEND
+
+#define PANGO_FC_FONT_MAP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PANGO_TYPE_FC_FONT_MAP, PangoFcFontMapClass))
+#define PANGO_IS_FC_FONT_MAP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PANGO_TYPE_FC_FONT_MAP))
+#define PANGO_FC_FONT_MAP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PANGO_TYPE_FC_FONT_MAP, PangoFcFontMapClass))
+
+/**
+ * PangoFcFontMap:
+ *
+ * #PangoFcFontMap is a base class for font map implementations
+ * using the FontConfig and FreeType libraries. To create a new
+ * backend using Fontconfig and FreeType, you derive from this class
+ * and implement a new_font() virtual function that creates an
+ * instance deriving from #PangoFcFont.
+ **/
+struct _PangoFcFontMap
+{
+ PangoFontMap parent_instance;
+
+ PangoFcFontMapPrivate *priv;
+};
+
+/**
+ * PangoFcFontMapClass:
+ * @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.
+ * @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
+ * of #PangoFcFont when you call g_object_new()
+ *
+ * Class structure for #PangoFcFontMap.
+ **/
+struct _PangoFcFontMapClass
+{
+ /*< private >*/
+ PangoFontMapClass parent_class;
+
+ /*< public >*/
+ void (*default_substitute) (PangoFcFontMap *fontmap,
+ FcPattern *pattern);
+ PangoFcFont *(*new_font) (PangoFcFontMap *fontmap,
+ FcPattern *pattern);
+
+ /*< private >*/
+
+ /* Padding for future expansion */
+ void (*_pango_reserved1) (void);
+ void (*_pango_reserved2) (void);
+ void (*_pango_reserved3) (void);
+ void (*_pango_reserved4) (void);
+};
+
+PangoContext * pango_fc_font_map_create_context (PangoFcFontMap *fcfontmap);
+void pango_fc_font_map_cache_clear (PangoFcFontMap *fcfontmap);
+void pango_fc_font_map_shutdown (PangoFcFontMap *fcfontmap);
+
+#endif
+
+GType pango_fc_font_map_get_type (void);
+
+PangoFontDescription *pango_fc_font_description_from_pattern (FcPattern *pattern,
+ gboolean include_size);
+
+G_END_DECLS
+
+#endif /* __PANGO_FC_FONT_MAP_H__ */
diff --git a/pango/pangofc-private.h b/pango/pangofc-private.h
new file mode 100644
index 00000000..9ef285af
--- /dev/null
+++ b/pango/pangofc-private.h
@@ -0,0 +1,39 @@
+/* Pango
+ * pangofc-private.h: Private routines and declarations for generic
+ * fontconfig operation
+ *
+ * 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 __PANGOFC_PRIVATE_H__
+#define __PANGOFC_PRIVATE_H__
+
+#include <pangofc-fontmap.h>
+
+G_BEGIN_DECLS
+
+void _pango_fc_font_shutdown (PangoFcFont *fcfont);
+
+void _pango_fc_font_map_remove (PangoFcFontMap *fcfontmap,
+ PangoFcFont *fcfont);
+PangoCoverage *_pango_fc_font_map_get_coverage (PangoFcFontMap *fcfontmap,
+ FcPattern *pattern);
+
+G_END_DECLS
+
+#endif /* __PANGOFC_PRIVATE_H__ */
diff --git a/pango/pangoft2-fontmap.c b/pango/pangoft2-fontmap.c
index 9feea38f..1abc5a0d 100644
--- a/pango/pangoft2-fontmap.c
+++ b/pango/pangoft2-fontmap.c
@@ -33,10 +33,9 @@
#include <fontconfig/fontconfig.h>
-#include "pango-fontmap.h"
#include "pango-utils.h"
#include "pangoft2-private.h"
-#include "modules.h"
+#include "pangofc-fontmap.h"
#ifdef G_OS_WIN32
#define STRICT
@@ -44,36 +43,17 @@
#endif
typedef struct _PangoFT2Family PangoFT2Family;
+typedef struct _PangoFT2FontMapClass PangoFT2FontMapClass;
struct _PangoFT2FontMap
{
- PangoFontMap parent_instance;
+ PangoFcFontMap parent_instance;
FT_Library library;
- /* We have one map from PangoFontDescription -> PangoXftPatternSet
- * per language tag.
- */
- GList *fontset_hash_list;
- /* pattern_hash is used to make sure we only store one copy of
- * each identical pattern. (Speeds up lookup).
- */
- GHashTable *pattern_hash;
- GHashTable *coverage_hash; /* Maps font file name -> PangoCoverage */
-
- GHashTable *fonts; /* Maps XftPattern -> PangoFT2Font */
-
- GQueue *fontset_cache; /* Recently used fontsets */
-
- /* List of all families availible */
- PangoFT2Family **families;
- int n_families; /* -1 == uninitialized */
-
double dpi_x;
double dpi_y;
- guint closed : 1;
-
/* Function to call on prepared patterns to do final
* config tweaking.
*/
@@ -82,34 +62,75 @@ struct _PangoFT2FontMap
GDestroyNotify substitute_destroy;
};
-/************************************************************
- * Code shared with PangoXft *
- ************************************************************/
+struct _PangoFT2FontMapClass
+{
+ PangoFcFontMapClass parent_class;
+};
+
+static void pango_ft2_font_map_class_init (PangoFT2FontMapClass *class);
+static void pango_ft2_font_map_finalize (GObject *object);
+static void pango_ft2_font_map_default_substitute (PangoFcFontMap *fcfontmap,
+ FcPattern *pattern);
+static PangoFcFont * pango_ft2_font_map_new_font (PangoFcFontMap *fcfontmap,
+ FcPattern *pattern);
-#define PangoFcFamily PangoFT2Family
-#define _PangoFcFamily _PangoFT2Family
-#define PangoFcFontMap PangoFT2FontMap
-#define PangoFcFont PangoFT2Font
+static PangoFT2FontMap *pango_ft2_global_fontmap = NULL;
-#define PANGO_FC_FONT_MAP PANGO_FT2_FONT_MAP
+static GObjectClass *parent_class;
-#define pango_fc_font_map_get_type pango_ft2_font_map_get_type
-#define _pango_fc_font_map_add _pango_ft2_font_map_add
-#define _pango_fc_font_map_remove _pango_ft2_font_map_remove
-#define _pango_fc_font_map_get_coverage _pango_ft2_font_map_get_coverage
-#define _pango_fc_font_map_set_coverage _pango_ft2_font_map_set_coverage
-#define _pango_fc_font_desc_from_pattern _pango_ft2_font_desc_from_pattern
-#define _pango_fc_font_new _pango_ft2_font_new
+GType
+pango_ft2_font_map_get_type (void)
+{
+ static GType object_type = 0;
-#define PANGO_FC_NAME "PangoFT2"
+ if (!object_type)
+ {
+ static const GTypeInfo object_info =
+ {
+ sizeof (PangoFT2FontMapClass),
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
+ (GClassInitFunc) pango_ft2_font_map_class_init,
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof (PangoFT2FontMap),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) NULL,
+ };
+
+ object_type = g_type_register_static (PANGO_TYPE_FC_FONT_MAP,
+ "PangoFT2FontMap",
+ &object_info, 0);
+ }
+
+ return object_type;
+}
-#include "pangofc-fontmap.cI"
+static void
+pango_ft2_font_map_class_init (PangoFT2FontMapClass *class)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (class);
+ PangoFcFontMapClass *fcfontmap_class = PANGO_FC_FONT_MAP_CLASS (class);
+
+ parent_class = g_type_class_peek_parent (class);
-/*************************************************************
- * FreeType specific code *
- *************************************************************/
+ gobject_class->finalize = pango_ft2_font_map_finalize;
+ fcfontmap_class->default_substitute = pango_ft2_font_map_default_substitute;
+ fcfontmap_class->new_font = pango_ft2_font_map_new_font;
+}
-static PangoFT2FontMap *pango_ft2_global_fontmap = NULL;
+static void
+pango_ft2_font_map_finalize (GObject *object)
+{
+ PangoFT2FontMap *ft2fontmap = PANGO_FT2_FONT_MAP (object);
+
+ if (ft2fontmap->substitute_destroy)
+ ft2fontmap->substitute_destroy (ft2fontmap->substitute_data);
+
+ FT_Done_FreeType (ft2fontmap->library);
+
+ parent_class->finalize (object);
+}
/**
* pango_ft2_font_map_new:
@@ -128,23 +149,12 @@ static PangoFT2FontMap *pango_ft2_global_fontmap = NULL;
PangoFontMap *
pango_ft2_font_map_new (void)
{
- static gboolean registered_modules = FALSE;
PangoFT2FontMap *ft2fontmap;
FT_Error error;
- if (!registered_modules)
- {
- int i;
-
- registered_modules = TRUE;
-
- /* Make sure that the type system is initialized */
- g_type_init ();
+ /* Make sure that the type system is initialized */
+ g_type_init ();
- for (i = 0; _pango_included_ft2_modules[i].list; i++)
- pango_module_register (&_pango_included_ft2_modules[i]);
- }
-
ft2fontmap = g_object_new (PANGO_TYPE_FT2_FONT_MAP, NULL);
error = FT_Init_FreeType (&ft2fontmap->library);
@@ -186,7 +196,7 @@ pango_ft2_font_map_set_default_substitute (PangoFT2FontMap *fontmap,
fontmap->substitute_data = data;
fontmap->substitute_destroy = notify;
- pango_fc_font_map_cache_clear (fontmap);
+ pango_fc_font_map_cache_clear (PANGO_FC_FONT_MAP (fontmap));
}
/**
@@ -204,7 +214,7 @@ pango_ft2_font_map_set_default_substitute (PangoFT2FontMap *fontmap,
void
pango_ft2_font_map_substitute_changed (PangoFT2FontMap *fontmap)
{
- pango_fc_font_map_cache_clear (fontmap);
+ pango_fc_font_map_cache_clear (PANGO_FC_FONT_MAP (fontmap));
}
/**
@@ -241,14 +251,9 @@ pango_ft2_font_map_set_resolution (PangoFT2FontMap *fontmap,
PangoContext *
pango_ft2_font_map_create_context (PangoFT2FontMap *fontmap)
{
- PangoContext *context;
-
g_return_val_if_fail (PANGO_FT2_IS_FONT_MAP (fontmap), NULL);
- context = pango_context_new ();
- pango_context_set_font_map (context, PANGO_FONT_MAP (fontmap));
-
- return context;
+ return pango_fc_font_map_create_context (PANGO_FC_FONT_MAP (fontmap));
}
/**
@@ -306,7 +311,7 @@ pango_ft2_shutdown_display (void)
{
if (pango_ft2_global_fontmap)
{
- pango_fc_font_map_cache_clear (pango_ft2_global_fontmap);
+ pango_fc_font_map_cache_clear (PANGO_FC_FONT_MAP (pango_ft2_global_fontmap));
g_object_unref (pango_ft2_global_fontmap);
@@ -323,26 +328,25 @@ _pango_ft2_font_map_get_library (PangoFontMap *fontmap)
}
static void
-pango_fc_do_finalize (PangoFT2FontMap *fontmap)
-{
- if (fontmap->substitute_destroy)
- fontmap->substitute_destroy (fontmap->substitute_data);
-
- FT_Done_FreeType (fontmap->library);
-}
-
-static void
-pango_fc_default_substitute (PangoFT2FontMap *fontmap,
- FcPattern *pattern)
+pango_ft2_font_map_default_substitute (PangoFcFontMap *fcfontmap,
+ FcPattern *pattern)
{
+ PangoFT2FontMap *ft2fontmap = PANGO_FT2_FONT_MAP (fcfontmap);
FcValue v;
-
+
FcConfigSubstitute (NULL, pattern, FcMatchPattern);
- if (fontmap->substitute_func)
- fontmap->substitute_func (pattern, fontmap->substitute_data);
+ if (ft2fontmap->substitute_func)
+ ft2fontmap->substitute_func (pattern, ft2fontmap->substitute_data);
FcDefaultSubstitute (pattern);
if (FcPatternGet (pattern, FC_DPI, 0, &v) == FcResultNoMatch)
- FcPatternAddDouble (pattern, FC_DPI, fontmap->dpi_y);
+ FcPatternAddDouble (pattern, FC_DPI, ft2fontmap->dpi_y);
+}
+
+static PangoFcFont *
+pango_ft2_font_map_new_font (PangoFcFontMap *fcfontmap,
+ FcPattern *pattern)
+{
+ return (PangoFcFont *)_pango_ft2_font_new (PANGO_FT2_FONT_MAP (fcfontmap), pattern);
}
diff --git a/pango/pangoft2-private.h b/pango/pangoft2-private.h
index 71746f02..1f086832 100644
--- a/pango/pangoft2-private.h
+++ b/pango/pangoft2-private.h
@@ -23,7 +23,6 @@
#ifndef __PANGOFT2_PRIVATE_H__
#define __PANGOFT2_PRIVATE_H__
-#include "pango-modules.h"
#include "pangoft2.h"
#include <fontconfig/fontconfig.h>
@@ -61,15 +60,11 @@ struct _PangoFT2Font
{
PangoFcFont font;
- FcPattern *font_pattern;
FT_Face face;
int load_flags;
int size;
- PangoFontMap *fontmap;
- PangoFontDescription *description;
-
GSList *metrics_by_lang;
GHashTable *glyph_info;
@@ -83,19 +78,10 @@ struct _PangoFT2GlyphInfo
void *cached_glyph;
};
-PangoFT2Font * _pango_ft2_font_new (PangoFontMap *font,
- FcPattern *pattern);
-PangoMap *_pango_ft2_get_shaper_map (PangoLanguage *language);
-PangoCoverage *_pango_ft2_font_map_get_coverage (PangoFontMap *fontmap,
- FcPattern *pattern);
+PangoFT2Font * _pango_ft2_font_new (PangoFT2FontMap *ft2fontmap,
+ FcPattern *pattern);
FT_Library _pango_ft2_font_map_get_library (PangoFontMap *fontmap);
-void _pango_ft2_font_map_add (PangoFontMap *fontmap,
- PangoFT2Font *ft2font);
-void _pango_ft2_font_map_remove (PangoFontMap *fontmap,
- PangoFT2Font *ft2font);
const char *_pango_ft2_ft_strerror (FT_Error error);
-PangoFontDescription *_pango_ft2_font_desc_from_pattern (FcPattern *pattern,
- gboolean include_size);
void *pango_ft2_font_get_cache_glyph_data (PangoFont *font,
int glyph_index);
diff --git a/pango/pangoft2.c b/pango/pangoft2.c
index 517e952b..6c42b3c4 100644
--- a/pango/pangoft2.c
+++ b/pango/pangoft2.c
@@ -30,9 +30,9 @@
#include <freetype/freetype.h>
-#include "pango-utils.h"
#include "pangoft2.h"
#include "pangoft2-private.h"
+#include "pangofc-fontmap.h"
/* for compatibility with older freetype versions */
#ifndef FT_LOAD_TARGET_MONO
@@ -47,19 +47,12 @@
#define PANGO_FT2_FONT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PANGO_TYPE_FT2_FONT, PangoFT2FontClass))
typedef struct _PangoFT2FontClass PangoFT2FontClass;
-typedef struct _PangoFT2MetricsInfo PangoFT2MetricsInfo;
struct _PangoFT2FontClass
{
PangoFcFontClass parent_class;
};
-struct _PangoFT2MetricsInfo
-{
- const char *sample_str;
- PangoFontMetrics *metrics;
-};
-
typedef struct
{
FT_Bitmap bitmap;
@@ -73,21 +66,11 @@ static void pango_ft2_font_class_init (PangoFT2FontClass *class);
static void pango_ft2_font_init (PangoFT2Font *ft2font);
static void pango_ft2_font_finalize (GObject *object);
-static PangoFontDescription * pango_ft2_font_describe (PangoFont *font);
-
-static PangoEngineShape * pango_ft2_font_find_shaper (PangoFont *font,
- PangoLanguage *language,
- guint32 ch);
-
static void pango_ft2_font_get_glyph_extents (PangoFont *font,
PangoGlyph glyph,
PangoRectangle *ink_rect,
PangoRectangle *logical_rect);
-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,
@@ -96,8 +79,6 @@ 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 void pango_ft2_font_real_kern_glyphs (PangoFcFont *font,
- PangoGlyphString *glyphs);
static GType pango_ft2_font_get_type (void);
@@ -111,29 +92,23 @@ static void pango_ft2_get_item_properties (PangoItem *item,
PangoFT2Font *
-_pango_ft2_font_new (PangoFontMap *fontmap,
- FcPattern *pattern)
+_pango_ft2_font_new (PangoFT2FontMap *ft2fontmap,
+ FcPattern *pattern)
{
+ PangoFontMap *fontmap = PANGO_FONT_MAP (ft2fontmap);
PangoFT2Font *ft2font;
double d;
g_return_val_if_fail (fontmap != NULL, NULL);
g_return_val_if_fail (pattern != NULL, NULL);
- ft2font = (PangoFT2Font *)g_object_new (PANGO_TYPE_FT2_FONT, NULL);
-
- ft2font->fontmap = fontmap;
- ft2font->font_pattern = pattern;
-
- g_object_ref (fontmap);
- ft2font->description = _pango_ft2_font_desc_from_pattern (pattern, TRUE);
- ft2font->face = NULL;
+ ft2font = (PangoFT2Font *)g_object_new (PANGO_TYPE_FT2_FONT,
+ "pattern", pattern,
+ NULL);
if (FcPatternGetDouble (pattern, FC_PIXEL_SIZE, 0, &d) == FcResultMatch)
ft2font->size = d*PANGO_SCALE;
- _pango_ft2_font_map_add (ft2font->fontmap, ft2font);
-
return ft2font;
}
@@ -156,6 +131,7 @@ static void
load_fallback_face (PangoFT2Font *ft2font,
const char *original_file)
{
+ PangoFcFont *fcfont = PANGO_FC_FONT (ft2font);
FcPattern *sans;
FcPattern *matched;
FcResult result;
@@ -166,7 +142,7 @@ load_fallback_face (PangoFT2Font *ft2font,
sans = FcPatternBuild (NULL,
FC_FAMILY, FcTypeString, "sans",
- FC_SIZE, FcTypeDouble, (double)pango_font_description_get_size (ft2font->description)/PANGO_SCALE,
+ FC_SIZE, FcTypeDouble, (double)pango_font_description_get_size (fcfont->description)/PANGO_SCALE,
NULL);
matched = FcFontMatch (0, sans, &result);
@@ -177,20 +153,20 @@ load_fallback_face (PangoFT2Font *ft2font,
if (FcPatternGetInteger (matched, FC_INDEX, 0, &id) != FcResultMatch)
goto bail1;
- error = FT_New_Face (_pango_ft2_font_map_get_library (ft2font->fontmap),
+ error = FT_New_Face (_pango_ft2_font_map_get_library (fcfont->fontmap),
(char *) filename2, id, &ft2font->face);
if (error)
{
bail1:
- name = pango_font_description_to_string (ft2font->description);
+ name = pango_font_description_to_string (fcfont->description);
g_warning ("Unable to open font file %s for font %s, exiting\n", filename2, name);
exit (1);
}
else
{
- name = pango_font_description_to_string (ft2font->description);
+ name = pango_font_description_to_string (fcfont->description);
g_warning ("Unable to open font file %s for font %s, falling back to %s\n", original_file, name, filename2);
g_free (name);
}
@@ -220,13 +196,14 @@ FT_Face
pango_ft2_font_get_face (PangoFont *font)
{
PangoFT2Font *ft2font = (PangoFT2Font *)font;
+ PangoFcFont *fcfont = (PangoFcFont *)font;
FT_Error error;
FcPattern *pattern;
FcChar8 *filename;
FcBool antialias, hinting, autohint;
int id;
- pattern = ft2font->font_pattern;
+ pattern = fcfont->font_pattern;
if (!ft2font->face)
{
@@ -264,7 +241,7 @@ pango_ft2_font_get_face (PangoFont *font)
if (FcPatternGetInteger (pattern, FC_INDEX, 0, &id) != FcResultMatch)
goto bail0;
- error = FT_New_Face (_pango_ft2_font_map_get_library (ft2font->fontmap),
+ error = FT_New_Face (_pango_ft2_font_map_get_library (fcfont->fontmap),
(char *) filename, id, &ft2font->face);
if (error != FT_Err_Ok)
{
@@ -331,8 +308,6 @@ pango_ft2_font_init (PangoFT2Font *ft2font)
ft2font->size = 0;
- ft2font->metrics_by_lang = NULL;
-
ft2font->glyph_info = g_hash_table_new (NULL, NULL);
}
@@ -347,18 +322,13 @@ pango_ft2_font_class_init (PangoFT2FontClass *class)
object_class->finalize = pango_ft2_font_finalize;
- font_class->describe = pango_ft2_font_describe;
- font_class->get_coverage = pango_ft2_font_get_coverage;
- 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->kern_glyphs = pango_ft2_font_real_kern_glyphs;
}
static void
@@ -669,71 +639,6 @@ pango_ft2_font_get_kerning (PangoFont *font,
return PANGO_UNITS_26_6 (kerning.x);
}
-static PangoFontMetrics *
-pango_ft2_font_get_metrics (PangoFont *font,
- PangoLanguage *language)
-{
- PangoFT2Font *ft2font = PANGO_FT2_FONT (font);
- PangoFT2MetricsInfo *info = NULL; /* Quiet gcc */
- GSList *tmp_list;
-
- const char *sample_str = pango_language_get_sample_string (language);
-
- tmp_list = ft2font->metrics_by_lang;
- while (tmp_list)
- {
- info = tmp_list->data;
-
- if (info->sample_str == sample_str) /* We _don't_ need strcmp */
- break;
-
- tmp_list = tmp_list->next;
- }
-
- if (!tmp_list)
- {
- PangoContext *context;
- PangoLayout *layout;
- PangoRectangle extents;
- FT_Face face = pango_ft2_font_get_face (font);
-
- info = g_new (PangoFT2MetricsInfo, 1);
- info->sample_str = sample_str;
- info->metrics = pango_font_metrics_new ();
-
- info->metrics->ascent = PANGO_UNITS_26_6 (face->size->metrics.ascender);
- info->metrics->descent = PANGO_UNITS_26_6 (- face->size->metrics.descender);
- info->metrics->approximate_char_width =
- info->metrics->approximate_digit_width =
- PANGO_UNITS_26_6 (face->size->metrics.max_advance);
-
- ft2font->metrics_by_lang = g_slist_prepend (ft2font->metrics_by_lang, info);
-
- context = pango_context_new ();
- pango_context_set_font_map (context, ft2font->fontmap);
- pango_context_set_language (context, language);
-
- layout = pango_layout_new (context);
- pango_layout_set_font_description (layout, ft2font->description);
-
- pango_layout_set_text (layout, sample_str, -1);
- pango_layout_get_extents (layout, NULL, &extents);
-
- info->metrics->approximate_char_width =
- extents.width / g_utf8_strlen (sample_str, -1);
-
- pango_layout_set_text (layout, "0123456789", -1);
- pango_layout_get_extents (layout, NULL, &extents);
-
- info->metrics->approximate_digit_width = extents.width / 10;
-
- g_object_unref (layout);
- g_object_unref (context);
- }
-
- return pango_font_metrics_ref (info->metrics);
-}
-
static FT_Face
pango_ft2_font_real_lock_face (PangoFcFont *font)
{
@@ -779,40 +684,6 @@ pango_ft2_font_real_get_unknown_glyph (PangoFcFont *font,
return 0;
}
-static void
-pango_ft2_font_real_kern_glyphs (PangoFcFont *font,
- PangoGlyphString *glyphs)
-{
- FT_Face face;
- FT_Error error;
- FT_Vector kerning;
- int i;
-
- face = pango_fc_font_lock_face (font);
- if (!face)
- return;
-
- if (!FT_HAS_KERNING (face))
- {
- pango_fc_font_unlock_face (font);
- return;
- }
-
- for (i = 1; i < glyphs->num_glyphs; ++i)
- {
- error = FT_Get_Kerning (face,
- glyphs->glyphs[i-1].glyph,
- glyphs->glyphs[i].glyph,
- ft_kerning_default,
- &kerning);
-
- if (error == FT_Err_Ok)
- glyphs->glyphs[i-1].geometry.width += PANGO_UNITS_26_6 (kerning.x);
- }
-
- pango_fc_font_unlock_face (font);
-}
-
static gboolean
pango_ft2_free_glyph_info_callback (gpointer key, gpointer value, gpointer data)
{
@@ -827,33 +698,16 @@ pango_ft2_free_glyph_info_callback (gpointer key, gpointer value, gpointer data)
}
static void
-free_metrics_info (PangoFT2MetricsInfo *info)
-{
- pango_font_metrics_unref (info->metrics);
- g_free (info);
-}
-
-static void
pango_ft2_font_finalize (GObject *object)
{
PangoFT2Font *ft2font = (PangoFT2Font *)object;
- _pango_ft2_font_map_remove (ft2font->fontmap, ft2font);
-
if (ft2font->face)
{
FT_Done_Face (ft2font->face);
ft2font->face = NULL;
}
- pango_font_description_free (ft2font->description);
- FcPatternDestroy (ft2font->font_pattern);
-
- g_object_unref (ft2font->fontmap);
-
- g_slist_foreach (ft2font->metrics_by_lang, (GFunc)free_metrics_info, NULL);
- g_slist_free (ft2font->metrics_by_lang);
-
g_hash_table_foreach_remove (ft2font->glyph_info,
pango_ft2_free_glyph_info_callback, object);
g_hash_table_destroy (ft2font->glyph_info);
@@ -861,60 +715,19 @@ pango_ft2_font_finalize (GObject *object)
G_OBJECT_CLASS (parent_class)->finalize (object);
}
-static PangoFontDescription *
-pango_ft2_font_describe (PangoFont *font)
-{
- PangoFT2Font *ft2font;
- PangoFontDescription *desc;
-
- ft2font = PANGO_FT2_FONT (font);
-
- desc = pango_font_description_copy (ft2font->description);
-
- return desc;
-}
-
-PangoMap *
-pango_ft2_get_shaper_map (PangoLanguage *language)
-{
- static guint engine_type_id = 0;
- static guint render_type_id = 0;
-
- if (engine_type_id == 0)
- {
- engine_type_id = g_quark_from_static_string (PANGO_ENGINE_TYPE_SHAPE);
- render_type_id = g_quark_from_static_string (PANGO_RENDER_TYPE_FT2);
- }
-
- return pango_find_map (language, engine_type_id, render_type_id);
-}
-
/**
* pango_ft2_font_get_coverage:
* @font: a #PangoFT2Font.
* @language: a language tag.
* @returns: a #PangoCoverage.
*
- * Should not be called directly, use pango_font_get_coverage() instead.
+ * Gets the #PangoCoverage for a #PangoFT2Font. Use pango_font_get_coverage() instead.
**/
PangoCoverage *
pango_ft2_font_get_coverage (PangoFont *font,
PangoLanguage *language)
{
- PangoFT2Font *ft2font = (PangoFT2Font *)font;
-
- return _pango_ft2_font_map_get_coverage (ft2font->fontmap, ft2font->font_pattern);
-}
-
-static PangoEngineShape *
-pango_ft2_font_find_shaper (PangoFont *font,
- PangoLanguage *language,
- guint32 ch)
-{
- PangoMap *shape_map = NULL;
-
- shape_map = pango_ft2_get_shaper_map (language);
- return (PangoEngineShape *)pango_map_get_engine (shape_map, ch);
+ return pango_font_get_coverage (font, language);
}
/* Utility functions */
diff --git a/pango/pangoft2.h b/pango/pangoft2.h
index 2bb7db8d..da5cf3fb 100644
--- a/pango/pangoft2.h
+++ b/pango/pangoft2.h
@@ -30,7 +30,9 @@
G_BEGIN_DECLS
+#ifndef PANGO_DISABLE_DEPRECATED
#define PANGO_RENDER_TYPE_FT2 "PangoRenderFT2"
+#endif
#define PANGO_TYPE_FT2_FONT_MAP (pango_ft2_font_map_get_type ())
#define PANGO_FT2_FONT_MAP(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), PANGO_TYPE_FT2_FONT_MAP, PangoFT2FontMap))
diff --git a/pango/pangoxft-font.c b/pango/pangoxft-font.c
index 1c11fb0b..968192b2 100644
--- a/pango/pangoxft-font.c
+++ b/pango/pangoxft-font.c
@@ -23,10 +23,8 @@
#include <stdlib.h>
+#include "pangofc-fontmap.h"
#include "pangoxft-private.h"
-#include "pango-layout.h"
-#include "pango-modules.h"
-#include "pango-utils.h"
#define PANGO_XFT_FONT(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), PANGO_TYPE_XFT_FONT, PangoXftFont))
#define PANGO_XFT_FONT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PANGO_TYPE_XFT_FONT, PangoXftFontClass))
@@ -35,45 +33,22 @@
#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
{
PangoFcFontClass parent_class;
};
-struct _PangoXftMetricsInfo
-{
- const char *sample_str;
- PangoFontMetrics *metrics;
-};
-
static PangoFontClass *parent_class; /* Parent class structure for PangoXftFont */
static void pango_xft_font_class_init (PangoXftFontClass *class);
-static void pango_xft_font_init (PangoXftFont *xfont);
static void pango_xft_font_finalize (GObject *object);
-static PangoFontDescription *pango_xft_font_describe (PangoFont *font);
-static PangoCoverage * pango_xft_font_get_coverage (PangoFont *font,
- PangoLanguage *language);
-static PangoEngineShape * pango_xft_font_find_shaper (PangoFont *font,
- PangoLanguage *language,
- guint32 ch);
static void pango_xft_font_get_glyph_extents (PangoFont *font,
PangoGlyph glyph,
PangoRectangle *ink_rect,
PangoRectangle *logical_rect);
-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);
@@ -83,8 +58,7 @@ 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 void pango_xft_font_real_kern_glyphs (PangoFcFont *font,
- PangoGlyphString *glyphs);
+static void pango_xft_font_real_shutdown (PangoFcFont *font);
static XftFont *xft_font_get_font (PangoFont *font);
@@ -105,7 +79,7 @@ pango_xft_font_get_type (void)
NULL, /* class_data */
sizeof (PangoXftFont),
0, /* n_preallocs */
- (GInstanceInitFunc) pango_xft_font_init,
+ (GInstanceInitFunc) NULL,
};
object_type = g_type_register_static (PANGO_TYPE_FC_FONT,
@@ -116,12 +90,6 @@ pango_xft_font_get_type (void)
return object_type;
}
-static void
-pango_xft_font_init (PangoXftFont *xfont)
-{
- xfont->metrics_by_lang = NULL;
-}
-
static void
pango_xft_font_class_init (PangoXftFontClass *class)
{
@@ -133,40 +101,32 @@ pango_xft_font_class_init (PangoXftFontClass *class)
object_class->finalize = pango_xft_font_finalize;
- font_class->describe = pango_xft_font_describe;
- font_class->get_coverage = pango_xft_font_get_coverage;
- 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->kern_glyphs = pango_xft_font_real_kern_glyphs;
+ fc_font_class->shutdown = pango_xft_font_real_shutdown;
}
PangoXftFont *
-_pango_xft_font_new (PangoFontMap *fontmap,
- FcPattern *pattern)
+_pango_xft_font_new (PangoXftFontMap *xftfontmap,
+ FcPattern *pattern)
{
+ PangoFontMap *fontmap = PANGO_FONT_MAP (xftfontmap);
PangoXftFont *xfont;
g_return_val_if_fail (fontmap != NULL, NULL);
g_return_val_if_fail (pattern != NULL, NULL);
- xfont = (PangoXftFont *)g_object_new (PANGO_TYPE_XFT_FONT, NULL);
-
- xfont->fontmap = fontmap;
- xfont->font_pattern = pattern;
+ xfont = (PangoXftFont *)g_object_new (PANGO_TYPE_XFT_FONT,
+ "pattern", pattern,
+ NULL);
- g_object_ref (fontmap);
- xfont->description = _pango_xft_font_desc_from_pattern (pattern, TRUE);
xfont->xft_font = NULL;
- _pango_xft_font_map_add (xfont->fontmap, xfont);
-
return xfont;
}
@@ -174,8 +134,9 @@ static PangoFont *
get_mini_font (PangoFont *font)
{
PangoXftFont *xfont = (PangoXftFont *)font;
+ PangoFcFont *fcfont = (PangoFcFont *)font;
- g_assert (xfont->fontmap);
+ g_assert (fcfont->fontmap);
if (!xfont->mini_font)
{
@@ -186,13 +147,13 @@ get_mini_font (PangoFont *font)
XGlyphInfo extents;
XftFont *mini_xft;
- _pango_xft_font_map_get_info (xfont->fontmap, &display, NULL);
+ _pango_xft_font_map_get_info (fcfont->fontmap, &display, NULL);
pango_font_description_set_family_static (desc, "monospace");
pango_font_description_set_size (desc,
- 0.5 * pango_font_description_get_size (xfont->description));
+ 0.5 * pango_font_description_get_size (fcfont->description));
- xfont->mini_font = pango_font_map_load_font (xfont->fontmap, NULL, desc);
+ xfont->mini_font = pango_font_map_load_font (fcfont->fontmap, NULL, desc);
pango_font_description_free (desc);
mini_xft = xft_font_get_font (xfont->mini_font);
@@ -281,6 +242,7 @@ pango_xft_real_render (Display *display,
gint y)
{
PangoXftFont *xfont = PANGO_XFT_FONT (font);
+ PangoFcFont *fcfont = PANGO_FC_FONT (font);
XftFont *xft_font = xft_font_get_font (font);
int i;
int x_off = 0;
@@ -289,7 +251,7 @@ pango_xft_real_render (Display *display,
XftCharSpec chars[4]; /* for unknown */
int n_xft_glyph = 0;
- if (!xfont->fontmap) /* Display closed */
+ if (!fcfont->fontmap) /* Display closed */
return;
#define FLUSH_GLYPHS() G_STMT_START { \
@@ -305,7 +267,7 @@ pango_xft_real_render (Display *display,
} G_STMT_END
if (!display)
- _pango_xft_font_map_get_info (xfont->fontmap, &display, NULL);
+ _pango_xft_font_map_get_info (fcfont->fontmap, &display, NULL);
for (i=0; i<glyphs->num_glyphs; i++)
{
@@ -444,133 +406,26 @@ pango_xft_picture_render (Display *display,
pango_xft_real_render (display, src_picture, dest_picture, NULL, NULL, font, glyphs, x, y);
}
-static PangoFontMetrics *
-pango_xft_font_get_metrics (PangoFont *font,
- PangoLanguage *language)
-{
- PangoXftFont *xfont = PANGO_XFT_FONT (font);
- PangoXftMetricsInfo *info = NULL; /* Quiet gcc */
- GSList *tmp_list;
-
- const char *sample_str = pango_language_get_sample_string (language);
-
- tmp_list = xfont->metrics_by_lang;
- while (tmp_list)
- {
- info = tmp_list->data;
-
- if (info->sample_str == sample_str) /* We _don't_ need strcmp */
- break;
-
- tmp_list = tmp_list->next;
- }
-
- if (!tmp_list)
- {
- PangoLayout *layout;
- PangoRectangle extents;
- PangoContext *context;
- XftFont *xft_font;
- Display *display;
- int screen;
-
- info = g_new0 (PangoXftMetricsInfo, 1);
- xfont->metrics_by_lang = g_slist_prepend (xfont->metrics_by_lang,
- info);
-
-
- if (xfont->fontmap)
- {
- xft_font = xft_font_get_font (font);
-
- _pango_xft_font_map_get_info (xfont->fontmap, &display, &screen);
- context = pango_xft_get_context (display, screen);
-
- info->sample_str = sample_str;
- info->metrics = pango_font_metrics_new ();
-
- info->metrics->ascent = PANGO_SCALE * xft_font->ascent;
- info->metrics->descent = PANGO_SCALE * xft_font->descent;
- info->metrics->approximate_char_width =
- info->metrics->approximate_digit_width =
- PANGO_SCALE * xft_font->max_advance_width;
-
- pango_context_set_language (context, language);
- layout = pango_layout_new (context);
- pango_layout_set_font_description (layout, xfont->description);
-
- pango_layout_set_text (layout, sample_str, -1);
- pango_layout_get_extents (layout, NULL, &extents);
-
- info->metrics->approximate_char_width =
- extents.width / g_utf8_strlen (sample_str, -1);
-
- pango_layout_set_text (layout, "0123456789", -1);
- pango_layout_get_extents (layout, NULL, &extents);
-
- info->metrics->approximate_digit_width = extents.width / 10;
-
- g_object_unref (layout);
- g_object_unref (context);
- }
- }
-
- return pango_font_metrics_ref (info->metrics);
-}
-
-static void
-free_metrics_info (PangoXftMetricsInfo *info)
-{
- pango_font_metrics_unref (info->metrics);
- g_free (info);
-}
-
static void
pango_xft_font_finalize (GObject *object)
{
PangoXftFont *xfont = (PangoXftFont *)object;
-
- if (xfont->fontmap)
- _pango_xft_font_map_remove (xfont->fontmap, xfont);
+ PangoFcFont *fcfont = (PangoFcFont *)object;
if (xfont->mini_font)
g_object_unref (xfont->mini_font);
- pango_font_description_free (xfont->description);
-
- g_slist_foreach (xfont->metrics_by_lang, (GFunc)free_metrics_info, NULL);
- g_slist_free (xfont->metrics_by_lang);
-
if (xfont->xft_font)
{
Display *display;
- _pango_xft_font_map_get_info (xfont->fontmap, &display, NULL);
+ _pango_xft_font_map_get_info (fcfont->fontmap, &display, NULL);
XftFontClose (display, xfont->xft_font);
}
- FcPatternDestroy (xfont->font_pattern);
-
G_OBJECT_CLASS (parent_class)->finalize (object);
}
-static PangoFontDescription *
-pango_xft_font_describe (PangoFont *font)
-{
- PangoXftFont *xfont = (PangoXftFont *)font;
-
- return pango_font_description_copy (xfont->description);
-}
-
-static PangoCoverage *
-pango_xft_font_get_coverage (PangoFont *font,
- PangoLanguage *language)
-{
- PangoXftFont *xfont = (PangoXftFont *)font;
-
- return _pango_xft_font_map_get_coverage (xfont->fontmap, xfont->font_pattern);
-}
-
static void
pango_xft_font_get_glyph_extents (PangoFont *font,
PangoGlyph glyph,
@@ -579,13 +434,14 @@ pango_xft_font_get_glyph_extents (PangoFont *font,
{
PangoXftFont *xfont = (PangoXftFont *)font;
XftFont *xft_font = xft_font_get_font (font);
+ PangoFcFont *fcfont = PANGO_FC_FONT (font);
XGlyphInfo extents;
Display *display;
- if (!xfont->fontmap) /* Display closed */
+ if (!fcfont->fontmap) /* Display closed */
goto fallback;
- _pango_xft_font_map_get_info (xfont->fontmap, &display, NULL);
+ _pango_xft_font_map_get_info (fcfont->fontmap, &display, NULL);
if (glyph == (PangoGlyph)-1)
glyph = 0;
@@ -652,59 +508,19 @@ pango_xft_font_get_glyph_extents (PangoFont *font,
}
}
-static PangoMap *
-pango_xft_get_shaper_map (PangoLanguage *language)
-{
- static guint engine_type_id = 0;
- static guint render_type_id = 0;
-
- if (engine_type_id == 0)
- {
- engine_type_id = g_quark_from_static_string (PANGO_ENGINE_TYPE_SHAPE);
- render_type_id = g_quark_from_static_string (PANGO_RENDER_TYPE_XFT);
- }
-
- return pango_find_map (language, engine_type_id, render_type_id);
-}
-
-static PangoEngineShape *
-pango_xft_font_find_shaper (PangoFont *font,
- PangoLanguage *language,
- guint32 ch)
-{
- PangoMap *shape_map = NULL;
-
- shape_map = pango_xft_get_shaper_map (language);
- return (PangoEngineShape *)pango_map_get_engine (shape_map, ch);
-}
-
-static gboolean
-set_unicode_charmap (FT_Face face)
-{
- int charmap;
-
- for (charmap = 0; charmap < face->num_charmaps; charmap++)
- if (face->charmaps[charmap]->encoding == ft_encoding_unicode)
- {
- FT_Error error = FT_Set_Charmap(face, face->charmaps[charmap]);
- return error == FT_Err_Ok;
- }
-
- return FALSE;
-}
-
static void
load_fallback_font (PangoXftFont *xfont)
{
+ PangoFcFont *fcfont = PANGO_FC_FONT (xfont);
Display *display;
int screen;
XftFont *xft_font;
- _pango_xft_font_map_get_info (xfont->fontmap, &display, &screen);
+ _pango_xft_font_map_get_info (fcfont->fontmap, &display, &screen);
xft_font = XftFontOpen (display, screen,
FC_FAMILY, FcTypeString, "sans",
- FC_SIZE, FcTypeDouble, (double)pango_font_description_get_size (xfont->description)/PANGO_SCALE,
+ FC_SIZE, FcTypeDouble, (double)pango_font_description_get_size (fcfont->description)/PANGO_SCALE,
NULL);
if (!xft_font)
@@ -720,19 +536,21 @@ static XftFont *
xft_font_get_font (PangoFont *font)
{
PangoXftFont *xfont;
+ PangoFcFont *fcfont;
Display *display;
int screen;
xfont = (PangoXftFont *)font;
+ fcfont = (PangoFcFont *)font;
if (xfont->xft_font == NULL)
{
- _pango_xft_font_map_get_info (xfont->fontmap, &display, &screen);
+ _pango_xft_font_map_get_info (fcfont->fontmap, &display, &screen);
- xfont->xft_font = XftFontOpenPattern (display, FcPatternDuplicate (xfont->font_pattern));
+ xfont->xft_font = XftFontOpenPattern (display, FcPatternDuplicate (fcfont->font_pattern));
if (!xfont->xft_font)
{
- gchar *name = pango_font_description_to_string (xfont->description);
+ gchar *name = pango_font_description_to_string (fcfont->description);
g_warning ("Cannot open font file for font %s", name);
g_free (name);
@@ -785,37 +603,18 @@ pango_xft_font_real_get_unknown_glyph (PangoFcFont *font,
}
static void
-pango_xft_font_real_kern_glyphs (PangoFcFont *font,
- PangoGlyphString *glyphs)
+pango_xft_font_real_shutdown (PangoFcFont *fcfont)
{
- FT_Face face;
- FT_Error error;
- FT_Vector kerning;
- int i;
-
- face = pango_fc_font_lock_face (font);
- if (!face)
- return;
-
- if (!FT_HAS_KERNING (face))
- {
- pango_fc_font_unlock_face (font);
- return;
- }
+ PangoXftFont *xfont = PANGO_XFT_FONT (fcfont);
- for (i = 1; i < glyphs->num_glyphs; ++i)
+ if (xfont->xft_font)
{
- error = FT_Get_Kerning (face,
- glyphs->glyphs[i-1].glyph,
- glyphs->glyphs[i].glyph,
- ft_kerning_default,
- &kerning);
-
- if (error == FT_Err_Ok)
- glyphs->glyphs[i-1].geometry.width += PANGO_UNITS_26_6 (kerning.x);
+ Display *display;
+
+ _pango_xft_font_map_get_info (fcfont->fontmap, &display, NULL);
+ XftFontClose (display, xfont->xft_font);
+ xfont->xft_font = NULL;
}
-
- pango_fc_font_unlock_face (font);
}
/**
@@ -845,13 +644,13 @@ pango_xft_font_get_font (PangoFont *font)
Display *
pango_xft_font_get_display (PangoFont *font)
{
- PangoXftFont *xfont;
+ PangoFcFont *fcfont;
Display *display;
g_return_val_if_fail (PANGO_XFT_IS_FONT (font), NULL);
- xfont = PANGO_XFT_FONT (font);
- _pango_xft_font_map_get_info (xfont->fontmap, &display, NULL);
+ fcfont = PANGO_FC_FONT (font);
+ _pango_xft_font_map_get_info (fcfont->fontmap, &display, NULL);
return display;
}
diff --git a/pango/pangoxft-fontmap.c b/pango/pangoxft-fontmap.c
index 9d800d10..ca362cb2 100644
--- a/pango/pangoxft-fontmap.c
+++ b/pango/pangoxft-fontmap.c
@@ -1,7 +1,7 @@
/* Pango
* pangoxft-fontmap.c: Xft font handling
*
- * Copyright (C) 2000 Red Hat Software
+ * Copyright (C) 2000-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
@@ -22,16 +22,15 @@
#include <stdlib.h>
#include <string.h>
-#include "pango-fontmap.h"
+#include "pangofc-fontmap.h"
#include "pangoxft.h"
#include "pangoxft-private.h"
-#include "modules.h"
/* For XExtSetCloseDisplay */
#include <X11/Xlibint.h>
typedef struct _PangoXftFamily PangoXftFamily;
-typedef struct _PangoXftFontMap PangoXftFontMap;
+typedef struct _PangoXftFontMapClass PangoXftFontMapClass;
#define PANGO_TYPE_XFT_FONT_MAP (pango_xft_font_map_get_type ())
#define PANGO_XFT_FONT_MAP(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), PANGO_TYPE_XFT_FONT_MAP, PangoXftFontMap))
@@ -39,29 +38,10 @@ typedef struct _PangoXftFontMap PangoXftFontMap;
struct _PangoXftFontMap
{
- PangoFontMap parent_instance;
-
- /* We have one map from PangoFontDescription -> PangoXftPatternSet
- * per language tag.
- */
- GList *fontset_hash_list;
- /* pattern_hash is used to make sure we only store one copy of
- * each identical pattern. (Speeds up lookup).
- */
- GHashTable *pattern_hash;
- GHashTable *coverage_hash; /* Maps font file name/id -> PangoCoverage */
-
- GHashTable *fonts; /* Maps XftPattern -> PangoXftFont */
-
- GQueue *fontset_cache; /* Recently used fontsets */
-
- /* List of all families availible */
- PangoXftFamily **families;
- int n_families; /* -1 == uninitialized */
+ PangoFcFontMap parent_instance;
Display *display;
int screen;
- guint closed : 1;
/* Function to call on prepared patterns to do final
* config tweaking.
@@ -71,32 +51,76 @@ struct _PangoXftFontMap
GDestroyNotify substitute_destroy;
};
-/************************************************************
- * Code shared with PangoFT2 *
- ************************************************************/
+struct _PangoXftFontMapClass
+{
+ PangoFcFontMapClass parent_class;
+};
+
+static void pango_xft_font_map_class_init (PangoXftFontMapClass *class);
+static void pango_xft_font_map_default_substitute (PangoFcFontMap *fcfontmap,
+ FcPattern *pattern);
+static PangoFcFont * pango_xft_font_map_new_font (PangoFcFontMap *fcfontmap,
+ FcPattern *pattern);
+static void pango_xft_font_map_finalize (GObject *object);
+
+static GObjectClass *parent_class;
+
+static GSList *fontmaps = NULL;
+
+GType
+pango_xft_font_map_get_type (void)
+{
+ static GType object_type = 0;
+
+ if (!object_type)
+ {
+ static const GTypeInfo object_info =
+ {
+ sizeof (PangoXftFontMapClass),
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
+ (GClassInitFunc) pango_xft_font_map_class_init,
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof (PangoXftFontMap),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) NULL,
+ };
+
+ object_type = g_type_register_static (PANGO_TYPE_FC_FONT_MAP,
+ "PangoXftFontMap",
+ &object_info, 0);
+ }
+
+ return object_type;
+}
+
+static void
+pango_xft_font_map_class_init (PangoXftFontMapClass *class)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (class);
+ PangoFcFontMapClass *fcfontmap_class = PANGO_FC_FONT_MAP_CLASS (class);
-#define PangoFcFamily PangoXftFamily
-#define _PangoFcFamily _PangoXftFamily
-#define PangoFcFontMap PangoXftFontMap
-#define PangoFcFont PangoXftFont
+ parent_class = g_type_class_peek_parent (class);
-#define PANGO_FC_FONT_MAP PANGO_XFT_FONT_MAP
+ gobject_class->finalize = pango_xft_font_map_finalize;
+ fcfontmap_class->default_substitute = pango_xft_font_map_default_substitute;
+ fcfontmap_class->new_font = pango_xft_font_map_new_font;
+}
-#define pango_fc_font_map_get_type pango_xft_font_map_get_type
-#define _pango_fc_font_map_add _pango_xft_font_map_add
-#define _pango_fc_font_map_remove _pango_xft_font_map_remove
-#define _pango_fc_font_map_get_coverage _pango_xft_font_map_get_coverage
-#define _pango_fc_font_map_set_coverage _pango_xft_font_map_set_coverage
-#define _pango_fc_font_desc_from_pattern _pango_xft_font_desc_from_pattern
-#define _pango_fc_font_new _pango_xft_font_new
+static void
+pango_xft_font_map_finalize (GObject *object)
+{
+ PangoXftFontMap *xftfontmap = PANGO_XFT_FONT_MAP (object);
+
+ fontmaps = g_slist_remove (fontmaps, object);
-#define PANGO_FC_NAME "PangoXft"
+ if (xftfontmap->substitute_destroy)
+ xftfontmap->substitute_destroy (xftfontmap->substitute_data);
-#include "pangofc-fontmap.cI"
+ parent_class->finalize (object);
+}
-/*************************************************************
- * Xft specific code *
- *************************************************************/
static PangoFontMap *
pango_xft_find_font_map (Display *display,
@@ -180,29 +204,18 @@ PangoFontMap *
pango_xft_get_font_map (Display *display,
int screen)
{
- static gboolean registered_modules = FALSE;
PangoFontMap *fontmap;
PangoXftFontMap *xftfontmap;
g_return_val_if_fail (display != NULL, NULL);
- if (!registered_modules)
- {
- int i;
-
- registered_modules = TRUE;
-
- /* Make sure that the type system is initialized */
- g_type_init ();
-
- for (i = 0; _pango_included_xft_modules[i].list; i++)
- pango_module_register (&_pango_included_xft_modules[i]);
- }
-
fontmap = pango_xft_find_font_map (display, screen);
if (fontmap)
return fontmap;
+ /* Make sure that the type system is initialized */
+ g_type_init ();
+
xftfontmap = (PangoXftFontMap *)g_object_new (PANGO_TYPE_XFT_FONT_MAP, NULL);
xftfontmap->display = display;
@@ -215,17 +228,6 @@ pango_xft_get_font_map (Display *display,
return PANGO_FONT_MAP (xftfontmap);
}
-static void
-cleanup_font (gpointer key,
- PangoXftFont *xfont,
- PangoXftFontMap *xftfontmap)
-{
- if (xfont->xft_font)
- XftFontClose (xftfontmap->display, xfont->xft_font);
-
- xfont->fontmap = NULL;
-}
-
/**
* pango_xft_shutdown_display:
* @display: an X display
@@ -246,16 +248,11 @@ pango_xft_shutdown_display (Display *display,
if (fontmap)
{
PangoXftFontMap *xftfontmap = PANGO_XFT_FONT_MAP (fontmap);
-
+
fontmaps = g_slist_remove (fontmaps, fontmap);
- pango_fc_font_map_cache_clear (xftfontmap);
-
- g_hash_table_foreach (xftfontmap->fonts, (GHFunc)cleanup_font, fontmap);
- g_hash_table_destroy (xftfontmap->fonts);
- xftfontmap->fonts = NULL;
+ pango_fc_font_map_shutdown (PANGO_FC_FONT_MAP (fontmap));
xftfontmap->display = NULL;
- xftfontmap->closed = TRUE;
g_object_unref (fontmap);
}
}
@@ -292,7 +289,7 @@ pango_xft_set_default_substitute (Display *display,
xftfontmap->substitute_data = data;
xftfontmap->substitute_destroy = notify;
- pango_fc_font_map_cache_clear (xftfontmap);
+ pango_fc_font_map_cache_clear (PANGO_FC_FONT_MAP (xftfontmap));
}
/**
@@ -314,7 +311,7 @@ pango_xft_substitute_changed (Display *display,
{
PangoXftFontMap *xftfontmap = (PangoXftFontMap *)pango_xft_get_font_map (display, screen);
- pango_fc_font_map_cache_clear (xftfontmap);
+ pango_fc_font_map_cache_clear (PANGO_FC_FONT_MAP (xftfontmap));
}
void
@@ -344,29 +341,29 @@ PangoContext *
pango_xft_get_context (Display *display,
int screen)
{
- PangoContext *result;
+ PangoFontMap *fontmap;
g_return_val_if_fail (display != NULL, NULL);
- result = pango_context_new ();
- pango_context_set_font_map (result, pango_xft_get_font_map (display, screen));
-
- return result;
+ fontmap = pango_xft_get_font_map (display, screen);
+ return pango_fc_font_map_create_context (PANGO_FC_FONT_MAP (fontmap));
}
static void
-pango_fc_do_finalize (PangoXftFontMap *fontmap)
+pango_xft_font_map_default_substitute (PangoFcFontMap *fcfontmap,
+ FcPattern *pattern)
{
- if (fontmap->substitute_destroy)
- fontmap->substitute_destroy (fontmap->substitute_data);
+ PangoXftFontMap *xftfontmap = PANGO_XFT_FONT_MAP (fcfontmap);
+
+ FcConfigSubstitute (NULL, pattern, FcMatchPattern);
+ if (xftfontmap->substitute_func)
+ xftfontmap->substitute_func (pattern, xftfontmap->substitute_data);
+ XftDefaultSubstitute (xftfontmap->display, xftfontmap->screen, pattern);
}
-static void
-pango_fc_default_substitute (PangoXftFontMap *fontmap,
+static PangoFcFont *
+pango_xft_font_map_new_font (PangoFcFontMap *fcfontmap,
FcPattern *pattern)
{
- FcConfigSubstitute (NULL, pattern, FcMatchPattern);
- if (fontmap->substitute_func)
- fontmap->substitute_func (pattern, fontmap->substitute_data);
- XftDefaultSubstitute (fontmap->display, fontmap->screen, pattern);
+ return (PangoFcFont *)_pango_xft_font_new (PANGO_XFT_FONT_MAP (fcfontmap), pattern);
}
diff --git a/pango/pangoxft-private.h b/pango/pangoxft-private.h
index 0d42ae16..0ffdf6e5 100644
--- a/pango/pangoxft-private.h
+++ b/pango/pangoxft-private.h
@@ -27,39 +27,26 @@
G_BEGIN_DECLS
-typedef struct _PangoXftFont PangoXftFont;
+typedef struct _PangoXftFont PangoXftFont;
+typedef struct _PangoXftFontMap PangoXftFontMap;
struct _PangoXftFont
{
PangoFcFont parent_instance;
- FcPattern *font_pattern; /* fully resolved pattern */
XftFont *xft_font; /* created on demand */
PangoFont *mini_font; /* font used to display missing glyphs */
- PangoFontMap *fontmap; /* associated map */
- PangoFontDescription *description;
-
- GSList *metrics_by_lang;
guint16 mini_width; /* metrics for missing glyph drawing */
guint16 mini_height;
guint16 mini_pad;
};
-PangoXftFont * _pango_xft_font_new (PangoFontMap *font,
- FcPattern *pattern);
-void _pango_xft_font_map_add (PangoFontMap *fontmap,
- PangoXftFont *xfont);
-void _pango_xft_font_map_remove (PangoFontMap *fontmap,
- PangoXftFont *xfont);
-PangoCoverage *_pango_xft_font_map_get_coverage (PangoFontMap *fontmap,
- FcPattern *pattern);
-void _pango_xft_font_map_get_info (PangoFontMap *fontmap,
- Display **display,
- int *screen);
-
-PangoFontDescription * _pango_xft_font_desc_from_pattern (FcPattern *pattern,
- gboolean include_size);
+PangoXftFont *_pango_xft_font_new (PangoXftFontMap *xftfontmap,
+ FcPattern *pattern);
+void _pango_xft_font_map_get_info (PangoFontMap *fontmap,
+ Display **display,
+ int *screen);
G_END_DECLS
diff --git a/pango/pangoxft.h b/pango/pangoxft.h
index bb5ce511..3f6ecfd5 100644
--- a/pango/pangoxft.h
+++ b/pango/pangoxft.h
@@ -38,7 +38,9 @@ G_BEGIN_DECLS
#error "must have Xft version 2 or newer"
#endif
+#ifndef PANGO_DISABLE_DEPRECATED
#define PANGO_RENDER_TYPE_XFT "PangoRenderXft"
+#endif
typedef void (*PangoXftSubstituteFunc) (FcPattern *pattern,
gpointer data);