* src/psaux/t1cmap.h, src/psaux/t1cmap.c, src/type1/t1cmap.h,

src/type1/t1cmap.c: updating and moving the Type 1 FT_CMap support
        from "src/type1" to "src/psaux" since it's going to be shared
        by the Type 1 and CID font drivers..

        * src/psaux/Jamfile, src/psaux/psaux.c, src/psaux/psauxmod.c,
        src/psaux/rules.mk, include/freetype/internal/psaux.h: added support
        for Type 1 FT_CMaps.
This commit is contained in:
David Turner 2002-03-21 15:02:54 +00:00
parent e2f4e52ac8
commit 42372fd4d8
10 changed files with 473 additions and 227 deletions

View File

@ -1,3 +1,17 @@
2002-03-21 David Turner <david@freetype.org>
* src/base/ftobjs.c, src/pcf/pcfdriver.c, src/pcf/pcfread.c: updated
to new FT_CMap definitions
* src/psaux/t1cmap.h, src/psaux/t1cmap.c, src/type1/t1cmap.h,
src/type1/t1cmap.c: updating and moving the Type 1 FT_CMap support
from "src/type1" to "src/psaux" since it's going to be shared
by the Type 1 and CID font drivers..
* src/psaux/Jamfile, src/psaux/psaux.c, src/psaux/psauxmod.c,
src/psaux/rules.mk, include/freetype/internal/psaux.h: added support
for Type 1 FT_CMaps.
2002-03-20 David Turner <david@freetype.org> 2002-03-20 David Turner <david@freetype.org>
* src/base/ftgloadr.c (FT_GlyphLoader_CheckSubGlyphs): fixed a memory * src/base/ftgloadr.c (FT_GlyphLoader_CheckSubGlyphs): fixed a memory

View File

@ -651,6 +651,25 @@ FT_BEGIN_HEADER
} T1_DecoderRec; } T1_DecoderRec;
/*************************************************************************/
/*************************************************************************/
/***** *****/
/***** TYPE1 CHARMAPS *****/
/***** *****/
/*************************************************************************/
/*************************************************************************/
typedef const struct T1_CMap_ClassesRec_* T1_CMap_Classes;
typedef struct T1_CMap_ClassesRec_
{
FT_CMap_Class standard;
FT_CMap_Class expert;
FT_CMap_Class custom;
FT_CMap_Class unicode;
} T1_CMap_ClassesRec;
/*************************************************************************/ /*************************************************************************/
/*************************************************************************/ /*************************************************************************/
@ -660,7 +679,7 @@ FT_BEGIN_HEADER
/*************************************************************************/ /*************************************************************************/
/*************************************************************************/ /*************************************************************************/
typedef struct PSAux_Interface_ typedef struct PSAux_ServiceRec_
{ {
const PS_Table_Funcs ps_table_funcs; const PS_Table_Funcs ps_table_funcs;
const PS_Parser_Funcs ps_parser_funcs; const PS_Parser_Funcs ps_parser_funcs;
@ -672,9 +691,12 @@ FT_BEGIN_HEADER
FT_Offset length, FT_Offset length,
FT_UShort seed ); FT_UShort seed );
} PSAux_Interface; T1_CMap_Classes t1_cmap_classes;
typedef PSAux_Interface* PSAux_Service; } PSAux_ServiceRec, *PSAux_Service;
/* backwards-compatible type definition */
typedef PSAux_ServiceRec PSAux_Interface;
FT_END_HEADER FT_END_HEADER

View File

@ -37,6 +37,198 @@ THE SOFTWARE.
#include "pcferror.h" #include "pcferror.h"
#undef FT_COMPONENT
#define FT_COMPONENT trace_pcfread
#ifdef FT_CONFIG_OPTION_USE_CMAPS
typedef struct PCF_CMapRec_
{
FT_CMapRec cmap;
FT_UInt num_encodings;
PCF_Encoding encodings;
} PCF_CMapRec, *PCF_CMap;
FT_CALLBACK_DEF( FT_Error )
pcf_cmap_init( PCF_CMap cmap )
{
PCF_Face face = (PCF_Face) FT_CMAP_FACE(cmap);
cmap->num_encodings = (FT_UInt) face->nencodings;
cmap->encodings = face->encodings;
return FT_Err_Ok;
}
FT_CALLBACK_DEF( void )
pcf_cmap_done( PCF_CMap cmap )
{
cmap->encodings = NULL;
cmap->num_encodings = 0;
}
FT_CALLBACK_DEF( FT_UInt )
pcf_cmap_char_index( FT_CMap cmap,
FT_UInt32 charcode )
{
PCF_Encoding encoding = cmap->encodings;
FT_UInt min, max, mid;
FT_UInt result = 0;
min = 0;
max = cmap->num_encodings;
while ( min < max )
{
FT_UInt32 code;
mid = ( min + max ) >> 1;
code = encodings[mid].enc;
if ( charcode == code )
{
result = encodings[mid].glyph;
break;
}
if ( charcode < code )
max = mid;
else
min = mid+1;
}
return result;
}
FT_CALLBACK_DEF( FT_UInt )
pcf_cmap_char_next( PCF_CMap cmap,
FT_UInt32 *acharcode )
{
PCF_Encoding encodings = cmap->encodings;
FT_UInt min, max, mid;
FT_UInt32 charcode = *acharcode + 1;
FT_UInt result = 0;
min = 0;
max = cmap->num_encodings;
while ( min < max )
{
FT_UInt32 code;
mid = ( min + max ) >> 1;
code = encodings[mid].enc;
if ( charcode == code )
{
result = encodings[mid].glyph;
goto Exit;
}
if ( charcode < code )
max = mid;
else
min = mid+1;
}
charcode = 0;
if ( ++min < cmap->num_encodings )
{
charcode = encodings[min].enc;
glyph = encodings[min].glyph;
}
Exit:
*acharcode = charcode;
return result;
}
FT_CALLBACK_TABLE const FT_CMap_ClassRec pcf_cmap_class =
{
sizeof( PCF_CMapRec ),
(FT_CMap_InitFunc) pcf_cmap_init,
(FT_CMap_DoneFunc) pcf_cmap_done,
(FT_CMap_CharIndexFunc) pcf_cmap_char_index,
(FT_CMap_CharNextFunc) pcf_cmap_char_next
};
#else /* !FT_CONFIG_OPTION_USE_CMAPS */
static FT_UInt
PCF_Char_Get_Index( FT_CharMap charmap,
FT_Long char_code )
{
PCF_Face face = (PCF_Face)charmap->face;
PCF_Encoding en_table = face->encodings;
int low, high, mid;
FT_TRACE4(( "get_char_index %ld\n", char_code ));
low = 0;
high = face->nencodings - 1;
while ( low <= high )
{
mid = ( low + high ) / 2;
if ( char_code < en_table[mid].enc )
high = mid - 1;
else if ( char_code > en_table[mid].enc )
low = mid + 1;
else
return en_table[mid].glyph;
}
return 0;
}
static FT_Long
PCF_Char_Get_Next( FT_CharMap charmap,
FT_Long char_code )
{
PCF_Face face = (PCF_Face)charmap->face;
PCF_Encoding en_table = face->encodings;
int low, high, mid;
FT_TRACE4(( "get_next_char %ld\n", char_code ));
char_code++;
low = 0;
high = face->nencodings - 1;
while ( low <= high )
{
mid = ( low + high ) / 2;
if ( char_code < en_table[mid].enc )
high = mid - 1;
else if ( char_code > en_table[mid].enc )
low = mid + 1;
else
return char_code;
}
if ( high < 0 )
high = 0;
while ( high < face->nencodings )
{
if ( en_table[high].enc >= char_code )
return en_table[high].enc;
high++;
}
return 0;
}
#endif /* !FT_CONFIG_OPTION_USE_CMAPS */
/*************************************************************************/ /*************************************************************************/
/* */ /* */
@ -48,7 +240,7 @@ THE SOFTWARE.
#define FT_COMPONENT trace_pcfdriver #define FT_COMPONENT trace_pcfdriver
static FT_Error FT_CALLBACK_DEF( FT_Error )
PCF_Face_Done( PCF_Face face ) PCF_Face_Done( PCF_Face face )
{ {
FT_Memory memory = FT_FACE_MEMORY( face ); FT_Memory memory = FT_FACE_MEMORY( face );
@ -86,7 +278,7 @@ THE SOFTWARE.
} }
static FT_Error FT_CALLBACK_DEF( FT_Error )
PCF_Face_Init( FT_Stream stream, PCF_Face_Init( FT_Stream stream,
PCF_Face face, PCF_Face face,
FT_Int face_index, FT_Int face_index,
@ -104,13 +296,75 @@ THE SOFTWARE.
if ( error ) if ( error )
goto Fail; goto Fail;
return PCF_Err_Ok; /* set-up charmap */
{
FT_String *charset_registry, *charset_encoding;
FT_Face root = FT_FACE(face);
FT_Bool unicode_charmap = 0;
charset_registry = face->charset_registry;
charset_encoding = face->charset_encoding;
if ( ( charset_registry != NULL ) &&
( charset_encoding != NULL ) )
{
if ( !strcmp( face->charset_registry, "ISO10646" ) ||
( !strcmp( face->charset_registry, "ISO8859" ) &&
!strcmp( face->charset_encoding, "1" ) ) )
unicode_charmap = 1;
}
#ifdef FT_CONFIG_OPTION_USE_CMAPS
{
FT_CharMapRec charmap;
charmap.face = FT_FACE(face);
charmap.encoding = ft_encoding_none;
charmap.platform_id = 0;
charmap.encoding_id = 0;
if ( unicode_charmap )
{
charmap.encoding = ft_encoding_unicode;
charmap.platform_id = 3;
charmap.encoding_id = 1;
}
error = FT_CMap_New( &pcf_cmap_class, NULL, &charmap, NULL );
}
#else /* !FT_CONFIG_OPTION_USE_CMAPS */
/* XXX: charmaps. For now, report unicode for Unicode and Latin 1 */
root->charmaps = &face->charmap_handle;
root->num_charmaps = 1;
face->charmap.encoding = ft_encoding_none;
face->charmap.platform_id = 0;
face->charmap.encoding_id = 0;
if ( unicode_charmap )
{
face->charmap.encoding = ft_encoding_unicode;
face->charmap.platform_id = 3;
face->charmap.encoding_id = 1;
}
face->charmap.face = root;
face->charmap_handle = &face->charmap;
root->charmap = face->charmap_handle;
#endif /* !FT_CONFIG_OPTION_USE_CMAPS */
}
Exit:
return error;
Fail: Fail:
FT_TRACE2(( "[not a valid PCF file]\n" )); FT_TRACE2(( "[not a valid PCF file]\n" ));
PCF_Face_Done( face ); error = PCF_Err_Unknown_File_Format; /* error */
goto Exit;
return PCF_Err_Unknown_File_Format; /* error */
} }
@ -256,74 +510,6 @@ THE SOFTWARE.
} }
static FT_UInt
PCF_Char_Get_Index( FT_CharMap charmap,
FT_Long char_code )
{
PCF_Face face = (PCF_Face)charmap->face;
PCF_Encoding en_table = face->encodings;
int low, high, mid;
FT_TRACE4(( "get_char_index %ld\n", char_code ));
low = 0;
high = face->nencodings - 1;
while ( low <= high )
{
mid = ( low + high ) / 2;
if ( char_code < en_table[mid].enc )
high = mid - 1;
else if ( char_code > en_table[mid].enc )
low = mid + 1;
else
return en_table[mid].glyph;
}
return 0;
}
static FT_Long
PCF_Char_Get_Next( FT_CharMap charmap,
FT_Long char_code )
{
PCF_Face face = (PCF_Face)charmap->face;
PCF_Encoding en_table = face->encodings;
int low, high, mid;
FT_TRACE4(( "get_next_char %ld\n", char_code ));
char_code++;
low = 0;
high = face->nencodings - 1;
while ( low <= high )
{
mid = ( low + high ) / 2;
if ( char_code < en_table[mid].enc )
high = mid - 1;
else if ( char_code > en_table[mid].enc )
low = mid + 1;
else
return char_code;
}
if ( high < 0 )
high = 0;
while ( high < face->nencodings )
{
if ( en_table[high].enc >= char_code )
return en_table[high].enc;
high++;
}
return 0;
}
FT_CALLBACK_TABLE_DEF FT_CALLBACK_TABLE_DEF
const FT_Driver_ClassRec pcf_driver_class = const FT_Driver_ClassRec pcf_driver_class =
{ {
@ -353,17 +539,26 @@ THE SOFTWARE.
(FT_Slot_InitFunc)0, (FT_Slot_InitFunc)0,
(FT_Slot_DoneFunc)0, (FT_Slot_DoneFunc)0,
(FT_Size_ResetPointsFunc) PCF_Set_Pixel_Size, (FT_Size_ResetPointsFunc) PCF_Set_Pixel_Size,
(FT_Size_ResetPixelsFunc)PCF_Set_Pixel_Size, (FT_Size_ResetPixelsFunc) PCF_Set_Pixel_Size,
(FT_Slot_LoadFunc) PCF_Glyph_Load, (FT_Slot_LoadFunc) PCF_Glyph_Load,
#ifndef FT_CONFIG_OPTION_USE_CMAPS
(FT_CharMap_CharIndexFunc) PCF_Char_Get_Index, (FT_CharMap_CharIndexFunc) PCF_Char_Get_Index,
#else
(FT_CharMap_CharNextFunc) 0,
#endif
(FT_Face_GetKerningFunc) 0, (FT_Face_GetKerningFunc) 0,
(FT_Face_AttachFunc) 0, (FT_Face_AttachFunc) 0,
(FT_Face_GetAdvancesFunc) 0, (FT_Face_GetAdvancesFunc) 0,
#ifndef FT_CONFIG_OPTION_USE_CMAPS
(FT_CharMap_CharNextFunc) PCF_Char_Get_Next, (FT_CharMap_CharNextFunc) PCF_Char_Get_Next,
#else
(FT_CharMap_CharNextFunc) 0
#endif
}; };

