ref: 72f5ff5bbb6f3467baf13e4c014f3f50479e3b96
parent: 5d6a36054267353f6ba9432217aef5b13876c0c0
author: Werner Lemberg <[email protected]>
date: Wed Jul 31 18:49:29 EDT 2013
[autofit] Introduce `writing systems'. This patch adds a new top level to the auto-hinter's script class hierarchy. It defines `writing systems' which can contain multiple scripts. For example, the `latin' writing system (in file `aflatin.c') is able to support scripts like Latin, Cyrillic, Armenian, etc., which can be handled similarly. Scripts are now named using four-letter OpenType tags. * src/autofit/aftypes.h (AF_ScriptClassRec): Move relevant members to... (AF_WritingSystemClassRec): This new structure. It holds pointers to functions which can be shared among related scripts. (AF_WritingSystem): New enumeration. (AF_Script): Revised values using four-letter tags. (AF_DEFINE_WRITING_SYSTEM_CLASS): New macro. (AF_DEFINE_SCRIPT_CLASS): Updated. * src/autofit/afglobal.c (af_writing_system_classes): New global, constant array. (af_script_classes): Updated. (af_face_globals_free): Updated. Remove assertion. (af_face_globals_get_metrics): Updated. * src/autofit/afglobal.h (AF_SCRIPT_FALLBACK) [!AF_CONFIG_OPTION_CJK]: Handle this case. * src/autofit/afloader.c (af_loader_load_g, af_loader_load_glyph): Updated. * src/autofit/afpic.c (autofit_module_class_pic_init): Updated; initialize structures for both writing systems and scripts. * src/autofit/afpic.h: Updated. (AF_WRITING_SYSTEM_CLASSES_GET): New macro. * src/autofit/afcjk.c (af_cjk_writing_system_class): New writing system. (af_cjk_uniranges): Renamed to... (af_hani_uniranges): This. (af_cjk_script_class): Reduced and renamed to... (af_hani_script_class): This. * src/autofit/afcjk.h: Updated. * src/autofit/afdummy.c (af_dummy_writing_system_class): New writing system. (af_dummy_script_class): Reduced and renamed to... (af_dflt_script_class): This. * src/autofit/afdummy.h: Updated. * src/autofit/afindic.c (af_indic_writing_system_class): New writing system. (af_indic_uniranges): Renamed to... (af_deva_uniranges): This. (af_indic_script_class): Reduced and renamed to... (af_deva_script_class): This. * src/autofit/afcjk.h: Updated. * src/autofit/aflatin.c (af_latin_writing_system_class): New writing system. (af_latin_uniranges): Renamed to... (af_latn_uniranges): This. (af_latin_script_class): Reduced and renamed to... (af_latn_script_class): This. * src/autofit/aflatin.h: Updated. * src/autofit/aflatin2.c (af_latin2_writing_system_class): New writing system. (af_latin2_uniranges): Renamed to... (af_ltn2_uniranges): This. Synchronize ranges with `latin'. (af_latin2_script_class): Reduced and renamed to... (af_ltn2_script_class): This. * src/autofit/aflatin2.h: Updated.
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,85 @@
2013-07-30 Werner Lemberg <[email protected]>
+ [autofit] Introduce `writing systems'.
+
+ This patch adds a new top level to the auto-hinter's script class
+ hierarchy. It defines `writing systems' which can contain multiple
+ scripts.
+
+ For example, the `latin' writing system (in file `aflatin.c') is
+ able to support scripts like Latin, Cyrillic, Armenian, etc., which
+ can be handled similarly.
+
+ Scripts are now named using four-letter OpenType tags.
+
+ * src/autofit/aftypes.h (AF_ScriptClassRec): Move relevant members
+ to...
+ (AF_WritingSystemClassRec): This new structure. It holds pointers
+ to functions which can be shared among related scripts.
+ (AF_WritingSystem): New enumeration.
+ (AF_Script): Revised values using four-letter tags.
+ (AF_DEFINE_WRITING_SYSTEM_CLASS): New macro.
+ (AF_DEFINE_SCRIPT_CLASS): Updated.
+
+ * src/autofit/afglobal.c (af_writing_system_classes): New global,
+ constant array.
+ (af_script_classes): Updated.
+ (af_face_globals_free): Updated.
+ Remove assertion.
+ (af_face_globals_get_metrics): Updated.
+
+ * src/autofit/afglobal.h (AF_SCRIPT_FALLBACK)
+ [!AF_CONFIG_OPTION_CJK]: Handle this case.
+
+ * src/autofit/afloader.c (af_loader_load_g, af_loader_load_glyph):
+ Updated.
+
+ * src/autofit/afpic.c (autofit_module_class_pic_init): Updated;
+ initialize structures for both writing systems and scripts.
+ * src/autofit/afpic.h: Updated.
+ (AF_WRITING_SYSTEM_CLASSES_GET): New macro.
+
+ * src/autofit/afcjk.c (af_cjk_writing_system_class): New writing
+ system.
+ (af_cjk_uniranges): Renamed to...
+ (af_hani_uniranges): This.
+ (af_cjk_script_class): Reduced and renamed to...
+ (af_hani_script_class): This.
+ * src/autofit/afcjk.h: Updated.
+
+ * src/autofit/afdummy.c (af_dummy_writing_system_class): New writing
+ system.
+ (af_dummy_script_class): Reduced and renamed to...
+ (af_dflt_script_class): This.
+ * src/autofit/afdummy.h: Updated.
+
+ * src/autofit/afindic.c (af_indic_writing_system_class): New writing
+ system.
+ (af_indic_uniranges): Renamed to...
+ (af_deva_uniranges): This.
+ (af_indic_script_class): Reduced and renamed to...
+ (af_deva_script_class): This.
+ * src/autofit/afcjk.h: Updated.
+
+ * src/autofit/aflatin.c (af_latin_writing_system_class): New writing
+ system.
+ (af_latin_uniranges): Renamed to...
+ (af_latn_uniranges): This.
+ (af_latin_script_class): Reduced and renamed to...
+ (af_latn_script_class): This.
+ * src/autofit/aflatin.h: Updated.
+
+ * src/autofit/aflatin2.c (af_latin2_writing_system_class): New
+ writing system.
+ (af_latin2_uniranges): Renamed to...
+ (af_ltn2_uniranges): This.
+ Synchronize ranges with `latin'.
+ (af_latin2_script_class): Reduced and renamed to...
+ (af_ltn2_script_class): This.
+ * src/autofit/aflatin2.h: Updated.
+
+2013-07-30 Werner Lemberg <[email protected]>
+
[autofit] Variable renaming.
* src/autofit/aftypes.h (AF_ScriptMetricsRec):
--- a/src/autofit/afcjk.c
+++ b/src/autofit/afcjk.c
@@ -2192,9 +2192,28 @@
/*************************************************************************/
+ AF_DEFINE_WRITING_SYSTEM_CLASS(
+ af_cjk_writing_system_class,
+
+ AF_WRITING_SYSTEM_CJK,
+
+ sizeof ( AF_CJKMetricsRec ),
+
+ (AF_Script_InitMetricsFunc) af_cjk_metrics_init,
+ (AF_Script_ScaleMetricsFunc)af_cjk_metrics_scale,
+ (AF_Script_DoneMetricsFunc) NULL,
+
+ (AF_Script_InitHintsFunc) af_cjk_hints_init,
+ (AF_Script_ApplyHintsFunc) af_cjk_hints_apply
+ )
+
+
/* this corresponds to Unicode 6.0 */
- static const AF_Script_UniRangeRec af_cjk_uniranges[] =
+ /* XXX: this should probably fine tuned to differentiate better between */
+ /* scripts... */
+
+ static const AF_Script_UniRangeRec af_hani_uniranges[] =
{
AF_UNIRANGE_REC( 0x1100UL, 0x11FFUL ), /* Hangul Jamo */
AF_UNIRANGE_REC( 0x2E80UL, 0x2EFFUL ), /* CJK Radicals Supplement */
@@ -2232,45 +2251,41 @@
};
- AF_DEFINE_SCRIPT_CLASS( af_cjk_script_class,
- AF_SCRIPT_CJK,
- af_cjk_uniranges,
- 0x7530, /* 田 */
+#else /* !AF_CONFIG_OPTION_CJK */
+ AF_DEFINE_WRITING_SYSTEM_CLASS(
+ af_cjk_writing_system_class,
+
+ AF_WRITING_SYSTEM_CJK,
+
sizeof ( AF_CJKMetricsRec ),
- (AF_Script_InitMetricsFunc) af_cjk_metrics_init,
- (AF_Script_ScaleMetricsFunc)af_cjk_metrics_scale,
+ (AF_Script_InitMetricsFunc) NULL,
+ (AF_Script_ScaleMetricsFunc)NULL,
(AF_Script_DoneMetricsFunc) NULL,
- (AF_Script_InitHintsFunc) af_cjk_hints_init,
- (AF_Script_ApplyHintsFunc) af_cjk_hints_apply
+ (AF_Script_InitHintsFunc) NULL,
+ (AF_Script_ApplyHintsFunc) NULL
)
-#else /* !AF_CONFIG_OPTION_CJK */
- static const AF_Script_UniRangeRec af_cjk_uniranges[] =
+ static const AF_Script_UniRangeRec af_hani_uniranges[] =
{
AF_UNIRANGE_REC( 0UL, 0UL )
};
+#endif /* !AF_CONFIG_OPTION_CJK */
- AF_DEFINE_SCRIPT_CLASS( af_cjk_script_class,
- AF_SCRIPT_CJK,
- af_cjk_uniranges,
- 0,
- sizeof ( AF_CJKMetricsRec ),
+ AF_DEFINE_SCRIPT_CLASS(
+ af_hani_script_class,
- (AF_Script_InitMetricsFunc) NULL,
- (AF_Script_ScaleMetricsFunc)NULL,
- (AF_Script_DoneMetricsFunc) NULL,
+ AF_SCRIPT_HANI,
+ AF_WRITING_SYSTEM_CJK,
- (AF_Script_InitHintsFunc) NULL,
- (AF_Script_ApplyHintsFunc) NULL
+ af_hani_uniranges,
+ 0x7530 /* 田 */
)
-
-#endif /* !AF_CONFIG_OPTION_CJK */
/* END */
--- a/src/autofit/afcjk.h
+++ b/src/autofit/afcjk.h
@@ -4,7 +4,7 @@
/* */
/* Auto-fitter hinting routines for CJK script (specification). */
/* */
-/* Copyright 2006, 2007, 2011, 2012 by */
+/* Copyright 2006, 2007, 2011-2013 by */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */
/* This file is part of the FreeType project, and may only be used, */
@@ -26,9 +26,15 @@
FT_BEGIN_HEADER
- /* the CJK-specific script class */
+ /* the CJK-specific writing system */
- AF_DECLARE_SCRIPT_CLASS( af_cjk_script_class )
+ AF_DECLARE_WRITING_SYSTEM_CLASS( af_cjk_writing_system_class )
+
+
+ /* the CJK-specific script classes */
+
+ AF_DECLARE_SCRIPT_CLASS( af_hani_script_class )
+
/* CJK (global) metrics management */
--- a/src/autofit/afdummy.c
+++ b/src/autofit/afdummy.c
@@ -43,11 +43,11 @@
}
- AF_DEFINE_SCRIPT_CLASS( af_dummy_script_class,
- AF_SCRIPT_DUMMY,
- NULL,
- 0,
+ AF_DEFINE_WRITING_SYSTEM_CLASS(
+ af_dummy_writing_system_class,
+ AF_WRITING_SYSTEM_DUMMY,
+
sizeof ( AF_ScriptMetricsRec ),
(AF_Script_InitMetricsFunc) NULL,
@@ -56,6 +56,17 @@
(AF_Script_InitHintsFunc) af_dummy_hints_init,
(AF_Script_ApplyHintsFunc) af_dummy_hints_apply
+ )
+
+
+ AF_DEFINE_SCRIPT_CLASS(
+ af_dflt_script_class,
+
+ AF_SCRIPT_DFLT,
+ AF_WRITING_SYSTEM_DUMMY,
+
+ NULL,
+ '\0'
)
--- a/src/autofit/afdummy.h
+++ b/src/autofit/afdummy.h
@@ -5,7 +5,7 @@
/* Auto-fitter dummy routines to be used if no hinting should be */
/* performed (specification). */
/* */
-/* Copyright 2003-2005, 2011 by */
+/* Copyright 2003-2005, 2011, 2013 by */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */
/* This file is part of the FreeType project, and may only be used, */
@@ -25,11 +25,13 @@
FT_BEGIN_HEADER
- /* A dummy script metrics class used when no hinting should
- * be performed. This is the default for non-latin glyphs!
+ /* A dummy writing system and script class used when no hinting should be
+ * performed.
*/
- AF_DECLARE_SCRIPT_CLASS( af_dummy_script_class )
+ AF_DECLARE_WRITING_SYSTEM_CLASS( af_dummy_writing_system_class )
+
+ AF_DECLARE_SCRIPT_CLASS( af_dflt_script_class )
/* */
--- a/src/autofit/afglobal.c
+++ b/src/autofit/afglobal.c
@@ -31,6 +31,23 @@
#ifndef FT_CONFIG_OPTION_PIC
+ /* when updating this table, don't forget to update */
+ /* AF_WRITING_SYSTEM_CLASSES_COUNT and autofit_module_class_pic_init */
+
+ /* populate this list when you add new writing systems */
+ static AF_WritingSystemClass const af_writing_system_classes[] =
+ {
+ &af_dummy_writing_system_class,
+ &af_latin_writing_system_class,
+ &af_cjk_writing_system_class,
+ &af_indic_writing_system_class,
+#ifdef FT_OPTION_AUTOFIT2
+ &af_latin2_writing_system_class,
+#endif
+ NULL /* do not remove */
+ };
+
+
/* when updating this table, don't forget to update */
/* AF_SCRIPT_CLASSES_COUNT and autofit_module_class_pic_init */
@@ -37,13 +54,13 @@
/* populate this list when you add new scripts */
static AF_ScriptClass const af_script_classes[] =
{
- &af_dummy_script_class,
+ &af_dflt_script_class, /* XXX */
+ &af_latn_script_class,
+ &af_hani_script_class,
+ &af_deva_script_class,
#ifdef FT_OPTION_AUTOFIT2
- &af_latin2_script_class,
+ &af_ltn2_script_class,
#endif
- &af_latin_script_class,
- &af_cjk_script_class,
- &af_indic_script_class,
NULL /* do not remove */
};
@@ -206,14 +223,15 @@
{
if ( globals->metrics[nn] )
{
- AF_ScriptClass script_class = AF_SCRIPT_CLASSES_GET[nn];
+ AF_ScriptClass script_class =
+ AF_SCRIPT_CLASSES_GET[nn];
+ AF_WritingSystemClass writing_system_class =
+ AF_WRITING_SYSTEM_CLASSES_GET[script_class->writing_system];
- FT_ASSERT( globals->metrics[nn]->script_class == script_class );
+ if ( writing_system_class->script_metrics_done )
+ writing_system_class->script_metrics_done( globals->metrics[nn] );
- if ( script_class->script_metrics_done )
- script_class->script_metrics_done( globals->metrics[nn] );
-
FT_FREE( globals->metrics[nn] );
}
}
@@ -235,13 +253,16 @@
{
AF_ScriptMetrics metrics = NULL;
FT_UInt gidx;
- AF_ScriptClass script_class;
- FT_UInt script = options & 15;
- const FT_Offset script_max = sizeof ( AF_SCRIPT_CLASSES_GET ) /
- sizeof ( AF_SCRIPT_CLASSES_GET[0] );
- FT_Error error = FT_Err_Ok;
+ AF_WritingSystemClass writing_system_class;
+ AF_ScriptClass script_class;
+ FT_UInt script = options & 15;
+ const FT_Offset script_max = sizeof ( AF_SCRIPT_CLASSES_GET ) /
+ sizeof ( AF_SCRIPT_CLASSES_GET[0] );
+ FT_Error error = FT_Err_Ok;
+
+
if ( gindex >= (FT_ULong)globals->glyph_count )
{
error = FT_THROW( Invalid_Argument );
@@ -252,7 +273,9 @@
if ( gidx == 0 || gidx + 1 >= script_max )
gidx = globals->glyph_scripts[gindex] & AF_SCRIPT_NONE;
- script_class = AF_SCRIPT_CLASSES_GET[gidx];
+ script_class = AF_SCRIPT_CLASSES_GET[gidx];
+ writing_system_class = AF_WRITING_SYSTEM_CLASSES_GET
+ [script_class->writing_system];
if ( script == 0 )
script = script_class->script;
@@ -263,19 +286,20 @@
FT_Memory memory = globals->face->memory;
- if ( FT_ALLOC( metrics, script_class->script_metrics_size ) )
+ if ( FT_ALLOC( metrics, writing_system_class->script_metrics_size ) )
goto Exit;
metrics->script_class = script_class;
metrics->globals = globals;
- if ( script_class->script_metrics_init )
+ if ( writing_system_class->script_metrics_init )
{
- error = script_class->script_metrics_init( metrics, globals->face );
+ error = writing_system_class->script_metrics_init( metrics,
+ globals->face );
if ( error )
{
- if ( script_class->script_metrics_done )
- script_class->script_metrics_done( metrics );
+ if ( writing_system_class->script_metrics_done )
+ writing_system_class->script_metrics_done( metrics );
FT_FREE( metrics );
goto Exit;
--- a/src/autofit/afglobal.h
+++ b/src/autofit/afglobal.h
@@ -5,7 +5,7 @@
/* Auto-fitter routines to compute global hinting values */
/* (specification). */
/* */
-/* Copyright 2003-2005, 2007, 2009, 2011-2012 by */
+/* Copyright 2003-2005, 2007, 2009, 2011-2013 by */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */
/* This file is part of the FreeType project, and may only be used, */
@@ -34,7 +34,11 @@
*/
/* index of fallback script in `af_script_classes' */
-#define AF_SCRIPT_FALLBACK 2
+#ifdef AF_CONFIG_OPTION_CJK
+#define AF_SCRIPT_FALLBACK 2 /* hani */
+#else
+#define AF_SCRIPT_FALLBACK 0 /* dflt */
+#endif
/* a bit mask indicating an uncovered glyph */
#define AF_SCRIPT_NONE 0x7F
/* if this flag is set, we have an ASCII digit */
@@ -55,8 +59,8 @@
/*
- * Note that glyph_scripts[] is used to map each glyph into
- * an index into the `af_script_classes' array.
+ * Note that glyph_scripts[] maps each glyph to an index into the
+ * `af_script_classes' array.
*
*/
typedef struct AF_FaceGlobalsRec_
--- a/src/autofit/afindic.c
+++ b/src/autofit/afindic.c
@@ -97,27 +97,11 @@
/*************************************************************************/
- static const AF_Script_UniRangeRec af_indic_uniranges[] =
- {
-#if 0
- AF_UNIRANGE_REC( 0x0100UL, 0xFFFFUL ), /* why this? */
-#endif
- AF_UNIRANGE_REC( 0x0900UL, 0x0DFFUL), /* Indic Range */
- AF_UNIRANGE_REC( 0x0F00UL, 0x0FFFUL), /* Tibetan */
- AF_UNIRANGE_REC( 0x1900UL, 0x194FUL), /* Limbu */
- AF_UNIRANGE_REC( 0x1B80UL, 0x1BBFUL), /* Sundanese */
- AF_UNIRANGE_REC( 0x1C80UL, 0x1CDFUL), /* Meetei Mayak */
- AF_UNIRANGE_REC( 0xA800UL, 0xA82FUL), /* Syloti Nagri */
- AF_UNIRANGE_REC( 0x11800UL, 0x118DFUL), /* Sharada */
- AF_UNIRANGE_REC( 0UL, 0UL)
- };
+ AF_DEFINE_WRITING_SYSTEM_CLASS(
+ af_indic_writing_system_class,
+ AF_WRITING_SYSTEM_INDIC,
- AF_DEFINE_SCRIPT_CLASS( af_indic_script_class,
- AF_SCRIPT_INDIC,
- af_indic_uniranges,
- 'o', /* XXX */
-
sizeof ( AF_CJKMetricsRec ),
(AF_Script_InitMetricsFunc) af_indic_metrics_init,
@@ -128,19 +112,29 @@
(AF_Script_ApplyHintsFunc) af_indic_hints_apply
)
-#else /* !AF_CONFIG_OPTION_INDIC */
+ /* XXX: this should probably fine tuned to differentiate better between */
+ /* scripts... */
- static const AF_Script_UniRangeRec af_indic_uniranges[] =
+ static const AF_Script_UniRangeRec af_deva_uniranges[] =
{
- { 0, 0 }
+ AF_UNIRANGE_REC( 0x0900UL, 0x0DFFUL ), /* Indic Range */
+ AF_UNIRANGE_REC( 0x0F00UL, 0x0FFFUL ), /* Tibetan */
+ AF_UNIRANGE_REC( 0x1900UL, 0x194FUL ), /* Limbu */
+ AF_UNIRANGE_REC( 0x1B80UL, 0x1BBFUL ), /* Sundanese */
+ AF_UNIRANGE_REC( 0x1C80UL, 0x1CDFUL ), /* Meetei Mayak */
+ AF_UNIRANGE_REC( 0xA800UL, 0xA82FUL ), /* Syloti Nagri */
+ AF_UNIRANGE_REC( 0x11800UL, 0x118DFUL ), /* Sharada */
+ AF_UNIRANGE_REC( 0UL, 0UL )
};
- AF_DEFINE_SCRIPT_CLASS( af_indic_script_class,
- AF_SCRIPT_INDIC,
- af_indic_uniranges,
- 0,
+#else /* !AF_CONFIG_OPTION_INDIC */
+ AF_DEFINE_WRITING_SYSTEM_CLASS(
+ af_indic_writing_system_class,
+
+ AF_WRITING_SYSTEM_INDIC,
+
sizeof ( AF_CJKMetricsRec ),
(AF_Script_InitMetricsFunc) NULL,
@@ -151,7 +145,24 @@
(AF_Script_ApplyHintsFunc) NULL
)
+
+ static const AF_Script_UniRangeRec af_deva_uniranges[] =
+ {
+ AF_UNIRANGE_REC( 0UL, 0UL )
+ };
+
#endif /* !AF_CONFIG_OPTION_INDIC */
+
+
+ AF_DEFINE_SCRIPT_CLASS(
+ af_deva_script_class,
+
+ AF_SCRIPT_DEVA,
+ AF_WRITING_SYSTEM_INDIC,
+
+ af_deva_uniranges,
+ 'o' /* XXX */
+ )
/* END */
--- a/src/autofit/afindic.h
+++ b/src/autofit/afindic.h
@@ -4,7 +4,7 @@
/* */
/* Auto-fitter hinting routines for Indic scripts (specification). */
/* */
-/* Copyright 2007, 2012 by */
+/* Copyright 2007, 2012, 2013 by */
/* Rahul Bhalerao <[email protected]>, <[email protected]>. */
/* */
/* This file is part of the FreeType project, and may only be used, */
@@ -25,9 +25,14 @@
FT_BEGIN_HEADER
- /* the Indic-specific script class */
+ /* the `indic' writing system */
- AF_DECLARE_SCRIPT_CLASS( af_indic_script_class )
+ AF_DECLARE_WRITING_SYSTEM_CLASS( af_indic_writing_system_class )
+
+
+ /* the indic-specific script classes */
+
+ AF_DECLARE_SCRIPT_CLASS( af_deva_script_class )
/* */
--- a/src/autofit/aflatin.c
+++ b/src/autofit/aflatin.c
@@ -2448,10 +2448,26 @@
/*************************************************************************/
+ AF_DEFINE_WRITING_SYSTEM_CLASS(
+ af_latin_writing_system_class,
+
+ AF_WRITING_SYSTEM_LATIN,
+
+ sizeof ( AF_LatinMetricsRec ),
+
+ (AF_Script_InitMetricsFunc) af_latin_metrics_init,
+ (AF_Script_ScaleMetricsFunc)af_latin_metrics_scale,
+ (AF_Script_DoneMetricsFunc) NULL,
+
+ (AF_Script_InitHintsFunc) af_latin_hints_init,
+ (AF_Script_ApplyHintsFunc) af_latin_hints_apply
+ )
+
+
/* XXX: this should probably fine tuned to differentiate better between */
/* scripts... */
- static const AF_Script_UniRangeRec af_latin_uniranges[] =
+ static const AF_Script_UniRangeRec af_latn_uniranges[] =
{
AF_UNIRANGE_REC( 0x0020UL, 0x007FUL ), /* Basic Latin (no control chars) */
AF_UNIRANGE_REC( 0x00A0UL, 0x00FFUL ), /* Latin-1 Supplement (no control chars) */
@@ -2485,19 +2501,14 @@
};
- AF_DEFINE_SCRIPT_CLASS( af_latin_script_class,
- AF_SCRIPT_LATIN,
- af_latin_uniranges,
- 'o',
+ AF_DEFINE_SCRIPT_CLASS(
+ af_latn_script_class,
- sizeof ( AF_LatinMetricsRec ),
+ AF_SCRIPT_LATN,
+ AF_WRITING_SYSTEM_LATIN,
- (AF_Script_InitMetricsFunc) af_latin_metrics_init,
- (AF_Script_ScaleMetricsFunc)af_latin_metrics_scale,
- (AF_Script_DoneMetricsFunc) NULL,
-
- (AF_Script_InitHintsFunc) af_latin_hints_init,
- (AF_Script_ApplyHintsFunc) af_latin_hints_apply
+ af_latn_uniranges,
+ 'o'
)
--- a/src/autofit/aflatin.h
+++ b/src/autofit/aflatin.h
@@ -4,7 +4,7 @@
/* */
/* Auto-fitter hinting routines for latin script (specification). */
/* */
-/* Copyright 2003-2007, 2009, 2011-2012 by */
+/* Copyright 2003-2007, 2009, 2011-2013 by */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */
/* This file is part of the FreeType project, and may only be used, */
@@ -24,10 +24,20 @@
FT_BEGIN_HEADER
+ /* the `latin' writing system */
- /* the latin-specific script class */
+ AF_DECLARE_WRITING_SYSTEM_CLASS( af_latin_writing_system_class )
- AF_DECLARE_SCRIPT_CLASS( af_latin_script_class )
+
+ /* the latin-specific script classes */
+
+ AF_DECLARE_SCRIPT_CLASS( af_latn_script_class ) /* XXX */
+#if 0
+ AF_DECLARE_SCRIPT_CLASS( af_armn_script_class )
+ AF_DECLARE_SCRIPT_CLASS( af_cyrl_script_class )
+ AF_DECLARE_SCRIPT_CLASS( af_grek_script_class )
+ AF_DECLARE_SCRIPT_CLASS( af_hebr_script_class )
+#endif
/* constants are given with units_per_em == 2048 in mind */
--- a/src/autofit/aflatin2.c
+++ b/src/autofit/aflatin2.c
@@ -2380,19 +2380,11 @@
/*************************************************************************/
- static const AF_Script_UniRangeRec af_latin2_uniranges[] =
- {
- AF_UNIRANGE_REC( 32UL, 127UL ), /* TODO: Add new Unicode ranges here! */
- AF_UNIRANGE_REC( 160UL, 255UL ),
- AF_UNIRANGE_REC( 0UL, 0UL )
- };
+ AF_DEFINE_WRITING_SYSTEM_CLASS(
+ af_latin2_writing_system_class,
+ AF_WRITING_SYSTEM_LATIN2,
- AF_DEFINE_SCRIPT_CLASS( af_latin2_script_class,
- AF_SCRIPT_LATIN2,
- af_latin2_uniranges,
- 'o',
-
sizeof ( AF_LatinMetricsRec ),
(AF_Script_InitMetricsFunc) af_latin2_metrics_init,
@@ -2401,6 +2393,54 @@
(AF_Script_InitHintsFunc) af_latin2_hints_init,
(AF_Script_ApplyHintsFunc) af_latin2_hints_apply
+ )
+
+
+ /* XXX: this should probably fine tuned to differentiate better between */
+ /* scripts... */
+
+ static const AF_Script_UniRangeRec af_ltn2_uniranges[] =
+ {
+ AF_UNIRANGE_REC( 0x0020UL, 0x007FUL ), /* Basic Latin (no control chars) */
+ AF_UNIRANGE_REC( 0x00A0UL, 0x00FFUL ), /* Latin-1 Supplement (no control chars) */
+ AF_UNIRANGE_REC( 0x0100UL, 0x017FUL ), /* Latin Extended-A */
+ AF_UNIRANGE_REC( 0x0180UL, 0x024FUL ), /* Latin Extended-B */
+ AF_UNIRANGE_REC( 0x0250UL, 0x02AFUL ), /* IPA Extensions */
+ AF_UNIRANGE_REC( 0x02B0UL, 0x02FFUL ), /* Spacing Modifier Letters */
+ AF_UNIRANGE_REC( 0x0300UL, 0x036FUL ), /* Combining Diacritical Marks */
+ AF_UNIRANGE_REC( 0x0370UL, 0x03FFUL ), /* Greek and Coptic */
+ AF_UNIRANGE_REC( 0x0400UL, 0x04FFUL ), /* Cyrillic */
+ AF_UNIRANGE_REC( 0x0500UL, 0x052FUL ), /* Cyrillic Supplement */
+ AF_UNIRANGE_REC( 0x1D00UL, 0x1D7FUL ), /* Phonetic Extensions */
+ AF_UNIRANGE_REC( 0x1D80UL, 0x1DBFUL ), /* Phonetic Extensions Supplement */
+ AF_UNIRANGE_REC( 0x1DC0UL, 0x1DFFUL ), /* Combining Diacritical Marks Supplement */
+ AF_UNIRANGE_REC( 0x1E00UL, 0x1EFFUL ), /* Latin Extended Additional */
+ AF_UNIRANGE_REC( 0x1F00UL, 0x1FFFUL ), /* Greek Extended */
+ AF_UNIRANGE_REC( 0x2000UL, 0x206FUL ), /* General Punctuation */
+ AF_UNIRANGE_REC( 0x2070UL, 0x209FUL ), /* Superscripts and Subscripts */
+ AF_UNIRANGE_REC( 0x20A0UL, 0x20CFUL ), /* Currency Symbols */
+ AF_UNIRANGE_REC( 0x2150UL, 0x218FUL ), /* Number Forms */
+ AF_UNIRANGE_REC( 0x2460UL, 0x24FFUL ), /* Enclosed Alphanumerics */
+ AF_UNIRANGE_REC( 0x2C60UL, 0x2C7FUL ), /* Latin Extended-C */
+ AF_UNIRANGE_REC( 0x2DE0UL, 0x2DFFUL ), /* Cyrillic Extended-A */
+ AF_UNIRANGE_REC( 0x2E00UL, 0x2E7FUL ), /* Supplemental Punctuation */
+ AF_UNIRANGE_REC( 0xA640UL, 0xA69FUL ), /* Cyrillic Extended-B */
+ AF_UNIRANGE_REC( 0xA720UL, 0xA7FFUL ), /* Latin Extended-D */
+ AF_UNIRANGE_REC( 0xFB00UL, 0xFB06UL ), /* Alphab. Present. Forms (Latin Ligs) */
+ AF_UNIRANGE_REC( 0x1D400UL, 0x1D7FFUL ), /* Mathematical Alphanumeric Symbols */
+ AF_UNIRANGE_REC( 0x1F100UL, 0x1F1FFUL ), /* Enclosed Alphanumeric Supplement */
+ AF_UNIRANGE_REC( 0UL, 0UL )
+ };
+
+
+ AF_DEFINE_SCRIPT_CLASS(
+ af_ltn2_script_class,
+
+ AF_SCRIPT_LTN2,
+ AF_WRITING_SYSTEM_LATIN2,
+
+ af_ltn2_uniranges,
+ 'o'
)
--- a/src/autofit/aflatin2.h
+++ b/src/autofit/aflatin2.h
@@ -4,7 +4,7 @@
/* */
/* Auto-fitter hinting routines for latin script (specification). */
/* */
-/* Copyright 2003-2007, 2012 by */
+/* Copyright 2003-2007, 2012, 2013 by */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */
/* This file is part of the FreeType project, and may only be used, */
@@ -25,9 +25,21 @@
FT_BEGIN_HEADER
- /* the latin-specific script class */
+ /* the `latin' writing system */
- AF_DECLARE_SCRIPT_CLASS( af_latin2_script_class )
+ AF_DECLARE_WRITING_SYSTEM_CLASS( af_latin2_writing_system_class )
+
+
+ /* the latin-specific script classes */
+
+ AF_DECLARE_SCRIPT_CLASS( af_ltn2_script_class ) /* XXX */
+#if 0
+ AF_DECLARE_SCRIPT_CLASS( af_arm2_script_class )
+ AF_DECLARE_SCRIPT_CLASS( af_cyr2_script_class )
+ AF_DECLARE_SCRIPT_CLASS( af_grk2_script_class )
+ AF_DECLARE_SCRIPT_CLASS( af_hbr2_script_class )
+#endif
+
/* */
--- a/src/autofit/afloader.c
+++ b/src/autofit/afloader.c
@@ -180,11 +180,21 @@
/* now load the slot image into the auto-outline and run the */
/* automatic hinting process */
- if ( metrics->script_class->script_hints_apply )
- metrics->script_class->script_hints_apply( hints,
- &gloader->current.outline,
- metrics );
+ {
+#ifdef FT_CONFIG_OPTION_PIC
+ AF_FaceGlobals globals = loader->globals;
+#endif
+ AF_WritingSystemClass writing_system_class =
+ AF_WRITING_SYSTEM_CLASSES_GET
+ [metrics->script_class->writing_system];
+
+ if ( writing_system_class->script_hints_apply )
+ writing_system_class->script_hints_apply( hints,
+ &gloader->current.outline,
+ metrics );
+ }
+
/* we now need to adjust the metrics according to the change in */
/* width/positioning that occurred during the hinting process */
if ( scaler->render_mode != FT_RENDER_MODE_LIGHT )
@@ -519,13 +529,13 @@
if ( !error )
{
AF_ScriptMetrics metrics;
- FT_UInt options = 0;
+ FT_UInt options = AF_SCRIPT_DFLT;
#ifdef FT_OPTION_AUTOFIT2
- /* XXX: undocumented hook to activate the latin2 hinter */
+ /* XXX: undocumented hook to activate the latin2 writing system */
if ( load_flags & ( 1UL << 20 ) )
- options = 2;
+ options = AF_SCRIPT_LTN2;
#endif
error = af_face_globals_get_metrics( loader->globals, gindex,
@@ -532,10 +542,18 @@
options, &metrics );
if ( !error )
{
+#ifdef FT_CONFIG_OPTION_PIC
+ AF_FaceGlobals globals = loader->globals;
+#endif
+ AF_WritingSystemClass writing_system_class =
+ AF_WRITING_SYSTEM_CLASSES_GET
+ [metrics->script_class->writing_system];
+
+
loader->metrics = metrics;
- if ( metrics->script_class->script_metrics_scale )
- metrics->script_class->script_metrics_scale( metrics, &scaler );
+ if ( writing_system_class->script_metrics_scale )
+ writing_system_class->script_metrics_scale( metrics, &scaler );
else
metrics->scaler = scaler;
@@ -542,10 +560,10 @@
load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_IGNORE_TRANSFORM;
load_flags &= ~FT_LOAD_RENDER;
- if ( metrics->script_class->script_hints_init )
+ if ( writing_system_class->script_hints_init )
{
- error = metrics->script_class->script_hints_init( &loader->hints,
- metrics );
+ error = writing_system_class->script_hints_init( &loader->hints,
+ metrics );
if ( error )
goto Exit;
}
--- a/src/autofit/afpic.c
+++ b/src/autofit/afpic.c
@@ -100,27 +100,47 @@
FT_Init_Class_af_service_properties( &container->af_service_properties );
- for ( ss = 0 ; ss < AF_SCRIPT_CLASSES_REC_COUNT ; ss++ )
- {
+ for ( ss = 0; ss < AF_WRITING_SYSTEM_CLASSES_REC_COUNT; ss++ )
+ container->af_writing_system_classes[ss] =
+ &container->af_writing_system_classes_rec[ss];
+ container->af_writing_system_classes
+ [AF_WRITING_SYSTEM_CLASSES_COUNT - 1] = NULL;
+
+ for ( ss = 0; ss < AF_SCRIPT_CLASSES_REC_COUNT; ss++ )
container->af_script_classes[ss] =
&container->af_script_classes_rec[ss];
- }
- container->af_script_classes[AF_SCRIPT_CLASSES_COUNT - 1] = NULL;
+ container->af_script_classes
+ [AF_SCRIPT_CLASSES_COUNT - 1] = NULL;
/* add call to initialization function when you add new scripts */
+ /* or writing systems */
ss = 0;
- FT_Init_Class_af_dummy_script_class(
- &container->af_script_classes_rec[ss++] );
+ FT_Init_Class_af_dummy_writing_system_class(
+ &container->af_writing_system_classes_rec[ss++] );
+ FT_Init_Class_af_latin_writing_system_class(
+ &container->af_writing_system_classes_rec[ss++] );
+ FT_Init_Class_af_cjk_writing_system_class(
+ &container->af_writing_system_classes_rec[ss++] );
+ FT_Init_Class_af_indic_writing_system_class(
+ &container->af_writing_system_classes_rec[ss++] );
#ifdef FT_OPTION_AUTOFIT2
- FT_Init_Class_af_latin2_script_class(
- &container->af_script_classes_rec[ss++] );
+ FT_Init_Class_af_latin2_writing_system_class(
+ &container->af_writing_system_classes_rec[ss++] );
#endif
- FT_Init_Class_af_latin_script_class(
+
+ ss = 0;
+ FT_Init_Class_af_dflt_script_class(
&container->af_script_classes_rec[ss++] );
- FT_Init_Class_af_cjk_script_class(
+ FT_Init_Class_af_latn_script_class(
&container->af_script_classes_rec[ss++] );
- FT_Init_Class_af_indic_script_class(
+ FT_Init_Class_af_hani_script_class(
&container->af_script_classes_rec[ss++] );
+ FT_Init_Class_af_deva_script_class(
+ &container->af_script_classes_rec[ss++] );
+#ifdef FT_OPTION_AUTOFIT2
+ FT_Init_Class_af_ltn2_script_class(
+ &container->af_script_classes_rec[ss++] );
+#endif
FT_Init_Class_af_autofitter_interface(
library, &container->af_autofitter_interface );
--- a/src/autofit/afpic.h
+++ b/src/autofit/afpic.h
@@ -4,7 +4,7 @@
/* */
/* The FreeType position independent code services for autofit module. */
/* */
-/* Copyright 2009, 2011-2012 by */
+/* Copyright 2009, 2011-2013 by */
/* Oran Agra and Mickey Gabel. */
/* */
/* This file is part of the FreeType project, and may only be used, */
@@ -27,11 +27,12 @@
#ifndef FT_CONFIG_OPTION_PIC
-#define AF_SERVICES_GET af_services
-#define AF_SERVICE_PROPERTIES_GET af_service_properties
+#define AF_SERVICES_GET af_services
+#define AF_SERVICE_PROPERTIES_GET af_service_properties
-#define AF_SCRIPT_CLASSES_GET af_script_classes
-#define AF_INTERFACE_GET af_autofitter_interface
+#define AF_WRITING_SYSTEM_CLASSES_GET af_writing_system_classes
+#define AF_SCRIPT_CLASSES_GET af_script_classes
+#define AF_INTERFACE_GET af_autofitter_interface
#else /* FT_CONFIG_OPTION_PIC */
@@ -40,15 +41,20 @@
#include "aftypes.h"
- /* increase these when you add new scripts, */
- /* and update autofit_module_class_pic_init */
+ /* increase these when you add new scripts or writing systems, */
+ /* and update autofit_module_class_pic_init */
#ifdef FT_OPTION_AUTOFIT2
-#define AF_SCRIPT_CLASSES_COUNT 6
+#define AF_WRITING_SYSTEM_CLASSES_COUNT 6
+#define AF_SCRIPT_CLASSES_COUNT 6
#else
-#define AF_SCRIPT_CLASSES_COUNT 5
+#define AF_WRITING_SYSTEM_CLASSES_COUNT 5
+#define AF_SCRIPT_CLASSES_COUNT 5
#endif
-#define AF_SCRIPT_CLASSES_REC_COUNT ( AF_SCRIPT_CLASSES_COUNT - 1 )
+#define AF_SCRIPT_CLASSES_REC_COUNT \
+ ( AF_SCRIPT_CLASSES_COUNT - 1 )
+#define AF_WRITING_SYSTEM_CLASSES_REC_COUNT \
+ ( AF_WRITING_SYSTEM_CLASSES_COUNT - 1 )
typedef struct AFModulePIC_
@@ -56,8 +62,16 @@
FT_ServiceDescRec* af_services;
FT_Service_PropertiesRec af_service_properties;
- AF_ScriptClass af_script_classes[AF_SCRIPT_CLASSES_COUNT];
- AF_ScriptClassRec af_script_classes_rec[AF_SCRIPT_CLASSES_REC_COUNT];
+ AF_WritingSystemClass af_writing_system_classes
+ [AF_WRITING_SYSTEM_CLASSES_COUNT];
+ AF_WritingSystemClassRec af_writing_system_classes_rec
+ [AF_WRITING_SYSTEM_CLASSES_REC_COUNT];
+
+ AF_ScriptClass af_script_classes
+ [AF_SCRIPT_CLASSES_COUNT];
+ AF_ScriptClassRec af_script_classes_rec
+ [AF_SCRIPT_CLASSES_REC_COUNT];
+
FT_AutoHinter_InterfaceRec af_autofitter_interface;
} AFModulePIC;
@@ -71,6 +85,8 @@
#define AF_SERVICE_PROPERTIES_GET \
( GET_PIC( library )->af_service_properties )
+#define AF_WRITING_SYSTEM_CLASSES_GET \
+ ( GET_PIC( FT_FACE_LIBRARY( globals->face ) )->af_writing_system_classes )
#define AF_SCRIPT_CLASSES_GET \
( GET_PIC( FT_FACE_LIBRARY( globals->face ) )->af_script_classes )
#define AF_INTERFACE_GET \
--- a/src/autofit/aftypes.h
+++ b/src/autofit/aftypes.h
@@ -4,7 +4,7 @@
/* */
/* Auto-fitter types (specification only). */
/* */
-/* Copyright 2003-2009, 2011-2012 by */
+/* Copyright 2003-2009, 2011-2013 by */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */
/* This file is part of the FreeType project, and may only be used, */
@@ -20,15 +20,12 @@
*
* The auto-fitter is a complete rewrite of the old auto-hinter.
* Its main feature is the ability to differentiate between different
- * scripts in order to apply language-specific rules.
+ * writing systems in order to apply script-specific rules.
*
* The code has also been compartmentized into several entities that
* should make algorithmic experimentation easier than with the old
* code.
*
- * Finally, we get rid of the Catharon license, since this code is
- * released under the FreeType one.
- *
*************************************************************************/
@@ -201,53 +198,18 @@
/*************************************************************************/
/*************************************************************************/
/***** *****/
- /***** S C R I P T S *****/
+ /***** S C R I P T M E T R I C S *****/
/***** *****/
/*************************************************************************/
/*************************************************************************/
- /*
- * The list of known scripts. Each different script corresponds to the
- * following information:
- *
- * - A set of Unicode ranges to test whether the face supports the
- * script.
- *
- * - A specific global analyzer that will compute global metrics
- * specific to the script.
- *
- * - A specific glyph analyzer that will compute segments and
- * edges for each glyph covered by the script.
- *
- * - A specific grid-fitting algorithm that will distort the
- * scaled glyph outline according to the results of the glyph
- * analyzer.
- *
- * Note that a given analyzer and/or grid-fitting algorithm can be
- * used by more than one script.
- */
+ /* This is the main structure which combines writing systems and script */
+ /* data (for a given face object, see below). */
- typedef enum AF_Script_
- {
- AF_SCRIPT_DUMMY = 0,
- AF_SCRIPT_LATIN = 1,
- AF_SCRIPT_CJK = 2,
- AF_SCRIPT_INDIC = 3,
-#ifdef FT_OPTION_AUTOFIT2
- AF_SCRIPT_LATIN2 = 4,
-#endif
+ typedef struct AF_WritingSystemClassRec_ const* AF_WritingSystemClass;
+ typedef struct AF_ScriptClassRec_ const* AF_ScriptClass;
+ typedef struct AF_FaceGlobalsRec_* AF_FaceGlobals;
- /* add new scripts here. Don't forget to update the list in */
- /* `afglobal.c'. */
-
- AF_SCRIPT_MAX /* do not remove */
-
- } AF_Script;
-
-
- typedef struct AF_ScriptClassRec_ const* AF_ScriptClass;
- typedef struct AF_FaceGlobalsRec_* AF_FaceGlobals;
-
typedef struct AF_ScriptMetricsRec_
{
AF_ScriptClass script_class;
@@ -284,23 +246,55 @@
AF_ScriptMetrics metrics );
- typedef struct AF_Script_UniRangeRec_
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** W R I T I N G S Y S T E M S *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*
+ * In FreeType, a writing system consists of multiple scripts which can
+ * be handled similarly *in a typographical way*; the relationship is not
+ * based on history. For example, both the Greek and the unrelated
+ * Armenian scripts share the same features like ascender, descender,
+ * x-height, etc. Essentially, a writing system is covered by a
+ * submodule of the auto-fitter; it contains
+ *
+ * - a specific global analyzer which computes global metrics specific to
+ * the script (based on script-specific characters to identify ascender
+ * height, x-height, etc.),
+ *
+ * - a specific glyph analyzer that computes segments and edges for each
+ * glyph covered by the script,
+ *
+ * - a specific grid-fitting algorithm that distorts the scaled glyph
+ * outline according to the results of the glyph analyzer.
+ */
+
+ /* The list of known writing systems. */
+ typedef enum AF_WritingSystem_
{
- FT_UInt32 first;
- FT_UInt32 last;
+ AF_WRITING_SYSTEM_DUMMY = 0,
+ AF_WRITING_SYSTEM_LATIN = 1,
+ AF_WRITING_SYSTEM_CJK = 2,
+ AF_WRITING_SYSTEM_INDIC = 3,
+#ifdef FT_OPTION_AUTOFIT2
+ AF_WRITING_SYSTEM_LATIN2 = 4,
+#endif
- } AF_Script_UniRangeRec;
+ /* Add new writing systems here. Don't forget to update */
+ /* the list in `afglobal.c'. */
-#define AF_UNIRANGE_REC( a, b ) { (FT_UInt32)(a), (FT_UInt32)(b) }
+ AF_WRITING_SYSTEM_MAX /* do not remove */
- typedef const AF_Script_UniRangeRec *AF_Script_UniRange;
+ } AF_WritingSystem;
- typedef struct AF_ScriptClassRec_
+ typedef struct AF_WritingSystemClassRec_
{
- AF_Script script;
- AF_Script_UniRange script_uni_ranges; /* last must be { 0, 0 } */
- FT_UInt32 standard_char; /* for default width and height */
+ AF_WritingSystem writing_system;
FT_Offset script_metrics_size;
AF_Script_InitMetricsFunc script_metrics_init;
@@ -310,6 +304,64 @@
AF_Script_InitHintsFunc script_hints_init;
AF_Script_ApplyHintsFunc script_hints_apply;
+ } AF_WritingSystemClassRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** S C R I P T S *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*
+ * Each script is associated with a set of Unicode ranges which gets used
+ * to test whether the font face supports the script. It also references
+ * the writing system it belongs to.
+ *
+ * We use four-letter script tags from the OpenType specification.
+ */
+
+ /* The list of known scripts. */
+ typedef enum AF_Script_
+ {
+ AF_SCRIPT_DFLT = 0,
+ AF_SCRIPT_LATN = 1,
+ AF_SCRIPT_HANI = 2,
+ AF_SCRIPT_DEVA = 3,
+#ifdef FT_OPTION_AUTOFIT2
+ AF_SCRIPT_LTN2 = 4,
+#endif
+
+ /* Add new scripts here. Don't forget to update */
+ /* the list in `afglobal.c'. */
+
+ AF_SCRIPT_MAX /* do not remove */
+
+ } AF_Script;
+
+
+ typedef struct AF_Script_UniRangeRec_
+ {
+ FT_UInt32 first;
+ FT_UInt32 last;
+
+ } AF_Script_UniRangeRec;
+
+#define AF_UNIRANGE_REC( a, b ) { (FT_UInt32)(a), (FT_UInt32)(b) }
+
+ typedef const AF_Script_UniRangeRec* AF_Script_UniRange;
+
+
+ typedef struct AF_ScriptClassRec_
+ {
+ AF_Script script;
+ AF_WritingSystem writing_system;
+
+ AF_Script_UniRange script_uni_ranges; /* last must be { 0, 0 } */
+ FT_UInt32 standard_char; /* for default width and height */
+
} AF_ScriptClassRec;
@@ -316,53 +368,102 @@
/* Declare and define vtables for classes */
#ifndef FT_CONFIG_OPTION_PIC
+#define AF_DECLARE_WRITING_SYSTEM_CLASS( writing_system_class ) \
+ FT_CALLBACK_TABLE const AF_WritingSystemClassRec \
+ writing_system_class;
+
+#define AF_DEFINE_WRITING_SYSTEM_CLASS( \
+ writing_system_class, \
+ system, \
+ m_size, \
+ m_init, \
+ m_scale, \
+ m_done, \
+ h_init, \
+ h_apply ) \
+ FT_CALLBACK_TABLE_DEF \
+ const AF_WritingSystemClassRec writing_system_class = \
+ { \
+ system, \
+ \
+ m_size, \
+ \
+ m_init, \
+ m_scale, \
+ m_done, \
+ \
+ h_init, \
+ h_apply \
+ };
+
+
#define AF_DECLARE_SCRIPT_CLASS( script_class ) \
FT_CALLBACK_TABLE const AF_ScriptClassRec \
script_class;
-#define AF_DEFINE_SCRIPT_CLASS( script_class, script_, ranges, def_char, \
- m_size, \
- m_init, m_scale, m_done, h_init, h_apply ) \
- FT_CALLBACK_TABLE_DEF const AF_ScriptClassRec script_class = \
- { \
- script_, \
- ranges, \
- def_char, \
- \
- m_size, \
- \
- m_init, \
- m_scale, \
- m_done, \
- \
- h_init, \
- h_apply \
+#define AF_DEFINE_SCRIPT_CLASS( \
+ script_class, \
+ script_, \
+ writing_system_, \
+ ranges, \
+ std_char ) \
+ FT_CALLBACK_TABLE_DEF \
+ const AF_ScriptClassRec script_class = \
+ { \
+ script_, \
+ writing_system_, \
+ ranges, \
+ std_char \
};
#else /* FT_CONFIG_OPTION_PIC */
+#define AF_DECLARE_WRITING_SYSTEM_CLASS( writing_system_class ) \
+ FT_LOCAL( void ) \
+ FT_Init_Class_ ## writing_system_class( AF_WritingSystemClassRec* ac );
+
+#define AF_DEFINE_WRITING_SYSTEM_CLASS( \
+ writing_system_class, \
+ system, \
+ m_size, \
+ m_init, \
+ m_scale, \
+ m_done, \
+ h_init, \
+ h_apply ) \
+ FT_LOCAL_DEF( void ) \
+ FT_Init_Class_ ## writing_system_class( AF_WritingSystemClassRec* ac ) \
+ { \
+ ac->writing_system = system; \
+ \
+ ac->script_metrics_size = m_size; \
+ \
+ ac->script_metrics_init = m_init; \
+ ac->script_metrics_scale = m_scale; \
+ ac->script_metrics_done = m_done; \
+ \
+ ac->script_hints_init = h_init; \
+ ac->script_hints_apply = h_apply; \
+ }
+
+
#define AF_DECLARE_SCRIPT_CLASS( script_class ) \
FT_LOCAL( void ) \
FT_Init_Class_ ## script_class( AF_ScriptClassRec* ac );
-#define AF_DEFINE_SCRIPT_CLASS( script_class, script_, ranges, def_char, \
- m_size, \
- m_init, m_scale, m_done, h_init, h_apply ) \
- FT_LOCAL_DEF( void ) \
- FT_Init_Class_ ## script_class( AF_ScriptClassRec* ac ) \
- { \
- ac->script = script_; \
- ac->script_uni_ranges = ranges; \
- ac->default_char = def_char; \
- \
- ac->script_metrics_size = m_size; \
- \
- ac->script_metrics_init = m_init; \
- ac->script_metrics_scale = m_scale; \
- ac->script_metrics_done = m_done; \
- \
- ac->script_hints_init = h_init; \
- ac->script_hints_apply = h_apply; \
+#define AF_DEFINE_SCRIPT_CLASS( \
+ script_class, \
+ script_, \
+ writing_system_, \
+ ranges, \
+ std_char ) \
+ FT_LOCAL_DEF( void ) \
+ FT_Init_Class_ ## script_class( AF_ScriptClassRec* ac ) \
+ { \
+ ac->script = script_; \
+ ac->writing_system = writing_system_; \
+ ac->script_uni_ranges = ranges; \
+ ac->standard_char = std_char; \
}
#endif /* FT_CONFIG_OPTION_PIC */