diff --git a/ChangeLog b/ChangeLog index cd1db7bc8..8132b998d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2002-02-10 Roberto Alameda + + Add support for ISOLatin1 PS encoding. + + * include/freetype/freetype.h (ft_encoding_latin_1): New tag + (`lat1'). + * include/freetype/internal/t1types.h (T1_Encoding_Type): Add + `t1_encoding_isolatin1'. + * src/type1/t1driver.c (Get_Char_Index, Get_Next_Char): Handle + ft_encoding_latin_1. + * src/type1/t1load.c (parse_encoding): Handle `ISOLatin1Encoding'. + * src/type1/t1objs.c (T1_Face_Init): Handle `t1_encoding_isolatin1'. + 2002-02-09 Werner Lemberg * README: Fix typo. diff --git a/include/freetype/freetype.h b/include/freetype/freetype.h index 40a4e659b..c36aacbca 100644 --- a/include/freetype/freetype.h +++ b/include/freetype/freetype.h @@ -395,6 +395,7 @@ FT_BEGIN_HEADER FT_ENC_TAG( ft_encoding_symbol, 's', 'y', 'm', 'b' ), FT_ENC_TAG( ft_encoding_unicode, 'u', 'n', 'i', 'c' ), + FT_ENC_TAG( ft_encoding_latin_1, 'l', 'a', 't', '1' ), FT_ENC_TAG( ft_encoding_latin_2, 'l', 'a', 't', '2' ), FT_ENC_TAG( ft_encoding_sjis, 's', 'j', 'i', 's' ), FT_ENC_TAG( ft_encoding_gb2312, 'g', 'b', ' ', ' ' ), diff --git a/include/freetype/internal/t1types.h b/include/freetype/internal/t1types.h index e561acb8d..cc76b0335 100644 --- a/include/freetype/internal/t1types.h +++ b/include/freetype/internal/t1types.h @@ -80,6 +80,7 @@ FT_BEGIN_HEADER t1_encoding_none = 0, t1_encoding_array, t1_encoding_standard, + t1_encoding_isolatin1, t1_encoding_expert } T1_EncodingType; diff --git a/src/type1/t1driver.c b/src/type1/t1driver.c index b5bf444bf..0e9c3b82d 100644 --- a/src/type1/t1driver.c +++ b/src/type1/t1driver.c @@ -273,6 +273,24 @@ result = 0; goto Exit; + /*******************************************************************/ + /* */ + /* ISOLatin1 encoding support */ + /* */ + case ft_encoding_latin_1: + /* ISOLatin1 is the first page of Unicode */ + if ( charcode < 256 && psnames->unicode_value ) + { + result = psnames->lookup_unicode( &face->unicode_map, + (FT_ULong)charcode ); + + /* the function returns 0xFFFF if the Unicode charcode has */ + /* no corresponding glyph */ + if ( result == 0xFFFF ) + result = 0; + } + goto Exit; + /*******************************************************************/ /* */ /* Custom Type 1 encoding */ @@ -365,6 +383,23 @@ return psnames->next_unicode( &face->unicode_map, (FT_ULong)charcode ); + /*******************************************************************/ + /* */ + /* ISOLatin1 encoding support */ + /* */ + case ft_encoding_latin_1: + { + FT_Long code; + + + /* use the `PSNames' module to synthetize the Unicode charmap */ + code = psnames->next_unicode( &face->unicode_map, + (FT_ULong)charcode ); + if ( code < 256 ) + return code; + break; + } + /*******************************************************************/ /* */ /* Custom Type 1 encoding */ @@ -426,9 +461,9 @@ { { ft_module_font_driver | - ft_module_driver_scalable | + ft_module_driver_scalable | ft_module_driver_has_hinter, - + sizeof( FT_DriverRec ), "type1", @@ -466,7 +501,7 @@ (FTDriver_attachFile) T1_Read_AFM, #endif (FTDriver_getAdvances) 0, - + (FTDriver_getNextChar) Get_Next_Char }; diff --git a/src/type1/t1load.c b/src/type1/t1load.c index 69116f0c6..8b512a51a 100644 --- a/src/type1/t1load.c +++ b/src/type1/t1load.c @@ -1082,6 +1082,10 @@ strncmp( (const char*)cur, "ExpertEncoding", 14 ) == 0 ) face->type1.encoding_type = t1_encoding_expert; + else if ( cur + 18 < limit && + strncmp( (const char*)cur, "ISOLatin1Encoding", 17 ) == 0 ) + face->type1.encoding_type = t1_encoding_isolatin1; + else { FT_ERROR(( "parse_encoding: invalid token!\n" )); diff --git a/src/type1/t1objs.c b/src/type1/t1objs.c index dfe812523..172ee51e4 100644 --- a/src/type1/t1objs.c +++ b/src/type1/t1objs.c @@ -61,7 +61,7 @@ T1_Face face = (T1_Face) size->root.face; PSHinter_Interface* pshinter = face->pshinter; FT_Module module; - + module = FT_Get_Module( size->root.face->driver->root.library, "pshinter" ); @@ -77,7 +77,7 @@ if ( size->root.internal ) { PSH_Globals_Funcs funcs; - + funcs = T1_Size_Get_Globals_Funcs( size ); if ( funcs ) @@ -93,20 +93,20 @@ { FT_Error error = 0; PSH_Globals_Funcs funcs = T1_Size_Get_Globals_Funcs( size ); - + if ( funcs ) { PSH_Globals globals; T1_Face face = (T1_Face)size->root.face; - - error = funcs->create( size->root.face->memory, + + error = funcs->create( size->root.face->memory, &face->type1.private_dict, &globals ); if ( !error ) size->root.internal = (FT_Size_Internal)(void*)globals; } - + return error; } @@ -117,7 +117,7 @@ PSH_Globals_Funcs funcs = T1_Size_Get_Globals_Funcs( size ); FT_Error error = 0; - + if ( funcs ) error = funcs->set_scale( (PSH_Globals)size->root.internal, size->root.metrics.x_scale, @@ -142,29 +142,29 @@ FT_LOCAL_DEF FT_Error T1_GlyphSlot_Init( T1_GlyphSlot slot ) - { + { T1_Face face; PSHinter_Interface* pshinter; - + face = (T1_Face) slot->root.face; pshinter = face->pshinter; if (pshinter) { FT_Module module; - + module = FT_Get_Module( slot->root.face->driver->root.library, "pshinter" ); if (module) { T1_Hints_Funcs funcs; - + funcs = pshinter->get_t1_funcs( module ); slot->root.internal->glyph_hints = (void*)funcs; } } return 0; } - - + + /*************************************************************************/ /* */ /* FACE FUNCTIONS */ @@ -304,7 +304,7 @@ face->psaux = psaux; } - + pshinter = (PSHinter_Interface*)face->pshinter; if ( !pshinter ) { @@ -372,7 +372,7 @@ family++; full++; } - + root->style_name = ( *full == ' ' ? full + 1 : (char *)"Regular" ); } @@ -489,10 +489,20 @@ charmap->encoding_id = 1; break; - default: + case t1_encoding_array: charmap->encoding = ft_encoding_adobe_custom; charmap->encoding_id = 2; break; + + case t1_encoding_isolatin1: + charmap->encoding = ft_encoding_latin_1; + charmap->encoding_id = 3; + break; + + default: + FT_ERROR(( "T1_Face_Init: invalid encoding\n" )); + error = T1_Err_Invalid_File_Format; + goto Exit; } root->charmaps = face->charmaps;