ref: ed54f28e4ac2ff2ed0016fe8b2d0f5d7b4689ef3
parent: fa77c87f64978546fd4c55866d21d7cbdbae1b02
author: David Turner <[email protected]>
date: Fri Mar 22 12:09:52 EST 2002
various fixes to the FT_CMaps support
--- a/include/freetype/config/ftoption.h
+++ b/include/freetype/config/ftoption.h
@@ -76,7 +76,7 @@
/*************************************************************************/
-#undef FT_CONFIG_OPTION_USE_CMAPS
+#define FT_CONFIG_OPTION_USE_CMAPS
#define TT_CONFIG_CMAP_FORMAT_0
#define TT_CONFIG_CMAP_FORMAT_2
#define TT_CONFIG_CMAP_FORMAT_4
--- a/include/freetype/internal/ftobjs.h
+++ b/include/freetype/internal/ftobjs.h
@@ -127,8 +127,8 @@
/* validator structure */
typedef struct FT_ValidatorRec_
{
- FT_Byte* base; /* address of table in memory */
- FT_Byte* limit; /* 'base' + sizeof(table) in memory */
+ const FT_Byte* base; /* address of table in memory */
+ const FT_Byte* limit; /* 'base' + sizeof(table) in memory */
FT_ValidationLevel level; /* validation level */
FT_Error error; /* error returned. 0 means success */
@@ -136,13 +136,17 @@
} FT_ValidatorRec;
+#define FT_VALIDATOR(x) ((FT_Validator)(x))
FT_BASE( void )
ft_validator_init( FT_Validator valid,
- FT_Byte* base,
- FT_Byte* limit,
+ const FT_Byte* base,
+ const FT_Byte* limit,
FT_ValidationLevel level );
+ FT_BASE( FT_Int )
+ ft_validator_run( FT_Validator valid );
+
/* sets the error field in a validator, then calls 'longjmp' to return */
/* to high-level caller. Using 'setjmp/longjmp' avoids many stupid */
/* error checks within the validation routines.. */
@@ -450,6 +454,7 @@
#define FT_FACE_DRIVER( x ) FT_FACE( x )->driver
#define FT_FACE_LIBRARY( x ) FT_FACE_DRIVER( x )->root.library
#define FT_FACE_MEMORY( x ) FT_FACE( x )->memory
+#define FT_FACE_STREAM( x ) FT_FACE( x )->stream
#define FT_SIZE_FACE( x ) FT_SIZE( x )->face
#define FT_SLOT_FACE( x ) FT_SLOT( x )->face
--- a/src/base/ftobjs.c
+++ b/src/base/ftobjs.c
@@ -26,8 +26,39 @@
#include FT_OUTLINE_H
#include <string.h> /* for strcmp() */
+#include <setjmp.h> /* for setjmp() and longjmp() */
+ FT_BASE_DEF( void )
+ ft_validator_init( FT_Validator valid,
+ const FT_Byte* base,
+ const FT_Byte* limit,
+ FT_ValidationLevel level )
+ {
+ valid->base = base;
+ valid->limit = limit;
+ valid->level = level;
+ valid->error = 0;
+ }
+
+ FT_BASE_DEF( FT_Int )
+ ft_validator_run( FT_Validator valid )
+ {
+ int result;
+
+ result = setjmp( valid->jump_buffer );
+ return result;
+ }
+
+ FT_BASE_DEF( void )
+ ft_validator_error( FT_Validator valid,
+ FT_Error error )
+ {
+ valid->error = error;
+ longjmp( valid->jump_buffer, 1 );
+ }
+
+
/*************************************************************************/
/*************************************************************************/
/*************************************************************************/
@@ -1443,29 +1474,47 @@
/* documentation is in freetype.h */
+#ifdef FT_CONFIG_OPTION_USE_CMAPS
+
FT_EXPORT_DEF( FT_UInt )
FT_Get_Char_Index( FT_Face face,
FT_ULong charcode )
{
- FT_UInt result;
- FT_Driver driver;
+ FT_UInt result = 0;
- result = 0;
if ( face && face->charmap )
{
-#ifdef FT_CONFIG_OPTION_USE_CMAPS
FT_CMap cmap = FT_CMAP( face->charmap );
-
+
result = cmap->clazz->char_index( cmap, charcode );
+ }
+ return result;
+ }
+
#else /* !FT_CONFIG_OPTION_USE_CMAPS */
+
+
+
+ FT_EXPORT_DEF( FT_UInt )
+ FT_Get_Char_Index( FT_Face face,
+ FT_ULong charcode )
+ {
+ FT_UInt result = 0;
+ FT_Driver driver;
+
+
+ if ( face && face->charmap )
+ {
driver = face->driver;
result = driver->clazz->get_char_index( face->charmap, charcode );
-#endif /* !FT_CONFIG_OPTION_USE_CMAPS */
}
return result;
}
+#endif /* !FT_CONFIG_OPTION_USE_CMAPS */
+
+
/* documentation is in freetype.h */
FT_EXPORT_DEF( FT_ULong )
@@ -1490,6 +1539,9 @@
/* documentation is in freetype.h */
+
+#ifdef FT_CONFIG_OPTION_USE_CMAPS
+
FT_EXPORT_DEF( FT_ULong )
FT_Get_Next_Char( FT_Face face,
FT_ULong charcode,
@@ -1497,17 +1549,37 @@
{
FT_ULong result = 0;
FT_UInt gindex = 0;
- FT_Driver driver;
if ( face && face->charmap )
{
-#ifdef FT_CONFIG_OPTION_USE_CMAPS
- FT_CMap cmap = FT_CMAP( face->charmap );
+ FT_UInt32 code = (FT_UInt32)charcode;
+ FT_CMap cmap = FT_CMAP( face->charmap );
- gindex = cmap->clazz->char_next( cmap, &charcode );
- result = ( gindex == 0 ) ? 0 : charcode;
+ gindex = cmap->clazz->char_next( cmap, &code );
+ result = ( gindex == 0 ) ? 0 : code;
+ }
+
+ if ( agindex )
+ *agindex = gindex;
+
+ return result;
+ }
+
#else /* !FT_CONFIG_OPTION_USE_CMAPS */
+
+ FT_EXPORT_DEF( FT_ULong )
+ FT_Get_Next_Char( FT_Face face,
+ FT_ULong charcode,
+ FT_UInt *agindex )
+ {
+ FT_ULong result = 0;
+ FT_UInt gindex = 0;
+ FT_Driver driver;
+
+
+ if ( face && face->charmap )
+ {
driver = face->driver;
result = driver->clazz->get_next_char( face->charmap, charcode );
if ( result != 0 )
@@ -1516,7 +1588,6 @@
if ( gindex == 0 )
result = 0;
}
-#endif /* !FT_CONFIG_OPTION_USE_CMAPS */
}
if ( agindex )
@@ -1524,6 +1595,8 @@
return result;
}
+
+#endif /* !FT_CONFIG_OPTION_USE_CMAPS */
/* documentation is in freetype.h */
--- a/src/cff/cffobjs.c
+++ b/src/cff/cffobjs.c
@@ -249,56 +249,6 @@
-
- static FT_Encoding
- find_encoding( int platform_id,
- int encoding_id )
- {
- typedef struct TEncoding
- {
- int platform_id;
- int encoding_id;
- FT_Encoding encoding;
-
- } TEncoding;
-
- static
- const TEncoding tt_encodings[] =
- {
- { TT_PLATFORM_ISO, -1, ft_encoding_unicode },
-
- { TT_PLATFORM_APPLE_UNICODE, -1, ft_encoding_unicode },
-
- { TT_PLATFORM_MACINTOSH, TT_MAC_ID_ROMAN, ft_encoding_apple_roman },
-
- { TT_PLATFORM_MICROSOFT, TT_MS_ID_UNICODE_CS, ft_encoding_unicode },
- { TT_PLATFORM_MICROSOFT, TT_MS_ID_SJIS, ft_encoding_sjis },
- { TT_PLATFORM_MICROSOFT, TT_MS_ID_GB2312, ft_encoding_gb2312 },
- { TT_PLATFORM_MICROSOFT, TT_MS_ID_BIG_5, ft_encoding_big5 },
- { TT_PLATFORM_MICROSOFT, TT_MS_ID_WANSUNG, ft_encoding_wansung },
- { TT_PLATFORM_MICROSOFT, TT_MS_ID_JOHAB, ft_encoding_johab }
- };
-
- const TEncoding *cur, *limit;
-
-
- cur = tt_encodings;
- limit = cur + sizeof ( tt_encodings ) / sizeof ( tt_encodings[0] );
-
- for ( ; cur < limit; cur++ )
- {
- if ( cur->platform_id == platform_id )
- {
- if ( cur->encoding_id == encoding_id ||
- cur->encoding_id == -1 )
- return cur->encoding;
- }
- }
-
- return ft_encoding_none;
- }
-
-
FT_LOCAL_DEF( FT_Error )
CFF_Face_Init( FT_Stream stream,
CFF_Face face,
@@ -498,48 +448,8 @@
flags |= FT_STYLE_FLAG_BOLD;
root->style_flags = flags;
-
- /* set the charmaps if any */
- if ( sfnt_format )
- {
- /*****************************************************************/
- /* */
- /* Polish the charmaps. */
- /* */
- /* Try to set the charmap encoding according to the platform & */
- /* encoding ID of each charmap. */
- /* */
- TT_CharMap charmap;
- FT_Int n;
-
-
- charmap = face->charmaps;
- root->num_charmaps = face->num_charmaps;
-
- /* allocate table of pointers */
- if ( FT_NEW_ARRAY( root->charmaps, root->num_charmaps ) )
- goto Exit;
-
- for ( n = 0; n < root->num_charmaps; n++, charmap++ )
- {
- FT_Int platform = charmap->cmap.platformID;
- FT_Int encoding = charmap->cmap.platformEncodingID;
-
-
- charmap->root.face = (FT_Face)face;
- charmap->root.platform_id = (FT_UShort)platform;
- charmap->root.encoding_id = (FT_UShort)encoding;
- charmap->root.encoding = find_encoding( platform, encoding );
-
- /* now, set root->charmap with a unicode charmap */
- /* wherever available */
- if ( !root->charmap &&
- charmap->root.encoding == ft_encoding_unicode )
- root->charmap = (FT_CharMap)charmap;
-
- root->charmaps[n] = (FT_CharMap)charmap;
- }
- }
+
+ /* XXX: no charmaps for pure CFF fonts for now !! */
}
}
--- a/src/pcf/pcfdriver.c
+++ b/src/pcf/pcfdriver.c
@@ -72,10 +72,10 @@
FT_CALLBACK_DEF( FT_UInt )
- pcf_cmap_char_index( FT_CMap cmap,
+ pcf_cmap_char_index( PCF_CMap cmap,
FT_UInt32 charcode )
{
- PCF_Encoding encoding = cmap->encodings;
+ PCF_Encoding encodings = cmap->encodings;
FT_UInt min, max, mid;
FT_UInt result = 0;
@@ -140,7 +140,7 @@
if ( ++min < cmap->num_encodings )
{
charcode = encodings[min].enc;
- glyph = encodings[min].glyph;
+ result = encodings[min].glyph;
}
Exit:
--- a/src/sfnt/sfobjs.c
+++ b/src/sfnt/sfobjs.c
@@ -19,6 +19,7 @@
#include <ft2build.h>
#include "sfobjs.h"
#include "ttload.h"
+#include "ttcmap0.h"
#include FT_INTERNAL_SFNT_H
#include FT_INTERNAL_POSTSCRIPT_NAMES_H
#include FT_TRUETYPE_IDS_H
@@ -384,7 +385,6 @@
{
FT_Face root = &face->root;
FT_Int flags = 0;
- TT_CharMap charmap;
FT_Int n;
FT_Memory memory;
@@ -456,12 +456,12 @@
/* */
#ifdef FT_CONFIG_OPTION_USE_CMAPS
- error = TT_Build_CMaps( face );
- if (error) goto Exit;
+ TT_Build_CMaps( face ); /* ignore errors */
+
/* set the encoding fields */
{
- FT_UInt n;
+ FT_Int n;
for ( n = 0; n < root->num_charmaps; n++ )
{
@@ -480,32 +480,36 @@
}
#else /* !FT_CONFIG_OPTION_USE_CMAPS */
-
- charmap = face->charmaps;
- root->num_charmaps = face->num_charmaps;
-
- /* allocate table of pointers */
- if ( FT_NEW_ARRAY( root->charmaps, root->num_charmaps ) )
- goto Exit;
-
- for ( n = 0; n < root->num_charmaps; n++, charmap++ )
+
{
- FT_Int platform = charmap->cmap.platformID;
- FT_Int encoding = charmap->cmap.platformEncodingID;
-
-
- charmap->root.face = (FT_Face)face;
- charmap->root.platform_id = (FT_UShort)platform;
- charmap->root.encoding_id = (FT_UShort)encoding;
- charmap->root.encoding = sfnt_find_encoding( platform, encoding );
-
- /* now, set root->charmap with a unicode charmap */
- /* wherever available */
- if ( !root->charmap &&
- charmap->root.encoding == ft_encoding_unicode )
- root->charmap = (FT_CharMap)charmap;
-
- root->charmaps[n] = (FT_CharMap)charmap;
+ TT_CharMap charmap = face->charmaps;
+
+ charmap = face->charmaps;
+ root->num_charmaps = face->num_charmaps;
+
+ /* allocate table of pointers */
+ if ( FT_NEW_ARRAY( root->charmaps, root->num_charmaps ) )
+ goto Exit;
+
+ for ( n = 0; n < root->num_charmaps; n++, charmap++ )
+ {
+ FT_Int platform = charmap->cmap.platformID;
+ FT_Int encoding = charmap->cmap.platformEncodingID;
+
+
+ charmap->root.face = (FT_Face)face;
+ charmap->root.platform_id = (FT_UShort)platform;
+ charmap->root.encoding_id = (FT_UShort)encoding;
+ charmap->root.encoding = sfnt_find_encoding( platform, encoding );
+
+ /* now, set root->charmap with a unicode charmap */
+ /* wherever available */
+ if ( !root->charmap &&
+ charmap->root.encoding == ft_encoding_unicode )
+ root->charmap = (FT_CharMap)charmap;
+
+ root->charmaps[n] = (FT_CharMap)charmap;
+ }
}
#endif /* !FT_CONFIG_OPTION_USE_CMAPS */
--- a/src/sfnt/ttcmap0.c
+++ b/src/sfnt/ttcmap0.c
@@ -1549,15 +1549,12 @@
FT_LOCAL_DEF( FT_Error )
TT_Build_CMaps( TT_Face face )
{
- TT_CMap_Class clazz;
- FT_ValidatorRec valid;
FT_UInt num_cmaps;
FT_Byte* table = face->cmap_table;
FT_Byte* limit = table + face->cmap_size;
FT_Byte* p = table;
- FT_UInt format;
- if ( p + 4 < limit )
+ if ( p + 4 > limit )
return FT_Err_Invalid_Table;
/* only recognize format 0 */
@@ -1582,10 +1579,10 @@
if ( offset && table + offset + 2 < limit )
{
- FT_Byte* cmap = table + offset;
- FT_UInt format = TT_PEEK_USHORT(cmap);
- TT_CMap_Class* pclazz = tt_cmap_classes;
- TT_CMap_Class clazz;
+ FT_Byte* cmap = table + offset;
+ FT_UInt format = TT_PEEK_USHORT(cmap);
+ const TT_CMap_Class* pclazz = tt_cmap_classes;
+ TT_CMap_Class clazz;
for ( ; *pclazz; pclazz++ )
{
@@ -1592,19 +1589,21 @@
clazz = *pclazz;
if ( clazz->format == format )
{
- volatile TT_Validator valid;
-
+ volatile TT_ValidatorRec valid;
+
+ ft_validator_init( FT_VALIDATOR(&valid), cmap, limit,
+ FT_VALIDATE_DEFAULT );
+
valid.num_glyphs = face->root.num_glyphs;
- if ( ft_validator_init( FT_VALIDATOR(&valid), cmap, limit,
- FT_VALIDATE_LEVEL_DEFAULT ) == 0 )
+ if ( setjmp( FT_VALIDATOR(&valid)->jump_buffer ) == 0 )
{
/* validate this cmap sub-table */
clazz->validate( cmap, FT_VALIDATOR(&valid) );
}
- if ( valid.error == 0 )
- (void)FT_CMap_New( clazz, cmap, face, NULL );
+ if ( valid.validator.error == 0 )
+ (void)FT_CMap_New( (FT_CMap_Class)clazz, cmap, &charmap, NULL );
else
FT_ERROR(( "%s: broken cmap sub-table ignored !!\n",
"TT_Build_CMaps" ));
--- a/src/sfnt/ttcmap0.h
+++ b/src/sfnt/ttcmap0.h
@@ -49,8 +49,8 @@
typedef struct TT_ValidatorRec_
{
- FT_Validator validator;
- FT_UInt num_glyphs;
+ FT_ValidatorRec validator;
+ FT_UInt num_glyphs;
} TT_ValidatorRec, *TT_Validator;
--- a/src/sfnt/ttload.c
+++ b/src/sfnt/ttload.c
@@ -1128,9 +1128,6 @@
FT_Stream stream )
{
FT_Error error;
- FT_Memory memory = stream->memory;
- FT_Long table_start;
- TT_CMapDirRec cmap_dir;
error = face->goto_table( face, TTAG_cmap, stream, &face->cmap_size );
if ( error )
--- a/src/type1/t1objs.c
+++ b/src/type1/t1objs.c
@@ -436,7 +436,7 @@
if ( psnames && psaux )
{
FT_CharMapRec charmap;
- FT_CMap_Classes cmap_classes = psaux->cmap_classes;
+ T1_CMap_Classes cmap_classes = psaux->t1_cmap_classes;
FT_CMap_Class clazz;
charmap.face = root;
@@ -446,7 +446,7 @@
charmap.encoding_id = 1;
charmap.encoding = ft_encoding_unicode;
- FT_CMap_New( root, cmap_classes->unicode, &charmap, NULL );
+ FT_CMap_New( cmap_classes->unicode, NULL, &charmap, NULL );
/* now, generate an Adobe Standard encoding when appropriate */
charmap.platform_id = 7;
@@ -473,9 +473,9 @@
break;
case T1_ENCODING_TYPE_ISOLATIN1:
- charmap.encoding = ft_encoding_adobe_latin_1;
+ charmap.encoding = ft_encoding_latin_1;
charmap.encoding_id = 3;
- clazz = cmap_classes->latin_1;
+ clazz = cmap_classes->unicode;
break;
default:
@@ -483,7 +483,7 @@
}
if ( clazz )
- FT_CMap_New( root, clazz, &charmap, NULL );
+ FT_CMap_New( clazz, NULL, &charmap, NULL );
}
}
--- a/src/winfonts/winfnt.c
+++ b/src/winfonts/winfnt.c
@@ -323,7 +323,7 @@
static FT_Error
- fnt_cmap_init( FT_CMap cmap )
+ fnt_cmap_init( FNT_CMap cmap )
{
FNT_Face face = (FNT_Face) FT_CMAP_FACE(cmap);
FNT_Font font = face->fonts;
@@ -336,7 +336,7 @@
static FT_UInt
- fnt_cmap_char_index( FT_CMap cmap,
+ fnt_cmap_char_index( FNT_CMap cmap,
FT_UInt32 char_code )
{
FT_UInt gindex = 0;
@@ -350,7 +350,7 @@
static FT_UInt
- fnt_cmap_char_next( FT_CMap cmap,
+ fnt_cmap_char_next( FNT_CMap cmap,
FT_UInt32 *pchar_code )
{
FT_UInt gindex = 0;
@@ -734,20 +734,29 @@
(FT_Face_DoneFunc) FNT_Face_Done,
(FT_Size_InitFunc) 0,
(FT_Size_DoneFunc) 0,
- (FT_Slot_InitFunc)0,
- (FT_Slot_DoneFunc)0,
+ (FT_Slot_InitFunc) 0,
+ (FT_Slot_DoneFunc) 0,
(FT_Size_ResetPointsFunc) FNT_Size_Set_Pixels,
(FT_Size_ResetPixelsFunc)FNT_Size_Set_Pixels,
-
(FT_Slot_LoadFunc) FNT_Load_Glyph,
+
+#ifdef FT_CONFIG_OPTION_USE_CMAPS
+ (FT_CharMap_CharIndexFunc) 0,
+#else
(FT_CharMap_CharIndexFunc) FNT_Get_Char_Index,
+#endif
+
(FT_Face_GetKerningFunc) 0,
(FT_Face_AttachFunc) 0,
(FT_Face_GetAdvancesFunc) 0,
+#ifdef FT_CONFIG_OPTION_USE_CMAPS
+ (FT_CharMap_CharNextFunc) 0
+#else
(FT_CharMap_CharNextFunc) FNT_Get_Next_Char
+#endif
};