* 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:
parent
e2f4e52ac8
commit
42372fd4d8
14
ChangeLog
14
ChangeLog
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue