summaryrefslogtreecommitdiff
path: root/modules/indic
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>2003-04-14 23:48:34 +0000
committerOwen Taylor <otaylor@src.gnome.org>2003-04-14 23:48:34 +0000
commit402f2625c2c779df20470ed0f758999db494e4dc (patch)
tree6667e384ed0c39a22a6e3f731c062311fa7b3e9a /modules/indic
parentf6fdd34661bd9fe23452b5eb98ece8488a12ce8f (diff)
downloadpango-402f2625c2c779df20470ed0f758999db494e4dc.tar.gz
Switch over the way that module entry points work, taking advantage of the
Mon Apr 14 06:02:34 2003 Owen Taylor <otaylor@redhat.com> * modules/thai/{thai-fc.c,thai-shaper.c,thai-x.c}: * modules/*/*-{xft,x,win32.c} pango/pango-engine.h modules/*/Makefile.am: Switch over the way that module entry points work, taking advantage of the new automake capability for per-target CFLAGS for shared sources. * pango/pangofc-font.[ch] pango/pangoxft-font.c pango/pangoft2.c: Add a base class for PangoXft and PangoFT2 font classes so code can be shared between FT2 and Xft backends. * configure.in modules/*/Makefile.am modules/{arabic,basic,hangul,hebrew,indic,thai}: Move *-xft.c to *-fc.c and share between Xft and FT2 backends; adds FT2 backend capabilities for hangul/indic/thai. * pango/pangoxft.h pango/pangoft2.h: Deprecate APIs that moved into PangoFcFont * modules/basic/basic-fc.c (set_glyph): Add kerning handling from FT2 backend.
Diffstat (limited to 'modules/indic')
-rw-r--r--modules/indic/Makefile.am38
-rw-r--r--modules/indic/bengali-x.c13
-rw-r--r--modules/indic/devanagari-x.c13
-rw-r--r--modules/indic/gujarati-x.c13
-rw-r--r--modules/indic/gurmukhi-x.c13
-rw-r--r--modules/indic/indic-fc.c44
-rw-r--r--modules/indic/indic-xft.c446
-rw-r--r--modules/indic/myanmar-x.c13
8 files changed, 73 insertions, 520 deletions
diff --git a/modules/indic/Makefile.am b/modules/indic/Makefile.am
index 4df9443f..42912836 100644
--- a/modules/indic/Makefile.am
+++ b/modules/indic/Makefile.am
@@ -22,35 +22,30 @@ if HAVE_X
INCLUDES += $(X_CFLAGS)
if INCLUDE_MYANMAR_X
noinst_LTLIBRARIES += libpango-myanmar-x.la
-INCLUDES += -DMYANMAR_X_MODULE_PREFIX
else
module_LTLIBRARIES += pango-myanmar-x.la
endif
if INCLUDE_GURMUKHI_X
noinst_LTLIBRARIES += libpango-gurmukhi-x.la
-INCLUDES += -DGURMUKHI_X_MODULE_PREFIX
else
module_LTLIBRARIES += pango-gurmukhi-x.la
endif
if INCLUDE_BENGALI_X
noinst_LTLIBRARIES += libpango-bengali-x.la
-INCLUDES += -DBENGALI_X_MODULE_PREFIX
else
module_LTLIBRARIES += pango-bengali-x.la
endif
if INCLUDE_DEVANAGARI_X
noinst_LTLIBRARIES += libpango-devanagari-x.la
-INCLUDES += -DDEVANAGARI_X_MODULE_PREFIX
else
module_LTLIBRARIES += pango-devanagari-x.la
endif
if INCLUDE_GUJARATI_X
noinst_LTLIBRARIES += libpango-gujarati-x.la
-INCLUDES += -DGUJARATI_X_MODULE_PREFIX
else
module_LTLIBRARIES += pango-gujarati-x.la
endif
@@ -60,40 +55,44 @@ pango_devanagari_x_la_LDFLAGS = -export-dynamic -avoid-version -module
pango_devanagari_x_la_LIBADD = $(pangoxlibs)
pango_devanagari_x_la_SOURCES = devanagari-x.c pango-indic-script.h
libpango_devanagari_x_la_SOURCES = devanagari-x.c pango-indic-script.h
+libpango_devanagari_x_la_CFLAGS = -DPANGO_MODULE_PREFIX=_pango_devanagari_x
pango_myanmar_x_la_LDFLAGS = -export-dynamic -avoid-version -module
pango_myanmar_x_la_LIBADD = $(pangoxlibs)
pango_myanmar_x_la_SOURCES = myanmar-x.c pango-indic-script.h
libpango_myanmar_x_la_SOURCES = myanmar-x.c pango-indic-script.h
+libpango_myanmar_x_la_CFLAGS = -DPANGO_MODULE_PREFIX=_pango_myanmar_x
pango_gurmukhi_x_la_LDFLAGS = -export-dynamic -avoid-version -module
pango_gurmukhi_x_la_LIBADD = $(pangoxlibs)
pango_gurmukhi_x_la_SOURCES = gurmukhi-x.c pango-indic-script.h
libpango_gurmukhi_x_la_SOURCES = gurmukhi-x.c pango-indic-script.h
+libpango_gurmukhi_x_la_CFLAGS = -DPANGO_MODULE_PREFIX=_pango_gurmukhi_x
pango_bengali_x_la_LDFLAGS = -export-dynamic -avoid-version -module
pango_bengali_x_la_LIBADD = $(pangoxlibs)
pango_bengali_x_la_SOURCES = bengali-x.c pango-indic-script.h
libpango_bengali_x_la_SOURCES = bengali-x.c pango-indic-script.h
+libpango_bengali_x_la_CFLAGS = -DPANGO_MODULE_PREFIX=_pango_bengali_x
pango_gujarati_x_la_LDFLAGS = -export-dynamic -avoid-version -module
pango_gujarati_x_la_LIBADD = $(pangoxlibs)
pango_gujarati_x_la_SOURCES = gujarati-x.c pango-indic-script.h
libpango_gujarati_x_la_SOURCES = gujarati-x.c pango-indic-script.h
+libpango_gujarati_x_la_CFLAGS = -DPANGO_MODULE_PREFIX=_pango_gujarati_x
if HAVE_XFT
INCLUDES += $(XFT_CFLAGS)
if INCLUDE_INDIC_XFT
noinst_LTLIBRARIES += libpango-indic-xft.la
-INCLUDES += -DXFT_MODULE_PREFIX
else
module_LTLIBRARIES += pango-indic-xft.la
endif
endif
xft_sources = \
- indic-xft.c \
+ indic-fc.c \
indic-ot-class-tables.c \
indic-ot.c \
indic-ot.h
@@ -101,7 +100,32 @@ xft_sources = \
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
+else
+module_LTLIBRARIES += pango-indic-ft2.la
+endif
+endif
+
+ft2_sources = \
+ indic-fc.c \
+ indic-ot-class-tables.c \
+ indic-ot.c \
+ indic-ot.h
+
+pango_indic_ft2_la_LDFLAGS = -export-dynamic -avoid-version -module
+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
included-modules: $(noinst_LTLIBRARIES)
diff --git a/modules/indic/bengali-x.c b/modules/indic/bengali-x.c
index ee66c9a0..7f74abe8 100644
--- a/modules/indic/bengali-x.c
+++ b/modules/indic/bengali-x.c
@@ -285,21 +285,16 @@ pango_indic_engine_x_new ()
return (PangoEngine *) result;
}
-#ifdef BENGALI_X_MODULE_PREFIX
-#define MODULE_ENTRY(func) _pango_bengali_x_##func
-#else
-#define MODULE_ENTRY(func) func
-#endif
-
void
-MODULE_ENTRY(script_engine_list) (PangoEngineInfo ** engines, int *n_engines)
+PANGO_MODULE_ENTRY(list) (PangoEngineInfo **engines,
+ int *n_engines)
{
*engines = script_engines;
*n_engines = n_script_engines;
}
PangoEngine *
-MODULE_ENTRY(script_engine_load) (const char *id)
+PANGO_MODULE_ENTRY(load) (const char *id)
{
if (!strcmp (id, SCRIPT_ENGINE_NAME))
return pango_indic_engine_x_new ();
@@ -308,7 +303,7 @@ MODULE_ENTRY(script_engine_load) (const char *id)
}
void
-MODULE_ENTRY(script_engine_unload) (PangoEngine * engine)
+PANGO_MODULE_ENTRY(unload) (PangoEngine *engine)
{
}
diff --git a/modules/indic/devanagari-x.c b/modules/indic/devanagari-x.c
index e81e600a..865124e3 100644
--- a/modules/indic/devanagari-x.c
+++ b/modules/indic/devanagari-x.c
@@ -338,21 +338,16 @@ pango_indic_engine_x_new ()
return (PangoEngine *) result;
}
-#ifdef DEVANAGARI_X_MODULE_PREFIX
-#define MODULE_ENTRY(func) _pango_devanagari_x_##func
-#else
-#define MODULE_ENTRY(func) func
-#endif
-
void
-MODULE_ENTRY(script_engine_list) (PangoEngineInfo ** engines, int *n_engines)
+PANGO_MODULE_ENTRY(list) (PangoEngineInfo **engines,
+ int *n_engines)
{
*engines = script_engines;
*n_engines = n_script_engines;
}
PangoEngine *
-MODULE_ENTRY(script_engine_load) (const char *id)
+PANGO_MODULE_ENTRY(load) (const char *id)
{
if (!strcmp (id, SCRIPT_ENGINE_NAME))
return pango_indic_engine_x_new ();
@@ -361,6 +356,6 @@ MODULE_ENTRY(script_engine_load) (const char *id)
}
void
-MODULE_ENTRY(script_engine_unload) (PangoEngine * engine)
+PANGO_MODULE_ENTRY(unload) (PangoEngine *engine)
{
}
diff --git a/modules/indic/gujarati-x.c b/modules/indic/gujarati-x.c
index 1a998b88..f414a38a 100644
--- a/modules/indic/gujarati-x.c
+++ b/modules/indic/gujarati-x.c
@@ -314,21 +314,16 @@ pango_indic_engine_x_new ()
return (PangoEngine *) result;
}
-#ifdef GUJARATI_X_MODULE_PREFIX
-#define MODULE_ENTRY(func) _pango_gujarati_x_##func
-#else
-#define MODULE_ENTRY(func) func
-#endif
-
void
-MODULE_ENTRY(script_engine_list) (PangoEngineInfo ** engines, int *n_engines)
+PANGO_MODULE_ENTRY(list) (PangoEngineInfo **engines,
+ int *n_engines)
{
*engines = script_engines;
*n_engines = n_script_engines;
}
PangoEngine *
-MODULE_ENTRY(script_engine_load) (const char *id)
+PANGO_MODULE_ENTRY(load) (const char *id)
{
if (!strcmp (id, SCRIPT_ENGINE_NAME))
return pango_indic_engine_x_new ();
@@ -337,6 +332,6 @@ MODULE_ENTRY(script_engine_load) (const char *id)
}
void
-MODULE_ENTRY(script_engine_unload) (PangoEngine * engine)
+PANGO_MODULE_ENTRY(unload) (PangoEngine * engine)
{
}
diff --git a/modules/indic/gurmukhi-x.c b/modules/indic/gurmukhi-x.c
index 89ae5e69..6187f937 100644
--- a/modules/indic/gurmukhi-x.c
+++ b/modules/indic/gurmukhi-x.c
@@ -229,21 +229,16 @@ pango_indic_engine_x_new ()
return (PangoEngine *) result;
}
-#ifdef GURMUKHI_X_MODULE_PREFIX
-#define MODULE_ENTRY(func) _pango_gurmukhi_x_##func
-#else
-#define MODULE_ENTRY(func) func
-#endif
-
void
-MODULE_ENTRY(script_engine_list) (PangoEngineInfo ** engines, int *n_engines)
+PANGO_MODULE_ENTRY(list) (PangoEngineInfo **engines,
+ int *n_engines)
{
*engines = script_engines;
*n_engines = n_script_engines;
}
PangoEngine *
-MODULE_ENTRY(script_engine_load) (const char *id)
+PANGO_MODULE_ENTRY(load) (const char *id)
{
if (!strcmp (id, SCRIPT_ENGINE_NAME))
return pango_indic_engine_x_new ();
@@ -252,6 +247,6 @@ MODULE_ENTRY(script_engine_load) (const char *id)
}
void
-MODULE_ENTRY(script_engine_unload) (PangoEngine * engine)
+PANGO_MODULE_ENTRY(unload) (PangoEngine * engine)
{
}
diff --git a/modules/indic/indic-fc.c b/modules/indic/indic-fc.c
index 390b2871..ffe7424c 100644
--- a/modules/indic/indic-fc.c
+++ b/modules/indic/indic-fc.c
@@ -25,8 +25,8 @@
#include "indic-ot.h"
-#include "pangoxft.h"
#include "pango-engine.h"
+#include "pango-ot.h"
#include "pango-utils.h"
typedef struct _PangoEngineShapeIndic PangoEngineShapeIndic;
@@ -46,7 +46,17 @@ struct _PangoIndicInfo
gchar *gposQuarkName;
};
-#define INDIC_ENGINE_INFO(script) {#script "ScriptEngineXft", PANGO_ENGINE_TYPE_SHAPE, PANGO_RENDER_TYPE_XFT, script##_ranges, G_N_ELEMENTS(script##_ranges)}
+#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
+
+#define INDIC_ENGINE_INFO(script) {#script ENGINE_SUFFIX, PANGO_ENGINE_TYPE_SHAPE, RENDER_TYPE, script##_ranges, G_N_ELEMENTS(script##_ranges)}
#define PANGO_INDIC_INFO(script) {OT_TAG_##script, &script##_class_table, "pango-indic-" #script "-GSUB-ruleset", "pango-indic-" #script "-GPOS-rulsest"}
@@ -302,13 +312,15 @@ indic_engine_shape (PangoFont *font,
PangoOTRuleset *gsub_ruleset = NULL, *gpos_ruleset = NULL;
PangoEngineShapeIndic *indic_shape_engine = NULL;
PangoIndicInfo *indic_info = NULL;
+ PangoFcFont *fc_font;
g_return_if_fail (font != NULL);
g_return_if_fail (text != NULL);
g_return_if_fail (length >= 0);
g_return_if_fail (analysis != NULL);
- face = pango_xft_font_lock_face (font);
+ fc_font = PANGO_FC_FONT (font);
+ face = pango_fc_font_lock_face (fc_font);
g_assert (face != NULL);
indic_shape_engine = (PangoEngineShapeIndic *) analysis->shape_engine;
@@ -366,7 +378,7 @@ indic_engine_shape (PangoFont *font,
}
#endif
- pango_xft_font_unlock_face (font);
+ pango_fc_font_unlock_face (fc_font);
g_free (tags);
g_free (indices);
@@ -383,7 +395,7 @@ indic_engine_get_coverage (PangoFont *font,
}
static PangoEngine *
-indic_engine_xft_new (gint index)
+indic_engine_fc_new (gint index)
{
PangoEngineShapeIndic *result;
@@ -400,23 +412,11 @@ indic_engine_xft_new (gint index)
return (PangoEngine *)result;
}
-/* The following three functions provide the public module API for
- * Pango. If we are compiling it as a module, then we name the
- * entry points script_engine_list, etc. But if we are compiling
- * it for inclusion directly in Pango, then we need them to
- * to have distinct names for this module, so we prepend
- * _pango_indic_xft_
- */
-#ifdef XFT_MODULE_PREFIX
-#define MODULE_ENTRY(func) _pango_indic_xft_##func
-#else
-#define MODULE_ENTRY(func) func
-#endif
-
/* List the engines contained within this module
*/
void
-MODULE_ENTRY(script_engine_list) (PangoEngineInfo **engines, gint *n_engines)
+PANGO_MODULE_ENTRY(list) (PangoEngineInfo **engines,
+ int *n_engines)
{
*engines = script_engines;
*n_engines = G_N_ELEMENTS (script_engines);
@@ -425,7 +425,7 @@ MODULE_ENTRY(script_engine_list) (PangoEngineInfo **engines, gint *n_engines)
/* Load a particular engine given the ID for the engine
*/
PangoEngine *
-MODULE_ENTRY(script_engine_load) (const char *id)
+PANGO_MODULE_ENTRY(load) (const char *id)
{
gint i;
@@ -433,7 +433,7 @@ MODULE_ENTRY(script_engine_load) (const char *id)
{
if (!strcmp(id, script_engines[i].id))
{
- return indic_engine_xft_new(i);
+ return indic_engine_fc_new(i);
}
}
@@ -441,6 +441,6 @@ MODULE_ENTRY(script_engine_load) (const char *id)
}
void
-MODULE_ENTRY(script_engine_unload) (PangoEngine *engine)
+PANGO_MODULE_ENTRY(unload) (PangoEngine *engine)
{
}
diff --git a/modules/indic/indic-xft.c b/modules/indic/indic-xft.c
deleted file mode 100644
index 390b2871..00000000
--- a/modules/indic/indic-xft.c
+++ /dev/null
@@ -1,446 +0,0 @@
-/* Pango
- * indic-xft.c:
- *
- * Copyright (C) 2001, 2002 IBM Corporation
- * Author: Eric Mader <mader@jtcsv.com>
- * Based on arabic-xft.c by Owen Taylor <otaylor@redhat.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <string.h>
-
-#include "indic-ot.h"
-
-#include "pangoxft.h"
-#include "pango-engine.h"
-#include "pango-utils.h"
-
-typedef struct _PangoEngineShapeIndic PangoEngineShapeIndic;
-typedef struct _PangoIndicInfo PangoIndicInfo;
-
-struct _PangoEngineShapeIndic
-{
- PangoEngineShape shapeEngine;
- PangoIndicInfo *indicInfo;
-};
-
-struct _PangoIndicInfo
-{
- PangoOTTag scriptTag;
- IndicOTClassTable *classTable;
- gchar *gsubQuarkName;
- gchar *gposQuarkName;
-};
-
-#define INDIC_ENGINE_INFO(script) {#script "ScriptEngineXft", PANGO_ENGINE_TYPE_SHAPE, PANGO_RENDER_TYPE_XFT, script##_ranges, G_N_ELEMENTS(script##_ranges)}
-
-#define PANGO_INDIC_INFO(script) {OT_TAG_##script, &script##_class_table, "pango-indic-" #script "-GSUB-ruleset", "pango-indic-" #script "-GPOS-rulsest"}
-
-#define INDIC_SCRIPT_RANGE(script) {SCRIPT_RANGE_##script, "*"}
-
-#define OT_TAG_deva FT_MAKE_TAG('d','e','v','a')
-#define OT_TAG_beng FT_MAKE_TAG('b','e','n','g')
-#define OT_TAG_guru FT_MAKE_TAG('g','u','r','u')
-#define OT_TAG_gujr FT_MAKE_TAG('g','u','j','r')
-#define OT_TAG_orya FT_MAKE_TAG('o','r','y','a')
-#define OT_TAG_taml FT_MAKE_TAG('t','a','m','l')
-#define OT_TAG_telu FT_MAKE_TAG('t','e','l','u')
-#define OT_TAG_knda FT_MAKE_TAG('k','n','d','a')
-#define OT_TAG_mlym FT_MAKE_TAG('m','l','y','m')
-
-static PangoEngineRange deva_ranges[] = {
- INDIC_SCRIPT_RANGE(deva), /* Devanagari */
-};
-
-static PangoEngineRange beng_ranges[] = {
- INDIC_SCRIPT_RANGE(beng), /* Bengali */
-};
-
-static PangoEngineRange guru_ranges[] = {
- INDIC_SCRIPT_RANGE(guru), /* Gurmukhi */
-};
-
-static PangoEngineRange gujr_ranges[] = {
- INDIC_SCRIPT_RANGE(gujr), /* Gujarati */
-};
-
-static PangoEngineRange orya_ranges[] = {
- INDIC_SCRIPT_RANGE(orya), /* Oriya */
-};
-
-static PangoEngineRange taml_ranges[] = {
- INDIC_SCRIPT_RANGE(taml), /* Tamil */
-};
-
-static PangoEngineRange telu_ranges[] = {
- INDIC_SCRIPT_RANGE(telu), /* Telugu */
-};
-
-static PangoEngineRange knda_ranges[] = {
- INDIC_SCRIPT_RANGE(knda), /* Kannada */
-};
-
-static PangoEngineRange mlym_ranges[] = {
- INDIC_SCRIPT_RANGE(mlym), /* Malayalam */
-};
-
-static PangoEngineInfo script_engines[] = {
- INDIC_ENGINE_INFO(deva), INDIC_ENGINE_INFO(beng), INDIC_ENGINE_INFO(guru),
- INDIC_ENGINE_INFO(gujr), INDIC_ENGINE_INFO(orya), INDIC_ENGINE_INFO(taml),
- INDIC_ENGINE_INFO(telu), INDIC_ENGINE_INFO(knda), INDIC_ENGINE_INFO(mlym)
-};
-
-/*
- * WARNING: These entries need to be in the same order as the entries
- * in script_engines[].
- *
- * FIXME: remove this requirement, either by encapsulating the order
- * in a macro that calls a body macro that can be redefined, or by
- * putting the pointers to the PangoEngineInfo in PangoIndicInfo...
- */
-static PangoIndicInfo indic_info[] = {
- PANGO_INDIC_INFO(deva), PANGO_INDIC_INFO(beng), PANGO_INDIC_INFO(guru),
- PANGO_INDIC_INFO(gujr), PANGO_INDIC_INFO(orya), PANGO_INDIC_INFO(taml),
- PANGO_INDIC_INFO(telu), PANGO_INDIC_INFO(knda), PANGO_INDIC_INFO(mlym)
-};
-
-static void
-maybe_add_GSUB_feature (PangoOTRuleset *ruleset,
- PangoOTInfo *info,
- guint script_index,
- PangoOTTag feature_tag,
- gulong property_bit)
-{
- guint feature_index;
-
- /* 0xffff == default language system */
- if (pango_ot_info_find_feature (info, PANGO_OT_TABLE_GSUB,
- feature_tag, script_index, 0xffff, &feature_index))
- {
- /*
- printf("Added GSUB feature '%c%c%c%c' = %8.8X\n", feature_tag>>24, feature_tag>>16&0xFF, feature_tag>>8&0xFF, feature_tag&0xFF, property_bit);
- */
-
- pango_ot_ruleset_add_feature (ruleset, PANGO_OT_TABLE_GSUB, feature_index,
- property_bit);
- }
-}
-
-static void
-maybe_add_GPOS_feature (PangoOTRuleset *ruleset,
- PangoOTInfo *info,
- guint script_index,
- PangoOTTag feature_tag,
- gulong property_bit)
-{
- guint feature_index;
-
- if (pango_ot_info_find_feature (info, PANGO_OT_TABLE_GPOS,
- feature_tag,script_index, 0xffff, &feature_index))
- {
- /*
- printf("Added GPOS feature '%c%c%c%c' = %8.8X\n", feature_tag>>24, feature_tag>>16&0xFF, feature_tag>>8&0xFF, feature_tag&0xFF, property_bit);
- */
-
- pango_ot_ruleset_add_feature (ruleset, PANGO_OT_TABLE_GPOS, feature_index,
- property_bit);
- }
-}
-
-static PangoOTRuleset *
-get_gsub_ruleset (FT_Face face, PangoIndicInfo *indic_info)
-{
- PangoOTInfo *info = pango_ot_info_get (face);
- GQuark ruleset_quark = g_quark_from_string (indic_info->gsubQuarkName);
- PangoOTRuleset *ruleset;
-
- if (!info)
- return NULL;
-
- ruleset = g_object_get_qdata (G_OBJECT (info), ruleset_quark);
-
- if (!ruleset)
- {
- guint script_index;
-
- ruleset = pango_ot_ruleset_new (info);
-
- if (pango_ot_info_find_script (info, PANGO_OT_TABLE_GSUB,
- indic_info->scriptTag, &script_index))
- {
- maybe_add_GSUB_feature (ruleset, info, script_index, FT_MAKE_TAG ('n','u','k','t'), nukt);
- maybe_add_GSUB_feature (ruleset, info, script_index, FT_MAKE_TAG ('a','k','h','n'), akhn);
- maybe_add_GSUB_feature (ruleset, info, script_index, FT_MAKE_TAG ('r','p','h','f'), rphf);
- maybe_add_GSUB_feature (ruleset, info, script_index, FT_MAKE_TAG ('b','l','w','f'), blwf);
- maybe_add_GSUB_feature (ruleset, info, script_index, FT_MAKE_TAG ('h','a','l','f'), half);
- maybe_add_GSUB_feature (ruleset, info, script_index, FT_MAKE_TAG ('p','s','t','f'), pstf);
- maybe_add_GSUB_feature (ruleset, info, script_index, FT_MAKE_TAG ('v','a','t','u'), vatu);
- maybe_add_GSUB_feature (ruleset, info, script_index, FT_MAKE_TAG ('p','r','e','s'), pres);
- maybe_add_GSUB_feature (ruleset, info, script_index, FT_MAKE_TAG ('b','l','w','s'), blws);
- maybe_add_GSUB_feature (ruleset, info, script_index, FT_MAKE_TAG ('a','b','v','s'), abvs);
- maybe_add_GSUB_feature (ruleset, info, script_index, FT_MAKE_TAG ('p','s','t','s'), psts);
- maybe_add_GSUB_feature (ruleset, info, script_index, FT_MAKE_TAG ('h','a','l','n'), haln);
- }
-
- g_object_set_qdata_full (G_OBJECT (info), ruleset_quark, ruleset,
- (GDestroyNotify)g_object_unref);
- }
-
- return ruleset;
-}
-
-
-static PangoOTRuleset *
-get_gpos_ruleset (FT_Face face, PangoIndicInfo *indic_info)
-{
- PangoOTInfo *info = pango_ot_info_get (face);
- GQuark ruleset_quark = g_quark_from_string (indic_info->gposQuarkName);
- PangoOTRuleset *ruleset;
-
- if (!info)
- return NULL;
-
- ruleset = g_object_get_qdata (G_OBJECT (info), ruleset_quark);
-
- if (!ruleset)
- {
- guint script_index;
-
- ruleset = pango_ot_ruleset_new (info);
-
- if (1 && pango_ot_info_find_script (info, PANGO_OT_TABLE_GPOS,
- indic_info->scriptTag, &script_index))
- {
- maybe_add_GPOS_feature (ruleset, info, script_index, FT_MAKE_TAG ('b','l','w','m'), blwm);
- maybe_add_GPOS_feature (ruleset, info, script_index, FT_MAKE_TAG ('a','b','v','m'), abvm);
- maybe_add_GPOS_feature (ruleset, info, script_index, FT_MAKE_TAG ('d','i','s','t'), dist);
- }
-
- g_object_set_qdata_full (G_OBJECT (info), ruleset_quark, ruleset,
- (GDestroyNotify)g_object_unref);
- }
-
- return ruleset;
-}
-static void
-set_glyphs (PangoFont *font, FT_Face face, const gunichar *wcs, const glong *indices, glong n_glyphs, PangoGlyphString *glyphs)
-{
- gint i;
-
- g_assert (face);
-
- pango_glyph_string_set_size (glyphs, n_glyphs);
-
- for (i = 0; i < n_glyphs; i += 1)
- {
- PangoGlyph glyph = FT_Get_Char_Index (face, wcs[i]);
-
- glyphs->glyphs[i].glyph = glyph;
- glyphs->log_clusters[i] = indices[i];
- }
-}
-
-/*
- * FIXME: should this check for null pointers, etc.?
- */
-static gunichar *
-expand_text(const gchar *text, glong length, glong **offsets, glong *n_chars)
-{
- const gchar *p;
- gunichar *wcs, *wco;
- glong i, *oo;
-
- *n_chars = g_utf8_strlen (text, length);
- wcs = g_new (gunichar, *n_chars);
- *offsets = g_new (glong, *n_chars + 1);
-
- p = text;
- wco = wcs;
- oo = *offsets;
- for (i = 0; i < *n_chars; i += 1)
- {
- *wco++ = g_utf8_get_char (p);
- *oo++ = p - text;
-
- p = g_utf8_next_char (p);
- }
-
- *oo = p - text;
-
- return wcs;
-}
-
-
-/* analysis->shape_engine has the PangoEngine... */
-static void
-indic_engine_shape (PangoFont *font,
- const char *text,
- gint length,
- PangoAnalysis *analysis,
- PangoGlyphString *glyphs)
-{
- glong i, n_chars, n_glyphs;
- gulong *tags = NULL;
- gunichar *wc_in = NULL, *wc_out = NULL;
- glong *utf8_offsets = NULL;
- glong *indices = NULL;
- FT_Face face;
- PangoOTRuleset *gsub_ruleset = NULL, *gpos_ruleset = NULL;
- PangoEngineShapeIndic *indic_shape_engine = NULL;
- PangoIndicInfo *indic_info = NULL;
-
- g_return_if_fail (font != NULL);
- g_return_if_fail (text != NULL);
- g_return_if_fail (length >= 0);
- g_return_if_fail (analysis != NULL);
-
- face = pango_xft_font_lock_face (font);
- g_assert (face != NULL);
-
- indic_shape_engine = (PangoEngineShapeIndic *) analysis->shape_engine;
-
-#if 1
- g_assert (indic_shape_engine->shapeEngine.engine.length == sizeof (PangoEngineShapeIndic));
-#endif
-
- indic_info = indic_shape_engine->indicInfo;
-
- wc_in = expand_text (text, length, &utf8_offsets, &n_chars);
- n_glyphs = indic_ot_reorder (wc_in, utf8_offsets, n_chars, indic_info->classTable, NULL, NULL, NULL);
-
- wc_out = g_new (gunichar, n_glyphs);
- indices = g_new (glong, n_glyphs);
- tags = g_new (gulong, n_glyphs);
-
- n_glyphs = indic_ot_reorder (wc_in, utf8_offsets, n_chars, indic_info->classTable, wc_out, indices, tags);
-
- pango_glyph_string_set_size (glyphs, n_glyphs);
- set_glyphs(font, face, wc_out, indices, n_glyphs, glyphs);
-
- /* do gsub processing */
- gsub_ruleset = get_gsub_ruleset (face, indic_info);
- if (gsub_ruleset != NULL)
- {
- pango_ot_ruleset_shape (gsub_ruleset, glyphs, tags);
- }
-
- /* apply default positioning */
- for (i = 0; i < glyphs->num_glyphs; i += 1)
- {
- if (glyphs->glyphs[i].glyph != 0)
- {
- PangoRectangle logical_rect;
-
- pango_font_get_glyph_extents (font, glyphs->glyphs[i].glyph, NULL, &logical_rect);
- glyphs->glyphs[i].geometry.width = logical_rect.width;
- }
- else
- {
- glyphs->glyphs[i].geometry.width = 0;
- }
-
- glyphs->glyphs[i].geometry.x_offset = 0;
- glyphs->glyphs[i].geometry.y_offset = 0;
- }
-
-#if 1
- /* do gpos processing */
- gpos_ruleset = get_gpos_ruleset (face, indic_info);
- if (gpos_ruleset != NULL)
- {
- pango_ot_ruleset_shape (gpos_ruleset, glyphs, tags);
- }
-#endif
-
- pango_xft_font_unlock_face (font);
-
- g_free (tags);
- g_free (indices);
- g_free (wc_out);
- g_free (wc_in);
- g_free (utf8_offsets);
-}
-
-static PangoCoverage *
-indic_engine_get_coverage (PangoFont *font,
- PangoLanguage *lang)
-{
- return pango_font_get_coverage (font, lang);
-}
-
-static PangoEngine *
-indic_engine_xft_new (gint index)
-{
- PangoEngineShapeIndic *result;
-
- result = g_new (PangoEngineShapeIndic, 1);
-
- result->shapeEngine.engine.id = script_engines[index].id;
- result->shapeEngine.engine.type = PANGO_ENGINE_TYPE_SHAPE;
- result->shapeEngine.engine.length = sizeof (*result);
- result->shapeEngine.script_shape = indic_engine_shape;
- result->shapeEngine.get_coverage = indic_engine_get_coverage;
-
- result->indicInfo = &indic_info[index];
-
- return (PangoEngine *)result;
-}
-
-/* The following three functions provide the public module API for
- * Pango. If we are compiling it as a module, then we name the
- * entry points script_engine_list, etc. But if we are compiling
- * it for inclusion directly in Pango, then we need them to
- * to have distinct names for this module, so we prepend
- * _pango_indic_xft_
- */
-#ifdef XFT_MODULE_PREFIX
-#define MODULE_ENTRY(func) _pango_indic_xft_##func
-#else
-#define MODULE_ENTRY(func) func
-#endif
-
-/* List the engines contained within this module
- */
-void
-MODULE_ENTRY(script_engine_list) (PangoEngineInfo **engines, gint *n_engines)
-{
- *engines = script_engines;
- *n_engines = G_N_ELEMENTS (script_engines);
-}
-
-/* Load a particular engine given the ID for the engine
- */
-PangoEngine *
-MODULE_ENTRY(script_engine_load) (const char *id)
-{
- gint i;
-
- for (i = 0; i < G_N_ELEMENTS(script_engines); i += 1)
- {
- if (!strcmp(id, script_engines[i].id))
- {
- return indic_engine_xft_new(i);
- }
- }
-
- return NULL;
-}
-
-void
-MODULE_ENTRY(script_engine_unload) (PangoEngine *engine)
-{
-}
diff --git a/modules/indic/myanmar-x.c b/modules/indic/myanmar-x.c
index 140e2026..76dd5c18 100644
--- a/modules/indic/myanmar-x.c
+++ b/modules/indic/myanmar-x.c
@@ -209,21 +209,16 @@ pango_engine_x_new ()
return (PangoEngine *) result;
}
-#ifdef MYANMAR_X_MODULE_PREFIX
-#define MODULE_ENTRY(func) _pango_myanmar_x_##func
-#else
-#define MODULE_ENTRY(func) func
-#endif
-
void
-MODULE_ENTRY(script_engine_list) (PangoEngineInfo ** engines, int *n_engines)
+PANGO_MODULE_ENTRY(list) (PangoEngineInfo **engines,
+ int *n_engines)
{
*engines = script_engines;
*n_engines = n_script_engines;
}
PangoEngine *
-MODULE_ENTRY(script_engine_load) (const char *id)
+PANGO_MODULE_ENTRY(load) (const char *id)
{
if (!strcmp (id, SCRIPT_ENGINE_NAME))
return pango_engine_x_new ();
@@ -232,6 +227,6 @@ MODULE_ENTRY(script_engine_load) (const char *id)
}
void
-MODULE_ENTRY(script_engine_unload) (PangoEngine * engine)
+PANGO_MODULE_ENTRY(unload) (PangoEngine * engine)
{
}