diff options
author | Reinhard Tartler <siretart@tauware.de> | 2011-10-10 17:43:39 +0200 |
---|---|---|
committer | Reinhard Tartler <siretart@tauware.de> | 2011-10-10 17:43:39 +0200 |
commit | f4092abdf94af6a99aff944d6264bc1284e8bdd4 (patch) | |
tree | 2ac1c9cc16ceb93edb2c4382c088dac5aeafdf0f /nx-X11/extras/freetype2/src/autofit/afglobal.c | |
parent | a840692edc9c6d19cd7c057f68e39c7d95eb767d (diff) | |
download | nx-libs-f4092abdf94af6a99aff944d6264bc1284e8bdd4.tar.gz nx-libs-f4092abdf94af6a99aff944d6264bc1284e8bdd4.tar.bz2 nx-libs-f4092abdf94af6a99aff944d6264bc1284e8bdd4.zip |
Imported nx-X11-3.1.0-1.tar.gznx-X11/3.1.0-1
Summary: Imported nx-X11-3.1.0-1.tar.gz
Keywords:
Imported nx-X11-3.1.0-1.tar.gz
into Git repository
Diffstat (limited to 'nx-X11/extras/freetype2/src/autofit/afglobal.c')
-rw-r--r-- | nx-X11/extras/freetype2/src/autofit/afglobal.c | 236 |
1 files changed, 236 insertions, 0 deletions
diff --git a/nx-X11/extras/freetype2/src/autofit/afglobal.c b/nx-X11/extras/freetype2/src/autofit/afglobal.c new file mode 100644 index 000000000..54852ab31 --- /dev/null +++ b/nx-X11/extras/freetype2/src/autofit/afglobal.c @@ -0,0 +1,236 @@ +#include "afglobal.h" +#include "afdummy.h" +#include "aflatin.h" + + /* populate this list when you add new scripts + */ + static AF_ScriptClass const af_script_classes[] = + { + & af_dummy_script_class, + & af_latin_script_class, + + NULL /* do not remove */ + }; + +#define AF_SCRIPT_LIST_DEFAULT 1 /* index of default script in 'af_script_classes' */ +#define AF_SCRIPT_LIST_NONE 255 /* indicates an uncovered glyph */ + + /* + * note that glyph_scripts[] is used to map each glyph into + * an index into the 'af_script_classes' array. + * + */ + typedef struct AF_FaceGlobalsRec_ + { + FT_Face face; + FT_UInt glyph_count; /* same as face->num_glyphs */ + FT_Byte* glyph_scripts; + + AF_ScriptMetrics metrics[ AF_SCRIPT_MAX ]; + + } AF_FaceGlobalsRec; + + + + + /* this function is used to compute the script index of each glyph + * within a given face + */ + static FT_Error + af_face_globals_compute_script_coverage( AF_FaceGlobals globals ) + { + FT_Error error = 0; + FT_Face face = globals->face; + FT_CharMap old_charmap = face->charmap; + FT_Byte* gscripts = globals->glyph_scripts; + FT_UInt ss; + + /* the value 255 means "uncovered glyph" + */ + FT_MEM_SET( globals->glyph_scripts, + AF_SCRIPT_LIST_NONE, + globals->glyph_count ); + + error = FT_Select_Charmap( face, FT_ENCODING_UNICODE ); + if ( error ) + { + /* ignore this error, we'll simply use Latin as the standard + * script. XXX: Shouldn't we rather disable hinting ?? + */ + error = 0; + goto Exit; + } + + /* scan each script in a Unicode charmap + */ + for ( ss = 0; af_script_classes[ss]; ss++ ) + { + AF_ScriptClass clazz = af_script_classes[ss]; + AF_Script_UniRange range; + + if ( clazz->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++ ) + { + FT_ULong charcode = range->first; + FT_UInt gindex; + + gindex = FT_Get_Char_Index( face, charcode ); + + if ( gindex != 0 && + gindex < globals->glyph_count && + gscripts[ gindex ] == AF_SCRIPT_LIST_NONE ) + { + gscripts[ gindex ] = (FT_Byte) ss; + } + for (;;) + { + charcode = FT_Get_Next_Char( face, charcode, &gindex ); + + if ( gindex == 0 || charcode > range->last ) + break; + + if ( gindex < globals->glyph_count && + gscripts[ gindex ] == AF_SCRIPT_LIST_NONE ) + { + gscripts[ gindex ] = (FT_Byte) ss; + } + } + } + } + + Exit: + /* by default, all uncovered glyphs are set to the latin script + * XXX: shouldnt' we disable hinting or do something similar ? + */ + { + FT_UInt nn; + + for ( nn = 0; nn < globals->glyph_count; nn++ ) + { + if ( gscripts[ nn ] == AF_SCRIPT_LIST_NONE ) + gscripts[ nn ] = AF_SCRIPT_LIST_DEFAULT; + } + } + + FT_Set_Charmap( face, old_charmap ); + return error; + } + + + + FT_LOCAL_DEF( FT_Error ) + af_face_globals_new( FT_Face face, + AF_FaceGlobals *aglobals ) + { + FT_Error error; + FT_Memory memory; + AF_FaceGlobals globals; + + memory = face->memory; + + if ( !FT_ALLOC( globals, sizeof(*globals) + + face->num_glyphs*sizeof(FT_Byte) ) ) + { + globals->face = face; + globals->glyph_count = face->num_glyphs; + globals->glyph_scripts = (FT_Byte*)( globals+1 ); + + error = af_face_globals_compute_script_coverage( globals ); + if ( error ) + { + af_face_globals_free( globals ); + globals = NULL; + } + } + + *aglobals = globals; + return error; + } + + + FT_LOCAL_DEF( void ) + af_face_globals_free( AF_FaceGlobals globals ) + { + if ( globals ) + { + FT_Memory memory = globals->face->memory; + FT_UInt nn; + + for ( nn = 0; nn < AF_SCRIPT_MAX; nn++ ) + { + if ( globals->metrics[nn] ) + { + AF_ScriptClass clazz = af_script_classes[nn]; + + FT_ASSERT( globals->metrics[nn]->clazz == clazz ); + + if ( clazz->script_metrics_done ) + clazz->script_metrics_done( globals->metrics[nn] ); + + FT_FREE( globals->metrics[nn] ); + } + } + + globals->glyph_count = 0; + globals->glyph_scripts = NULL; /* no need to free this one !! */ + globals->face = NULL; + FT_FREE( globals ); + } + } + + + FT_LOCAL_DEF( FT_Error ) + af_face_globals_get_metrics( AF_FaceGlobals globals, + FT_UInt gindex, + AF_ScriptMetrics *ametrics ) + { + AF_ScriptMetrics metrics = NULL; + FT_UInt index; + AF_ScriptClass clazz; + FT_Error error = 0; + + if ( gindex >= globals->glyph_count ) + { + error = FT_Err_Invalid_Argument; + goto Exit; + } + + index = globals->glyph_scripts[ gindex ]; + clazz = af_script_classes[ index ]; + metrics = globals->metrics[ clazz->script ]; + if ( metrics == NULL ) + { + /* create the global metrics object when needed + */ + FT_Memory memory = globals->face->memory; + + if ( FT_ALLOC( metrics, clazz->script_metrics_size ) ) + goto Exit; + + metrics->clazz = clazz; + + if ( clazz->script_metrics_init ) + { + error = clazz->script_metrics_init( metrics, globals->face ); + if ( error ) + { + if ( clazz->script_metrics_done ) + clazz->script_metrics_done( metrics ); + + FT_FREE( metrics ); + goto Exit; + } + } + + globals->metrics[ clazz->script ] = metrics; + } + + Exit: + *ametrics = metrics; + return error; + } |