#include "afglobal.h"
-#include "afdummy.h"
-#include "aflatin.h"
-#include "afcjk.h"
-#include "afindic.h"
-#include "afpic.h"
+
+ /* get writing system specific header files */
+#undef WRITING_SYSTEM
+#define WRITING_SYSTEM( ws, WS ) /* empty */
+#include "afwrtsys.h"
#include "aferrors.h"
+#include "afpic.h"
-#ifdef FT_OPTION_AUTOFIT2
-#include "aflatin2.h"
-#endif
#ifndef FT_CONFIG_OPTION_PIC
- /* when updating this table, don't forget to update */
- /* AF_SCRIPT_CLASSES_COUNT and autofit_module_class_pic_init */
+#undef WRITING_SYSTEM
+#define WRITING_SYSTEM( ws, WS ) \
+ &af_ ## ws ## _writing_system_class,
- /* populate this list when you add new scripts */
- static AF_ScriptClass const af_script_classes[] =
+ FT_LOCAL_ARRAY_DEF( AF_WritingSystemClass )
+ af_writing_system_classes[] =
{
- &af_dummy_script_class,
-#ifdef FT_OPTION_AUTOFIT2
- &af_latin2_script_class,
-#endif
- &af_latin_script_class,
- &af_cjk_script_class,
- &af_indic_script_class,
+
+#include "afwrtsys.h"
+
+ NULL /* do not remove */
+ };
+
+
+#undef SCRIPT
+#define SCRIPT( s, S, d ) \
+ &af_ ## s ## _script_class,
+
+ FT_LOCAL_ARRAY_DEF( AF_ScriptClass )
+ af_script_classes[] =
+ {
+
+#include "afscript.h"
+
NULL /* do not remove */
};
#endif /* !FT_CONFIG_OPTION_PIC */
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+#undef SCRIPT
+#define SCRIPT( s, S, d ) #s,
+
+ FT_LOCAL_ARRAY_DEF( char* )
+ af_script_names[] =
+ {
+
+#include "afscript.h"
+
+ };
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+
/* Compute the script index of each glyph within a given face. */
static FT_Error
/* scan each script in a Unicode charmap */
for ( ss = 0; AF_SCRIPT_CLASSES_GET[ss]; ss++ )
{
- AF_ScriptClass clazz = AF_SCRIPT_CLASSES_GET[ss];
+ AF_ScriptClass script_class = AF_SCRIPT_CLASSES_GET[ss];
AF_Script_UniRange range;
- if ( clazz->script_uni_ranges == NULL )
+ if ( script_class->script_uni_ranges == NULL )
continue;
/*
* Scan all Unicode points in the range and set the corresponding
* glyph script index.
*/
- for ( range = clazz->script_uni_ranges; range->first != 0; range++ )
+ for ( range = script_class->script_uni_ranges;
+ range->first != 0;
+ range++ )
{
FT_ULong charcode = range->first;
FT_UInt gindex;
{
if ( globals->metrics[nn] )
{
- AF_ScriptClass clazz = 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]->clazz == clazz );
-
- if ( clazz->script_metrics_done )
- clazz->script_metrics_done( globals->metrics[nn] );
+ if ( writing_system_class->script_metrics_done )
+ writing_system_class->script_metrics_done( globals->metrics[nn] );
FT_FREE( globals->metrics[nn] );
}
AF_ScriptMetrics *ametrics )
{
AF_ScriptMetrics metrics = NULL;
- FT_UInt gidx;
- AF_ScriptClass clazz;
- 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_Script script = (AF_Script)( options & 15 );
+ AF_WritingSystemClass writing_system_class;
+ AF_ScriptClass script_class;
+
+ FT_Error error = FT_Err_Ok;
if ( gindex >= (FT_ULong)globals->glyph_count )
goto Exit;
}
- gidx = script;
- if ( gidx == 0 || gidx + 1 >= script_max )
- gidx = globals->glyph_scripts[gindex] & AF_SCRIPT_NONE;
+ /* if we have a forced script (via `options'), use it, */
+ /* otherwise look into `glyph_scripts' array */
+ if ( script == AF_SCRIPT_DFLT || script + 1 >= AF_SCRIPT_MAX )
+ script = (AF_Script)( globals->glyph_scripts[gindex] & AF_SCRIPT_NONE );
- clazz = AF_SCRIPT_CLASSES_GET[gidx];
- if ( script == 0 )
- script = clazz->script;
+ script_class = AF_SCRIPT_CLASSES_GET[script];
+ writing_system_class = AF_WRITING_SYSTEM_CLASSES_GET
+ [script_class->writing_system];
- metrics = globals->metrics[clazz->script];
+ metrics = globals->metrics[script];
if ( metrics == NULL )
{
/* create the global metrics object if necessary */
FT_Memory memory = globals->face->memory;
- if ( FT_ALLOC( metrics, clazz->script_metrics_size ) )
+ if ( FT_ALLOC( metrics, writing_system_class->script_metrics_size ) )
goto Exit;
- metrics->clazz = clazz;
- metrics->globals = globals;
+ metrics->script_class = script_class;
+ metrics->globals = globals;
- if ( clazz->script_metrics_init )
+ if ( writing_system_class->script_metrics_init )
{
- error = clazz->script_metrics_init( metrics, globals->face );
+ error = writing_system_class->script_metrics_init( metrics,
+ globals->face );
if ( error )
{
- if ( clazz->script_metrics_done )
- clazz->script_metrics_done( metrics );
+ if ( writing_system_class->script_metrics_done )
+ writing_system_class->script_metrics_done( metrics );
FT_FREE( metrics );
goto Exit;
}
}
- globals->metrics[clazz->script] = metrics;
+ globals->metrics[script] = metrics;
}
Exit: