diff --git a/ChangeLog b/ChangeLog index 05c5f8e54..dc10196e4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -6,12 +6,23 @@ * src/otlayout/otlcommn.c, src/otlayout/otlcommn.h: s/index/idx/. * src/psaux/t1cmap.c: Ditto. + * src/sfnt/ttcmap0.c: Ditto. * include/freetype/internal/tttypes.h, include/freetype/internal/sfnt.h (TT_Goto_Table_Func): Renamed to ... (TT_Loader_GotoTableFunc): This. * src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Fix debug messages. + * src/psnames/psmodule.c (psnames_interface) + [!FT_CONFIG_OPTION_ADOBE_GLYPH_LIST]: Fix typo. + * src/sfnt/sfdriver.c (get_sfnt_table): 16bit fix. + * src/sfnt/ttcmap.c: 16bit fixes (0xFFFF -> 0xFFFFU). + * src/sfnt/ttcmap0.c: 16bit fixes. + (TT_Build_CMaps): Simplify debug messages. + (tt_cmap12_char_next): Fix offset. + * src/sfnt/ttload.c (TT_Load_Names, TT_Load_CMap): Fix debug + messages. + (TT_Load_OS2): 16bit fix. 2002-03-30 David Turner @@ -439,8 +450,8 @@ * src/type1/t1cmap.h, src/type1/t1cmap.c: Adding (still experimental) code for Type 1 charmap processing. - * src/sfnt/ttcmap0.c: Completing the experimental SFNT charmap - processing. + * src/sfnt/ttcmap0.c: New file. It contains a new, still + experimental SFNT charmap processing support. * include/freetype/internal/ftobjs.h: Adding validation support as well as internal charmap object definitions (FT_CMap != FT_CharMap). diff --git a/src/pshinter/descrip.mms b/src/pshinter/descrip.mms index 3bdb8a085..205d6cfcc 100644 --- a/src/pshinter/descrip.mms +++ b/src/pshinter/descrip.mms @@ -3,7 +3,7 @@ # -# Copyright 2001 by +# Copyright 2001, 2002 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/pshinter/pshalgo1.c b/src/pshinter/pshalgo1.c index faca3812d..67c159edb 100644 --- a/src/pshinter/pshalgo1.c +++ b/src/pshinter/pshalgo1.c @@ -4,7 +4,7 @@ /* */ /* PostScript hinting algorithm 1 (body). */ /* */ -/* Copyright 2001 by */ +/* Copyright 2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used */ diff --git a/src/pshinter/pshalgo2.c b/src/pshinter/pshalgo2.c index 1ddce48ac..8509d87bb 100644 --- a/src/pshinter/pshalgo2.c +++ b/src/pshinter/pshalgo2.c @@ -4,7 +4,7 @@ /* */ /* PostScript hinting algorithm 2 (body). */ /* */ -/* Copyright 2001 by */ +/* Copyright 2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used */ diff --git a/src/pshinter/pshglob.c b/src/pshinter/pshglob.c index 21bd2a291..9b32e9f9f 100644 --- a/src/pshinter/pshglob.c +++ b/src/pshinter/pshglob.c @@ -5,7 +5,7 @@ /* PostScript hinter global hinting management (body). */ /* Inspired by the new auto-hinter module. */ /* */ -/* Copyright 2001 by */ +/* Copyright 2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used */ diff --git a/src/pshinter/pshglob.h b/src/pshinter/pshglob.h index bdb5e12af..fcda9dac7 100644 --- a/src/pshinter/pshglob.h +++ b/src/pshinter/pshglob.h @@ -4,7 +4,7 @@ /* */ /* PostScript hinter global hinting management. */ /* */ -/* Copyright 2001 by */ +/* Copyright 2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/src/pshinter/pshmod.c b/src/pshinter/pshmod.c index afaf73a4e..5b18684c7 100644 --- a/src/pshinter/pshmod.c +++ b/src/pshinter/pshmod.c @@ -4,7 +4,7 @@ /* */ /* FreeType PostScript hinter module implementation (body). */ /* */ -/* Copyright 2001 by */ +/* Copyright 2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/src/pshinter/pshrec.c b/src/pshinter/pshrec.c index a67896656..ad0485e1d 100644 --- a/src/pshinter/pshrec.c +++ b/src/pshinter/pshrec.c @@ -4,7 +4,7 @@ /* */ /* FreeType PostScript hints recorder (body). */ /* */ -/* Copyright 2001 by */ +/* Copyright 2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/src/pshinter/pshrec.h b/src/pshinter/pshrec.h index 7345eb6d4..884aa5c5d 100644 --- a/src/pshinter/pshrec.h +++ b/src/pshinter/pshrec.h @@ -4,7 +4,7 @@ /* */ /* Postscript (Type1/Type2) hints recorder (specification). */ /* */ -/* Copyright 2001 by */ +/* Copyright 2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/src/psnames/descrip.mms b/src/psnames/descrip.mms index ba8b26f76..6a66b9fa3 100644 --- a/src/psnames/descrip.mms +++ b/src/psnames/descrip.mms @@ -3,7 +3,7 @@ # -# Copyright 2001 by +# Copyright 2001, 2002 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/psnames/psmodule.c b/src/psnames/psmodule.c index e5c0769ab..58b7de679 100644 --- a/src/psnames/psmodule.c +++ b/src/psnames/psmodule.c @@ -4,7 +4,7 @@ /* */ /* PSNames module implementation (body). */ /* */ -/* Copyright 1996-2001 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -186,8 +186,8 @@ count = (FT_UInt)( map - table->maps ); if ( count > 0 && FT_REALLOC( table->maps, - num_glyphs * sizeof ( PS_UniMap ), - count * sizeof ( PS_UniMap ) ) ) + num_glyphs * sizeof ( PS_UniMap ), + count * sizeof ( PS_UniMap ) ) ) count = 0; if ( count == 0 ) @@ -314,7 +314,6 @@ 0, 0, 0, - 0, #endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ diff --git a/src/psnames/rules.mk b/src/psnames/rules.mk index cb51272bb..4a4b82e82 100644 --- a/src/psnames/rules.mk +++ b/src/psnames/rules.mk @@ -3,7 +3,7 @@ # -# Copyright 1996-2000 by +# Copyright 1996-2000, 2001 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/raster/ftraster.c b/src/raster/ftraster.c index 298675eae..28475f7c0 100644 --- a/src/raster/ftraster.c +++ b/src/raster/ftraster.c @@ -4,7 +4,7 @@ /* */ /* The FreeType glyph rasterizer (body). */ /* */ -/* Copyright 1996-2001 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -3211,9 +3211,9 @@ static void - ft_black_set_mode( TRaster_Instance* raster, - unsigned long mode, - const char* palette ) + ft_black_set_mode( TRaster_Instance* raster, + unsigned long mode, + const char* palette ) { #ifdef FT_RASTER_OPTION_ANTI_ALIASING diff --git a/src/raster/ftrend1.c b/src/raster/ftrend1.c index 96e798010..05211e673 100644 --- a/src/raster/ftrend1.c +++ b/src/raster/ftrend1.c @@ -4,7 +4,7 @@ /* */ /* The FreeType glyph rasterizer interface (body). */ /* */ -/* Copyright 1996-2001 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/src/raster/rules.mk b/src/raster/rules.mk index 7d3f65c51..9fe4b8bd0 100644 --- a/src/raster/rules.mk +++ b/src/raster/rules.mk @@ -3,7 +3,7 @@ # -# Copyright 1996-2000 by +# Copyright 1996-2000, 2001 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/sfnt/Jamfile b/src/sfnt/Jamfile index dccfdb3cf..d7722e396 100644 --- a/src/sfnt/Jamfile +++ b/src/sfnt/Jamfile @@ -1,4 +1,4 @@ -# FreeType 2 src/sfnt Jamfile (c) 2001 David Turner +# FreeType 2 src/sfnt Jamfile (c) 2001, 2002 David Turner # SubDir FT2_TOP src sfnt ; diff --git a/src/sfnt/descrip.mms b/src/sfnt/descrip.mms index fb5c724b1..811c8b3ee 100644 --- a/src/sfnt/descrip.mms +++ b/src/sfnt/descrip.mms @@ -3,7 +3,7 @@ # -# Copyright 2001 by +# Copyright 2001, 2002 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/sfnt/rules.mk b/src/sfnt/rules.mk index 833445fc4..c074a6afc 100644 --- a/src/sfnt/rules.mk +++ b/src/sfnt/rules.mk @@ -3,7 +3,7 @@ # -# Copyright 1996-2000 by +# Copyright 1996-2000, 2002 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/sfnt/sfdriver.c b/src/sfnt/sfdriver.c index 8f29a2b4f..303498a08 100644 --- a/src/sfnt/sfdriver.c +++ b/src/sfnt/sfdriver.c @@ -4,7 +4,7 @@ /* */ /* High-level SFNT driver interface (body). */ /* */ -/* Copyright 1996-2001 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -58,7 +58,7 @@ break; case ft_sfnt_os2: - table = face->os2.version == 0xFFFF ? 0 : &face->os2; + table = face->os2.version == 0xFFFFU ? 0 : &face->os2; break; case ft_sfnt_post: @@ -114,7 +114,7 @@ static const char* get_sfnt_postscript_name( TT_Face face ) { - FT_Int n, found_win, found_apple; + FT_Int n, found_win, found_apple; const char* result = NULL; @@ -124,8 +124,8 @@ /* scan the name table to see whether we have a Postscript name here, */ /* either in Macintosh or Windows platform encodings */ - found_win = -1; - found_apple = -1; + found_win = -1; + found_apple = -1; for ( n = 0; n < face->num_names; n++ ) { @@ -148,16 +148,18 @@ if ( found_win != -1 ) { - FT_Memory memory = face->root.memory; + FT_Memory memory = face->root.memory; TT_NameEntryRec* name = face->name_table.names + found_win; - FT_UInt len = name->stringLength/2; - FT_Error error; + FT_UInt len = name->stringLength / 2; + FT_Error error; - if ( !FT_ALLOC( result, len+1 ) ) + + if ( !FT_ALLOC( result, len + 1 ) ) { FT_String* r = (FT_String*)result; - FT_Byte* p = (FT_Byte*) name->string; + FT_Byte* p = (FT_Byte*)name->string; + for ( ; len > 0; len--, p += 2 ) { if ( p[0] == 0 && p[1] >= 32 && p[1] < 128 ) @@ -175,7 +177,8 @@ FT_UInt len = name->stringLength; FT_Error error; - if ( !FT_ALLOC( result, len+1 ) ) + + if ( !FT_ALLOC( result, len + 1 ) ) { FT_MEM_COPY( (char*)result, name->string, len ); ((char*)result)[len] = '\0'; diff --git a/src/sfnt/sfnt.c b/src/sfnt/sfnt.c index 15898bcc8..6e0757aa8 100644 --- a/src/sfnt/sfnt.c +++ b/src/sfnt/sfnt.c @@ -4,7 +4,7 @@ /* */ /* Single object library component. */ /* */ -/* Copyright 1996-2001 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/src/sfnt/sfobjs.c b/src/sfnt/sfobjs.c index a1c208fab..2e6326d15 100644 --- a/src/sfnt/sfobjs.c +++ b/src/sfnt/sfobjs.c @@ -4,7 +4,7 @@ /* */ /* SFNT object management (base). */ /* */ -/* Copyright 1996-2001 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -39,91 +39,94 @@ - /* convert a UTF-16 name entry to ASCII */ + /* convert a UTF-16 name entry to ASCII */ static FT_String* - tt_name_entry_ascii_from_utf16( TT_NameEntry entry, - FT_Memory memory ) + tt_name_entry_ascii_from_utf16( TT_NameEntry entry, + FT_Memory memory ) { FT_String* string; FT_UInt len, code, n; - FT_Byte* read = (FT_Byte*) entry->string; - - len = (FT_UInt) entry->stringLength/2; - - if ( FT_MEM_NEW_ARRAY( string, len+1 ) ) + FT_Byte* read = (FT_Byte*)entry->string; + + + len = (FT_UInt)entry->stringLength / 2; + + if ( FT_MEM_NEW_ARRAY( string, len + 1 ) ) return NULL; - + for ( n = 0; n < len; n++ ) { - code = FT_NEXT_USHORT(read); + code = FT_NEXT_USHORT( read ); if ( code < 32 || code > 127 ) code = '?'; - + string[n] = (char)code; } string[len] = 0; - + return string; - } + } - /* convert a UCS-4 name entry to ASCII */ + /* convert a UCS-4 name entry to ASCII */ static FT_String* tt_name_entry_ascii_from_ucs4( TT_NameEntry entry, FT_Memory memory ) { FT_String* string; FT_UInt len, code, n; - FT_Byte* read = (FT_Byte*) entry->string; - - len = (FT_UInt) entry->stringLength/4; - - if ( FT_MEM_NEW_ARRAY( string, len+1 ) ) + FT_Byte* read = (FT_Byte*)entry->string; + + + len = (FT_UInt)entry->stringLength / 4; + + if ( FT_MEM_NEW_ARRAY( string, len + 1 ) ) return NULL; - + for ( n = 0; n < len; n++ ) { - code = FT_NEXT_ULONG(read); + code = FT_NEXT_ULONG( read ); if ( code < 32 || code > 127 ) code = '?'; - + string[n] = (char)code; } string[len] = 0; - + return string; - } + } - /* convert an Apple Roman or symbol name entry to ASCII */ + /* convert an Apple Roman or symbol name entry to ASCII */ static FT_String* tt_name_entry_ascii_from_other( TT_NameEntry entry, FT_Memory memory ) { FT_String* string; FT_UInt len, code, n; - FT_Byte* read = (FT_Byte*) entry->string; - - len = (FT_UInt) entry->stringLength; - - if ( FT_MEM_NEW_ARRAY( string, len+1 ) ) + FT_Byte* read = (FT_Byte*)entry->string; + + + len = (FT_UInt)entry->stringLength; + + if ( FT_MEM_NEW_ARRAY( string, len + 1 ) ) return NULL; - + for ( n = 0; n < len; n++ ) { code = *read++; if ( code < 32 || code > 127 ) code = '?'; - + string[n] = (char)code; } string[len] = 0; - + return string; - } + } /*************************************************************************/ @@ -158,91 +161,79 @@ rec = face->name_table.names; for ( n = 0; n < face->name_table.numNameRecords; n++, rec++ ) { - /* according to the OpenType 1.3 specification, only Microsoft of */ - /* Apple platform ids might be used in the 'name' table. The */ - /* 'Unicode' platform is reserved for the 'cmap' table, and */ - /* the 'Iso' one is deprecated */ - - /* however the Apple TrueType specification doesn't says the same */ - /* thing and goes to suggest that all Unicode 'name' table entries */ - /* should be coded in UTF-16 (in big-endian format I suppose) */ + /* According to the OpenType 1.3 specification, only Microsoft or */ + /* Apple platform IDs might be used in the `name' table. The */ + /* `Unicode' platform is reserved for the `cmap' table, and the */ + /* `Iso' one is deprecated. */ + /* */ + /* However, the Apple TrueType specification doesn't say the same */ + /* thing and goes to suggest that all Unicode `name' table entries */ + /* should be coded in UTF-16 (in big-endian format I suppose). */ /* */ if ( rec->nameID == nameid && rec->string ) { switch ( rec->platformID ) { + case TT_PLATFORM_APPLE_UNICODE: + case TT_PLATFORM_ISO: + /* there is `languageID' to check there. We should use this */ + /* field only as a last solution when nothing else is */ + /* available. */ + /* */ + found_unicode = n; + break; - case TT_PLATFORM_APPLE_UNICODE: - case TT_PLATFORM_ISO: + case TT_PLATFORM_MACINTOSH: + if ( rec->languageID == TT_MAC_LANGID_ENGLISH ) + found_apple = n; + + break; + + case TT_PLATFORM_MICROSOFT: + /* we only take a non-English name when there is nothing */ + /* else available in the font */ + /* */ + if ( found_win == -1 || ( rec->languageID & 0x3FF ) == 0x009 ) + { + switch ( rec->encodingID ) { - /* there is 'languageID' to check there. We should use this */ - /* field only as a last solution when nothing else is */ - /* available.. */ - /* */ - found_unicode = n; + case TT_MS_ID_SYMBOL_CS: + case TT_MS_ID_UNICODE_CS: + case TT_MS_ID_UCS_4: + found_win = n; break; + + default: + ; } - - case TT_PLATFORM_MACINTOSH: - { - if ( rec->languageID == TT_MAC_LANGID_ENGLISH ) - found_apple = n; - - break; - } - - case TT_PLATFORM_MICROSOFT: - { - /* we only take a non-English name when there is nothing */ - /* else available in the font.. */ - /* */ - if ( found_win == -1 || (rec->languageID & 0x3FF) == 0x009 ) - { - switch ( rec->encodingID ) - { - case TT_MS_ID_SYMBOL_CS: - case TT_MS_ID_UNICODE_CS: - case TT_MS_ID_UCS_4: - found_win = n; - break; - - default: - ; - } - } - break; - } - - default: - ; + } + break; + + default: + ; } } } - /* some fonts contain invalid Unicode or Macintosh formatted entries */ - /* we will thus favor name encoded in Windows formats when they're */ - /* available.. */ - /* */ + /* some fonts contain invalid Unicode or Macintosh formatted entries; */ + /* we will thus favor names encoded in Windows formats if available */ + /* */ if ( found_win >= 0 ) { rec = face->name_table.names + found_win; switch ( rec->encodingID ) { - case TT_MS_ID_UNICODE_CS: - case TT_MS_ID_SYMBOL_CS: - { - result = tt_name_entry_ascii_from_utf16( rec, memory ); - break; - } - - case TT_MS_ID_UCS_4: - { - result = tt_name_entry_ascii_from_ucs4( rec, memory ); - break; - } - - default: - ; + case TT_MS_ID_UNICODE_CS: + case TT_MS_ID_SYMBOL_CS: + result = tt_name_entry_ascii_from_utf16( rec, memory ); + break; + + case TT_MS_ID_UCS_4: + result = tt_name_entry_ascii_from_ucs4( rec, memory ); + break; + + default: + ; } } else if ( found_apple >= 0 ) @@ -255,7 +246,7 @@ rec = face->name_table.names + found_unicode; result = tt_name_entry_ascii_from_utf16( rec, memory ); } - + return result; } @@ -321,12 +312,13 @@ FT_Error error; FT_Library library = face->root.driver->root.library; SFNT_Service sfnt; - SFNT_HeaderRec sfnt_header; + SFNT_HeaderRec sfnt_header; /* for now, parameters are unused */ FT_UNUSED( num_params ); FT_UNUSED( params ); + sfnt = (SFNT_Service)face->sfnt; if ( !sfnt ) { @@ -344,7 +336,7 @@ if ( !face->psnames ) { face->psnames = (PSNames_Service) - FT_Get_Module_Interface( library, "psnames" ); + FT_Get_Module_Interface( library, "psnames" ); } /* check that we have a valid TrueType file */ @@ -381,9 +373,9 @@ FT_Int num_params, FT_Parameter* params ) { - FT_Error error; - FT_Bool has_outline; - FT_Bool is_apple_sbit; + FT_Error error; + FT_Bool has_outline; + FT_Bool is_apple_sbit; SFNT_Service sfnt = (SFNT_Service)face->sfnt; @@ -433,7 +425,6 @@ (void)LOAD_( max_profile ); (void)LOAD_( charmaps ); - /* the following tables are optional in PCL fonts -- */ /* don't check for errors */ (void)LOAD_( names ); @@ -470,6 +461,7 @@ else goto Exit; } + #endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ if ( LOAD_( hdmx ) || @@ -478,15 +470,17 @@ LOAD_( pclt ) ) goto Exit; - face->root.family_name = tt_face_get_name( face, TT_NAME_ID_FONT_FAMILY ); - face->root.style_name = tt_face_get_name( face, TT_NAME_ID_FONT_SUBFAMILY ); + face->root.family_name = tt_face_get_name( face, + TT_NAME_ID_FONT_FAMILY ); + face->root.style_name = tt_face_get_name( face, + TT_NAME_ID_FONT_SUBFAMILY ); /* now set up root fields */ { - FT_Face root = &face->root; - FT_Int flags = 0; - FT_Int n; - FT_Memory memory; + FT_Face root = &face->root; + FT_Int flags = 0; + FT_Int n; + FT_Memory memory; memory = root->memory; @@ -557,19 +551,21 @@ #ifdef FT_CONFIG_OPTION_USE_CMAPS TT_Build_CMaps( face ); /* ignore errors */ - - + + /* set the encoding fields */ { FT_Int m; - + + for ( m = 0; m < root->num_charmaps; m++ ) { FT_CharMap charmap = root->charmaps[m]; - + + charmap->encoding = sfnt_find_encoding( charmap->platform_id, charmap->encoding_id ); - + if ( root->charmap == NULL && charmap->encoding == ft_encoding_unicode ) { @@ -580,34 +576,35 @@ } #else /* !FT_CONFIG_OPTION_USE_CMAPS */ - + { 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; } } @@ -622,7 +619,8 @@ root->face_flags |= FT_FACE_FLAG_FIXED_SIZES; #if 0 - /* I don't know criteria whether layout is horizontal or vertical */ + /* XXX: I don't know criteria whether layout is horizontal */ + /* or vertical. */ if ( has_outline.... ) { ... @@ -753,7 +751,7 @@ FT_LOCAL_DEF( void ) SFNT_Done_Face( TT_Face face ) { - FT_Memory memory = face->root.memory; + FT_Memory memory = face->root.memory; SFNT_Service sfnt = (SFNT_Service)face->sfnt; @@ -783,8 +781,9 @@ #ifdef FT_CONFIG_OPTION_USE_CMAPS { - FT_Stream stream = FT_FACE_STREAM(face); - + FT_Stream stream = FT_FACE_STREAM( face ); + + /* simply release the 'cmap' table frame */ FT_FRAME_RELEASE( face->cmap_table ); face->cmap_size = 0; diff --git a/src/sfnt/sfobjs.h b/src/sfnt/sfobjs.h index a93595674..f30c1985e 100644 --- a/src/sfnt/sfobjs.h +++ b/src/sfnt/sfobjs.h @@ -4,7 +4,7 @@ /* */ /* SFNT object management (specification). */ /* */ -/* Copyright 1996-2001 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/src/sfnt/ttcmap.c b/src/sfnt/ttcmap.c index 7a583915c..5d0a61a2c 100644 --- a/src/sfnt/ttcmap.c +++ b/src/sfnt/ttcmap.c @@ -4,7 +4,7 @@ /* */ /* TrueType character mapping table (cmap) support (body). */ /* */ -/* Copyright 1996-2001 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -35,52 +35,52 @@ FT_CALLBACK_DEF( FT_UInt ) - code_to_index0( TT_CMapTable charmap, - FT_ULong char_code ); + code_to_index0( TT_CMapTable charmap, + FT_ULong char_code ); FT_CALLBACK_DEF( FT_ULong ) - code_to_next0( TT_CMapTable charmap, - FT_ULong char_code ); + code_to_next0( TT_CMapTable charmap, + FT_ULong char_code ); FT_CALLBACK_DEF( FT_UInt ) - code_to_index2( TT_CMapTable charmap, - FT_ULong char_code ); + code_to_index2( TT_CMapTable charmap, + FT_ULong char_code ); FT_CALLBACK_DEF( FT_ULong ) - code_to_next2( TT_CMapTable charmap, - FT_ULong char_code ); + code_to_next2( TT_CMapTable charmap, + FT_ULong char_code ); FT_CALLBACK_DEF( FT_UInt ) - code_to_index4( TT_CMapTable charmap, - FT_ULong char_code ); + code_to_index4( TT_CMapTable charmap, + FT_ULong char_code ); FT_CALLBACK_DEF( FT_ULong ) - code_to_next4( TT_CMapTable charmap, - FT_ULong char_code ); + code_to_next4( TT_CMapTable charmap, + FT_ULong char_code ); FT_CALLBACK_DEF( FT_UInt ) - code_to_index6( TT_CMapTable charmap, - FT_ULong char_code ); + code_to_index6( TT_CMapTable charmap, + FT_ULong char_code ); FT_CALLBACK_DEF( FT_ULong ) - code_to_next6( TT_CMapTable charmap, - FT_ULong char_code ); + code_to_next6( TT_CMapTable charmap, + FT_ULong char_code ); FT_CALLBACK_DEF( FT_UInt ) - code_to_index8_12( TT_CMapTable charmap, - FT_ULong char_code ); + code_to_index8_12( TT_CMapTable charmap, + FT_ULong char_code ); FT_CALLBACK_DEF( FT_ULong ) - code_to_next8_12( TT_CMapTable charmap, - FT_ULong char_code ); + code_to_next8_12( TT_CMapTable charmap, + FT_ULong char_code ); FT_CALLBACK_DEF( FT_UInt ) - code_to_index10( TT_CMapTable charmap, - FT_ULong char_code ); + code_to_index10( TT_CMapTable charmap, + FT_ULong char_code ); FT_CALLBACK_DEF( FT_ULong ) - code_to_next10( TT_CMapTable charmap, - FT_ULong char_code ); + code_to_next10( TT_CMapTable charmap, + FT_ULong char_code ); /*************************************************************************/ @@ -93,6 +93,7 @@ /* */ /* */ /* face :: A handle to the parent face object. */ + /* */ /* stream :: A handle to the current stream object. */ /* */ /* */ @@ -107,27 +108,27 @@ /* released. */ /* */ FT_LOCAL_DEF( FT_Error ) - TT_CharMap_Load( TT_Face face, - TT_CMapTable cmap, - FT_Stream stream ) + TT_CharMap_Load( TT_Face face, + TT_CMapTable cmap, + FT_Stream stream ) { - FT_Error error; - FT_Memory memory; - FT_UShort num_SH, num_Seg, i; - FT_ULong j, n; + FT_Error error; + FT_Memory memory; + FT_UShort num_SH, num_Seg, i; + FT_ULong j, n; - FT_UShort u, l; + FT_UShort u, l; - TT_CMap0 cmap0; - TT_CMap2 cmap2; - TT_CMap4 cmap4; - TT_CMap6 cmap6; + TT_CMap0 cmap0; + TT_CMap2 cmap2; + TT_CMap4 cmap4; + TT_CMap6 cmap6; TT_CMap8_12 cmap8_12; TT_CMap10 cmap10; - TT_CMap2SubHeader cmap2sub; - TT_CMap4Segment segments; - TT_CMapGroup groups; + TT_CMap2SubHeader cmap2sub; + TT_CMap4Segment segments; + TT_CMapGroup groups; if ( cmap->loaded ) @@ -143,12 +144,12 @@ case 0: cmap0 = &cmap->c.cmap0; - if ( FT_READ_USHORT( cmap0->language ) || - FT_ALLOC( cmap0->glyphIdArray, 256L ) || + if ( FT_READ_USHORT( cmap0->language ) || + FT_ALLOC( cmap0->glyphIdArray, 256L ) || FT_STREAM_READ( cmap0->glyphIdArray, 256L ) ) goto Fail; - cmap->get_index = code_to_index0; + cmap->get_index = code_to_index0; cmap->get_next_char = code_to_next0; break; @@ -159,7 +160,7 @@ /* allocate subheader keys */ if ( FT_NEW_ARRAY( cmap2->subHeaderKeys, 256 ) || - FT_FRAME_ENTER( 2L + 512L ) ) + FT_FRAME_ENTER( 2L + 512L ) ) goto Fail; cmap2->language = FT_GET_USHORT(); @@ -178,10 +179,10 @@ /* load subheaders */ cmap2->numGlyphId = l = (FT_UShort)( - ( ( cmap->length - 2L * ( 256 + 3 ) - num_SH * 8L ) & 0xFFFF ) / 2 ); + ( ( cmap->length - 2L * ( 256 + 3 ) - num_SH * 8L ) & 0xFFFFU ) / 2 ); - if ( FT_NEW_ARRAY( cmap2->subHeaders, num_SH + 1 ) || - FT_FRAME_ENTER( ( num_SH + 1 ) * 8L ) ) + if ( FT_NEW_ARRAY( cmap2->subHeaders, num_SH + 1 ) || + FT_FRAME_ENTER( ( num_SH + 1 ) * 8L ) ) { FT_FREE( cmap2->subHeaderKeys ); goto Fail; @@ -249,15 +250,15 @@ segments = cmap4->segments; for ( i = 0; i < num_Seg; i++ ) - segments[i].endCount = FT_GET_USHORT(); + segments[i].endCount = FT_GET_USHORT(); (void)FT_GET_USHORT(); for ( i = 0; i < num_Seg; i++ ) - segments[i].startCount = FT_GET_USHORT(); + segments[i].startCount = FT_GET_USHORT(); for ( i = 0; i < num_Seg; i++ ) - segments[i].idDelta = FT_GET_SHORT(); + segments[i].idDelta = FT_GET_SHORT(); for ( i = 0; i < num_Seg; i++ ) segments[i].idRangeOffset = FT_GET_USHORT(); @@ -265,7 +266,7 @@ FT_FRAME_EXIT(); cmap4->numGlyphId = l = (FT_UShort)( - ( ( cmap->length - ( 16L + 8L * num_Seg ) ) & 0xFFFF ) / 2 ); + ( ( cmap->length - ( 16L + 8L * num_Seg ) ) & 0xFFFFU ) / 2 ); /* load IDs */ @@ -283,7 +284,7 @@ cmap4->last_segment = cmap4->segments; - cmap->get_index = code_to_index4; + cmap->get_index = code_to_index4; cmap->get_next_char = code_to_next4; break; @@ -309,7 +310,7 @@ cmap6->glyphIdArray[i] = FT_GET_USHORT(); FT_FRAME_EXIT(); - cmap->get_index = code_to_index6; + cmap->get_index = code_to_index6; cmap->get_next_char = code_to_next6; break; @@ -351,7 +352,7 @@ cmap8_12->last_group = cmap8_12->groups; - cmap->get_index = code_to_index8_12; + cmap->get_index = code_to_index8_12; cmap->get_next_char = code_to_next8_12; break; @@ -378,7 +379,7 @@ cmap10->glyphs[j] = FT_GET_USHORT(); FT_FRAME_EXIT(); - cmap->get_index = code_to_index10; + cmap->get_index = code_to_index10; cmap->get_next_char = code_to_next10; break; @@ -405,14 +406,15 @@ /* */ /* */ /* face :: A handle to the parent face object. */ + /* */ /* cmap :: A handle to a cmap object. */ /* */ /* */ /* FreeType error code. 0 means success. */ /* */ FT_LOCAL_DEF( FT_Error ) - TT_CharMap_Free( TT_Face face, - TT_CMapTable cmap ) + TT_CharMap_Free( TT_Face face, + TT_CMapTable cmap ) { FT_Memory memory; @@ -478,16 +480,17 @@ /* */ /* */ /* charCode :: The wanted character code. */ + /* */ /* cmap0 :: A pointer to a cmap table in format 0. */ /* */ /* */ /* Glyph index into the glyphs array. 0 if the glyph does not exist. */ /* */ FT_CALLBACK_DEF( FT_UInt ) - code_to_index0( TT_CMapTable cmap, - FT_ULong charCode ) + code_to_index0( TT_CMapTable cmap, + FT_ULong charCode ) { - TT_CMap0 cmap0 = &cmap->c.cmap0; + TT_CMap0 cmap0 = &cmap->c.cmap0; return ( charCode <= 0xFF ? cmap0->glyphIdArray[charCode] : 0 ); @@ -506,16 +509,17 @@ /* */ /* */ /* charCode :: The wanted character code. */ + /* */ /* cmap0 :: A pointer to a cmap table in format 0. */ /* */ /* */ /* Next char code. 0 if no higher one is encoded. */ /* */ FT_CALLBACK_DEF( FT_ULong ) - code_to_next0( TT_CMapTable cmap, - FT_ULong charCode ) + code_to_next0( TT_CMapTable cmap, + FT_ULong charCode ) { - TT_CMap0 cmap0 = &cmap->c.cmap0; + TT_CMap0 cmap0 = &cmap->c.cmap0; while ( ++charCode <= 0xFF ) @@ -535,20 +539,21 @@ /* */ /* */ /* charCode :: The wanted character code. */ + /* */ /* cmap2 :: A pointer to a cmap table in format 2. */ /* */ /* */ /* Glyph index into the glyphs array. 0 if the glyph does not exist. */ /* */ FT_CALLBACK_DEF( FT_UInt ) - code_to_index2( TT_CMapTable cmap, - FT_ULong charCode ) + code_to_index2( TT_CMapTable cmap, + FT_ULong charCode ) { - FT_UInt result, index1, offset; - FT_UInt char_lo; - FT_ULong char_hi; - TT_CMap2SubHeader sh2; - TT_CMap2 cmap2; + FT_UInt result, index1, offset; + FT_UInt char_lo; + FT_ULong char_hi; + TT_CMap2SubHeader sh2; + TT_CMap2 cmap2; cmap2 = &cmap->c.cmap2; @@ -582,7 +587,7 @@ { result = cmap2->glyphIdArray[offset]; if ( result ) - result = ( result + sh2->idDelta ) & 0xFFFF; + result = ( result + sh2->idDelta ) & 0xFFFFU; } } @@ -600,20 +605,21 @@ /* */ /* */ /* charCode :: The wanted character code. */ + /* */ /* cmap2 :: A pointer to a cmap table in format 2. */ /* */ /* */ /* Next encoded character. 0 if none exists. */ /* */ FT_CALLBACK_DEF( FT_ULong ) - code_to_next2( TT_CMapTable cmap, - FT_ULong charCode ) + code_to_next2( TT_CMapTable cmap, + FT_ULong charCode ) { - FT_UInt index1, offset; - FT_UInt char_lo; - FT_ULong char_hi; - TT_CMap2SubHeader sh2; - TT_CMap2 cmap2; + FT_UInt index1, offset; + FT_UInt char_lo; + FT_ULong char_hi; + TT_CMap2SubHeader sh2; + TT_CMap2 cmap2; cmap2 = &cmap->c.cmap2; @@ -683,17 +689,18 @@ /* */ /* */ /* charCode :: The wanted character code. */ + /* */ /* cmap4 :: A pointer to a cmap table in format 4. */ /* */ /* */ /* Glyph index into the glyphs array. 0 if the glyph does not exist. */ /* */ FT_CALLBACK_DEF( FT_UInt ) - code_to_index4( TT_CMapTable cmap, - FT_ULong charCode ) + code_to_index4( TT_CMapTable cmap, + FT_ULong charCode ) { - FT_UInt result, index1, segCount; - TT_CMap4 cmap4; + FT_UInt result, index1, segCount; + TT_CMap4 cmap4; TT_CMap4SegmentRec *seg4, *limit; @@ -739,7 +746,7 @@ /* directly */ if ( seg4->idRangeOffset == 0 ) - result = ( charCode + seg4->idDelta ) & 0xFFFF; + result = ( charCode + seg4->idDelta ) & 0xFFFFU; else { /* otherwise, we must use the glyphIdArray to do it */ @@ -750,7 +757,7 @@ if ( index1 < (FT_UInt)cmap4->numGlyphId && cmap4->glyphIdArray[index1] != 0 ) - result = ( cmap4->glyphIdArray[index1] + seg4->idDelta ) & 0xFFFF; + result = ( cmap4->glyphIdArray[index1] + seg4->idDelta ) & 0xFFFFU; } return result; @@ -767,17 +774,18 @@ /* */ /* */ /* charCode :: The wanted character code. */ + /* */ /* cmap :: A pointer to a cmap table in format 4. */ /* */ /* */ /* Next encoded character. 0 if none exists. */ /* */ FT_CALLBACK_DEF( FT_ULong ) - code_to_next4( TT_CMapTable cmap, - FT_ULong charCode ) + code_to_next4( TT_CMapTable cmap, + FT_ULong charCode ) { - FT_UInt index1, segCount; - TT_CMap4 cmap4; + FT_UInt index1, segCount; + TT_CMap4 cmap4; TT_CMap4SegmentRec *seg4, *limit; @@ -834,17 +842,18 @@ /* */ /* */ /* charCode :: The wanted character code. */ + /* */ /* cmap6 :: A pointer to a cmap table in format 6. */ /* */ /* */ /* Glyph index into the glyphs array. 0 if the glyph does not exist. */ /* */ FT_CALLBACK_DEF( FT_UInt ) - code_to_index6( TT_CMapTable cmap, - FT_ULong charCode ) + code_to_index6( TT_CMapTable cmap, + FT_ULong charCode ) { - TT_CMap6 cmap6; - FT_UInt result = 0; + TT_CMap6 cmap6; + FT_UInt result = 0; cmap6 = &cmap->c.cmap6; @@ -867,16 +876,17 @@ /* */ /* */ /* charCode :: The wanted character code. */ + /* */ /* cmap :: A pointer to a cmap table in format 6. */ /* */ /* */ /* Next encoded character. 0 if none exists. */ /* */ FT_CALLBACK_DEF( FT_ULong ) - code_to_next6( TT_CMapTable cmap, - FT_ULong charCode ) + code_to_next6( TT_CMapTable cmap, + FT_ULong charCode ) { - TT_CMap6 cmap6; + TT_CMap6 cmap6; charCode++; @@ -910,16 +920,17 @@ /* */ /* */ /* charCode :: The wanted character code. */ + /* */ /* cmap8_12 :: A pointer to a cmap table in format 8 or 12. */ /* */ /* */ /* Glyph index into the glyphs array. 0 if the glyph does not exist. */ /* */ FT_CALLBACK_DEF( FT_UInt ) - code_to_index8_12( TT_CMapTable cmap, - FT_ULong charCode ) + code_to_index8_12( TT_CMapTable cmap, + FT_ULong charCode ) { - TT_CMap8_12 cmap8_12; + TT_CMap8_12 cmap8_12; TT_CMapGroupRec *group, *limit; @@ -974,16 +985,17 @@ /* */ /* */ /* charCode :: The wanted character code. */ + /* */ /* cmap :: A pointer to a cmap table in format 8 or 12. */ /* */ /* */ /* Next encoded character. 0 if none exists. */ /* */ FT_CALLBACK_DEF( FT_ULong ) - code_to_next8_12( TT_CMapTable cmap, - FT_ULong charCode ) + code_to_next8_12( TT_CMapTable cmap, + FT_ULong charCode ) { - TT_CMap8_12 cmap8_12; + TT_CMap8_12 cmap8_12; TT_CMapGroupRec *group, *limit; @@ -1020,17 +1032,18 @@ /* */ /* */ /* charCode :: The wanted character code. */ + /* */ /* cmap10 :: A pointer to a cmap table in format 10. */ /* */ /* */ /* Glyph index into the glyphs array. 0 if the glyph does not exist. */ /* */ FT_CALLBACK_DEF( FT_UInt ) - code_to_index10( TT_CMapTable cmap, - FT_ULong charCode ) + code_to_index10( TT_CMapTable cmap, + FT_ULong charCode ) { TT_CMap10 cmap10; - FT_UInt result = 0; + FT_UInt result = 0; cmap10 = &cmap->c.cmap10; @@ -1057,14 +1070,15 @@ /* */ /* */ /* charCode :: The wanted character code. */ + /* */ /* cmap :: A pointer to a cmap table in format 10. */ /* */ /* */ /* Next encoded character. 0 if none exists. */ /* */ FT_CALLBACK_DEF( FT_ULong ) - code_to_next10( TT_CMapTable cmap, - FT_ULong charCode ) + code_to_next10( TT_CMapTable cmap, + FT_ULong charCode ) { TT_CMap10 cmap10; diff --git a/src/sfnt/ttcmap.h b/src/sfnt/ttcmap.h index b05aba609..6ddb79ef4 100644 --- a/src/sfnt/ttcmap.h +++ b/src/sfnt/ttcmap.h @@ -4,7 +4,7 @@ /* */ /* TrueType character mapping table (cmap) support (specification). */ /* */ -/* Copyright 1996-2001 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -28,13 +28,13 @@ FT_BEGIN_HEADER FT_LOCAL( FT_Error ) - TT_CharMap_Load( TT_Face face, - TT_CMapTable cmap, - FT_Stream input ); + TT_CharMap_Load( TT_Face face, + TT_CMapTable cmap, + FT_Stream input ); FT_LOCAL( FT_Error ) - TT_CharMap_Free( TT_Face face, - TT_CMapTable cmap ); + TT_CharMap_Free( TT_Face face, + TT_CMapTable cmap ); FT_END_HEADER diff --git a/src/sfnt/ttcmap0.c b/src/sfnt/ttcmap0.c index b07969305..ac0ba2596 100644 --- a/src/sfnt/ttcmap0.c +++ b/src/sfnt/ttcmap0.c @@ -1,10 +1,10 @@ /***************************************************************************/ /* */ -/* ttcmap.c */ +/* ttcmap0.c */ /* */ -/* TrueType character mapping table (cmap) support (body). */ +/* TrueType new character mapping table (cmap) support (body). */ /* */ -/* Copyright 1996-2001 by */ +/* Copyright 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -35,48 +35,47 @@ #define FT_COMPONENT trace_ttcmap +#define TT_PEEK_SHORT FT_PEEK_SHORT +#define TT_PEEK_USHORT FT_PEEK_USHORT +#define TT_PEEK_LONG FT_PEEK_LONG +#define TT_PEEK_ULONG FT_PEEK_ULONG -#define TT_PEEK_SHORT FT_PEEK_SHORT -#define TT_PEEK_USHORT FT_PEEK_USHORT -#define TT_PEEK_LONG FT_PEEK_LONG -#define TT_PEEK_ULONG FT_PEEK_ULONG - -#define TT_NEXT_SHORT FT_NEXT_SHORT -#define TT_NEXT_USHORT FT_NEXT_USHORT -#define TT_NEXT_LONG FT_NEXT_LONG -#define TT_NEXT_ULONG FT_NEXT_ULONG +#define TT_NEXT_SHORT FT_NEXT_SHORT +#define TT_NEXT_USHORT FT_NEXT_USHORT +#define TT_NEXT_LONG FT_NEXT_LONG +#define TT_NEXT_ULONG FT_NEXT_ULONG FT_CALLBACK_DEF( FT_Error ) - tt_cmap_init( TT_CMap cmap, - FT_Byte* table ) + tt_cmap_init( TT_CMap cmap, + FT_Byte* table ) { cmap->data = table; return 0; } - /************************************************************************/ - /************************************************************************/ - /***** *****/ - /***** FORMAT 0 *****/ - /***** *****/ - /************************************************************************/ - /************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 0 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ - /************************************************************************* - * - * TABLE OVERVIEW: - * --------------- - * - * NAME OFFSET TYPE DESCRIPTION - * - * format 0 USHORT must be 0 - * length 2 USHORT table length in bytes - * language 4 USHORT Mac language code - * glyph_ids 6 BYTE[256] array of glyph indices - * 262 - */ + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 0 */ + /* length 2 USHORT table length in bytes */ + /* language 4 USHORT Mac language code */ + /* glyph_ids 6 BYTE[256] array of glyph indices */ + /* 262 */ + /* */ #ifdef TT_CONFIG_CMAP_FORMAT_0 @@ -85,7 +84,8 @@ FT_Validator valid ) { FT_Byte* p = table + 2; - FT_UInt length = TT_NEXT_USHORT(p); + FT_UInt length = TT_NEXT_USHORT( p ); + if ( table + length > valid->limit || length < 262 ) FT_INVALID_TOO_SHORT; @@ -93,13 +93,14 @@ /* check glyph indices whenever necessary */ if ( valid->level >= FT_VALIDATE_TIGHT ) { - FT_UInt n, index; + FT_UInt n, idx; + p = table + 6; for ( n = 0; n < 256; n++ ) { - index = *p++; - if ( index >= TT_VALID_GLYPH_COUNT(valid) ) + idx = *p++; + if ( idx >= TT_VALID_GLYPH_COUNT( valid ) ) FT_INVALID_GLYPH_ID; } } @@ -112,19 +113,21 @@ { FT_Byte* table = cmap->data; - return ( char_code < 256 ? table[6+char_code] : 0 ); + + return char_code < 256 ? table[6 + char_code] : 0; } FT_CALLBACK_DEF( FT_UInt ) - tt_cmap0_char_next( TT_CMap cmap, - FT_UInt32 *pchar_code ) + tt_cmap0_char_next( TT_CMap cmap, + FT_UInt32 *pchar_code ) { FT_Byte* table = cmap->data; FT_UInt32 charcode = *pchar_code; FT_UInt32 result = 0; FT_UInt gindex = 0; + table += 6; /* go to glyph ids */ while ( ++charcode < 256 ) { @@ -141,107 +144,109 @@ } - FT_CALLBACK_TABLE_DEF const TT_CMap_ClassRec tt_cmap0_class_rec = + FT_CALLBACK_TABLE_DEF + const TT_CMap_ClassRec tt_cmap0_class_rec = { { sizeof( TT_CMapRec ), - (FT_CMap_InitFunc) tt_cmap_init, - (FT_CMap_DoneFunc) NULL, - (FT_CMap_CharIndexFunc) tt_cmap0_char_index, - (FT_CMap_CharNextFunc) tt_cmap0_char_next + (FT_CMap_InitFunc) tt_cmap_init, + (FT_CMap_DoneFunc) NULL, + (FT_CMap_CharIndexFunc)tt_cmap0_char_index, + (FT_CMap_CharNextFunc) tt_cmap0_char_next }, 0, - (TT_CMap_ValidateFunc) tt_cmap0_validate + (TT_CMap_ValidateFunc) tt_cmap0_validate }; #endif /* TT_CONFIG_CMAP_FORMAT_0 */ - /************************************************************************/ - /************************************************************************/ - /***** *****/ - /***** FORMAT 2 *****/ - /***** *****/ - /***** This is used for certain CJK encodings that encode text *****/ - /***** in a mixed 8/16 bits along the following lines: *****/ - /***** *****/ - /***** * certain byte values correspond to an 8-bit character code *****/ - /***** (typicall in the range 0..127 for ASCII compatibility) *****/ - /***** *****/ - /***** * certain byte values signal the first byte of a 2-byte *****/ - /***** character code (but these values are also valid as the *****/ - /***** second byte of a 2-byte character) *****/ - /***** *****/ - /***** the following charmap lookup and iteration function all *****/ - /***** assume that the value "charcode" correspond to following: *****/ - /***** *****/ - /***** - for one byte characters, "charcode" is simply the *****/ - /***** character code *****/ - /***** *****/ - /***** - for two byte characters, "charcode" is the 2-byte *****/ - /***** character code in big endian format. More exactly: *****/ - /***** *****/ - /***** (charcode >> 8) is the first byte value *****/ - /***** (charcode & 0xFF) is the second byte value *****/ - /***** *****/ - /***** note that not all values of "charcode" are valid *****/ - /***** according to these rules, and the function moderately *****/ - /***** check the arguments.. *****/ - /***** *****/ - /************************************************************************/ - /************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 2 *****/ + /***** *****/ + /***** This is used for certain CJK encodings that encode text in a *****/ + /***** mixed 8/16 bits encoding along the following lines: *****/ + /***** *****/ + /***** * Certain byte values correspond to an 8-bit character code *****/ + /***** (typically in the range 0..127 for ASCII compatibility). *****/ + /***** *****/ + /***** * Certain byte values signal the first byte of a 2-byte *****/ + /***** character code (but these values are also valid as the *****/ + /***** second byte of a 2-byte character). *****/ + /***** *****/ + /***** The following charmap lookup and iteration functions all *****/ + /***** assume that the value "charcode" correspond to following: *****/ + /***** *****/ + /***** - For one byte characters, "charcode" is simply the *****/ + /***** character code. *****/ + /***** *****/ + /***** - For two byte characters, "charcode" is the 2-byte *****/ + /***** character code in big endian format. More exactly: *****/ + /***** *****/ + /***** (charcode >> 8) is the first byte value *****/ + /***** (charcode & 0xFF) is the second byte value *****/ + /***** *****/ + /***** Note that not all values of "charcode" are valid according *****/ + /***** to these rules, and the function moderately check the *****/ + /***** arguments. *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ - /************************************************************************* - * - * TABLE OVERVIEW: - * --------------- - * - * NAME OFFSET TYPE DESCRIPTION - * - * format 0 USHORT must be 2 - * length 2 USHORT table length in bytes - * language 4 USHORT Mac language code - * keys 6 USHORT[256] sub-header keys - * subs 518 SUBHEAD[NSUBS] sub-headers array - * glyph_ids 518+NSUB*8 USHORT[] glyph id array - * - * the 'keys' table is used to map charcode high-bytes to sub-headers. - * the value of 'NSUBS' is the number of sub-headers defined in the - * table and is computed by finding the maximum of the 'keys' table. - * - * note that for any N, keys[n] is a byte offset within the subs table, - * i.e. it is the corresponding sub-header index multiplied by 8. - * - * each sub-header has the following format: - * - * NAME OFFSET TYPE DESCRIPTION - * - * first 0 USHORT first valid low-byte - * count 2 USHORT number of valid low-bytes - * delta 4 SHORT see below - * offset 6 USHORT see below - * - * a sub-header defines, for each high-byte, the range of valid low-bytes - * within the charmap. note that the range defined by 'first' and 'count' - * must be completely included in the interval [0..255] according to the - * specification - * - * if a character code is contained within a given sub-header, then mapping - * it to a glyph index is done as follows: - * - * * the value of 'offset' is read. this is a _byte_ distance from the - * location of the 'offset' field itself into a slice of the 'glyph_ids' - * table. Let's call it 'slice' (it's a USHORT[] too) - * - * * the value 'slice[ char.lo - first ]' is read. If it is 0, there is - * no glyph for the charcode. Otherwise, the value of 'delta' is added - * to it (modulo 65536) to form a new glyph index - * - * it is up to the validation routine to check that all offsets fall within - * the glyph ids table (and not within the 'subs' table itself or outside - * of the CMap). - */ + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 2 */ + /* length 2 USHORT table length in bytes */ + /* language 4 USHORT Mac language code */ + /* keys 6 USHORT[256] sub-header keys */ + /* subs 518 SUBHEAD[NSUBS] sub-headers array */ + /* glyph_ids 518+NSUB*8 USHORT[] glyph id array */ + /* */ + /* The `keys' table is used to map charcode high-bytes to sub-headers. */ + /* The value of `NSUBS' is the number of sub-headers defined in the */ + /* table and is computed by finding the maximum of the `keys' table. */ + /* */ + /* Note that for any n, `keys[n]' is a byte offset within the `subs' */ + /* table, i.e., it is the corresponding sub-header index multiplied */ + /* by 8. */ + /* */ + /* Each sub-header has the following format: */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* first 0 USHORT first valid low-byte */ + /* count 2 USHORT number of valid low-bytes */ + /* delta 4 SHORT see below */ + /* offset 6 USHORT see below */ + /* */ + /* A sub-header defines, for each high-byte, the range of valid */ + /* low-bytes within the charmap. Note that the range defined by `first' */ + /* and `count' must be completely included in the interval [0..255] */ + /* according to the specification. */ + /* */ + /* If a character code is contained within a given sub-header, then */ + /* mapping it to a glyph index is done as follows: */ + /* */ + /* * The value of `offset' is read. This is a _byte_ distance from the */ + /* location of the `offset' field itself into a slice of the */ + /* `glyph_ids' table. Let's call it `slice' (it's a USHORT[] too). */ + /* */ + /* * The value `slice[char.lo - first]' is read. If it is 0, there is */ + /* no glyph for the charcode. Otherwise, the value of `delta' is */ + /* added to it (modulo 65536) to form a new glyph index. */ + /* */ + /* It is up to the validation routine to check that all offsets fall */ + /* within the glyph ids table (and not within the `subs' table itself or */ + /* outside of the CMap). */ + /* */ #ifdef TT_CONFIG_CMAP_FORMAT_2 @@ -249,15 +254,15 @@ tt_cmap2_validate( FT_Byte* table, FT_Validator valid ) { - FT_Byte* p = table + 2; /* skip format */ - FT_UInt length = TT_PEEK_USHORT(p); + FT_Byte* p = table + 2; /* skip format */ + FT_UInt length = TT_PEEK_USHORT( p ); FT_UInt n, max_subs; - FT_Byte* keys; /* keys table */ - FT_Byte* subs; /* sub-headers */ - FT_Byte* glyph_ids; /* glyph id array */ + FT_Byte* keys; /* keys table */ + FT_Byte* subs; /* sub-headers */ + FT_Byte* glyph_ids; /* glyph id array */ - if ( table + length > valid->limit || length < 6+512 ) + if ( table + length > valid->limit || length < 6 + 512 ) FT_INVALID_TOO_SHORT; keys = table + 6; @@ -267,22 +272,23 @@ max_subs = 0; for ( n = 0; n < 256; n++ ) { - FT_UInt index = TT_NEXT_USHORT(p); + FT_UInt idx = TT_NEXT_USHORT( p ); + /* value must be multiple of 8 */ - if ( valid->level >= FT_VALIDATE_PARANOID && ( index & 7 ) != 0 ) + if ( valid->level >= FT_VALIDATE_PARANOID && ( idx & 7 ) != 0 ) FT_INVALID_DATA; - index >>= 3; + idx >>= 3; - if ( index > max_subs ) - max_subs = index; + if ( idx > max_subs ) + max_subs = idx; } FT_ASSERT( p == table + 518 ); subs = p; - glyph_ids = subs + (max_subs + 1)*8; + glyph_ids = subs + (max_subs + 1) * 8; if ( glyph_ids > valid->limit ) FT_INVALID_TOO_SHORT; @@ -294,10 +300,10 @@ FT_Byte* ids; - first_code = TT_NEXT_USHORT(p); - code_count = TT_NEXT_USHORT(p); - delta = TT_NEXT_SHORT(p); - offset = TT_NEXT_USHORT(p); + first_code = TT_NEXT_USHORT( p ); + code_count = TT_NEXT_USHORT( p ); + delta = TT_NEXT_SHORT( p ); + offset = TT_NEXT_USHORT( p ); /* check range within 0..255 */ if ( valid->level >= FT_VALIDATE_PARANOID ) @@ -316,16 +322,17 @@ /* check glyph ids */ if ( valid->level >= FT_VALIDATE_TIGHT ) { - FT_Byte* limit = p + code_count*2; - FT_UInt index; + FT_Byte* limit = p + code_count * 2; + FT_UInt idx; + for ( ; p < limit; ) { - index = TT_NEXT_USHORT(p); - if ( index != 0 ) + idx = TT_NEXT_USHORT( p ); + if ( idx != 0 ) { - index = (index + delta) & 0xFFFFU; - if ( index >= TT_VALID_GLYPH_COUNT(valid) ) + idx = ( idx + delta ) & 0xFFFFU; + if ( idx >= TT_VALID_GLYPH_COUNT( valid ) ) FT_INVALID_GLYPH_ID; } } @@ -336,26 +343,27 @@ /* return sub header corresponding to a given character code */ - /* NULL on invalid charcode.. */ + /* NULL on invalid charcode */ static FT_Byte* tt_cmap2_get_subheader( FT_Byte* table, FT_UInt32 char_code ) { FT_Byte* result = NULL; - if ( char_code < 0x10000 ) + + if ( char_code < 0x10000UL ) { - FT_UInt char_lo = (FT_UInt)( char_code & 0xFF ); - FT_UInt char_hi = (FT_UInt)( char_code >> 8 ); - FT_Byte* p = table + 6; /* keys table */ - FT_Byte* subs = table + 518; /* subheaders table */ - FT_Byte* sub; + FT_UInt char_lo = (FT_UInt)( char_code & 0xFF ); + FT_UInt char_hi = (FT_UInt)( char_code >> 8 ); + FT_Byte* p = table + 6; /* keys table */ + FT_Byte* subs = table + 518; /* subheaders table */ + FT_Byte* sub; if ( char_hi == 0 ) { /* an 8-bit character code -- we use subHeader 0 in this case */ - /* to test wheteher the character code is in the charmap */ + /* to test whether the character code is in the charmap */ /* */ sub = subs; /* jump to first sub-header */ @@ -363,15 +371,15 @@ /* indicates that it's really a valid one-byte value */ /* Otherwise, return 0 */ /* */ - p += char_lo*2; - if ( TT_PEEK_USHORT(p) != 0 ) + p += char_lo * 2; + if ( TT_PEEK_USHORT( p ) != 0 ) goto Exit; } else { /* a 16-bit character code */ - p += char_hi*2; /* jump to key entry */ - sub = subs + ( TT_PEEK_USHORT(p) & -8 ); /* jump to sub-header */ + p += char_hi * 2; /* jump to key entry */ + sub = subs + ( TT_PEEK_USHORT( p ) & -8 ); /* jump to sub-header */ /* check that the hi byte isn't a valid one-byte value */ if ( sub == subs ) @@ -392,57 +400,60 @@ FT_UInt result = 0; FT_Byte* subheader; + subheader = tt_cmap2_get_subheader( table, char_code ); if ( subheader ) { - FT_Byte* p = subheader; - FT_UInt index = (FT_UInt)(char_code & 0xFF); + FT_Byte* p = subheader; + FT_UInt idx = (FT_UInt)(char_code & 0xFF); FT_UInt start, count; FT_Int delta; FT_UInt offset; - start = TT_NEXT_USHORT(p); - count = TT_NEXT_USHORT(p); - delta = TT_NEXT_SHORT(p); - offset = TT_PEEK_USHORT(p); - index -= start; - if ( index < count && offset != 0 ) + start = TT_NEXT_USHORT( p ); + count = TT_NEXT_USHORT( p ); + delta = TT_NEXT_SHORT ( p ); + offset = TT_PEEK_USHORT( p ); + + idx -= start; + if ( idx < count && offset != 0 ) { - p += offset + 2*index; - index = TT_PEEK_USHORT(p); + p += offset + 2 * idx; + idx = TT_PEEK_USHORT( p ); - if ( index != 0 ) - result = (FT_UInt)( index + delta ) & 0xFFFFU; + if ( idx != 0 ) + result = (FT_UInt)( idx + delta ) & 0xFFFFU; } } return result; } - FT_CALLBACK_DEF( FT_UInt ) tt_cmap2_char_next( TT_CMap cmap, FT_UInt32 *pcharcode ) { - FT_Byte* table = cmap->data; - FT_UInt gindex = 0; - FT_UInt32 result = 0; - FT_UInt32 charcode = *pcharcode + 1; - FT_Byte* subheader; + FT_Byte* table = cmap->data; + FT_UInt gindex = 0; + FT_UInt32 result = 0; + FT_UInt32 charcode = *pcharcode + 1; + FT_Byte* subheader; - while ( charcode < 0x10000U ) + + while ( charcode < 0x10000UL ) { subheader = tt_cmap2_get_subheader( table, charcode ); if ( subheader ) { FT_Byte* p = subheader; - FT_UInt start = TT_NEXT_USHORT(p); - FT_UInt count = TT_NEXT_USHORT(p); - FT_Int delta = TT_NEXT_SHORT(p); - FT_UInt offset = TT_PEEK_USHORT(p); + FT_UInt start = TT_NEXT_USHORT( p ); + FT_UInt count = TT_NEXT_USHORT( p ); + FT_Int delta = TT_NEXT_SHORT ( p ); + FT_UInt offset = TT_PEEK_USHORT( p ); FT_UInt char_lo = (FT_UInt)( charcode & 0xFF ); - FT_UInt pos, index; + FT_UInt pos, idx; + if ( offset == 0 ) goto Next_SubHeader; @@ -455,16 +466,16 @@ else pos = (FT_UInt)( char_lo - start ); - p += offset + pos*2; - charcode = (charcode & -256) + char_lo; + p += offset + pos * 2; + charcode = ( charcode & -256 ) + char_lo; for ( ; pos < count; pos++, charcode++ ) { - index = TT_NEXT_USHORT(p); + idx = TT_NEXT_USHORT( p ); - if ( index != 0 ) + if ( idx != 0 ) { - gindex = ( index + delta ) & 0xFFFFU; + gindex = ( idx + delta ) & 0xFFFFU; if ( gindex != 0 ) { result = charcode; @@ -476,7 +487,7 @@ /* jump to next sub-header, i.e. higher byte value */ Next_SubHeader: - charcode = (charcode & -256) + 256; + charcode = ( charcode & -256 ) + 256; } Exit: @@ -485,82 +496,89 @@ return gindex; } - FT_CALLBACK_TABLE_DEF const TT_CMap_ClassRec tt_cmap2_class_rec = + + FT_CALLBACK_TABLE_DEF + const TT_CMap_ClassRec tt_cmap2_class_rec = { { sizeof( TT_CMapRec ), - (FT_CMap_InitFunc) tt_cmap_init, - (FT_CMap_DoneFunc) NULL, - (FT_CMap_CharIndexFunc) tt_cmap2_char_index, - (FT_CMap_CharNextFunc) tt_cmap2_char_next + (FT_CMap_InitFunc) tt_cmap_init, + (FT_CMap_DoneFunc) NULL, + (FT_CMap_CharIndexFunc)tt_cmap2_char_index, + (FT_CMap_CharNextFunc) tt_cmap2_char_next }, 2, - (TT_CMap_ValidateFunc) tt_cmap2_validate + (TT_CMap_ValidateFunc) tt_cmap2_validate }; #endif /* TT_CONFIG_CMAP_FORMAT_2 */ - /************************************************************************/ - /************************************************************************/ - /***** *****/ - /***** FORMAT 4 *****/ - /***** *****/ - /************************************************************************/ - /************************************************************************/ - - /************************************************************************* - * - * TABLE OVERVIEW: - * --------------- - * - * NAME OFFSET TYPE DESCRIPTION - * - * format 0 USHORT must be 4 - * length 2 USHORT table length in bytes - * language 4 USHORT Mac language code - * - * segCountX2 6 USHORT 2*NUM_SEGS - * searchRange 8 USHORT 2*(1 << LOG_SEGS) - * entrySelector 10 USHORT LOG_SEGS - * rangeShift 12 USHORT segCountX2 - searchRange - * - * endCount 14 USHORT[NUM_SEGS] end charcode for each - * segment. last is 0xFFFF - * - * pad 14+NUM_SEGS*2 USHORT padding - * - * startCount 16+NUM_SEGS*2 USHORT[NUM_SEGS] first charcode for each - * segment - * - * idDelta 16+NUM_SEGS*4 SHORT[NUM_SEGS] delta for each segment - * - * idOffset 16+NUM_SEGS*6 SHORT[NUM_SEGS] range offset for each - * segment. can be 0 - * - * glyphIds 16+NUM_SEGS*8 USHORT[] array og glyph id ranges - * - * - * Charcodes are modelled by a series of ordered (increasing) intervals - * called segments. Each segment has start and end codes, provided by - * the 'startCount' and 'endCount' arrays. Segments must not be over-lapping - * and the last segment should always contain the '0xFFFF' endCount. - * - * The fields 'searchRange', 'entrySelector' and 'rangeShift' are better - * ignored (they're traces of over-engineering in the TT specification) - * - * Each segment also has a signed 'delta', as well as an optional offset - * within the 'glyphIds' table. - * - * if a segment's idOffset is 0, then the glyph index corresponding to - * any charcode within the segment is obtained by adding the value of - * 'idDelta' directly to the charcode, modulo 65536 - * - * otherwise, a glyph index is taken from the glyph ids sub-array for the - * segment, and the value of 'idDelta' is added to it.. - */ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 4 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 4 */ + /* length 2 USHORT table length */ + /* in bytes */ + /* language 4 USHORT Mac language code */ + /* */ + /* segCountX2 6 USHORT 2*NUM_SEGS */ + /* searchRange 8 USHORT 2*(1 << LOG_SEGS) */ + /* entrySelector 10 USHORT LOG_SEGS */ + /* rangeShift 12 USHORT segCountX2 - */ + /* searchRange */ + /* */ + /* endCount 14 USHORT[NUM_SEGS] end charcode for */ + /* each segment; last */ + /* is 0xFFFF */ + /* */ + /* pad 14+NUM_SEGS*2 USHORT padding */ + /* */ + /* startCount 16+NUM_SEGS*2 USHORT[NUM_SEGS] first charcode for */ + /* each segment */ + /* */ + /* idDelta 16+NUM_SEGS*4 SHORT[NUM_SEGS] delta for each */ + /* segment */ + /* idOffset 16+NUM_SEGS*6 SHORT[NUM_SEGS] range offset for */ + /* each segment; can be */ + /* zero */ + /* */ + /* glyphIds 16+NUM_SEGS*8 USHORT[] array of glyph id */ + /* ranges */ + /* */ + /* Character codes are modelled by a series of ordered (increasing) */ + /* intervals called segments. Each segment has start and end codes, */ + /* provided by the `startCount' and `endCount' arrays. Segments must */ + /* not be overlapping and the last segment should always contain the */ + /* `0xFFFF' endCount. */ + /* */ + /* The fields `searchRange', `entrySelector' and `rangeShift' are better */ + /* ignored (they are traces of over-engineering in the TrueType */ + /* specification). */ + /* */ + /* Each segment also has a signed `delta', as well as an optional offset */ + /* within the `glyphIds' table. */ + /* */ + /* If a segment's idOffset is 0, the glyph index corresponding to any */ + /* charcode within the segment is obtained by adding the value of */ + /* `idDelta' directly to the charcode, modulo 65536. */ + /* */ + /* Otherwise, a glyph index is taken from the glyph ids sub-array for */ + /* the segment, and the value of `idDelta' is added to it. */ + /* */ #ifdef TT_CONFIG_CMAP_FORMAT_4 @@ -568,16 +586,17 @@ tt_cmap4_validate( FT_Byte* table, FT_Validator valid ) { - FT_Byte* p = table + 2; /* skip format */ - FT_UInt length = TT_NEXT_USHORT(p); + FT_Byte* p = table + 2; /* skip format */ + FT_UInt length = TT_NEXT_USHORT( p ); FT_Byte *ends, *starts, *offsets, *deltas, *glyph_ids; FT_UInt num_segs; + if ( table + length > valid->limit || length < 16 ) FT_INVALID_TOO_SHORT; p = table + 6; - num_segs = TT_NEXT_USHORT(p); /* read segCountX2 */ + num_segs = TT_NEXT_USHORT( p ); /* read segCountX2 */ if ( valid->level >= FT_VALIDATE_PARANOID ) { @@ -593,30 +612,31 @@ if ( valid->level >= FT_VALIDATE_PARANOID ) { /* check the values of 'searchRange', 'entrySelector', 'rangeShift' */ - FT_UInt search_range = TT_NEXT_USHORT(p); - FT_UInt entry_selector = TT_NEXT_USHORT(p); - FT_UInt range_shift = TT_NEXT_USHORT(p); + FT_UInt search_range = TT_NEXT_USHORT( p ); + FT_UInt entry_selector = TT_NEXT_USHORT( p ); + FT_UInt range_shift = TT_NEXT_USHORT( p ); - if ( (search_range | range_shift) & 1 ) /* must be even values */ + + if ( ( search_range | range_shift ) & 1 ) /* must be even values */ FT_INVALID_DATA; search_range /= 2; range_shift /= 2; - /* 'search range' is the greatest power of 2 that is <= num_segs */ + /* `search range' is the greatest power of 2 that is <= num_segs */ - if ( search_range > num_segs || - search_range*2 < num_segs || - search_range + range_shift != num_segs || - search_range != (1U << entry_selector) ) + if ( search_range > num_segs || + search_range * 2 < num_segs || + search_range + range_shift != num_segs || + search_range != ( 1U << entry_selector ) ) FT_INVALID_DATA; } ends = table + 14; - starts = table + 16 + num_segs*2; - deltas = starts + num_segs*2; - offsets = deltas + num_segs*2; - glyph_ids = offsets + num_segs*2; + starts = table + 16 + num_segs * 2; + deltas = starts + num_segs * 2; + offsets = deltas + num_segs * 2; + glyph_ids = offsets + num_segs * 2; if ( glyph_ids >= table + length ) FT_INVALID_TOO_SHORT; @@ -624,23 +644,28 @@ /* check last segment, its end count must be FFFF */ if ( valid->level >= FT_VALIDATE_PARANOID ) { - p = ends + (num_segs-1)*2; - if ( TT_PEEK_USHORT(p) != 0xFFFFU ) + p = ends + ( num_segs - 1 ) * 2; + if ( TT_PEEK_USHORT( p ) != 0xFFFFU ) FT_INVALID_DATA; } - /* check that segments are sorted in increasing order and do not overlap */ - /* check also the offsets.. */ + /* check that segments are sorted in increasing order and do not */ + /* overlap; check also the offsets */ { FT_UInt start, end, last = 0,offset, n; FT_Int delta; + for ( n = 0; n < num_segs; n++ ) { - p = starts + n*2; start = TT_PEEK_USHORT(p); - p = ends + n*2; end = TT_PEEK_USHORT(p); - p = deltas + n*2; delta = TT_PEEK_SHORT(p); - p = offsets + n*2; offset = TT_PEEK_USHORT(p); + p = starts + n * 2; + start = TT_PEEK_USHORT( p ); + p = ends + n * 2; + end = TT_PEEK_USHORT( p ); + p = deltas + n * 2; + delta = TT_PEEK_SHORT( p ); + p = offsets + n * 2; + offset = TT_PEEK_USHORT( p ); if ( start > end ) FT_INVALID_DATA; @@ -653,34 +678,36 @@ p += offset; /* start of glyph id array */ /* check that we point within the glyph ids table only */ - if ( p < glyph_ids || p + (end - start + 1)*2 > table + length ) + if ( p < glyph_ids || + p + ( end - start + 1 ) * 2 > table + length ) FT_INVALID_DATA; /* check glyph indices within the segment range */ if ( valid->level >= FT_VALIDATE_TIGHT ) { - FT_UInt index; + FT_UInt idx; + for ( ; start < end; ) { - index = FT_NEXT_USHORT(p); - if ( index != 0 ) + idx = FT_NEXT_USHORT( p ); + if ( idx != 0 ) { - index = (FT_UInt)(index + delta) & 0xFFFFU; + idx = (FT_UInt)( idx + delta ) & 0xFFFFU; - if ( index >= TT_VALID_GLYPH_COUNT(valid) ) + if ( idx >= TT_VALID_GLYPH_COUNT( valid ) ) FT_INVALID_GLYPH_ID; } } } } + last = end; } } } - FT_CALLBACK_DEF( FT_UInt ) tt_cmap4_char_index( TT_CMap cmap, FT_UInt32 char_code ) @@ -688,44 +715,49 @@ FT_Byte* table = cmap->data; FT_UInt result = 0; - if ( char_code < 0x10000U ) + + if ( char_code < 0x10000UL ) { FT_Byte* p; FT_Byte* q; - FT_UInt index, num_segs2; + FT_UInt idx, num_segs2; FT_Int delta; FT_UInt n, code = (FT_UInt)char_code; + p = table + 6; - num_segs2 = TT_PEEK_USHORT(p) & -2; /* be paranoid !! */ + num_segs2 = TT_PEEK_USHORT( p ) & -2; /* be paranoid! */ p = table + 14; /* ends table */ q = table + 16 + num_segs2; /* starts table */ for ( n = 0; n < num_segs2; n += 2 ) { - FT_UInt end = TT_NEXT_USHORT(p); - FT_UInt start = TT_NEXT_USHORT(q); + FT_UInt end = TT_NEXT_USHORT( p ); + FT_UInt start = TT_NEXT_USHORT( q ); FT_UInt offset; + if ( code < start ) break; if ( code <= end ) { - index = code; + idx = code; - p = q + num_segs2 - 2; delta = TT_PEEK_SHORT(p); - p += num_segs2; offset = TT_PEEK_USHORT(p); + p = q + num_segs2 - 2; + delta = TT_PEEK_SHORT( p ); + p += num_segs2; + offset = TT_PEEK_USHORT( p ); if ( offset != 0 ) { - p += offset + 2*(index - start); - index = TT_PEEK_USHORT(p); + p += offset + 2 * ( idx - start ); + idx = TT_PEEK_USHORT( p ); } - if ( index != 0 ) - result = (FT_UInt)( index + delta ) & 0xFFFFU; + if ( idx != 0 ) + result = (FT_UInt)( idx + delta ) & 0xFFFFU; } } } @@ -733,20 +765,20 @@ } - FT_CALLBACK_DEF( FT_UInt ) tt_cmap4_char_next( TT_CMap cmap, FT_UInt32 *pchar_code ) { - FT_Byte* table = cmap->data; - FT_UInt32 result = 0; - FT_UInt32 char_code = *pchar_code + 1; - FT_UInt gindex = 0; - FT_Byte* p; - FT_Byte* q; - FT_UInt code, num_segs2; + FT_Byte* table = cmap->data; + FT_UInt32 result = 0; + FT_UInt32 char_code = *pchar_code + 1; + FT_UInt gindex = 0; + FT_Byte* p; + FT_Byte* q; + FT_UInt code, num_segs2; - if ( char_code >= 0x10000U ) + + if ( char_code >= 0x10000UL ) goto Exit; code = (FT_UInt)char_code; @@ -755,32 +787,36 @@ for (;;) { - FT_UInt offset, n; - FT_Int delta; + FT_UInt offset, n; + FT_Int delta; + p = table + 14; /* ends table */ q = table + 16 + num_segs2; /* starts table */ for ( n = 0; n < num_segs2; n += 2 ) { - FT_UInt end = TT_NEXT_USHORT(p); - FT_UInt start = TT_NEXT_USHORT(q); + FT_UInt end = TT_NEXT_USHORT( p ); + FT_UInt start = TT_NEXT_USHORT( q ); + if ( code < start ) code = start; if ( code <= end ) { - p = q + num_segs2 - 2; delta = TT_PEEK_SHORT(p); - p += num_segs2; offset = TT_PEEK_USHORT(p); + p = q + num_segs2 - 2; + delta = TT_PEEK_SHORT( p ); + p += num_segs2; + offset = TT_PEEK_USHORT( p ); if ( offset != 0 ) { /* parse the glyph ids array for non-0 index */ - p += offset + (code - start)*2; + p += offset + ( code - start ) * 2; while ( code <= end ) { - gindex = TT_NEXT_USHORT(p); + gindex = TT_NEXT_USHORT( p ); if ( gindex != 0 ) { gindex = (FT_UInt)( gindex + delta ) & 0xFFFFU; @@ -814,48 +850,50 @@ return gindex; } - FT_CALLBACK_TABLE_DEF const TT_CMap_ClassRec tt_cmap4_class_rec = + + FT_CALLBACK_TABLE_DEF + const TT_CMap_ClassRec tt_cmap4_class_rec = { { - sizeof( TT_CMapRec ), + sizeof ( TT_CMapRec ), - (FT_CMap_InitFunc) tt_cmap_init, - (FT_CMap_DoneFunc) NULL, - (FT_CMap_CharIndexFunc) tt_cmap4_char_index, - (FT_CMap_CharNextFunc) tt_cmap4_char_next + (FT_CMap_InitFunc) tt_cmap_init, + (FT_CMap_DoneFunc) NULL, + (FT_CMap_CharIndexFunc)tt_cmap4_char_index, + (FT_CMap_CharNextFunc) tt_cmap4_char_next }, 4, - (TT_CMap_ValidateFunc) tt_cmap4_validate + (TT_CMap_ValidateFunc) tt_cmap4_validate }; #endif /* TT_CONFIG_CMAP_FORMAT_4 */ - /************************************************************************/ - /************************************************************************/ - /***** *****/ - /***** FORMAT 6 *****/ - /***** *****/ - /************************************************************************/ - /************************************************************************/ - /************************************************************************* - * - * TABLE OVERVIEW: - * --------------- - * - * NAME OFFSET TYPE DESCRIPTION - * - * format 0 USHORT must be 4 - * length 2 USHORT table length in bytes - * language 4 USHORT Mac language code - * - * first 6 USHORT first segment code - * count 8 USHORT segment size in chars - * glyphIds 10 USHORT[count] glyph ids - * - * - * A very simplified segment mapping - */ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 6 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 4 */ + /* length 2 USHORT table length in bytes */ + /* language 4 USHORT Mac language code */ + /* */ + /* first 6 USHORT first segment code */ + /* count 8 USHORT segment size in chars */ + /* glyphIds 10 USHORT[count] glyph ids */ + /* */ + /* A very simplified segment mapping. */ + /* */ #ifdef TT_CONFIG_CMAP_FORMAT_6 @@ -866,17 +904,18 @@ FT_Byte* p; FT_UInt length, start, count; + if ( table + 10 > valid->limit ) FT_INVALID_TOO_SHORT; p = table + 2; - length = TT_NEXT_USHORT(p); + length = TT_NEXT_USHORT( p ); - p = table + 6; /* skip language */ - start = TT_NEXT_USHORT(p); - count = TT_NEXT_USHORT(p); + p = table + 6; /* skip language */ + start = TT_NEXT_USHORT( p ); + count = TT_NEXT_USHORT( p ); - if ( table + length > valid->limit || length < 10 + count*2 ) + if ( table + length > valid->limit || length < 10 + count * 2 ) FT_INVALID_TOO_SHORT; /* check glyph indices */ @@ -884,10 +923,11 @@ { FT_UInt gindex; + for ( ; count > 0; count-- ) { - gindex = TT_NEXT_USHORT(p); - if ( gindex >= TT_VALID_GLYPH_COUNT(valid) ) + gindex = TT_NEXT_USHORT( p ); + if ( gindex >= TT_VALID_GLYPH_COUNT( valid ) ) FT_INVALID_GLYPH_ID; } } @@ -901,45 +941,47 @@ FT_Byte* table = cmap->data; FT_UInt result = 0; FT_Byte* p = table + 6; - FT_UInt start = TT_NEXT_USHORT(p); - FT_UInt count = TT_NEXT_USHORT(p); - FT_UInt index = (FT_UInt)( char_code - start ); + FT_UInt start = TT_NEXT_USHORT( p ); + FT_UInt count = TT_NEXT_USHORT( p ); + FT_UInt idx = (FT_UInt)( char_code - start ); - if ( index < count ) + + if ( idx < count ) { - p += 2*index; - result = TT_PEEK_USHORT(p); + p += 2 * idx; + result = TT_PEEK_USHORT( p ); } return result; } FT_CALLBACK_DEF( FT_UInt ) - tt_cmap6_char_next( TT_CMap cmap, - FT_UInt32 *pchar_code ) + tt_cmap6_char_next( TT_CMap cmap, + FT_UInt32 *pchar_code ) { - FT_Byte* table = cmap->data; - FT_UInt32 result = 0; - FT_UInt32 char_code = *pchar_code + 1; - FT_UInt gindex = 0; + FT_Byte* table = cmap->data; + FT_UInt32 result = 0; + FT_UInt32 char_code = *pchar_code + 1; + FT_UInt gindex = 0; - FT_Byte* p = table + 6; - FT_UInt start = TT_NEXT_USHORT(p); - FT_UInt count = TT_NEXT_USHORT(p); - FT_UInt index; + FT_Byte* p = table + 6; + FT_UInt start = TT_NEXT_USHORT( p ); + FT_UInt count = TT_NEXT_USHORT( p ); + FT_UInt idx; - if ( char_code >= 0x10000U ) + + if ( char_code >= 0x10000UL ) goto Exit; if ( char_code < start ) char_code = start; - index = (FT_UInt)( char_code - start ); - p += 2*index; + idx = (FT_UInt)( char_code - start ); + p += 2 * idx; - for ( ; index < count; index++ ) + for ( ; idx < count; idx++ ) { - gindex = TT_NEXT_USHORT(p); + gindex = TT_NEXT_USHORT( p ); if ( gindex != 0 ) { result = char_code; @@ -954,79 +996,77 @@ } - FT_CALLBACK_TABLE_DEF const TT_CMap_ClassRec tt_cmap6_class_rec = + FT_CALLBACK_TABLE_DEF + const TT_CMap_ClassRec tt_cmap6_class_rec = { { - sizeof( TT_CMapRec ), + sizeof ( TT_CMapRec ), - (FT_CMap_InitFunc) tt_cmap_init, - (FT_CMap_DoneFunc) NULL, - (FT_CMap_CharIndexFunc) tt_cmap6_char_index, - (FT_CMap_CharNextFunc) tt_cmap6_char_next + (FT_CMap_InitFunc) tt_cmap_init, + (FT_CMap_DoneFunc) NULL, + (FT_CMap_CharIndexFunc)tt_cmap6_char_index, + (FT_CMap_CharNextFunc) tt_cmap6_char_next }, 6, - (TT_CMap_ValidateFunc) tt_cmap6_validate + (TT_CMap_ValidateFunc) tt_cmap6_validate }; #endif /* TT_CONFIG_CMAP_FORMAT_6 */ - /************************************************************************/ - /************************************************************************/ - /***** *****/ - /***** FORMAT 8 *****/ - /***** *****/ - /***** It's hard to completely understand what the OpenType *****/ - /***** spec says about this format, but here are my conclusion *****/ - /***** *****/ - /***** the purpose of this format is to easily map UTF-16 text *****/ - /***** to glyph indices. Basically, the 'char_code' must be in *****/ - /***** one of the following formats: *****/ - /***** *****/ - /***** - a 16-bit value that isn't part of the Unicode *****/ - /***** Surrogates Area (i.e. U+D800-U+DFFF) *****/ - /***** *****/ - /***** - a 32-bit value, made of two surrogate values, i.e. *****/ - /***** if "char_code = (char_hi << 16) | char_lo", then *****/ - /***** both 'char_hi' and 'char_lo' must be in the Surrogates *****/ - /***** Area. *****/ - /***** *****/ - /***** The 'is32' table embedded in the charmap indicates *****/ - /***** wether a given 16-bit value is in the surrogates area *****/ - /***** or not.. *****/ - /***** *****/ - /***** so, for any given "char_code", we can assert the following *****/ - /***** *****/ - /***** if 'char_hi == 0' then we must have 'is32[char_lo] == 0' *****/ - /***** *****/ - /***** if 'char_hi != 0' then we must have both *****/ - /***** 'is32[char_hi] != 0' and 'is32[char_lo] != 0' *****/ - /***** *****/ - /***** *****/ - /************************************************************************/ - /************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 8 *****/ + /***** *****/ + /***** It's hard to completely understand what the OpenType spec *****/ + /***** says about this format, but here is my conclusion. *****/ + /***** *****/ + /***** The purpose of this format is to easily map UTF-16 text to *****/ + /***** glyph indices. Basically, the `char_code' must be in one of *****/ + /***** the following formats: *****/ + /***** *****/ + /***** - A 16-bit value that isn't part of the Unicode Surrogates *****/ + /***** Area (i.e. U+D800-U+DFFF). *****/ + /***** *****/ + /***** - A 32-bit value, made of two surrogate values, i.e.. if *****/ + /***** `char_code = (char_hi << 16) | char_lo', then both *****/ + /***** `char_hi' and `char_lo' must be in the Surrogates Area. *****/ + /***** Area. *****/ + /***** *****/ + /***** The 'is32' table embedded in the charmap indicates whether a *****/ + /***** given 16-bit value is in the surrogates area or not. *****/ + /***** *****/ + /***** So, for any given `char_code', we can assert the following: *****/ + /***** *****/ + /***** If `char_hi == 0' then we must have `is32[char_lo] == 0'. *****/ + /***** *****/ + /***** If `char_hi != 0' then we must have both *****/ + /***** `is32[char_hi] != 0' and `is32[char_lo] != 0'. *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ - /************************************************************************* - * - * TABLE OVERVIEW: - * --------------- - * - * NAME OFFSET TYPE DESCRIPTION - * - * format 0 USHORT must be 8 - * reseved 2 USHORT reserved - * length 4 ULONG length in bytes - * language 8 ULONG Mac language code - * is32 12 BYTE[8192] 32-bitness bitmap - * count 8204 ULONG number of groups - * - * this header is followed by 'count' groups of the following format: - * - * start 0 ULONG first charcode - * end 4 ULONG last charcode - * startId 8 ULONG start glyph id for - * the group - */ + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 8 */ + /* reseved 2 USHORT reserved */ + /* length 4 ULONG length in bytes */ + /* language 8 ULONG Mac language code */ + /* is32 12 BYTE[8192] 32-bitness bitmap */ + /* count 8204 ULONG number of groups */ + /* */ + /* This header is followed by 'count' groups of the following format: */ + /* */ + /* start 0 ULONG first charcode */ + /* end 4 ULONG last charcode */ + /* startId 8 ULONG start glyph id for the group */ + /* */ #ifdef TT_CONFIG_CMAP_FORMAT_8 @@ -1039,31 +1079,34 @@ FT_UInt32 length; FT_UInt32 num_groups; + if ( table + 16 + 8192 > valid->limit ) FT_INVALID_TOO_SHORT; - length = TT_NEXT_ULONG(p); + length = TT_NEXT_ULONG( p ); if ( table + length > valid->limit || length < 8208 ) FT_INVALID_TOO_SHORT; is32 = table + 12; - p = is32 + 8192; /* skip 'is32' array */ - num_groups = TT_NEXT_ULONG(p); + p = is32 + 8192; /* skip `is32' array */ + num_groups = TT_NEXT_ULONG( p ); - if ( p + num_groups*12 > valid->limit ) + if ( p + num_groups * 12 > valid->limit ) FT_INVALID_TOO_SHORT; /* check groups, they must be in increasing order */ { FT_UInt32 n, start, end, start_id, count, last = 0; + for ( n = 0; n < num_groups; n++ ) { FT_UInt hi, lo; - start = TT_NEXT_ULONG(p); - end = TT_NEXT_ULONG(p); - start_id = TT_NEXT_ULONG(p); + + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + start_id = TT_NEXT_ULONG( p ); if ( start > end ) FT_INVALID_DATA; @@ -1073,41 +1116,41 @@ if ( valid->level >= FT_VALIDATE_TIGHT ) { - if ( start_id + end - start >= TT_VALID_GLYPH_COUNT(valid) ) + if ( start_id + end - start >= TT_VALID_GLYPH_COUNT( valid ) ) FT_INVALID_GLYPH_ID; - count = (FT_UInt32)(end - start + 1); + count = (FT_UInt32)( end - start + 1 ); if ( start & ~0xFFFFU ) { - /* start_hi != 0, check that is32[i] is 1 for each i in */ - /* the 'hi' and 'lo' of the range [start..end] */ + /* start_hi != 0; check that is32[i] is 1 for each i in */ + /* the `hi' and `lo' of the range [start..end] */ for ( ; count > 0; count--, start++ ) { - hi = (FT_UInt)(start >> 16); - lo = (FT_UInt)(start & 0xFFFFU); + hi = (FT_UInt)( start >> 16 ); + lo = (FT_UInt)( start & 0xFFFFU ); - if ( (is32[ hi >> 3 ] & (0x80 >> (hi & 7))) == 0 ) + if ( (is32[hi >> 3] & ( 0x80 >> ( hi & 7 ) ) ) == 0 ) FT_INVALID_DATA; - if ( (is32[ lo >> 3 ] & (0x80 >> (lo & 7))) == 0 ) + if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) == 0 ) FT_INVALID_DATA; } } else { - /* start_hi == 0, check that is32[i] is 0 for each i in */ + /* start_hi == 0; check that is32[i] is 0 for each i in */ /* the range [start..end] */ - /* end_hi cannot be != 0 !! */ + /* end_hi cannot be != 0! */ if ( end & ~0xFFFFU ) FT_INVALID_DATA; for ( ; count > 0; count--, start++ ) { - lo = (FT_UInt)(start & 0xFFFFU); + lo = (FT_UInt)( start & 0xFFFFU ); - if ( (is32[ lo >> 3 ] & (0x80 >> (lo & 7))) != 0 ) + if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) != 0 ) FT_INVALID_DATA; } } @@ -1120,20 +1163,21 @@ FT_CALLBACK_DEF( FT_UInt ) - tt_cmap8_char_index( TT_CMap cmap, - FT_UInt32 char_code ) + tt_cmap8_char_index( TT_CMap cmap, + FT_UInt32 char_code ) { FT_Byte* table = cmap->data; FT_UInt result = 0; FT_Byte* p = table + 8204; - FT_UInt32 num_groups = TT_NEXT_ULONG(p); + FT_UInt32 num_groups = TT_NEXT_ULONG( p ); FT_UInt32 start, end, start_id; + for ( ; num_groups > 0; num_groups-- ) { - start = TT_NEXT_ULONG(p); - end = TT_NEXT_ULONG(p); - start_id = TT_NEXT_ULONG(p); + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + start_id = TT_NEXT_ULONG( p ); if ( char_code < start ) break; @@ -1149,31 +1193,32 @@ FT_CALLBACK_DEF( FT_UInt ) - tt_cmap8_char_next( TT_CMap cmap, - FT_UInt32 *pchar_code ) + tt_cmap8_char_next( TT_CMap cmap, + FT_UInt32 *pchar_code ) { FT_UInt32 result = 0; FT_UInt32 char_code = *pchar_code + 1; FT_UInt gindex = 0; FT_Byte* table = cmap->data; FT_Byte* p = table + 8204; - FT_UInt32 num_groups = TT_NEXT_ULONG(p); + FT_UInt32 num_groups = TT_NEXT_ULONG( p ); FT_UInt32 n, start, end, start_id; + p = table + 8208; for ( n = 0; n < num_groups++; n++ ) { - start = TT_NEXT_ULONG(p); - end = TT_NEXT_ULONG(p); - start_id = TT_NEXT_ULONG(p); + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + start_id = TT_NEXT_ULONG( p ); if ( char_code < start ) char_code = start; if ( char_code <= end ) { - gindex = (FT_UInt)(char_code - start + start_id); + gindex = (FT_UInt)( char_code - start + start_id ); if ( gindex != 0 ) { result = char_code; @@ -1188,46 +1233,48 @@ } - FT_CALLBACK_TABLE_DEF const TT_CMap_ClassRec tt_cmap8_class_rec = + FT_CALLBACK_TABLE_DEF + const TT_CMap_ClassRec tt_cmap8_class_rec = { { - sizeof( TT_CMapRec ), + sizeof ( TT_CMapRec ), - (FT_CMap_InitFunc) tt_cmap_init, - (FT_CMap_DoneFunc) NULL, - (FT_CMap_CharIndexFunc) tt_cmap8_char_index, - (FT_CMap_CharNextFunc) tt_cmap8_char_next + (FT_CMap_InitFunc) tt_cmap_init, + (FT_CMap_DoneFunc) NULL, + (FT_CMap_CharIndexFunc)tt_cmap8_char_index, + (FT_CMap_CharNextFunc) tt_cmap8_char_next }, 8, - (TT_CMap_ValidateFunc) tt_cmap8_validate + (TT_CMap_ValidateFunc) tt_cmap8_validate }; #endif /* TT_CONFIG_CMAP_FORMAT_8 */ - /************************************************************************/ - /************************************************************************/ - /***** *****/ - /***** FORMAT 10 *****/ - /***** *****/ - /************************************************************************/ - /************************************************************************/ - /************************************************************************* - * - * TABLE OVERVIEW: - * --------------- - * - * NAME OFFSET TYPE DESCRIPTION - * - * format 0 USHORT must be 10 - * reseved 2 USHORT reserved - * length 4 ULONG length in bytes - * language 8 ULONG Mac language code - * - * start 12 ULONG first char in range - * count 16 ULONG number of chars in range - * glyphIds 20 USHORT[count] glyph indices covered - */ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 10 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 10 */ + /* reserved 2 USHORT reserved */ + /* length 4 ULONG length in bytes */ + /* language 8 ULONG Mac language code */ + /* */ + /* start 12 ULONG first char in range */ + /* count 16 ULONG number of chars in range */ + /* glyphIds 20 USHORT[count] glyph indices covered */ + /* */ #ifdef TT_CONFIG_CMAP_FORMAT_10 @@ -1238,15 +1285,16 @@ FT_Byte* p = table + 4; FT_ULong length, start, count; + if ( table + 20 > valid->limit ) FT_INVALID_TOO_SHORT; - length = TT_NEXT_ULONG(p); + length = TT_NEXT_ULONG( p ); p = table + 12; - start = TT_NEXT_ULONG(p); - count = TT_NEXT_ULONG(p); + start = TT_NEXT_ULONG( p ); + count = TT_NEXT_ULONG( p ); - if ( table + length > valid->limit || length < 20 + count*2 ) + if ( table + length > valid->limit || length < 20 + count * 2 ) FT_INVALID_TOO_SHORT; /* check glyph indices */ @@ -1254,10 +1302,11 @@ { FT_UInt gindex; + for ( ; count > 0; count-- ) { - gindex = TT_NEXT_USHORT(p); - if ( gindex >= TT_VALID_GLYPH_COUNT(valid) ) + gindex = TT_NEXT_USHORT( p ); + if ( gindex >= TT_VALID_GLYPH_COUNT( valid ) ) FT_INVALID_GLYPH_ID; } } @@ -1271,14 +1320,15 @@ FT_Byte* table = cmap->data; FT_UInt result = 0; FT_Byte* p = table + 12; - FT_UInt32 start = TT_NEXT_ULONG(p); - FT_UInt32 count = TT_NEXT_ULONG(p); - FT_UInt32 index = (FT_ULong)( char_code - start ); + FT_UInt32 start = TT_NEXT_ULONG( p ); + FT_UInt32 count = TT_NEXT_ULONG( p ); + FT_UInt32 idx = (FT_ULong)( char_code - start ); - if ( index < count ) + + if ( idx < count ) { - p += 2*index; - result = TT_PEEK_USHORT(p); + p += 2 * idx; + result = TT_PEEK_USHORT( p ); } return result; } @@ -1293,19 +1343,20 @@ FT_UInt32 char_code = *pchar_code + 1; FT_UInt gindex = 0; FT_Byte* p = table + 12; - FT_UInt32 start = TT_NEXT_ULONG(p); - FT_UInt32 count = TT_NEXT_ULONG(p); - FT_UInt32 index; + FT_UInt32 start = TT_NEXT_ULONG( p ); + FT_UInt32 count = TT_NEXT_ULONG( p ); + FT_UInt32 idx; + if ( char_code < start ) char_code = start; - index = (FT_UInt32)( char_code - start ); - p += 2*index; + idx = (FT_UInt32)( char_code - start ); + p += 2 * idx; - for ( ; index < count; index++ ) + for ( ; idx < count; idx++ ) { - gindex = TT_NEXT_USHORT(p); + gindex = TT_NEXT_USHORT( p ); if ( gindex != 0 ) { result = char_code; @@ -1319,52 +1370,52 @@ } - FT_CALLBACK_TABLE_DEF const TT_CMap_ClassRec tt_cmap10_class_rec = + FT_CALLBACK_TABLE_DEF + const TT_CMap_ClassRec tt_cmap10_class_rec = { { - sizeof( TT_CMapRec ), + sizeof ( TT_CMapRec ), - (FT_CMap_InitFunc) tt_cmap_init, - (FT_CMap_DoneFunc) NULL, - (FT_CMap_CharIndexFunc) tt_cmap10_char_index, - (FT_CMap_CharNextFunc) tt_cmap10_char_next + (FT_CMap_InitFunc) tt_cmap_init, + (FT_CMap_DoneFunc) NULL, + (FT_CMap_CharIndexFunc)tt_cmap10_char_index, + (FT_CMap_CharNextFunc) tt_cmap10_char_next }, 10, - (TT_CMap_ValidateFunc) tt_cmap10_validate + (TT_CMap_ValidateFunc) tt_cmap10_validate }; #endif /* TT_CONFIG_CMAP_FORMAT_10 */ - /************************************************************************/ - /************************************************************************/ - /***** *****/ - /***** FORMAT 12 *****/ - /***** *****/ - /************************************************************************/ - /************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 12 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ - /************************************************************************* - * - * TABLE OVERVIEW: - * --------------- - * - * NAME OFFSET TYPE DESCRIPTION - * - * format 0 USHORT must be 12 - * reseved 2 USHORT reserved - * length 4 ULONG length in bytes - * language 8 ULONG Mac language code - * count 12 ULONG number of groups - * 16 - * - * this header is followed by 'count' groups of the following format: - * - * start 0 ULONG first charcode - * end 4 ULONG last charcode - * startId 8 ULONG start glyph id for - * the group - */ + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 12 */ + /* reserved 2 USHORT reserved */ + /* length 4 ULONG length in bytes */ + /* language 8 ULONG Mac language code */ + /* count 12 ULONG number of groups */ + /* 16 */ + /* */ + /* This header is followed by `count' groups of the following format: */ + /* */ + /* start 0 ULONG first charcode */ + /* end 4 ULONG last charcode */ + /* startId 8 ULONG start glyph id for the group */ + /* */ #ifdef TT_CONFIG_CMAP_FORMAT_12 @@ -1376,27 +1427,29 @@ FT_ULong length; FT_ULong num_groups; + if ( table + 16 > valid->limit ) FT_INVALID_TOO_SHORT; p = table + 4; - length = TT_NEXT_ULONG(p); + length = TT_NEXT_ULONG( p ); p = table + 12; - num_groups = TT_NEXT_ULONG(p); + num_groups = TT_NEXT_ULONG( p ); - if ( table + length > valid->limit || length < 16 + 12*num_groups ) + if ( table + length > valid->limit || length < 16 + 12 * num_groups ) FT_INVALID_TOO_SHORT; /* check groups, they must be in increasing order */ { FT_ULong n, start, end, start_id, last = 0; + for ( n = 0; n < num_groups; n++ ) { - start = TT_NEXT_ULONG(p); - end = TT_NEXT_ULONG(p); - start_id = TT_NEXT_ULONG(p); + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + start_id = TT_NEXT_ULONG( p ); if ( start > end ) FT_INVALID_DATA; @@ -1406,7 +1459,7 @@ if ( valid->level >= FT_VALIDATE_TIGHT ) { - if ( start_id + end - start >= TT_VALID_GLYPH_COUNT(valid) ) + if ( start_id + end - start >= TT_VALID_GLYPH_COUNT( valid ) ) FT_INVALID_GLYPH_ID; } @@ -1416,7 +1469,6 @@ } - FT_CALLBACK_DEF( FT_UInt ) tt_cmap12_char_index( TT_CMap cmap, FT_UInt32 char_code ) @@ -1424,14 +1476,15 @@ FT_UInt result = 0; FT_Byte* table = cmap->data; FT_Byte* p = table + 12; - FT_UInt32 num_groups = TT_NEXT_ULONG(p); + FT_UInt32 num_groups = TT_NEXT_ULONG( p ); FT_UInt32 start, end, start_id; + for ( ; num_groups > 0; num_groups-- ) { - start = TT_NEXT_ULONG(p); - end = TT_NEXT_ULONG(p); - start_id = TT_NEXT_ULONG(p); + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + start_id = TT_NEXT_ULONG( p ); if ( char_code < start ) break; @@ -1447,24 +1500,25 @@ FT_CALLBACK_DEF( FT_UInt ) - tt_cmap12_char_next( TT_CMap cmap, - FT_UInt32 *pchar_code ) + tt_cmap12_char_next( TT_CMap cmap, + FT_UInt32 *pchar_code ) { FT_Byte* table = cmap->data; FT_UInt32 result = 0; FT_UInt32 char_code = *pchar_code + 1; FT_UInt gindex = 0; FT_Byte* p = table + 12; - FT_UInt32 num_groups = TT_NEXT_ULONG(p); + FT_UInt32 num_groups = TT_NEXT_ULONG( p ); FT_UInt32 n, start, end, start_id; - p = table + 8208; + + p = table + 16; for ( n = 0; n < num_groups++; n++ ) { - start = TT_NEXT_ULONG(p); - end = TT_NEXT_ULONG(p); - start_id = TT_NEXT_ULONG(p); + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + start_id = TT_NEXT_ULONG( p ); if ( char_code < start ) char_code = start; @@ -1486,26 +1540,25 @@ } - FT_CALLBACK_TABLE_DEF const TT_CMap_ClassRec tt_cmap12_class_rec = + FT_CALLBACK_TABLE_DEF + const TT_CMap_ClassRec tt_cmap12_class_rec = { { - sizeof( TT_CMapRec ), + sizeof ( TT_CMapRec ), - (FT_CMap_InitFunc) tt_cmap_init, - (FT_CMap_DoneFunc) NULL, - (FT_CMap_CharIndexFunc) tt_cmap12_char_index, - (FT_CMap_CharNextFunc) tt_cmap12_char_next + (FT_CMap_InitFunc) tt_cmap_init, + (FT_CMap_DoneFunc) NULL, + (FT_CMap_CharIndexFunc)tt_cmap12_char_index, + (FT_CMap_CharNextFunc) tt_cmap12_char_next }, 12, - (TT_CMap_ValidateFunc) tt_cmap12_validate + (TT_CMap_ValidateFunc) tt_cmap12_validate }; #endif /* TT_CONFIG_CMAP_FORMAT_12 */ - - #ifdef FT_CONFIG_OPTION_USE_CMAPS static const TT_CMap_Class tt_cmap_classes[] = @@ -1542,9 +1595,9 @@ }; - /* parse the 'cmap' table and build the corresponding TT_CMap objects */ - /* in the current face.. */ - /* */ + /* parse the `cmap' table and build the corresponding TT_CMap objects */ + /* in the current face */ + /* */ FT_LOCAL_DEF( FT_Error ) TT_Build_CMaps( TT_Face face ) { @@ -1553,38 +1606,41 @@ volatile FT_UInt num_cmaps; volatile FT_Byte* p = table; + if ( p + 4 > limit ) return FT_Err_Invalid_Table; /* only recognize format 0 */ - if ( TT_NEXT_USHORT(p) != 0 ) + if ( TT_NEXT_USHORT( p ) != 0 ) { p -= 2; - FT_ERROR(( "%s: unsupported 'cmap' table format = %d\n", - "TT_Build_CMaps", TT_PEEK_USHORT(p) )); + FT_ERROR(( "TT_Build_CMaps: unsupported `cmap' table format = %d\n", + TT_PEEK_USHORT( p ) )); return FT_Err_Invalid_Table; } - num_cmaps = TT_NEXT_USHORT(p); + num_cmaps = TT_NEXT_USHORT( p ); for ( ; num_cmaps > 0 && p + 8 <= limit; num_cmaps-- ) { FT_CharMapRec charmap; FT_UInt32 offset; - charmap.platform_id = TT_NEXT_USHORT(p); - charmap.encoding_id = TT_NEXT_USHORT(p); - charmap.face = FT_FACE(face); + + charmap.platform_id = TT_NEXT_USHORT( p ); + charmap.encoding_id = TT_NEXT_USHORT( p ); + charmap.face = FT_FACE( face ); charmap.encoding = ft_encoding_none; /* will be filled later */ - offset = TT_NEXT_ULONG(p); + offset = TT_NEXT_ULONG( p ); if ( offset && table + offset + 2 < limit ) { FT_Byte* cmap = table + offset; - FT_UInt format = TT_PEEK_USHORT(cmap); + FT_UInt format = TT_PEEK_USHORT( cmap ); volatile const TT_CMap_Class* pclazz = tt_cmap_classes; TT_CMap_Class clazz; + for ( ; *pclazz; pclazz++ ) { clazz = *pclazz; @@ -1592,22 +1648,25 @@ { volatile TT_ValidatorRec valid; - ft_validator_init( FT_VALIDATOR(&valid), cmap, limit, + + ft_validator_init( FT_VALIDATOR( &valid ), cmap, limit, FT_VALIDATE_DEFAULT ); valid.num_glyphs = face->root.num_glyphs; - if ( setjmp( FT_VALIDATOR(&valid)->jump_buffer ) == 0 ) + if ( setjmp( FT_VALIDATOR( &valid )->jump_buffer ) == 0 ) { /* validate this cmap sub-table */ - clazz->validate( cmap, FT_VALIDATOR(&valid) ); + clazz->validate( cmap, FT_VALIDATOR( &valid ) ); } 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" )); + { + FT_ERROR(( "TT_Build_CMaps:" )); + FT_ERROR(( " broken cmap sub-table ignored!\n" )); + } } } } @@ -1621,7 +1680,7 @@ FT_LOCAL_DEF( FT_Error ) TT_Build_CMaps( TT_Face face ) { - FT_ERROR(( "TT_Build_CMaps should _not_ be called !!\n" )); + FT_ERROR(( "No support for TT_Build_CMaps compiled\n" )); return 0; } diff --git a/src/sfnt/ttcmap0.h b/src/sfnt/ttcmap0.h index 77138852b..7ce90c9a2 100644 --- a/src/sfnt/ttcmap0.h +++ b/src/sfnt/ttcmap0.h @@ -1,10 +1,10 @@ /***************************************************************************/ /* */ -/* ttcmap.h */ +/* ttcmap0.h */ /* */ -/* TrueType character mapping table (cmap) support (specification). */ +/* TrueType new character mapping table (cmap) support (specification). */ /* */ -/* Copyright 1996-2001 by */ +/* Copyright 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -27,19 +27,21 @@ FT_BEGIN_HEADER - typedef struct TT_CMapRec_ + typedef struct TT_CMapRec_ { FT_CMapRec cmap; - FT_Byte* data; /* pointer to in-memory cmap table */ + FT_Byte* data; /* pointer to in-memory cmap table */ } TT_CMapRec, *TT_CMap; - typedef const struct TT_CMap_ClassRec_* TT_CMap_Class; + typedef const struct TT_CMap_ClassRec_* TT_CMap_Class; - typedef FT_Error (*TT_CMap_ValidateFunc)( FT_Byte* data, - FT_Validator valid ); - typedef struct TT_CMap_ClassRec_ + typedef FT_Error + (*TT_CMap_ValidateFunc)( FT_Byte* data, + FT_Validator valid ); + + typedef struct TT_CMap_ClassRec_ { FT_CMap_ClassRec clazz; FT_UInt format; @@ -47,19 +49,21 @@ FT_BEGIN_HEADER } TT_CMap_ClassRec; - typedef struct TT_ValidatorRec_ + + typedef struct TT_ValidatorRec_ { FT_ValidatorRec validator; FT_UInt num_glyphs; } TT_ValidatorRec, *TT_Validator; -#define TT_VALIDATOR(x) ((TT_Validator)(x)) -#define TT_VALID_GLYPH_COUNT(v) TT_VALIDATOR(v)->num_glyphs + +#define TT_VALIDATOR( x ) ((TT_Validator)( x )) +#define TT_VALID_GLYPH_COUNT( x ) TT_VALIDATOR( x )->num_glyphs FT_LOCAL( FT_Error ) - TT_Build_CMaps( TT_Face face ); + TT_Build_CMaps( TT_Face face ); FT_END_HEADER diff --git a/src/sfnt/ttload.c b/src/sfnt/ttload.c index c8ac9c0a5..dfa294833 100644 --- a/src/sfnt/ttload.c +++ b/src/sfnt/ttload.c @@ -5,7 +5,7 @@ /* Load the basic TrueType tables, i.e., tables that can be either in */ /* TTF or OTF fonts (body). */ /* */ -/* Copyright 1996-2001 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -28,6 +28,7 @@ #include /* for qsort */ + /*************************************************************************/ /* */ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ @@ -48,6 +49,7 @@ /* */ /* */ /* face :: A face object handle. */ + /* */ /* tag :: The searched tag. */ /* */ /* */ @@ -57,8 +59,8 @@ TT_LookUp_Table( TT_Face face, FT_ULong tag ) { - TT_Table entry; - TT_Table limit; + TT_Table entry; + TT_Table limit; FT_TRACE3(( "TT_LookUp_Table: %08p, `%c%c%c%c' -- ", @@ -95,7 +97,9 @@ /* */ /* */ /* face :: A face object handle. */ + /* */ /* tag :: The searched tag. */ + /* */ /* stream :: The stream to seek when the table is found. */ /* */ /* */ @@ -110,8 +114,8 @@ FT_Stream stream, FT_ULong* length ) { - TT_Table table; - FT_Error error; + TT_Table table; + FT_Error error; table = TT_LookUp_Table( face, tag ); @@ -134,14 +138,16 @@ /*************************************************************************/ /* */ /* */ - /* TT_Load_SFNT_HeaderRec */ + /* TT_Load_SFNT_HeaderRec */ /* */ /* */ /* Loads the header of a SFNT font file. Supports collections. */ /* */ /* */ /* face :: A handle to the target face object. */ + /* */ /* stream :: The input stream. */ + /* */ /* face_index :: If the font is a collection, the number of the font */ /* in the collection, ignored otherwise. */ /* */ @@ -161,9 +167,9 @@ /* */ FT_LOCAL_DEF( FT_Error ) TT_Load_SFNT_HeaderRec( TT_Face face, - FT_Stream stream, - FT_Long face_index, - SFNT_Header sfnt ) + FT_Stream stream, + FT_Long face_index, + SFNT_Header sfnt ) { FT_Error error; FT_ULong format_tag; @@ -190,21 +196,23 @@ FT_FRAME_START( 8 ), FT_FRAME_LONG( version ), FT_FRAME_LONG( count ), - FT_FRAME_END }; + FT_FRAME_END + }; FT_TRACE2(( "TT_Load_SFNT_HeaderRec: %08p, %ld\n", face, face_index )); - face->ttc_header.tag = 0; - face->ttc_header.version = 0; - face->ttc_header.count = 0; + face->ttc_header.tag = 0; + face->ttc_header.version = 0; + face->ttc_header.count = 0; face->num_tables = 0; /* first of all, read the first 4 bytes. If it is `ttcf', then the */ /* file is a TrueType collection, otherwise it can be any other */ /* kind of font. */ + /* */ if ( FT_READ_ULONG( format_tag ) ) goto Exit; @@ -215,8 +223,8 @@ FT_TRACE3(( "TT_Load_SFNT_HeaderRec: file is a collection\n" )); - /* it's a TrueType collection, i.e. a file containing several */ - /* font files. Read the font directory now */ + /* It is a TrueType collection, i.e. a file containing several */ + /* font files. Read the font directory now */ if ( FT_STREAM_READ_FIELDS( ttc_header_fields, &face->ttc_header ) ) goto Exit; @@ -239,7 +247,7 @@ /* seek to the appropriate TrueType file, then read tag */ if ( FT_STREAM_SEEK( face->ttc_header.offsets[face_index] ) || - FT_READ_LONG( format_tag ) ) + FT_READ_LONG( format_tag ) ) goto Exit; } @@ -284,6 +292,7 @@ /* */ /* */ /* stream :: The input stream. */ + /* */ /* sfnt :: The SFNT directory header. */ /* */ /* */ @@ -293,14 +302,14 @@ /* The stream cursor must be at the font file's origin. */ /* */ FT_LOCAL_DEF( FT_Error ) - TT_Load_Directory( TT_Face face, - FT_Stream stream, - SFNT_Header sfnt ) + TT_Load_Directory( TT_Face face, + FT_Stream stream, + SFNT_Header sfnt ) { - FT_Error error; - FT_Memory memory = stream->memory; + FT_Error error; + FT_Memory memory = stream->memory; - TT_TableRec *entry, *limit; + TT_TableRec *entry, *limit; FT_TRACE2(( "TT_Load_Directory: %08p\n", face )); @@ -444,6 +453,7 @@ /* */ /* */ /* face :: A handle to the target face object. */ + /* */ /* stream :: The input stream. */ /* */ /* */ @@ -545,6 +555,7 @@ /* */ /* */ /* face :: A handle to the target face object. */ + /* */ /* stream :: The input stream. */ /* */ /* */ @@ -666,7 +677,9 @@ /* */ /* */ /* face :: A handle to the target face object. */ + /* */ /* stream :: The input stream. */ + /* */ /* vertical :: A boolean flag. If set, load vertical metrics. */ /* */ /* */ @@ -694,6 +707,7 @@ if ( vertical ) { /* The table is optional, quit silently if it wasn't found */ + /* */ /* XXX: Some fonts have a valid vertical header with a non-null */ /* `number_of_VMetrics' fields, but no corresponding `vmtx' */ /* table to get the metrics from (e.g. mingliu). */ @@ -753,8 +767,8 @@ goto Exit; { - TT_LongMetrics cur = *longs; - TT_LongMetrics limit = cur + num_longs; + TT_LongMetrics cur = *longs; + TT_LongMetrics limit = cur + num_longs; for ( ; cur < limit; cur++ ) @@ -806,7 +820,9 @@ /* */ /* */ /* face :: A handle to the target face object. */ + /* */ /* stream :: The input stream. */ + /* */ /* vertical :: A boolean flag. If set, load vertical metrics. */ /* */ /* */ @@ -906,6 +922,7 @@ /* */ /* */ /* face :: A handle to the target face object. */ + /* */ /* stream :: The input stream. */ /* */ /* */ @@ -915,14 +932,14 @@ TT_Load_Names( TT_Face face, FT_Stream stream ) { - FT_Error error; - FT_Memory memory = stream->memory; + FT_Error error; + FT_Memory memory = stream->memory; - FT_ULong table_pos, table_len; - FT_ULong storageOffset, storageSize; - FT_Byte* storage; + FT_ULong table_pos, table_len; + FT_ULong storageOffset, storageSize; + FT_Byte* storage; - TT_NameTable names; + TT_NameTable names; const FT_Frame_Field name_table_fields[] = { @@ -972,10 +989,10 @@ /* check the 'storageOffset' field */ storageOffset = names->storageOffset; - if ( storageOffset < (FT_ULong)(6 + 12*names->numNameRecords) || - table_len <= storageOffset ) + if ( storageOffset < (FT_ULong)( 6 + 12 * names->numNameRecords ) || + table_len <= storageOffset ) { - FT_ERROR(( "TT.load_names: invalid 'name' table\n" )); + FT_ERROR(( "TT_Load_Names: invalid `name' table\n" )); error = SFNT_Err_Name_Table_Missing; goto Exit; } @@ -984,11 +1001,12 @@ /* Allocate the array of name records. */ if ( FT_ALLOC( names->names, - names->numNameRecords*sizeof(TT_NameEntryRec) + storageSize ) || - FT_FRAME_ENTER( names->numNameRecords * 12L ) ) + names->numNameRecords * sizeof ( TT_NameEntryRec ) + + storageSize ) || + FT_FRAME_ENTER( names->numNameRecords * 12L ) ) goto Exit; - storage = (FT_Byte*)(names->names + names->numNameRecords); + storage = (FT_Byte*)( names->names + names->numNameRecords ); /* Load the name records and determine how much storage is needed */ /* to hold the strings themselves. */ @@ -1002,8 +1020,8 @@ if ( FT_STREAM_READ_FIELDS( name_record_fields, cur ) ) break; - /* invalid name entries will have "cur->string" set to NULL !! */ - if ( (FT_ULong)(cur->stringOffset + cur->stringLength) < storageSize ) + /* invalid name entries will have "cur->string" set to NULL! */ + if ( (FT_ULong)( cur->stringOffset + cur->stringLength ) < storageSize ) cur->string = storage + cur->stringOffset; else { @@ -1016,18 +1034,17 @@ FT_FRAME_EXIT(); - if (error) + if ( error ) goto Exit; - storageOffset -= 6 + 12*names->numNameRecords; + storageOffset -= 6 + 12 * names->numNameRecords; if ( FT_STREAM_SKIP( storageOffset ) || FT_STREAM_READ( storage, storageSize ) ) goto Exit; - #ifdef FT_DEBUG_LEVEL_TRACE - /* Print Name Record Table in case of debugging */ + /* print Name Record Table in case of debugging */ { TT_NameEntryRec* cur = names->names; TT_NameEntryRec* limit = cur + names->numNameRecords; @@ -1039,24 +1056,24 @@ FT_TRACE3(( "(%2d %2d %4x %2d) ", - cur->platformID, - cur->encodingID, - cur->languageID, - cur->nameID )); + cur->platformID, + cur->encodingID, + cur->languageID, + cur->nameID )); /* I know that M$ encoded strings are Unicode, */ /* but this works reasonable well for debugging purposes. */ if ( cur->string ) for ( j = 0; j < (FT_UInt)cur->stringLength; j++ ) { - FT_Byte c = *(FT_Byte*)(cur->string + j); + FT_Byte c = *(FT_Byte*)( cur->string + j ); if ( c >= 32 && c < 128 ) FT_TRACE3(( "%c", c )); } else - FT_TRACE3(( "INVALID ENTRY !!\n" )); + FT_TRACE3(( "Invalid entry!\n" )); FT_TRACE3(( "\n" )); } @@ -1088,8 +1105,8 @@ FT_LOCAL_DEF( void ) TT_Free_Names( TT_Face face ) { - FT_Memory memory = face->root.driver->root.memory; - TT_NameTable names = &face->name_table; + FT_Memory memory = face->root.driver->root.memory; + TT_NameTable names = &face->name_table; /* free strings table */ @@ -1115,6 +1132,7 @@ /* */ /* */ /* face :: A handle to the target face object. */ + /* */ /* stream :: A handle to the input stream. */ /* */ /* */ @@ -1127,21 +1145,22 @@ TT_Load_CMap( TT_Face face, FT_Stream stream ) { - FT_Error error; + FT_Error error; + error = face->goto_table( face, TTAG_cmap, stream, &face->cmap_size ); if ( error ) { - FT_TRACE2(( "No 'cmap' table in font !\n" )); + FT_TRACE2(( "No `cmap' table in font !\n" )); error = SFNT_Err_CMap_Table_Missing; goto Exit; } if ( !FT_FRAME_EXTRACT( face->cmap_size, face->cmap_table ) ) - FT_TRACE2(( "'cmap' table loaded\n" )); + FT_TRACE2(( "`cmap' table loaded\n" )); else { - FT_ERROR(( "'cmap' table is too short !!\n" )); + FT_ERROR(( "`cmap' table is too short!\n" )); face->cmap_size = 0; } @@ -1213,7 +1232,7 @@ for ( ; charmap < limit; charmap++ ) { - TT_CMapTable cmap; + TT_CMapTable cmap; charmap->root.face = (FT_Face)face; @@ -1234,7 +1253,7 @@ if ( FT_STREAM_SEEK( table_start + (FT_Long)cmap->offset ) || - FT_STREAM_READ_FIELDS( cmap_rec_fields, cmap ) ) + FT_STREAM_READ_FIELDS( cmap_rec_fields, cmap ) ) goto Exit; cmap->offset = FT_STREAM_POS(); @@ -1249,6 +1268,7 @@ #endif /* !FT_CONFIG_OPTION_USE_CMAPS */ + /*************************************************************************/ /* */ /* */ @@ -1259,6 +1279,7 @@ /* */ /* */ /* face :: A handle to the target face object. */ + /* */ /* stream :: A handle to the input stream. */ /* */ /* */ @@ -1352,7 +1373,7 @@ if ( error ) { FT_TRACE2(( "is missing!\n" )); - face->os2.version = 0xFFFF; + face->os2.version = 0xFFFFU; error = SFNT_Err_Ok; goto Exit; } @@ -1401,6 +1422,7 @@ /* */ /* */ /* face :: A handle to the target face object. */ + /* */ /* stream :: A handle to the input stream. */ /* */ /* */ @@ -1459,6 +1481,7 @@ /* */ /* */ /* face :: A handle to the target face object. */ + /* */ /* stream :: A handle to the input stream. */ /* */ /* */ @@ -1526,6 +1549,7 @@ /* */ /* */ /* face :: A handle to the target face object. */ + /* */ /* stream :: The input stream. */ /* */ /* */ @@ -1603,6 +1627,7 @@ /* */ /* */ /* face :: A handle to the target face object. */ + /* */ /* stream :: The input stream. */ /* */ /* */ @@ -1648,7 +1673,7 @@ if ( coverage == 0x0001 ) { - FT_UInt num_pairs; + FT_UInt num_pairs; TT_Kern0_Pair pair; TT_Kern0_Pair limit; @@ -1685,7 +1710,7 @@ /* ensure that the kerning pair table is sorted (yes, some */ /* fonts have unsorted tables!) */ { - FT_UInt i; + FT_UInt i; TT_Kern0_Pair pair0; @@ -1722,6 +1747,7 @@ #undef TT_KERN_INDEX #define TT_KERN_INDEX( g1, g2 ) ( ( (FT_ULong)g1 << 16 ) | g2 ) + FT_CALLBACK_DEF( int ) tt_kern_pair_compare( const void* a, const void* b ) @@ -1737,6 +1763,7 @@ ( index1 > index2 ? 1 : 0 )); } + #undef TT_KERN_INDEX @@ -1750,6 +1777,7 @@ /* */ /* */ /* face :: A handle to the target face object. */ + /* */ /* stream :: A handle to the input stream. */ /* */ /* */ @@ -1759,12 +1787,12 @@ TT_Load_Hdmx( TT_Face face, FT_Stream stream ) { - FT_Error error; - FT_Memory memory = stream->memory; + FT_Error error; + FT_Memory memory = stream->memory; - TT_Hdmx hdmx = &face->hdmx; - FT_Long num_glyphs; - FT_Long record_size; + TT_Hdmx hdmx = &face->hdmx; + FT_Long num_glyphs; + FT_Long record_size; hdmx->version = 0; @@ -1807,7 +1835,7 @@ FT_READ_BYTE( cur->max_width ) ) goto Exit; - if ( FT_ALLOC( cur->widths, num_glyphs ) || + if ( FT_ALLOC( cur->widths, num_glyphs ) || FT_STREAM_READ( cur->widths, num_glyphs ) ) goto Exit; diff --git a/src/sfnt/ttload.h b/src/sfnt/ttload.h index a4b0f6cfa..67ec052fd 100644 --- a/src/sfnt/ttload.h +++ b/src/sfnt/ttload.h @@ -5,7 +5,7 @@ /* Load the basic TrueType tables, i.e., tables that can be either in */ /* TTF or OTF fonts (specification). */ /* */ -/* Copyright 1996-2001 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -42,9 +42,9 @@ FT_BEGIN_HEADER FT_LOCAL( FT_Error ) TT_Load_SFNT_HeaderRec( TT_Face face, - FT_Stream stream, - FT_Long face_index, - SFNT_Header sfnt ); + FT_Stream stream, + FT_Long face_index, + SFNT_Header sfnt ); FT_LOCAL( FT_Error ) TT_Load_Directory( TT_Face face, diff --git a/src/sfnt/ttpost.c b/src/sfnt/ttpost.c index 0743364b5..f6e243408 100644 --- a/src/sfnt/ttpost.c +++ b/src/sfnt/ttpost.c @@ -5,7 +5,7 @@ /* Postcript name table processing for TrueType and OpenType fonts */ /* (body). */ /* */ -/* Copyright 1996-2001 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -33,6 +33,7 @@ #include "sferrors.h" + /*************************************************************************/ /* */ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ @@ -155,14 +156,14 @@ Load_Format_20( TT_Face face, FT_Stream stream ) { - FT_Memory memory = stream->memory; - FT_Error error; + FT_Memory memory = stream->memory; + FT_Error error; - FT_Int num_glyphs; - FT_UShort num_names; + FT_Int num_glyphs; + FT_UShort num_names; - FT_UShort* glyph_indices = 0; - FT_Char** name_strings = 0; + FT_UShort* glyph_indices = 0; + FT_Char** name_strings = 0; if ( FT_READ_USHORT( num_glyphs ) ) @@ -241,7 +242,7 @@ /* all right, set table fields and exit successfuly */ { - TT_Post_20 table = &face->postscript_names.names.format_20; + TT_Post_20 table = &face->postscript_names.names.format_20; table->num_glyphs = (FT_UShort)num_glyphs; @@ -251,7 +252,6 @@ } return SFNT_Err_Ok; - Fail1: { FT_UShort n; @@ -292,7 +292,7 @@ goto Exit; } - if ( FT_ALLOC ( offset_table, num_glyphs ) || + if ( FT_ALLOC( offset_table, num_glyphs ) || FT_STREAM_READ( offset_table, num_glyphs ) ) goto Fail; @@ -316,7 +316,7 @@ /* OK, set table fields and exit successfuly */ { - TT_Post_25 table = &face->postscript_names.names.format_25; + TT_Post_25 table = &face->postscript_names.names.format_25; table->num_glyphs = (FT_UShort)num_glyphs; @@ -380,8 +380,8 @@ FT_LOCAL_DEF( void ) TT_Free_Post_Names( TT_Face face ) { - FT_Memory memory = face->root.memory; - TT_Post_Names names = &face->postscript_names; + FT_Memory memory = face->root.memory; + TT_Post_Names names = &face->postscript_names; if ( names->loaded ) @@ -390,8 +390,8 @@ { case 0x00020000L: { - TT_Post_20 table = &names->names.format_20; - FT_UShort n; + TT_Post_20 table = &names->names.format_20; + FT_UShort n; FT_FREE( table->glyph_indices ); @@ -407,7 +407,7 @@ case 0x00028000L: { - TT_Post_25 table = &names->names.format_25; + TT_Post_25 table = &names->names.format_25; FT_FREE( table->offsets ); @@ -446,8 +446,8 @@ FT_UInt idx, FT_String** PSname ) { - FT_Error error; - TT_Post_Names names; + FT_Error error; + TT_Post_Names names; #ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES PSNames_Service psnames; @@ -480,7 +480,7 @@ case 0x00020000L: { - TT_Post_20 table = &names->names.format_20; + TT_Post_20 table = &names->names.format_20; if ( !names->loaded ) @@ -505,7 +505,7 @@ case 0x00028000L: { - TT_Post_25 table = &names->names.format_25; + TT_Post_25 table = &names->names.format_25; if ( !names->loaded ) diff --git a/src/sfnt/ttpost.h b/src/sfnt/ttpost.h index 3c42e36c6..fd7f2afae 100644 --- a/src/sfnt/ttpost.h +++ b/src/sfnt/ttpost.h @@ -5,7 +5,7 @@ /* Postcript name table processing for TrueType and OpenType fonts */ /* (specification). */ /* */ -/* Copyright 1996-2001 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/src/sfnt/ttsbit.c b/src/sfnt/ttsbit.c index cd8b13014..d72c83d92 100644 --- a/src/sfnt/ttsbit.c +++ b/src/sfnt/ttsbit.c @@ -4,7 +4,7 @@ /* */ /* TrueType and OpenType embedded bitmap support (body). */ /* */ -/* Copyright 1996-2001 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -222,8 +222,8 @@ /* FreeType error code. 0 means success. */ /* */ static FT_Error - Load_SBit_Const_Metrics( TT_SBit_Range range, - FT_Stream stream ) + Load_SBit_Const_Metrics( TT_SBit_Range range, + FT_Stream stream ) { FT_Error error; @@ -254,9 +254,9 @@ /* FreeType error code. 0 means success. */ /* */ static FT_Error - Load_SBit_Range_Codes( TT_SBit_Range range, - FT_Stream stream, - FT_Bool load_offsets ) + Load_SBit_Range_Codes( TT_SBit_Range range, + FT_Stream stream, + FT_Bool load_offsets ) { FT_Error error; FT_ULong count, n, size; @@ -317,8 +317,8 @@ /* FreeType error code. 0 means success. */ /* */ static FT_Error - Load_SBit_Range( TT_SBit_Range range, - FT_Stream stream ) + Load_SBit_Range( TT_SBit_Range range, + FT_Stream stream ) { FT_Error error; FT_Memory memory = stream->memory; @@ -346,8 +346,8 @@ for ( n = 0; n < num_glyphs; n++ ) range->glyph_offsets[n] = (FT_ULong)( range->image_offset + - ( large ? FT_GET_ULONG() - : FT_GET_USHORT() ) ); + ( large ? FT_GET_ULONG() + : FT_GET_USHORT() ) ); FT_FRAME_EXIT(); } break; @@ -361,8 +361,8 @@ break; case 5: - error = Load_SBit_Const_Metrics( range, stream ) || - Load_SBit_Range_Codes( range, stream, 0 ); + error = Load_SBit_Const_Metrics( range, stream ) || + Load_SBit_Range_Codes( range, stream, 0 ); break; default: @@ -485,8 +485,8 @@ /* now read each strike table separately */ { - TT_SBit_Strike strike = face->sbit_strikes; - FT_ULong count = num_strikes; + TT_SBit_Strike strike = face->sbit_strikes; + FT_ULong count = num_strikes; if ( FT_FRAME_ENTER( 48L * num_strikes ) ) @@ -509,14 +509,14 @@ /* allocate the index ranges for each strike table */ { - TT_SBit_Strike strike = face->sbit_strikes; - FT_ULong count = num_strikes; + TT_SBit_Strike strike = face->sbit_strikes; + FT_ULong count = num_strikes; while ( count > 0 ) { - TT_SBit_Range range; - FT_ULong count2 = strike->num_ranges; + TT_SBit_Range range; + FT_ULong count2 = strike->num_ranges; if ( FT_NEW_ARRAY( strike->sbit_ranges, strike->num_ranges ) ) @@ -524,7 +524,7 @@ /* read each range */ if ( FT_STREAM_SEEK( table_base + strike->ranges_offset ) || - FT_FRAME_ENTER( strike->num_ranges * 8L ) ) + FT_FRAME_ENTER( strike->num_ranges * 8L ) ) goto Exit; range = strike->sbit_ranges; @@ -532,8 +532,8 @@ { range->first_glyph = FT_GET_USHORT(); range->last_glyph = FT_GET_USHORT(); - range->table_offset = table_base + strike->ranges_offset - + FT_GET_ULONG(); + range->table_offset = table_base + strike->ranges_offset + + FT_GET_ULONG(); count2--; range++; } @@ -547,7 +547,7 @@ { /* Read the header */ if ( FT_STREAM_SEEK( range->table_offset ) || - FT_FRAME_ENTER( 8L ) ) + FT_FRAME_ENTER( 8L ) ) goto Exit; range->index_format = FT_GET_USHORT(); @@ -588,17 +588,17 @@ FT_LOCAL_DEF( void ) TT_Free_SBit_Strikes( TT_Face face ) { - FT_Memory memory = face->root.memory; - TT_SBit_Strike strike = face->sbit_strikes; - TT_SBit_Strike strike_limit = strike + face->num_sbit_strikes; + FT_Memory memory = face->root.memory; + TT_SBit_Strike strike = face->sbit_strikes; + TT_SBit_Strike strike_limit = strike + face->num_sbit_strikes; if ( strike ) { for ( ; strike < strike_limit; strike++ ) { - TT_SBit_Range range = strike->sbit_ranges; - TT_SBit_Range range_limit = range + strike->num_ranges; + TT_SBit_Range range = strike->sbit_ranges; + TT_SBit_Range range_limit = range + strike->num_ranges; if ( range ) @@ -635,8 +635,8 @@ for ( i = 0; i < face->num_sbit_strikes; i++ ) { - if ( ( face->sbit_strikes[i].y_ppem == y_ppem ) && - ( ( x_ppem == 0 ) || + if ( ( face->sbit_strikes[i].y_ppem == y_ppem ) && + ( ( x_ppem == 0 ) || ( face->sbit_strikes[i].x_ppem == x_ppem ) ) ) { *astrike_index = i; @@ -673,8 +673,8 @@ static FT_Error Find_SBit_Range( FT_UInt glyph_index, TT_SBit_Strike strike, - TT_SBit_Range * arange, - FT_ULong* aglyph_offset ) + TT_SBit_Range *arange, + FT_ULong *aglyph_offset ) { TT_SBit_RangeRec *range, *range_limit; @@ -731,12 +731,12 @@ } } - /* fall-through */ - default: - goto Fail; + /* fall-through */ + default: + goto Fail; } - Found: + Found: /* return successfully! */ *arange = range; return 0; @@ -780,18 +780,18 @@ /* glyph. */ /* */ static FT_Error - Find_SBit_Image( TT_Face face, - FT_UInt glyph_index, - FT_ULong strike_index, - TT_SBit_Range *arange, - TT_SBit_Strike *astrike, - FT_ULong *aglyph_offset ) + Find_SBit_Image( TT_Face face, + FT_UInt glyph_index, + FT_ULong strike_index, + TT_SBit_Range *arange, + TT_SBit_Strike *astrike, + FT_ULong *aglyph_offset ) { - FT_Error error; - TT_SBit_Strike strike; + FT_Error error; + TT_SBit_Strike strike; - if ( !face->sbit_strikes || + if ( !face->sbit_strikes || ( face->num_sbit_strikes <= (FT_Int)strike_index ) ) goto Fail; @@ -844,9 +844,9 @@ /* function exit. */ /* */ static FT_Error - Load_SBit_Metrics( FT_Stream stream, - TT_SBit_Range range, - TT_SBit_Metrics metrics ) + Load_SBit_Metrics( FT_Stream stream, + TT_SBit_Range range, + TT_SBit_Metrics metrics ) { FT_Error error = SFNT_Err_Ok; @@ -930,8 +930,8 @@ /* metrics :: The corresponding metrics structure. */ /* */ static void - Crop_Bitmap( FT_Bitmap* map, - TT_SBit_Metrics metrics ) + Crop_Bitmap( FT_Bitmap* map, + TT_SBit_Metrics metrics ) { /***********************************************************************/ /* */ @@ -991,7 +991,7 @@ line = (FT_Byte*)map->buffer; FT_MEM_MOVE( line, line + count * line_len, - ( rows - count ) * line_len ); + ( rows - count ) * line_len ); metrics->height = (FT_Byte)( metrics->height - count ); metrics->horiBearingY = (FT_Char)( metrics->horiBearingY - count ); @@ -1121,13 +1121,13 @@ static FT_Error - Load_SBit_Single( FT_Bitmap* map, - FT_Int x_offset, - FT_Int y_offset, - FT_Int pix_bits, - FT_UShort image_format, - TT_SBit_Metrics metrics, - FT_Stream stream ) + Load_SBit_Single( FT_Bitmap* map, + FT_Int x_offset, + FT_Int y_offset, + FT_Int pix_bits, + FT_UShort image_format, + TT_SBit_Metrics metrics, + FT_Stream stream ) { FT_Error error; @@ -1142,11 +1142,11 @@ } { - FT_Int glyph_width = metrics->width; - FT_Int glyph_height = metrics->height; - FT_Int glyph_size; - FT_Int line_bits = pix_bits * glyph_width; - FT_Bool pad_bytes = 0; + FT_Int glyph_width = metrics->width; + FT_Int glyph_height = metrics->height; + FT_Int glyph_size; + FT_Int line_bits = pix_bits * glyph_width; + FT_Bool pad_bytes = 0; /* compute size of glyph image */ @@ -1160,10 +1160,17 @@ switch ( pix_bits ) { - case 1: line_length = ( glyph_width + 7 ) >> 3; break; - case 2: line_length = ( glyph_width + 3 ) >> 2; break; - case 4: line_length = ( glyph_width + 1 ) >> 1; break; - default: line_length = glyph_width; + case 1: + line_length = ( glyph_width + 7 ) >> 3; + break; + case 2: + line_length = ( glyph_width + 3 ) >> 2; + break; + case 4: + line_length = ( glyph_width + 1 ) >> 1; + break; + default: + line_length = glyph_width; } glyph_size = glyph_height * line_length; @@ -1201,15 +1208,15 @@ static FT_Error - Load_SBit_Image( TT_SBit_Strike strike, - TT_SBit_Range range, - FT_ULong ebdt_pos, - FT_ULong glyph_offset, - FT_Bitmap* map, - FT_Int x_offset, - FT_Int y_offset, - FT_Stream stream, - TT_SBit_Metrics metrics ) + Load_SBit_Image( TT_SBit_Strike strike, + TT_SBit_Range range, + FT_ULong ebdt_pos, + FT_ULong glyph_offset, + FT_Bitmap* map, + FT_Int x_offset, + FT_Int y_offset, + FT_Stream stream, + TT_SBit_Metrics metrics ) { FT_Memory memory = stream->memory; FT_Error error; @@ -1295,9 +1302,9 @@ /* All right, we have a compound format. First of all, read */ /* the array of elements. */ { - TT_SBit_Component components; - TT_SBit_Component comp; - FT_UShort num_components, count; + TT_SBit_Component components; + TT_SBit_Component comp; + FT_UShort num_components, count; if ( FT_READ_USHORT( num_components ) || @@ -1323,9 +1330,9 @@ comp = components; for ( ; count > 0; count--, comp++ ) { - TT_SBit_Range elem_range; + TT_SBit_Range elem_range; TT_SBit_MetricsRec elem_metrics; - FT_ULong elem_offset; + FT_ULong elem_offset; /* find the range for this element */ @@ -1393,20 +1400,20 @@ /* The `map.buffer' field is always freed before the glyph is loaded. */ /* */ FT_LOCAL_DEF( FT_Error ) - TT_Load_SBit_Image( TT_Face face, - FT_ULong strike_index, - FT_UInt glyph_index, - FT_UInt load_flags, - FT_Stream stream, - FT_Bitmap *map, + TT_Load_SBit_Image( TT_Face face, + FT_ULong strike_index, + FT_UInt glyph_index, + FT_UInt load_flags, + FT_Stream stream, + FT_Bitmap *map, TT_SBit_MetricsRec *metrics ) { - FT_Error error; - FT_Memory memory = stream->memory; - FT_ULong ebdt_pos, glyph_offset; + FT_Error error; + FT_Memory memory = stream->memory; + FT_ULong ebdt_pos, glyph_offset; - TT_SBit_Strike strike; - TT_SBit_Range range; + TT_SBit_Strike strike; + TT_SBit_Range range; /* Check whether there is a glyph sbit for the current index */ diff --git a/src/sfnt/ttsbit.h b/src/sfnt/ttsbit.h index 07a52ba81..f38123d7a 100644 --- a/src/sfnt/ttsbit.h +++ b/src/sfnt/ttsbit.h @@ -4,7 +4,7 @@ /* */ /* TrueType and OpenType embedded bitmap support (specification). */ /* */ -/* Copyright 1996-2001 by */ +/* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -42,12 +42,12 @@ FT_BEGIN_HEADER FT_ULong *astrike_index ); FT_LOCAL( FT_Error ) - TT_Load_SBit_Image( TT_Face face, - FT_ULong strike_index, - FT_UInt glyph_index, - FT_UInt load_flags, - FT_Stream stream, - FT_Bitmap *map, + TT_Load_SBit_Image( TT_Face face, + FT_ULong strike_index, + FT_UInt glyph_index, + FT_UInt load_flags, + FT_Stream stream, + FT_Bitmap *map, TT_SBit_MetricsRec *metrics );