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.
This commit is contained in:
Werner Lemberg 2006-01-17 16:55:32 +00:00
parent ce94c7a9aa
commit 47bf95dd70
8 changed files with 79 additions and 207 deletions

View File

@ -1,3 +1,23 @@
2006-01-17 Werner Lemberg <wl@gnu.org>
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 <b90201047@ntu.edu.tw>
* src/psaux/afmparse.c, src/psaux/afmparse.h: New files which

View File

@ -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. */
/* */
/* <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. */
/* */
FT_EXPORT( FT_Error )
FT_Select_Size( FT_Face face,
FT_Int index );
FT_Int idx );
/*************************************************************************/

View File

@ -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,

View File

@ -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;

View File

@ -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;
}
}

View File

@ -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;

View File

@ -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 );

View File

@ -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 );
}
}