зеркало из https://github.com/stride3d/freetype.git
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:
Родитель
ce94c7a9aa
Коммит
47bf95dd70
20
ChangeLog
20
ChangeLog
|
@ -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
|
||||
|
|
|
@ -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 );
|
||||
|
||||
|
||||
/*************************************************************************/
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче