ref: 47bf95dd705962679ba50aace24361066db777a1
parent: ce94c7a9aacb47b8a9df9bb59233ba2a36c594cb
author: Werner Lemberg <[email protected]>
date: Tue Jan 17 11:55:32 EST 2006
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.
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@
+2006-01-17 Werner Lemberg <[email protected]>
+
+ 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 <[email protected]>
* src/psaux/afmparse.c, src/psaux/afmparse.h: New files which
--- a/include/freetype/freetype.h
+++ b/include/freetype/freetype.h
@@ -147,7 +147,6 @@
/* FT_Attach_File */
/* FT_Attach_Stream */
/* */
- /* FT_Select_Size */
/* FT_Size_Request_Type */
/* FT_Size_Request */
/* FT_Request_Size */
@@ -1976,11 +1975,11 @@
/* Select a bitmap strike. */
/* */
/* <InOut> */
- /* face :: A handle to a target face object. */
+ /* face :: A handle to a target face object. */
/* */
/* <Input> */
- /* 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. */
/* */
/* <Return> */
/* FreeType error code. 0 means success. */
@@ -1987,7 +1986,7 @@
/* */
FT_EXPORT( FT_Error )
FT_Select_Size( FT_Face face,
- FT_Int index );
+ FT_Int idx );
/*************************************************************************/
--- 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,171 +144,51 @@
/* 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 );
}
@@ -322,7 +195,7 @@
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,
--- 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 @@
/*************************************************************************/
/* 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;
--- 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;
}
}
--- a/src/psaux/afmparse.h
+++ b/src/psaux/afmparse.h
@@ -53,10 +53,10 @@
};
- typedef struct
+ typedef struct AFM_ValueRec_
{
enum AFM_ValueType_ type;
- union {
+ union {
char* s;
FT_Fixed f;
FT_Int i;
--- 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 );
--- 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 );
}
}