View File

@ -866,11 +866,11 @@ THE SOFTWARE.
error = pcf_read_TOC( stream, face ); error = pcf_read_TOC( stream, face );
if ( error ) if ( error )
return error; goto Exit;
error = pcf_get_properties( stream, face ); error = pcf_get_properties( stream, face );
if ( error ) if ( error )
return error;; goto Exit;
/* Use the old accelerators if no BDF accelerators are in the file. */ /* Use the old accelerators if no BDF accelerators are in the file. */
hasBDFAccelerators = pcf_has_table_type( face->toc.tables, hasBDFAccelerators = pcf_has_table_type( face->toc.tables,
@ -880,30 +880,30 @@ THE SOFTWARE.
{ {
error = pcf_get_accel( stream, face, PCF_ACCELERATORS ); error = pcf_get_accel( stream, face, PCF_ACCELERATORS );
if ( error ) if ( error )
goto Bail; goto Exit;
} }
/* metrics */ /* metrics */
error = pcf_get_metrics( stream, face ); error = pcf_get_metrics( stream, face );
if ( error ) if ( error )
goto Bail; goto Exit;
/* bitmaps */ /* bitmaps */
error = pcf_get_bitmaps( stream, face ); error = pcf_get_bitmaps( stream, face );
if ( error ) if ( error )
goto Bail; goto Exit;
/* encodings */ /* encodings */
error = pcf_get_encodings( stream, face ); error = pcf_get_encodings( stream, face );
if ( error ) if ( error )
goto Bail; goto Exit;
/* BDF style accelerators (i.e. bounds based on encoded glyphs) */ /* BDF style accelerators (i.e. bounds based on encoded glyphs) */
if ( hasBDFAccelerators ) if ( hasBDFAccelerators )
{ {
error = pcf_get_accel( stream, face, PCF_BDF_ACCELERATORS ); error = pcf_get_accel( stream, face, PCF_BDF_ACCELERATORS );
if ( error ) if ( error )
goto Bail; goto Exit;
} }
/* XXX: TO DO: inkmetrics and glyph_names are missing */ /* XXX: TO DO: inkmetrics and glyph_names are missing */
@ -958,7 +958,7 @@ THE SOFTWARE.
if ( ALLOC( root->family_name, l * sizeof ( char ) ) ) if ( ALLOC( root->family_name, l * sizeof ( char ) ) )
goto Bail; goto Exit;
strcpy( root->family_name, prop->value.atom ); strcpy( root->family_name, prop->value.atom );
} }
} }
@ -969,7 +969,7 @@ THE SOFTWARE.
root->num_fixed_sizes = 1; root->num_fixed_sizes = 1;
if ( ALLOC_ARRAY( root->available_sizes, 1, FT_Bitmap_Size ) ) if ( ALLOC_ARRAY( root->available_sizes, 1, FT_Bitmap_Size ) )
goto Bail; goto Exit;
prop = pcf_find_property( face, "PIXEL_SIZE" ); prop = pcf_find_property( face, "PIXEL_SIZE" );
if ( prop != NULL ) if ( prop != NULL )
@ -977,12 +977,6 @@ THE SOFTWARE.
root->available_sizes->height = root->available_sizes->height =
root->available_sizes->width = (FT_Short)( prop->value.integer ); root->available_sizes->width = (FT_Short)( prop->value.integer );
#if 0 /* average width property support removed until maturation */
prop = pcf_find_property( face, "AVERAGE_WIDTH" );
if ( prop != NULL )
root->available_sizes->width = (FT_Short)( prop->value.integer / 10 );
#endif
size_set = 1; size_set = 1;
} }
else else
@ -1003,12 +997,6 @@ THE SOFTWARE.
(FT_Short)( prop->value.integer * (FT_Short)( prop->value.integer *
yres->value.integer / 720 ); yres->value.integer / 720 );
#if 0 /* average width property support removed until maturation */
if ( avgw != NULL )
root->available_sizes->width =
(FT_Short)( avgw->value.integer / 10 );
else
#endif
root->available_sizes->width = root->available_sizes->width =
(FT_Short)( prop->value.integer * (FT_Short)( prop->value.integer *
xres->value.integer / 720 ); xres->value.integer / 720 );
@ -1020,23 +1008,14 @@ THE SOFTWARE.
if (size_set == 0 ) if (size_set == 0 )
{ {
#if 0
printf( "PCF Warning: Pixel Size undefined, assuming 12\n");
#endif
root->available_sizes->width = 12; root->available_sizes->width = 12;
root->available_sizes->height = 12; root->available_sizes->height = 12;
} }
/* XXX: charmaps. For now, report unicode for Unicode and Latin 1 */ /* set-up charset */
root->charmaps = &face->charmap_handle;
root->num_charmaps = 1;
face->charmap.encoding = ft_encoding_none;
face->charmap.platform_id = 0;
face->charmap.encoding_id = 0;
{ {
PCF_Property charset_registry = 0, charset_encoding = 0; PCF_Property charset_registry = 0, charset_encoding = 0;
FT_Bool unicode_charmap = 0;
charset_registry = pcf_find_property( face, "CHARSET_REGISTRY" ); charset_registry = pcf_find_property( face, "CHARSET_REGISTRY" );
@ -1051,34 +1030,29 @@ THE SOFTWARE.
if ( ALLOC( face->charset_encoding, if ( ALLOC( face->charset_encoding,
( strlen( charset_encoding->value.atom ) + 1 ) * ( strlen( charset_encoding->value.atom ) + 1 ) *
sizeof ( char ) ) ) sizeof ( char ) ) )
goto Bail; goto Exit;
if ( ALLOC( face->charset_registry, if ( ALLOC( face->charset_registry,
( strlen( charset_registry->value.atom ) + 1 ) * ( strlen( charset_registry->value.atom ) + 1 ) *
sizeof ( char ) ) ) sizeof ( char ) ) )
goto Bail; goto Exit;
strcpy( face->charset_registry, charset_registry->value.atom ); strcpy( face->charset_registry, charset_registry->value.atom );
strcpy( face->charset_encoding, charset_encoding->value.atom ); strcpy( face->charset_encoding, charset_encoding->value.atom );
if ( !strcmp( face->charset_registry, "ISO10646" ) ||
( !strcmp( face->charset_registry, "ISO8859" ) &&
!strcmp( face->charset_encoding, "1" ) ) )
{
face->charmap.encoding = ft_encoding_unicode;
face->charmap.platform_id = 3;
face->charmap.encoding_id = 1;
}
} }
} }
} }
face->charmap.face = root;
face->charmap_handle = &face->charmap;
root->charmap = face->charmap_handle;
} }
return PCF_Err_Ok;
Bail: Exit:
return PCF_Err_Invalid_File_Format; if (error)
{
/* this is done to respect the behaviour of the original */
/* PCF font driver.. */
error = PCF_Err_Invalid_File_Format;
}
return error;
} }

