From 47bf95dd705962679ba50aace24361066db777a1 Mon Sep 17 00:00:00 2001 From: Werner Lemberg Date: Tue, 17 Jan 2006 16:55:32 +0000 Subject: [PATCH] Use pscmap service in CFF module. * src/cff/cffcmap.c (cff_cmap_uni_pair_compare): Removed. (cff_sid_to_glyph_name): New function. (cff_cmap_unicode_init, cff_cmap_unicode_done, cff_cmap_unicode_char_index, cff_cmap_unicode_char next): Use pscmap service. (cff_cmap_unicode_class_rec): Updated. * src/cff/cffcmap.h (CFF_CMapUnicode, CFF_CMap_UniPair): Removed. * src/psnames/psmodule.c (ps_unicodes_char_next): Fix `unicode' return value. * src/psaux/afmparse.c (afm_parser_read_vals): Use double casting to avoid type-punning compiler warnings. --- ChangeLog | 20 ++++ include/freetype/freetype.h | 9 +- src/cff/cffcmap.c | 193 ++++++------------------------------ src/cff/cffcmap.h | 20 +--- src/psaux/afmparse.c | 32 +++--- src/psaux/afmparse.h | 4 +- src/psaux/psconv.h | 2 +- src/psnames/psmodule.c | 6 +- 8 files changed, 79 insertions(+), 207 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9d5c0bf8..a1b78bc5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,23 @@ +2006-01-17 Werner Lemberg + + Use pscmap service in CFF module. + + * src/cff/cffcmap.c (cff_cmap_uni_pair_compare): Removed. + (cff_sid_to_glyph_name): New function. + (cff_cmap_unicode_init, cff_cmap_unicode_done, + cff_cmap_unicode_char_index, cff_cmap_unicode_char next): Use pscmap + service. + (cff_cmap_unicode_class_rec): Updated. + * src/cff/cffcmap.h (CFF_CMapUnicode, CFF_CMap_UniPair): Removed. + + + * src/psnames/psmodule.c (ps_unicodes_char_next): Fix `unicode' + return value. + + + * src/psaux/afmparse.c (afm_parser_read_vals): Use double casting + to avoid type-punning compiler warnings. + 2006-01-16 Chia-I Wu * src/psaux/afmparse.c, src/psaux/afmparse.h: New files which diff --git a/include/freetype/freetype.h b/include/freetype/freetype.h index c862e2cd..736987ee 100644 --- a/include/freetype/freetype.h +++ b/include/freetype/freetype.h @@ -147,7 +147,6 @@ FT_BEGIN_HEADER /* FT_Attach_File */ /* FT_Attach_Stream */ /* */ - /* FT_Select_Size */ /* FT_Size_Request_Type */ /* FT_Size_Request */ /* FT_Request_Size */ @@ -1976,18 +1975,18 @@ FT_BEGIN_HEADER /* Select a bitmap strike. */ /* */ /* */ - /* face :: A handle to a target face object. */ + /* face :: A handle to a target face object. */ /* */ /* */ - /* index :: The index of the bitmap strike in the `available_sizes' */ - /* field of @FT_FaceRec structure. */ + /* idx :: The index of the bitmap strike in the `available_sizes' */ + /* field of @FT_FaceRec structure. */ /* */ /* */ /* FreeType error code. 0 means success. */ /* */ FT_EXPORT( FT_Error ) FT_Select_Size( FT_Face face, - FT_Int index ); + FT_Int idx ); /*************************************************************************/ diff --git a/src/cff/cffcmap.c b/src/cff/cffcmap.c index 88169d0b..a486d344 100644 --- a/src/cff/cffcmap.c +++ b/src/cff/cffcmap.c @@ -4,7 +4,7 @@ /* */ /* CFF character mapping table (cmap) support (body). */ /* */ -/* Copyright 2002, 2003, 2004, 2005 by */ +/* Copyright 2002, 2003, 2004, 2005, 2006 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -119,30 +119,23 @@ /*************************************************************************/ /*************************************************************************/ - FT_CALLBACK_DEF( FT_Int ) - cff_cmap_uni_pair_compare( const void* pair1, - const void* pair2 ) + const char * + cff_sid_to_glyph_name( CFF_Font cff, + FT_UInt idx ) { - FT_UInt32 u1 = ((CFF_CMapUniPair)pair1)->unicode; - FT_UInt32 u2 = ((CFF_CMapUniPair)pair2)->unicode; + CFF_Charset charset = &cff->charset; + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; + FT_UInt sid = charset->sids[idx]; - if ( u1 < u2 ) - return -1; - - if ( u1 > u2 ) - return +1; - - return 0; + return cff_index_get_sid_string( &cff->string_index, sid, psnames ); } FT_CALLBACK_DEF( FT_Error ) - cff_cmap_unicode_init( CFF_CMapUnicode cmap ) + cff_cmap_unicode_init( PS_Unicodes unicodes ) { - FT_Error error; - FT_UInt count; - TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); + TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); FT_Memory memory = FT_FACE_MEMORY( face ); CFF_Font cff = (CFF_Font)face->extra.data; CFF_Charset charset = &cff->charset; @@ -151,178 +144,58 @@ /* can't build Unicode map for CID-keyed font */ if ( !charset->sids ) - { - error = CFF_Err_Invalid_Argument; - goto Exit; - } + return CFF_Err_Invalid_Argument; - cmap->num_pairs = 0; - cmap->pairs = NULL; - - count = cff->num_glyphs; - - if ( !FT_NEW_ARRAY( cmap->pairs, count ) ) - { - FT_UInt n, new_count; - CFF_CMapUniPair pair; - FT_UInt32 uni_code; - - - pair = cmap->pairs; - for ( n = 0; n < count; n++ ) - { - FT_UInt sid = charset->sids[n]; - const char* gname; - - - gname = cff_index_get_sid_string( &cff->string_index, sid, psnames ); - - /* build unsorted pair table by matching glyph names */ - if ( gname ) - { - uni_code = psnames->unicode_value( gname ); - - if ( uni_code != 0 ) - { - pair->unicode = uni_code; - pair->gindex = n; - pair++; - } - - FT_FREE( gname ); - } - } - - new_count = (FT_UInt)( pair - cmap->pairs ); - if ( new_count == 0 ) - { - /* there are no unicode characters in here! */ - FT_FREE( cmap->pairs ); - error = CFF_Err_Invalid_Argument; - } - else - { - /* re-allocate if the new array is much smaller than the original */ - /* one */ - if ( new_count != count && new_count < count / 2 ) - { - (void)FT_RENEW_ARRAY( cmap->pairs, count, new_count ); - error = CFF_Err_Ok; - } - - /* sort the pairs table to allow efficient binary searches */ - ft_qsort( cmap->pairs, - new_count, - sizeof ( CFF_CMapUniPairRec ), - cff_cmap_uni_pair_compare ); - - cmap->num_pairs = new_count; - } - } - - Exit: - return error; + return psnames->unicodes_init( memory, + unicodes, + cff->num_glyphs, + (PS_Glyph_NameFunc)&cff_sid_to_glyph_name, + (FT_Pointer)cff ); } FT_CALLBACK_DEF( void ) - cff_cmap_unicode_done( CFF_CMapUnicode cmap ) + cff_cmap_unicode_done( PS_Unicodes unicodes ) { - FT_Face face = FT_CMAP_FACE( cmap ); + FT_Face face = FT_CMAP_FACE( unicodes ); FT_Memory memory = FT_FACE_MEMORY( face ); - FT_FREE( cmap->pairs ); - cmap->num_pairs = 0; + FT_FREE( unicodes->maps ); + unicodes->num_maps = 0; } FT_CALLBACK_DEF( FT_UInt ) - cff_cmap_unicode_char_index( CFF_CMapUnicode cmap, - FT_UInt32 char_code ) + cff_cmap_unicode_char_index( PS_Unicodes unicodes, + FT_UInt32 char_code ) { - FT_UInt min = 0; - FT_UInt max = cmap->num_pairs; - FT_UInt mid; - CFF_CMapUniPair pair; + TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); + CFF_Font cff = (CFF_Font)face->extra.data; + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; - while ( min < max ) - { - mid = min + ( max - min ) / 2; - pair = cmap->pairs + mid; - - if ( pair->unicode == char_code ) - return pair->gindex; - - if ( pair->unicode < char_code ) - min = mid + 1; - else - max = mid; - } - return 0; + return psnames->unicodes_char_index( unicodes, char_code ); } FT_CALLBACK_DEF( FT_UInt ) - cff_cmap_unicode_char_next( CFF_CMapUnicode cmap, - FT_UInt32 *pchar_code ) + cff_cmap_unicode_char_next( PS_Unicodes unicodes, + FT_UInt32 *pchar_code ) { - FT_UInt result = 0; - FT_UInt32 char_code = *pchar_code + 1; + TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); + CFF_Font cff = (CFF_Font)face->extra.data; + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; - Restart: - { - FT_UInt min = 0; - FT_UInt max = cmap->num_pairs; - FT_UInt mid; - CFF_CMapUniPair pair; - - - while ( min < max ) - { - mid = min + ( ( max - min ) >> 1 ); - pair = cmap->pairs + mid; - - if ( pair->unicode == char_code ) - { - result = pair->gindex; - if ( result != 0 ) - goto Exit; - - char_code++; - goto Restart; - } - - if ( pair->unicode < char_code ) - min = mid+1; - else - max = mid; - } - - /* we didn't find it, but we have a pair just above it */ - char_code = 0; - - if ( min < cmap->num_pairs ) - { - pair = cmap->pairs + min; - result = pair->gindex; - if ( result != 0 ) - char_code = pair->unicode; - } - } - - Exit: - *pchar_code = char_code; - return result; + return psnames->unicodes_char_next( unicodes, pchar_code ); } FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec cff_cmap_unicode_class_rec = { - sizeof ( CFF_CMapUnicodeRec ), + sizeof ( PS_UnicodesRec ), (FT_CMap_InitFunc) cff_cmap_unicode_init, (FT_CMap_DoneFunc) cff_cmap_unicode_done, diff --git a/src/cff/cffcmap.h b/src/cff/cffcmap.h index ceb32cd3..f3d8e7af 100644 --- a/src/cff/cffcmap.h +++ b/src/cff/cffcmap.h @@ -4,7 +4,7 @@ /* */ /* CFF character mapping table (cmap) support (specification). */ /* */ -/* Copyright 2002, 2003 by */ +/* Copyright 2002, 2003, 2006 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -56,24 +56,6 @@ FT_BEGIN_HEADER /*************************************************************************/ /* unicode (synthetic) cmaps */ - typedef struct CFF_CMapUnicodeRec_* CFF_CMapUnicode; - - typedef struct CFF_CMapUniPairRec_ - { - FT_UInt32 unicode; - FT_UInt gindex; - - } CFF_CMapUniPairRec, *CFF_CMapUniPair; - - - typedef struct CFF_CMapUnicodeRec_ - { - FT_CMapRec cmap; - FT_UInt num_pairs; - CFF_CMapUniPair pairs; - - } CFF_CMapUnicodeRec; - FT_CALLBACK_TABLE const FT_CMap_ClassRec cff_cmap_unicode_class_rec; diff --git a/src/psaux/afmparse.c b/src/psaux/afmparse.c index 4c6f94fa..fa33fba7 100644 --- a/src/psaux/afmparse.c +++ b/src/psaux/afmparse.c @@ -383,10 +383,11 @@ for ( i = 0; i < n; i++ ) { - FT_UInt len; + FT_UInt len; + AFM_Value val = vals + i; - if ( vals[i].type == AFM_VALUE_TYPE_STRING ) + if ( val->type == AFM_VALUE_TYPE_STRING ) str = afm_stream_read_string( stream ); else str = afm_stream_read_one( stream ); @@ -396,41 +397,38 @@ len = AFM_STREAM_KEY_LEN( stream, str ); - switch ( vals[i].type ) + switch ( val->type ) { case AFM_VALUE_TYPE_STRING: case AFM_VALUE_TYPE_NAME: if ( !FT_QAlloc( parser->memory, len + 1, - (void**)&vals[i].u.s ) ) + (void**)&(val->u.s) ) ) { - ft_memcpy( vals[i].u.s, str, len ); - vals[i].u.s[len] = '\0'; + ft_memcpy( val->u.s, str, len ); + val->u.s[len] = '\0'; } break; case AFM_VALUE_TYPE_FIXED: - vals[i].u.f = PS_Conv_ToFixed( (FT_Byte**)&str, - (FT_Byte*)str + len, - 0 ); + val->u.f = PS_Conv_ToFixed( (FT_Byte**)(void*)&str, + (FT_Byte*)str + len, 0 ); break; case AFM_VALUE_TYPE_INTEGER: - vals[i].u.i = PS_Conv_ToInt( (FT_Byte**)&str, - (FT_Byte*)str + len ); + val->u.i = PS_Conv_ToInt( (FT_Byte**)(void*)&str, + (FT_Byte*)str + len ); break; case AFM_VALUE_TYPE_BOOL: - vals[i].u.b = ( len == 4 && - ft_strncmp( str, "true", 4 ) == 0 ); + val->u.b = ( len == 4 && + ft_strncmp( str, "true", 4 ) == 0 ); break; case AFM_VALUE_TYPE_INDEX: if ( parser->get_index ) - vals[i].u.i = parser->get_index( str, - len, - parser->user_data ); + val->u.i = parser->get_index( str, len, parser->user_data ); else - vals[i].u.i = 0; + val->u.i = 0; break; } } diff --git a/src/psaux/afmparse.h b/src/psaux/afmparse.h index 11eadcdf..192727a0 100644 --- a/src/psaux/afmparse.h +++ b/src/psaux/afmparse.h @@ -53,10 +53,10 @@ FT_BEGIN_HEADER }; - typedef struct + typedef struct AFM_ValueRec_ { enum AFM_ValueType_ type; - union { + union { char* s; FT_Fixed f; FT_Int i; diff --git a/src/psaux/psconv.h b/src/psaux/psconv.h index 61b24d53..82c37078 100644 --- a/src/psaux/psconv.h +++ b/src/psaux/psconv.h @@ -26,7 +26,7 @@ FT_BEGIN_HEADER - FT_LOCAL_DEF( FT_Int ) + FT_LOCAL( FT_Int ) PS_Conv_Strtol( FT_Byte** cursor, FT_Byte* limit, FT_Int base ); diff --git a/src/psnames/psmodule.c b/src/psnames/psmodule.c index 144a991a..631eafd0 100644 --- a/src/psnames/psmodule.c +++ b/src/psnames/psmodule.c @@ -345,9 +345,9 @@ if ( min < table->num_maps ) { - map = table->maps + min; - result = map->glyph_index; - char_code = map->unicode; + map = table->maps + min; + result = map->glyph_index; + char_code = BASE_GLYPH( map->unicode ); } }