View File

@ -10,7 +10,7 @@ SubDirHdrs [ FT2_SubDir src psaux ] ;
if $(FT2_MULTI) if $(FT2_MULTI)
{ {
_sources = psauxmod psobjs t1decode ; _sources = psauxmod psobjs t1decode t1cmap ;
} }
else else
{ {

View File

@ -22,6 +22,7 @@
#include "psobjs.c" #include "psobjs.c"
#include "psauxmod.c" #include "psauxmod.c"
#include "t1decode.c" #include "t1decode.c"
#include "t1cmap.c"
/* END */ /* END */

View File

@ -20,6 +20,7 @@
#include "psauxmod.h" #include "psauxmod.h"
#include "psobjs.h" #include "psobjs.h"
#include "t1decode.h" #include "t1decode.h"
#include "t1cmap.h"
FT_CALLBACK_TABLE_DEF FT_CALLBACK_TABLE_DEF
@ -73,6 +74,16 @@
}; };
FT_CALLBACK_TABLE_DEF
const T1_CMap_ClassesRec t1_cmap_classes =
{
&t1_cmap_standard_class_rec,
&t1_cmap_expert_class_rec,
&t1_cmap_custom_class_rec,
&t1_cmap_unicode_class_rec
};
static static
const PSAux_Interface psaux_interface = const PSAux_Interface psaux_interface =
{ {
@ -81,7 +92,9 @@
&t1_builder_funcs, &t1_builder_funcs,
&t1_decoder_funcs, &t1_decoder_funcs,
T1_Decrypt T1_Decrypt,
(const T1_CMap_ClassesRec*) &t1_cmap_classes,
}; };

View File

@ -28,6 +28,7 @@ PSAUX_COMPILE := $(FT_COMPILE) $I$(PSAUX_DIR)
# #
PSAUX_DRV_SRC := $(PSAUX_DIR_)psobjs.c \ PSAUX_DRV_SRC := $(PSAUX_DIR_)psobjs.c \
$(PSAUX_DIR_)t1decode.c \ $(PSAUX_DIR_)t1decode.c \
$(PSAUX_DIR_)t1cmap.c \
$(PSAUX_DIR_)psauxmod.c $(PSAUX_DIR_)psauxmod.c
# PSAUX driver headers # PSAUX driver headers

View File

@ -1,4 +1,7 @@
#include "t1cmap.h" #include "t1cmap.h"
#include <stdlib.h>
#include FT_INTERNAL_DEBUG_H
/***************************************************************************/ /***************************************************************************/
/***************************************************************************/ /***************************************************************************/
@ -8,18 +11,18 @@
/***************************************************************************/ /***************************************************************************/
/***************************************************************************/ /***************************************************************************/
static( void ) static void
t1_cmap_std_init( T1_CMapStd cmap, t1_cmap_std_init( T1_CMapStd cmap,
FT_Int is_expert ) FT_Int is_expert )
{ {
T1_Face face = (T1_Face) FT_CMAP_FACE(cmap); T1_Face face = (T1_Face) FT_CMAP_FACE(cmap);
PSNames_Service psnames = face->psnames; PSNames_Service psnames = face->psnames;
cmap->num_glyphs = face->type1.num_glyphs; cmap->num_glyphs = face->type1.num_glyphs;
cmap->glyph_names = face->type1.glyph_names; cmap->glyph_names = face->type1.glyph_names;
cmap->sid_strings = sid_strings; cmap->sid_to_string = psnames->adobe_std_strings;
cmap->code_to_sid = is_expert ? psnames->adobe_expert_encoding cmap->code_to_sid = is_expert ? psnames->adobe_expert_encoding
: psnames->adobe_std_encoding; : psnames->adobe_std_encoding;
FT_ASSERT( cmap->code_to_sid != NULL ); FT_ASSERT( cmap->code_to_sid != NULL );
} }
@ -28,10 +31,10 @@
FT_CALLBACK_DEF( void ) FT_CALLBACK_DEF( void )
t1_cmap_std_done( T1_CMapStd cmap ) t1_cmap_std_done( T1_CMapStd cmap )
{ {
cmap->num_glyphs = 0; cmap->num_glyphs = 0;
cmap->glyph_names = NULL; cmap->glyph_names = NULL;
cmap->sid_strings = NULL; cmap->sid_to_string = NULL;
cmap->code_to_sid = NULL; cmap->code_to_sid = NULL;
} }
@ -43,13 +46,12 @@
if ( char_code < 256 ) if ( char_code < 256 )
{ {
FT_UInt code; FT_UInt code, n;
const char* glyph_name; const char* glyph_name;
FT_Int n;
/* conver character code to Adobe SID string */ /* conver character code to Adobe SID string */
code = cmap->code_to_sid[ char_code ]; code = cmap->code_to_sid[ char_code ];
glyph_name = cmap->adobe_sid_strings[ code ]; glyph_name = cmap->sid_to_string( code );
/* look for the corresponding glyph name */ /* look for the corresponding glyph name */
for ( n = 0; n < cmap->num_glyphs; n++ ) for ( n = 0; n < cmap->num_glyphs; n++ )
@ -77,7 +79,7 @@
while ( char_code < 256 ) while ( char_code < 256 )
{ {
result = t1_cmap_standard_char_index( cmap, char_code ); result = t1_cmap_std_char_index( cmap, char_code );
if ( result != 0 ) if ( result != 0 )
goto Exit; goto Exit;
@ -99,46 +101,39 @@
} }
FT_CALLBACK_TABLE const T1_CMap_ClassRec FT_LOCAL_DEF( const FT_CMap_ClassRec )
t1_cmap_standard_class_rec = t1_cmap_standard_class_rec =
{ {
sizeof( T1_CMapStdRec ), sizeof( T1_CMapStdRec ),
t1_cmap_standard_init, (FT_CMap_InitFunc) t1_cmap_standard_init,
t1_cmap_std_done, (FT_CMap_DoneFunc) t1_cmap_std_done,
t1_cmap_std_char_index, (FT_CMap_CharIndexFunc) t1_cmap_std_char_index,
t1_cmap_std_char_next (FT_CMap_CharNextFunc) t1_cmap_std_char_next
}; };
FT_LOCAL_DEF( T1_CMap_Class )
t1_cmap_standard_class = &t1_cmap_standard_class_rec;
FT_CALLBACK_DEF( FT_Error )
FT_CALLBACK_DEF( void )
t1_cmap_expert_init( T1_CMapStd cmap ) t1_cmap_expert_init( T1_CMapStd cmap )
{ {
t1_cmap_std_init( cmap, 1 ); t1_cmap_std_init( cmap, 1 );
return 0; return 0;
} }
FT_CALLBACK_TABLE const FT_CMap_ClassRec FT_LOCAL_DEF( const FT_CMap_ClassRec )
t1_cmap_expert_class_rec = t1_cmap_expert_class_rec =
{ {
sizeof( T1_CMapStdRec ), sizeof( T1_CMapStdRec ),
t1_cmap_expert_init, (FT_CMap_InitFunc) t1_cmap_expert_init,
t1_cmap_std_done, (FT_CMap_DoneFunc) t1_cmap_std_done,
t1_cmap_std_char_index, (FT_CMap_CharIndexFunc) t1_cmap_std_char_index,
t1_cmap_std_char_next (FT_CMap_CharNextFunc) t1_cmap_std_char_next
}; };
FT_LOCAL_DEF( FT_CMap_Class )
t1_cmap_expert_class = &t1_cmap_expert_class_rec;
/***************************************************************************/ /***************************************************************************/
@ -153,8 +148,8 @@
FT_CALLBACK_DEF( FT_Error ) FT_CALLBACK_DEF( FT_Error )
t1_cmap_custom_init( T1_CMapCustom cmap ) t1_cmap_custom_init( T1_CMapCustom cmap )
{ {
T1_Face face = (T1_Face) FT_CMAP_FACE(cmap); T1_Face face = (T1_Face) FT_CMAP_FACE(cmap);
T1_Encoding encoding = face->type1.encoding; T1_Encoding encoding = &face->type1.encoding;
cmap->first = encoding->code_first; cmap->first = encoding->code_first;
cmap->count = (FT_UInt)(encoding->code_last - cmap->first + 1); cmap->count = (FT_UInt)(encoding->code_last - cmap->first + 1);
@ -192,8 +187,8 @@
FT_CALLBACK_DEF( FT_UInt ) FT_CALLBACK_DEF( FT_UInt )
t1_cmap_custom_char_next( T1_CMapCustion cmap, t1_cmap_custom_char_next( T1_CMapCustom cmap,
FT_UInt32 *pchar_code ) FT_UInt32 *pchar_code )
{ {
FT_UInt result = 0; FT_UInt result = 0;
FT_UInt32 char_code = *pchar_code; FT_UInt32 char_code = *pchar_code;
@ -205,7 +200,7 @@
char_code = cmap->first; char_code = cmap->first;
index = (FT_UInt32)( char_code - cmap->first ); index = (FT_UInt32)( char_code - cmap->first );
while ( index < cmap->count; index++, char_code++ ) for ( ; index < cmap->count; index++, char_code++ )
{ {
result = cmap->indices[index]; result = cmap->indices[index];
if ( result != 0 ) if ( result != 0 )
@ -220,19 +215,17 @@
} }
FT_CALLBACK_TABLE const FT_CMap_ClassRec FT_LOCAL_DEF( const FT_CMap_ClassRec )
t1_cmap_custom_class_rec = t1_cmap_custom_class_rec =
{ {
sizeof( T1_CMapCustomRec ), sizeof( T1_CMapCustomRec ),
t1_cmap_custom_init, (FT_CMap_InitFunc) t1_cmap_custom_init,
t1_cmap_custom_done, (FT_CMap_DoneFunc) t1_cmap_custom_done,
t1_cmap_custom_char_index, (FT_CMap_CharIndexFunc) t1_cmap_custom_char_index,
t1_cmap_custom_char_next (FT_CMap_CharNextFunc) t1_cmap_custom_char_next
}; };
FT_LOCAL_DEF( FT_CMap_Class )
t1_cmap_custom_class = &t1_cmap_custom_class_rec;
/***************************************************************************/ /***************************************************************************/
@ -243,14 +236,32 @@
/***************************************************************************/ /***************************************************************************/
/***************************************************************************/ /***************************************************************************/
FT_CALLBACK_DEF( FT_Int )
t1_cmap_uni_pair_compare( const void* pair1,
const void* pair2 )
{
FT_UInt32 u1 = ((T1_CMapUniPair)pair1)->unicode;
FT_UInt32 u2 = ((T1_CMapUniPair)pair2)->unicode;
if ( u1 < u2 )
return -1;
if ( u1 > u2 )
return +1;
return 0;
}
FT_CALLBACK_DEF( FT_Error ) FT_CALLBACK_DEF( FT_Error )
t1_cmap_unicode_init( T1_CMapUnicode cmap ) t1_cmap_unicode_init( T1_CMapUnicode cmap )
{ {
FT_Error error; FT_Error error;
FT_UInt count; FT_UInt count;
T1_Face face = (T1_Face) FT_CMAP_FACE(cmap); T1_Face face = (T1_Face) FT_CMAP_FACE(cmap);
FT_Memory memory = FT_FACE_MEMORY(face); FT_Memory memory = FT_FACE_MEMORY(face);
PSNames_Service psnames = face->psnames;
cmap->num_pairs = 0; cmap->num_pairs = 0;
cmap->pairs = NULL; cmap->pairs = NULL;
@ -272,7 +283,7 @@
/* build unsorted pair table by matching glyph names */ /* build unsorted pair table by matching glyph names */
if ( gname ) if ( gname )
{ {
uni_code = PS_Unicode_Value( gname ); uni_code = psnames->unicode_value( gname );
if ( uni_code != 0 ) if ( uni_code != 0 )
{ {
@ -281,28 +292,32 @@
pair++; pair++;
} }
} }
}
if ( new_count == 0 ) new_count = (FT_UInt)( pair - cmap->pairs );
if ( new_count == 0 )
{
/* there are no unicode characters in here !! */
FREE( cmap->pairs );
error = FT_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 )
{ {
/* there are no unicode characters in here !! */ (void)REALLOC_ARRAY( cmap->pairs, count, new_count, T1_CMapUniPairRec );
FREE( cmap->pairs ); error = 0;
error = FT_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 )
REALLOC_ARRAY( cmap->pairs, count, new_count, T1_CMapUniPairRec )
/* sort the pairs table to allow efficient binary searches */ /* sort the pairs table to allow efficient binary searches */
qsort( cmap->pairs, qsort( cmap->pairs,
new_count, new_count,
sizeof(T1_CMapUniPairRec), sizeof(T1_CMapUniPairRec),
t1_cmap_uni_pair_compare ); t1_cmap_uni_pair_compare );
cmap->num_pairs = new_count; cmap->num_pairs = new_count;
}
} }
} }
@ -313,7 +328,7 @@
FT_CALLBACK_DEF( void ) FT_CALLBACK_DEF( void )
t1_cmap_unicode_done( T1_CMapUnicode cmap ) t1_cmap_unicode_done( T1_CMapUnicode cmap )
{ {
FT_Face face = FT_CMAP_FACE(cmap); FT_Face face = FT_CMAP_FACE(cmap);
FT_Memory memory = FT_FACE_MEMORY(face); FT_Memory memory = FT_FACE_MEMORY(face);
FREE( cmap->pairs ); FREE( cmap->pairs );
@ -321,6 +336,7 @@
} }
FT_CALLBACK_DEF( FT_UInt ) FT_CALLBACK_DEF( FT_UInt )
t1_cmap_unicode_char_index( T1_CMapUnicode cmap, t1_cmap_unicode_char_index( T1_CMapUnicode cmap,
FT_UInt32 char_code ) FT_UInt32 char_code )
@ -351,7 +367,8 @@
t1_cmap_unicode_char_next( T1_CMapUnicode cmap, t1_cmap_unicode_char_next( T1_CMapUnicode cmap,
FT_UInt32 *pchar_code ) FT_UInt32 *pchar_code )
{ {
FT_UInt32 char_code = *pchar_code + 1; FT_UInt result = 0;
FT_UInt32 char_code = *pchar_code + 1;
Restart: Restart:
{ {
@ -362,7 +379,7 @@
while ( min < max ) while ( min < max )
{ {
mid = min + (max - min)/2; mid = min + ((max - min) >> 1);
pair = cmap->pairs + mid; pair = cmap->pairs + mid;
if ( pair->unicode == char_code ) if ( pair->unicode == char_code )
@ -386,7 +403,7 @@
if ( min < cmap->num_pairs ) if ( min < cmap->num_pairs )
{ {
pair = cmap->num_pairs + min; pair = cmap->pairs + min;
result = pair->gindex; result = pair->gindex;
if ( result != 0 ) if ( result != 0 )
char_code = pair->unicode; char_code = pair->unicode;
@ -403,8 +420,14 @@
t1_cmap_unicode_class_rec = t1_cmap_unicode_class_rec =
{ {
sizeof( T1_CMapUnicodeRec ), sizeof( T1_CMapUnicodeRec ),
t1_cmap_unicode_init, (FT_CMap_InitFunc) t1_cmap_unicode_init,
t1_cmap_unicode_done, (FT_CMap_DoneFunc) t1_cmap_unicode_done,
t1_cmap_unicode_char_index, (FT_CMap_CharIndexFunc) t1_cmap_unicode_char_index,
t1_cmap_unicode_char_next (FT_CMap_CharNextFunc) t1_cmap_unicode_char_next
}; };
FT_LOCAL_DEF( const FT_CMap_Class )
t1_cmap_unicode_class = &t1_cmap_unicode_class_rec;

View File

@ -1,6 +1,11 @@
#ifndef __FT_TYPE1_CMAP_H__ #ifndef __FT_TYPE1_CMAP_H__
#define __FT_TYPE1_CMAP_H__ #define __FT_TYPE1_CMAP_H__
#include <ft2build.h>
#include FT_INTERNAL_OBJECTS_H
#include FT_INTERNAL_TYPE1_TYPES_H
#include FT_INTERNAL_POSTSCRIPT_NAMES_H
FT_BEGIN_HEADER FT_BEGIN_HEADER
/***************************************************************************/ /***************************************************************************/
@ -16,21 +21,20 @@ FT_BEGIN_HEADER
typedef struct T1_CMapStdRec_ typedef struct T1_CMapStdRec_
{ {
FT_CMapRec cmap; FT_CMapRec cmap;
const FT_UShort* charcode_to_sid; const FT_UShort* code_to_sid;
const char* const* adobe_sid_strings; PS_Adobe_Std_Strings_Func sid_to_string;
FT_UInt num_glyphs;
const char** glyph_names;
FT_UInt num_glyphs;
const char* const* glyph_names;
} T1_CMapStdRec; } T1_CMapStdRec;
FT_LOCAL( FT_CMap_Class ) t1_cmap_standard_class; FT_LOCAL( const FT_CMap_ClassRec ) t1_cmap_standard_class_rec;
FT_LOCAL( FT_CMap_Class ) t1_cmap_expert_class; FT_LOCAL( const FT_CMap_ClassRec ) t1_cmap_expert_class_rec;
/***************************************************************************/ /***************************************************************************/
/***************************************************************************/ /***************************************************************************/
@ -47,12 +51,11 @@ FT_BEGIN_HEADER
FT_CMapRec cmap; FT_CMapRec cmap;
FT_UInt first; FT_UInt first;
FT_UInt count; FT_UInt count;
FT_UInt* indices; FT_UShort* indices;
} T1_CMapCustomRec; } T1_CMapCustomRec;
FT_LOCAL( const FT_CMap_ClassRec ) t1_cmap_custom_class_rec;
FT_LOCAL( FT_CMap_Class ) t1_cmap_custom_class;
/***************************************************************************/ /***************************************************************************/
/***************************************************************************/ /***************************************************************************/
@ -82,7 +85,7 @@ FT_BEGIN_HEADER
} T1_CMapUnicodeRec; } T1_CMapUnicodeRec;
FT_LOCAL( FT_CMap_Class ) t1_cmap_unicode_class; FT_LOCAL( const FT_CMap_ClassRec ) t1_cmap_unicode_class_rec;
/* */ /* */