diff --git a/include/freetype/freetype.h b/include/freetype/freetype.h index 633b2a8c6..919f09262 100644 --- a/include/freetype/freetype.h +++ b/include/freetype/freetype.h @@ -310,7 +310,10 @@ ft_encoding_unicode = FT_MAKE_TAG('u','n','i','c'), ft_encoding_latin_2 = FT_MAKE_TAG('l','a','t','2'), ft_encoding_sjis = FT_MAKE_TAG('s','j','i','s'), + ft_encoding_gb2312 = FT_MAKE_TAG('g','b',' ',' '), ft_encoding_big5 = FT_MAKE_TAG('b','i','g','5'), + ft_encoding_wansung = FT_MAKE_TAG('w','a','n','s'), + ft_encoding_johab = FT_MAKE_TAG('j','o','h','a'), ft_encoding_adobe_standard = FT_MAKE_TAG('a','d','o','b'), ft_encoding_adobe_expert = FT_MAKE_TAG('a','d','b','e'), diff --git a/src/base/ftbase.c b/src/base/ftbase.c index 8b2f5b2d1..20e419921 100644 --- a/src/base/ftbase.c +++ b/src/base/ftbase.c @@ -7,8 +7,8 @@ /* Copyright 1996-2000 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ -/* This file is part of the FreeType project, and may only be used */ -/* modified and distributed under the terms of the FreeType project */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ diff --git a/src/base/ftcalc.c b/src/base/ftcalc.c index 39cf6ac06..f0dcf1e3a 100644 --- a/src/base/ftcalc.c +++ b/src/base/ftcalc.c @@ -7,8 +7,8 @@ /* Copyright 1996-2000 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ -/* This file is part of the FreeType project, and may only be used */ -/* modified and distributed under the terms of the FreeType project */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ diff --git a/src/base/ftdebug.c b/src/base/ftdebug.c index 5fb000b33..72c44a3b0 100644 --- a/src/base/ftdebug.c +++ b/src/base/ftdebug.c @@ -7,8 +7,8 @@ /* Copyright 1996-2000 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ -/* This file is part of the FreeType project, and may only be used */ -/* modified and distributed under the terms of the FreeType project */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ diff --git a/src/base/ftextend.c b/src/base/ftextend.c index 24d8b0e08..72698717b 100644 --- a/src/base/ftextend.c +++ b/src/base/ftextend.c @@ -7,8 +7,8 @@ /* Copyright 1996-2000 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ -/* This file is part of the FreeType project, and may only be used */ -/* modified and distributed under the terms of the FreeType project */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ diff --git a/src/base/ftglyph.c b/src/base/ftglyph.c index 6bbad9042..d576b1012 100644 --- a/src/base/ftglyph.c +++ b/src/base/ftglyph.c @@ -7,8 +7,8 @@ /* Copyright 1996-2000 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ -/* This file is part of the FreeType project, and may only be used */ -/* modified and distributed under the terms of the FreeType project */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ diff --git a/src/base/ftgrays.c b/src/base/ftgrays.c index 44b240bd2..e006a3596 100644 --- a/src/base/ftgrays.c +++ b/src/base/ftgrays.c @@ -7,8 +7,8 @@ /* Copyright 2000 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ -/* This file is part of the FreeType project, and may only be used */ -/* modified and distributed under the terms of the FreeType project */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ diff --git a/src/base/ftinit.c b/src/base/ftinit.c index 1c3ace618..3d524acd0 100644 --- a/src/base/ftinit.c +++ b/src/base/ftinit.c @@ -7,8 +7,8 @@ /* Copyright 1996-2000 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ -/* This file is part of the FreeType project, and may only be used */ -/* modified and distributed under the terms of the FreeType project */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ diff --git a/src/base/ftlist.c b/src/base/ftlist.c index 3842fcb68..0158ba443 100644 --- a/src/base/ftlist.c +++ b/src/base/ftlist.c @@ -7,8 +7,8 @@ /* Copyright 1996-2000 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ -/* This file is part of the FreeType project, and may only be used */ -/* modified and distributed under the terms of the FreeType project */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ diff --git a/src/base/ftmm.c b/src/base/ftmm.c index 78317a728..ea4aaee53 100644 --- a/src/base/ftmm.c +++ b/src/base/ftmm.c @@ -7,8 +7,8 @@ /* Copyright 1996-2000 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ -/* This file is part of the FreeType project, and may only be used */ -/* modified and distributed under the terms of the FreeType project */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ diff --git a/src/base/ftobjs.c b/src/base/ftobjs.c index ac89cf00f..95981465b 100644 --- a/src/base/ftobjs.c +++ b/src/base/ftobjs.c @@ -5,10 +5,10 @@ /* The FreeType private base classes (base). */ /* */ /* Copyright 1996-2000 by */ -/* David Turner, Robert Wilhelm, and Werner Lemberg */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ -/* This file is part of the FreeType project, and may only be used */ -/* modified and distributed under the terms of the FreeType project */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ diff --git a/src/base/ftoutln.c b/src/base/ftoutln.c index 53cc3016b..93d8f457c 100644 --- a/src/base/ftoutln.c +++ b/src/base/ftoutln.c @@ -7,8 +7,8 @@ /* Copyright 1996-2000 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ -/* This file is part of the FreeType project, and may only be used */ -/* modified and distributed under the terms of the FreeType project */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ diff --git a/src/base/ftraster.c b/src/base/ftraster.c index d5f47bf9a..c450d0b4a 100644 --- a/src/base/ftraster.c +++ b/src/base/ftraster.c @@ -7,8 +7,8 @@ /* Copyright 1996-2000 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ -/* This file is part of the FreeType project, and may only be used */ -/* modified and distributed under the terms of the FreeType project */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ diff --git a/src/base/ftstream.c b/src/base/ftstream.c index dd33ec7ab..286cc5f69 100644 --- a/src/base/ftstream.c +++ b/src/base/ftstream.c @@ -7,8 +7,8 @@ /* Copyright 2000 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ -/* This file is part of the FreeType project, and may only be used */ -/* modified and distributed under the terms of the FreeType project */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ diff --git a/src/base/ftsystem.c b/src/base/ftsystem.c index f51a5040c..434a6dbad 100644 --- a/src/base/ftsystem.c +++ b/src/base/ftsystem.c @@ -7,8 +7,8 @@ /* Copyright 1996-2000 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ -/* This file is part of the FreeType project, and may only be used */ -/* modified and distributed under the terms of the FreeType project */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ diff --git a/src/base/rules.mk b/src/base/rules.mk index e2617ac1b..404f4d137 100644 --- a/src/base/rules.mk +++ b/src/base/rules.mk @@ -6,7 +6,7 @@ # Copyright 1996-2000 by # David Turner, Robert Wilhelm, and Werner Lemberg. # -# This file is part of the FreeType project, and may only be used modified +# This file is part of the FreeType project, and may only be used, modified, # and distributed under the terms of the FreeType project license, # LICENSE.TXT. By continuing to use, modify, or distribute this file you # indicate that you have read the license and understand and accept it diff --git a/src/psnames/rules.mk b/src/psnames/rules.mk index af226b728..56654b83c 100644 --- a/src/psnames/rules.mk +++ b/src/psnames/rules.mk @@ -14,8 +14,6 @@ ifndef PSNAMES_INCLUDE - PSNAMES_INCLUDED := 1 - # PSNAMES driver directory # PSNAMES_DIR := $(SRC_)psnames diff --git a/src/sfnt/rules.mk b/src/sfnt/rules.mk index 14de2b60e..395aab1be 100644 --- a/src/sfnt/rules.mk +++ b/src/sfnt/rules.mk @@ -14,18 +14,16 @@ ifndef SFNT_INCLUDE - SFNT_INCLUDED := 1 - # SFNT driver directory # SFNT_DIR := $(SRC_)sfnt SFNT_DIR_ := $(SFNT_DIR)$(SEP) + # additional include flags used when compiling the driver # SFNT_INCLUDE := $(SHARED) $(SFNT_DIR) - # compilation flags for the driver # SFNT_CFLAGS := $(SFNT_INCLUDE:%=$I%) @@ -41,7 +39,6 @@ ifndef SFNT_INCLUDE $(SFNT_DIR_)sfobjs.c \ $(SFNT_DIR_)sfdriver.c - # driver headers # SFNT_DRV_H := $(BASE_H) \ diff --git a/src/sfnt/sfdriver.c b/src/sfnt/sfdriver.c index abdc645f9..81bdb02c9 100644 --- a/src/sfnt/sfdriver.c +++ b/src/sfnt/sfdriver.c @@ -1,3 +1,21 @@ +/***************************************************************************/ +/* */ +/* sfdriver.c */ +/* */ +/* High-level SFNT driver interface (body). */ +/* */ +/* Copyright 1996-2000 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + #include #include #include @@ -7,24 +25,48 @@ #include #include + static - void* get_sfnt_table( TT_Face face, FT_Sfnt_Tag tag ) + void* get_sfnt_table( TT_Face face, + FT_Sfnt_Tag tag ) { void* table; - switch (tag) - { - case ft_sfnt_head: table = &face->header; break; - case ft_sfnt_hhea: table = &face->horizontal; break; - case ft_sfnt_vhea: table = (face->vertical_info ? &face->vertical : 0 ); break; - case ft_sfnt_os2: table = (face->os2.version == 0xFFFF ? 0 : &face->os2 ); break; - case ft_sfnt_post: table = &face->postscript; break; - case ft_sfnt_maxp: table = &face->max_profile; break; - case ft_sfnt_pclt: table = face->pclt.Version ? &face->pclt : 0 ; break; - default: - table = 0; + switch ( tag ) + { + case ft_sfnt_head: + table = &face->header; + break; + + case ft_sfnt_hhea: + table = &face->horizontal; + break; + + case ft_sfnt_vhea: + table = face->vertical_info ? &face->vertical : 0; + break; + + case ft_sfnt_os2: + table = face->os2.version == 0xFFFF ? 0 : &face->os2; + break; + + case ft_sfnt_post: + table = &face->postscript; + break; + + case ft_sfnt_maxp: + table = &face->max_profile; + break; + + case ft_sfnt_pclt: + table = face->pclt.Version ? &face->pclt : 0; + break; + + default: + table = 0; } + return table; } @@ -33,9 +75,9 @@ FTDriver_Interface SFNT_Get_Interface( FT_Driver driver, const char* interface ) { - UNUSED(driver); + UNUSED( driver ); - if (strcmp(interface,"get_sfnt")==0) + if ( strcmp( interface, "get_sfnt" ) == 0 ) return (FTDriver_Interface)get_sfnt_table; return 0; @@ -70,27 +112,27 @@ TT_Load_Kern, TT_Load_Gasp, - TT_Load_PCLT, + TT_Load_PCLT, #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS /* see `ttsbit.h' */ TT_Load_SBit_Strikes, TT_Load_SBit_Image, TT_Free_SBit_Strikes, -#else +#else /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ 0, 0, 0, -#endif +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ - /* see `ttpost.h' */ #ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES + /* see `ttpost.h' */ TT_Get_PS_Name, TT_Free_Post_Names, -#else +#else /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */ 0, 0, -#endif +#endif /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */ /* see `ttcmap.h' */ TT_CharMap_Load, @@ -100,19 +142,20 @@ const FT_DriverInterface sfnt_driver_interface = { - sizeof(FT_DriverRec), - 0, - 0, - 0, + sizeof ( FT_DriverRec ), 0, 0, 0, - "sfnt", /* driver name */ - 1, /* driver version */ - 2, /* driver requires FreeType 2 or above */ + "sfnt", /* driver name */ + 1, /* driver version */ + 2, /* driver requires FreeType 2 or higher */ (void*)&sfnt_interface, + + 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, + 0, 0, 0, + 0, }; + +/* END */ diff --git a/src/sfnt/sfdriver.h b/src/sfnt/sfdriver.h index 67fd3bd81..44d5a5579 100644 --- a/src/sfnt/sfdriver.h +++ b/src/sfnt/sfdriver.h @@ -4,7 +4,7 @@ /* */ /* High-level SFNT driver interface (specification). */ /* */ -/* Copyright 1996-1999 by */ +/* Copyright 1996-2000 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/sfnt.c b/src/sfnt/sfnt.c index 445cd6cae..a9aa1826a 100644 --- a/src/sfnt/sfnt.c +++ b/src/sfnt/sfnt.c @@ -1,3 +1,21 @@ +/***************************************************************************/ +/* */ +/* sfnt.c */ +/* */ +/* Single object library component. */ +/* */ +/* Copyright 1996-2000 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + #define FT_MAKE_OPTION_SINGLE_OBJECT #include @@ -15,3 +33,4 @@ #include +/* END */ diff --git a/src/sfnt/sfobjs.c b/src/sfnt/sfobjs.c index d85d022a2..a71a45167 100644 --- a/src/sfnt/sfobjs.c +++ b/src/sfnt/sfobjs.c @@ -1,7 +1,26 @@ +/***************************************************************************/ +/* */ +/* sfobjs.c */ +/* */ +/* SFNT object management (base). */ +/* */ +/* Copyright 1996-2000 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + #include #include #include + /*************************************************************************/ /* */ /* */ @@ -16,7 +35,7 @@ /* nameid :: The name id of the name record to return. */ /* */ /* */ - /* Char string. NULL if no name is present. */ + /* Character string. NULL if no name is present. */ /* */ static FT_String* Get_Name( TT_Face face, @@ -27,7 +46,7 @@ TT_NameRec* rec; FT_Bool wide_chars = 1; - /* first pass, look for a given name record */ + rec = face->name_table.names; for ( n = 0; n < face->name_table.numNameRecords; n++, rec++ ) { @@ -36,17 +55,18 @@ /* found the name - now create an ASCII string from it */ FT_Bool found = 0; - /* Test for Microsoft English language */ + + /* test for Microsoft English language */ if ( rec->platformID == TT_PLATFORM_MICROSOFT && rec->encodingID <= TT_MS_ID_UNICODE_CS && - (rec->languageID & 0x3FF) == 0x009 ) + ( rec->languageID & 0x3FF ) == 0x009 ) found = 1; - /* Test for Apple Unicode encoding */ + /* test for Apple Unicode encoding */ else if ( rec->platformID == TT_PLATFORM_APPLE_UNICODE ) found = 1; - /* Test for Apple Roman */ + /* test for Apple Roman */ else if ( rec->platformID == TT_PLATFORM_MACINTOSH && rec->languageID == TT_MAC_ID_ROMAN ) { @@ -54,22 +74,24 @@ wide_chars = 0; } - /* Found a Unicode Name */ + /* found a Unicode name */ if ( found ) { FT_String* string; FT_UInt len; + if ( wide_chars ) { TT_UInt m; + len = (TT_UInt)rec->stringLength / 2; if ( MEM_Alloc( string, len + 1 ) ) return NULL; for ( m = 0; m < len; m ++ ) - string[m] = rec->string[2*m + 1]; + string[m] = rec->string[2 * m + 1]; } else { @@ -85,13 +107,14 @@ } } } + return NULL; } static - FT_Encoding find_encoding( int platform_id, - int encoding_id ) + FT_Encoding find_encoding( int platform_id, + int encoding_id ) { typedef struct TEncoding { @@ -101,40 +124,42 @@ } TEncoding; - static - const TEncoding tt_encodings[] = + static const TEncoding tt_encodings[] = { - { TT_PLATFORM_ISO, -1, ft_encoding_unicode }, + { TT_PLATFORM_ISO, -1, ft_encoding_unicode }, - { TT_PLATFORM_APPLE_UNICODE, -1, ft_encoding_unicode }, + { TT_PLATFORM_APPLE_UNICODE, -1, ft_encoding_unicode }, - { TT_PLATFORM_MACINTOSH, TT_MAC_ID_ROMAN, ft_encoding_apple_roman }, + { TT_PLATFORM_MACINTOSH, TT_MAC_ID_ROMAN, ft_encoding_apple_roman }, - { TT_PLATFORM_MICROSOFT, TT_MS_ID_UNICODE_CS, ft_encoding_unicode }, - { TT_PLATFORM_MICROSOFT, TT_MS_ID_SJIS, ft_encoding_sjis }, - { TT_PLATFORM_MICROSOFT, TT_MS_ID_BIG_5, ft_encoding_big5 } + { TT_PLATFORM_MICROSOFT, TT_MS_ID_UNICODE_CS, ft_encoding_unicode }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_SJIS, ft_encoding_sjis }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_GB2312, ft_encoding_gb2312 }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_BIG_5, ft_encoding_big5 }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_WANSUNG, ft_encoding_wansung }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_JOHAB, ft_encoding_johab } }; const TEncoding *cur, *limit; + cur = tt_encodings; - limit = cur + sizeof(tt_encodings)/sizeof(tt_encodings[0]); + limit = cur + sizeof ( tt_encodings ) / sizeof ( tt_encodings[0] ); for ( ; cur < limit; cur++ ) { - if (cur->platform_id == platform_id) + if ( cur->platform_id == platform_id ) { - if (cur->encoding_id == encoding_id || - cur->encoding_id == -1 ) + if ( cur->encoding_id == encoding_id || + cur->encoding_id == -1 ) return cur->encoding; } } + return ft_encoding_none; } - - LOCAL_FUNC FT_Error SFNT_Init_Face( FT_Stream stream, TT_Face face, @@ -142,30 +167,32 @@ TT_Int num_params, FT_Parameter* params ) { - FT_Error error; - SFNT_Interface* sfnt; - PSNames_Interface* psnames; - SFNT_Header sfnt_header; + FT_Error error; + SFNT_Interface* sfnt; + PSNames_Interface* psnames; + SFNT_Header sfnt_header; /* for now, parameters are unused */ - UNUSED(num_params); - UNUSED(params); + UNUSED( num_params ); + UNUSED( params ); + sfnt = (SFNT_Interface*)face->sfnt; - if (!sfnt) + if ( !sfnt ) { /* look-up the SFNT driver */ FT_Driver sfnt_driver; + sfnt_driver = FT_Get_Driver( face->root.driver->library, "sfnt" ); - if (!sfnt_driver) + if ( !sfnt_driver ) { error = FT_Err_Invalid_File_Format; goto Exit; } - sfnt = (SFNT_Interface*)(sfnt_driver->interface.format_interface); - if (!sfnt) + sfnt = (SFNT_Interface*)( sfnt_driver->interface.format_interface ); + if ( !sfnt ) { error = FT_Err_Invalid_File_Format; goto Exit; @@ -176,27 +203,30 @@ } psnames = (PSNames_Interface*)face->psnames; - if (!psnames) + if ( !psnames ) { /* look-up the PSNames driver */ FT_Driver psnames_driver; + psnames_driver = FT_Get_Driver( face->root.driver->library, "psnames" ); - if (psnames_driver) + if ( psnames_driver ) face->psnames = (PSNames_Interface*) - (psnames_driver->interface.format_interface); + ( psnames_driver->interface.format_interface ); } /* check that we have a valid TrueType file */ error = sfnt->load_sfnt_header( face, stream, face_index, &sfnt_header ); - if (error) goto Exit; + if ( error ) + goto Exit; face->format_tag = sfnt_header.format_tag; face->num_tables = sfnt_header.num_tables; /* Load font directory */ error = sfnt->load_directory( face, stream, &sfnt_header ); - if ( error ) goto Exit; + if ( error ) + goto Exit; face->root.num_faces = face->ttc_header.DirCount; if ( face->root.num_faces < 1 ) @@ -207,9 +237,8 @@ } - #undef LOAD_ -#define LOAD_(x) ( (error = sfnt->load_##x( face, stream )) != FT_Err_Ok ) +#define LOAD_( x ) ( (error = sfnt->load_##x( face, stream )) != FT_Err_Ok ) LOCAL_FUNC @@ -219,18 +248,19 @@ TT_Int num_params, FT_Parameter* params ) { - FT_Error error; - SFNT_Interface* sfnt = (SFNT_Interface*)face->sfnt; + FT_Error error; + SFNT_Interface* sfnt = (SFNT_Interface*)face->sfnt; + /* Load tables */ if ( LOAD_( header ) || LOAD_( max_profile ) || - (error = sfnt->load_metrics( face, stream, 0 )) != FT_Err_Ok || /* load the `hhea' & `hmtx' tables at once */ + ( error = sfnt->load_metrics( face, stream, 0 ) ) != FT_Err_Ok || - (error = sfnt->load_metrics( face, stream, 1 )) != FT_Err_Ok || /* try to load the `vhea' & `vmtx' at once if present */ + ( error = sfnt->load_metrics( face, stream, 1 ) ) != FT_Err_Ok || LOAD_( charmaps ) || LOAD_( names ) || @@ -240,10 +270,11 @@ /* the optional tables */ - /* embedded bitmap support. */ #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS - if (sfnt->load_sbits && LOAD_(sbits)) goto Exit; -#endif + /* embedded bitmap support. */ + if ( sfnt->load_sbits && LOAD_( sbits ) ) + goto Exit; +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ if ( LOAD_( hdmx ) || LOAD_( gasp ) || @@ -267,21 +298,22 @@ TT_Int n; FT_Memory memory; + memory = root->memory; - /*****************************************************************/ - /* */ - /* Compute face flags. */ - /* */ + /*********************************************************************/ + /* */ + /* Compute face flags. */ + /* */ flags = FT_FACE_FLAG_SCALABLE | /* scalable outlines */ FT_FACE_FLAG_SFNT | /* SFNT file format */ FT_FACE_FLAG_HORIZONTAL; /* horizontal data */ - /* fixed width font ? */ + /* fixed width font? */ if ( face->postscript.isFixedPitch ) flags |= FT_FACE_FLAG_FIXED_WIDTH; - /* vertical information ? */ + /* vertical information? */ if ( face->vertical_info ) flags |= FT_FACE_FLAG_VERTICAL; @@ -291,15 +323,15 @@ root->face_flags = flags; - /*****************************************************************/ - /* */ - /* Compute style flags. */ - /* */ + /*********************************************************************/ + /* */ + /* Compute style flags. */ + /* */ flags = 0; if ( face->os2.version != 0xFFFF ) { - /* We have an OS/2 table, use the `fsSelection' field */ + /* we have an OS/2 table; use the `fsSelection' field */ if ( face->os2.fsSelection & 1 ) flags |= FT_STYLE_FLAG_ITALIC; @@ -308,7 +340,7 @@ } else { - /* This is an old Mac font, use the header field */ + /* this is an old Mac font, use the header field */ if ( face->header.Mac_Style & 1 ) flags |= FT_STYLE_FLAG_BOLD; @@ -318,13 +350,13 @@ face->root.style_flags = flags; - /*****************************************************************/ - /* */ - /* Polish the charmaps. */ - /* */ - /* Try to set the charmap encoding according to the platform & */ - /* encoding ID of each charmap. */ - /* */ + /*********************************************************************/ + /* */ + /* Polish the charmaps. */ + /* */ + /* Try to set the charmap encoding according to the platform & */ + /* encoding ID of each charmap. */ + /* */ charmap = face->charmaps; root->num_charmaps = face->num_charmaps; @@ -337,13 +369,16 @@ FT_Int platform = charmap->cmap.platformID; FT_Int encoding = charmap->cmap.platformEncodingID; + charmap->root.face = (FT_Face)face; charmap->root.platform_id = platform; charmap->root.encoding_id = encoding; - charmap->root.encoding = find_encoding(platform,encoding); + charmap->root.encoding = find_encoding( platform, encoding ); - /* now, set root->charmap with a unicode charmap wherever available */ - if (!root->charmap && charmap->root.encoding == ft_encoding_unicode) + /* 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; @@ -358,34 +393,34 @@ FT_Bitmap_Size ) ) return error; - for ( n = 0 ; n < face->num_sbit_strikes ; n++ ) - { - face->root.available_sizes[n].width = - face->sbit_strikes[n].x_ppem; - face->root.available_sizes[n].height = - face->sbit_strikes[n].y_ppem; - } + for ( n = 0 ; n < face->num_sbit_strikes ; n++ ) + { + face->root.available_sizes[n].width = + face->sbit_strikes[n].x_ppem; + face->root.available_sizes[n].height = + face->sbit_strikes[n].y_ppem; + } } else -#else +#else /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ { root->num_fixed_sizes = 0; root->available_sizes = 0; } #endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ - /*****************************************************************/ - /* */ - /* Set up metrics. */ - /* */ + /*********************************************************************/ + /* */ + /* Set up metrics. */ + /* */ root->bbox.xMin = face->header.xMin; root->bbox.yMin = face->header.yMin; root->bbox.xMax = face->header.xMax; root->bbox.yMax = face->header.yMax; root->units_per_EM = face->header.Units_Per_EM; - /* The ascender/descender/height are computed from the OS/2 table */ - /* when found. Otherwise, they're taken from the horizontal header */ + /* The ascender/descender/height are computed from the OS/2 table */ + /* when found. Otherwise, they're taken from the horizontal header. */ if ( face->os2.version != 0xFFFF ) { root->ascender = face->os2.sTypoAscender; @@ -401,11 +436,11 @@ face->horizontal.Line_Gap; } - root->max_advance_width = face->horizontal.advance_Width_Max; + root->max_advance_width = face->horizontal.advance_Width_Max; - root->max_advance_height = root->height; - if ( face->vertical_info ) - root->max_advance_height = face->vertical.advance_Height_Max; + root->max_advance_height = face->vertical_info + ? face->vertical.advance_Height_Max + : root->height; root->underline_position = face->postscript.underlinePosition; root->underline_thickness = face->postscript.underlineThickness; @@ -428,14 +463,15 @@ FT_Memory memory = face->root.memory; SFNT_Interface* sfnt = face->sfnt; - if (sfnt) + + if ( sfnt ) { - /* destroy the postscript names table if it is supported */ - if (sfnt->free_psnames) + /* destroy the postscript names table if it is loaded */ + if ( sfnt->free_psnames ) sfnt->free_psnames( face ); - /* destroy the embedded bitmaps table if it is supported */ - if (sfnt->free_sbits) + /* destroy the embedded bitmaps table if it is loaded */ + if ( sfnt->free_sbits ) sfnt->free_sbits( face ); } @@ -455,6 +491,8 @@ if (sfnt && sfnt->load_charmaps ) { FT_UShort n; + + for ( n = 0; n < face->num_charmaps; n++ ) sfnt->free_charmap( face, &face->charmaps[n].cmap ); } @@ -500,3 +538,5 @@ face->sfnt = 0; } + +/* END */ diff --git a/src/sfnt/sfobjs.h b/src/sfnt/sfobjs.h index 193cc9b90..380a1fc62 100644 --- a/src/sfnt/sfobjs.h +++ b/src/sfnt/sfobjs.h @@ -2,9 +2,9 @@ /* */ /* sfobjs.h */ /* */ -/* SFNT object management */ +/* SFNT object management (specification). */ /* */ -/* Copyright 1996-1999 by */ +/* Copyright 1996-2000 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -15,12 +15,14 @@ /* */ /***************************************************************************/ + #ifndef SFOBJS_H #define SFOBJS_H #include #include + LOCAL_DEF FT_Error SFNT_Init_Face( FT_Stream stream, TT_Face face, diff --git a/src/sfnt/ttcmap.c b/src/sfnt/ttcmap.c index daeaccf6d..a5c32f286 100644 --- a/src/sfnt/ttcmap.c +++ b/src/sfnt/ttcmap.c @@ -4,11 +4,11 @@ /* */ /* TrueType character mapping table (cmap) support (body). */ /* */ -/* Copyright 1996-1999 by */ +/* Copyright 1996-2000 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ -/* This file is part of the FreeType project, and may only be used */ -/* modified and distributed under the terms of the FreeType project */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ @@ -22,15 +22,26 @@ #include #include -/* required by the tracing mode */ + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ #undef FT_COMPONENT -#define FT_COMPONENT trace_ttcmap +#define FT_COMPONENT trace_ttcmap - static TT_UInt code_to_index0( TT_CMapTable* charmap, TT_ULong char_code ); - static TT_UInt code_to_index2( TT_CMapTable* charmap, TT_ULong char_code ); - static TT_UInt code_to_index4( TT_CMapTable* charmap, TT_ULong char_code ); - static TT_UInt code_to_index6( TT_CMapTable* charmap, TT_ULong char_code ); + static TT_UInt code_to_index0( TT_CMapTable* charmap, + TT_ULong char_code ); + static TT_UInt code_to_index2( TT_CMapTable* charmap, + TT_ULong char_code ); + static TT_UInt code_to_index4( TT_CMapTable* charmap, + TT_ULong char_code ); + static TT_UInt code_to_index6( TT_CMapTable* charmap, + TT_ULong char_code ); + /*************************************************************************/ /* */ @@ -48,7 +59,7 @@ /* table :: A pointer to a cmap object. */ /* */ /* */ - /* Error code. 0 means success. */ + /* TrueType error code. 0 means success. */ /* */ /* */ /* The function assumes that the stream is already in use (i.e., */ @@ -119,7 +130,7 @@ /* load subheaders */ cmap2->numGlyphId = l = - ( ( cmap->length - 2L*(256+3) - num_SH*8L ) & 0xffff ) / 2; + ( ( cmap->length - 2L * ( 256 + 3 ) - num_SH * 8L ) & 0xffff ) / 2; if ( ALLOC_ARRAY( cmap2->subHeaders, num_SH + 1, @@ -177,8 +188,8 @@ if ( ALLOC_ARRAY( cmap4->segments, num_Seg, - TT_CMap4Segment ) || - ACCESS_Frame( (num_Seg * 4 + 1) * 2L ) ) + TT_CMap4Segment ) || + ACCESS_Frame( ( num_Seg * 4 + 1 ) * 2L ) ) goto Fail; segments = cmap4->segments; @@ -200,12 +211,12 @@ FORGET_Frame(); cmap4->numGlyphId = l = - ( ( cmap->length - ( 16L + 8L * num_Seg ) ) & 0xFFFF ) /2; + ( ( cmap->length - ( 16L + 8L * num_Seg ) ) & 0xFFFF ) / 2; /* load IDs */ if ( ALLOC_ARRAY( cmap4->glyphIdArray, l, TT_UShort ) || - ACCESS_Frame( l*2L ) ) + ACCESS_Frame( l * 2L ) ) goto Fail; for ( i = 0; i < l; i++ ) @@ -248,6 +259,7 @@ return TT_Err_Invalid_CharMap_Format; } + return TT_Err_Ok; Fail: @@ -269,7 +281,7 @@ /* cmap :: A handle to a cmap object. */ /* */ /* */ - /* Error code. 0 means success. */ + /* TrueType error code. 0 means success. */ /* */ LOCAL_FUNC TT_Error TT_CharMap_Free( TT_Face face, @@ -316,7 +328,6 @@ } - /*************************************************************************/ /* */ /* */ @@ -332,8 +343,7 @@ /* cmap0 :: A pointer to a cmap table in format 0. */ /* */ /* */ - /* Glyph index into the glyphs array. 0 if the glyph does not */ - /* exist. */ + /* Glyph index into the glyphs array. 0 if the glyph does not exist. */ /* */ static TT_UInt code_to_index0( TT_CMapTable* cmap, @@ -341,6 +351,7 @@ { TT_CMap0* cmap0 = &cmap->c.cmap0; + return ( charCode <= 0xFF ? cmap0->glyphIdArray[charCode] : 0 ); } @@ -358,54 +369,53 @@ /* cmap2 :: A pointer to a cmap table in format 2. */ /* */ /* */ - /* Glyph index into the glyphs array. 0 if the glyph does not */ - /* exist. */ + /* Glyph index into the glyphs array. 0 if the glyph does not exist. */ /* */ static TT_UInt code_to_index2( TT_CMapTable* cmap, TT_ULong charCode ) { - TT_UInt result, index1, offset; - TT_UInt char_lo; - TT_ULong char_hi; - TT_CMap2SubHeader* sh2; - TT_CMap2* cmap2; + TT_UInt result, index1, offset; + TT_UInt char_lo; + TT_ULong char_hi; + TT_CMap2SubHeader* sh2; + TT_CMap2* cmap2; + cmap2 = &cmap->c.cmap2; result = 0; - char_lo = (TT_UInt)(charCode & 0xFF); + char_lo = (TT_UInt)( charCode & 0xFF ); char_hi = charCode >> 8; if ( char_hi == 0 ) { /* an 8-bit character code - we use the subHeader 0 in this case */ - /* to test wether the character code is in the charmap */ + /* to test whether the character code is in the charmap */ if ( cmap2->subHeaderKeys[char_lo] == 0 ) - { result = cmap2->glyphIdArray[char_lo]; - } } else { /* a 16-bit character code */ - index1 = cmap2->subHeaderKeys[ char_hi & 0xFF ]; - if (index1) + index1 = cmap2->subHeaderKeys[char_hi & 0xFF]; + if ( index1 ) { sh2 = cmap2->subHeaders + index1; char_lo -= sh2->firstCode; - if (char_lo < sh2->entryCount) + if ( char_lo < sh2->entryCount ) { - offset = sh2->idRangeOffset/2 + char_lo; - if (offset < cmap2->numGlyphId) + offset = sh2->idRangeOffset / 2 + char_lo; + if ( offset < cmap2->numGlyphId ) { result = cmap2->glyphIdArray[offset]; - if (result) - result = (result + sh2->idDelta) & 0xFFFF; + if ( result ) + result = ( result + sh2->idDelta ) & 0xFFFF; } } } } + return result; } @@ -423,8 +433,7 @@ /* cmap4 :: A pointer to a cmap table in format 4. */ /* */ /* */ - /* Glyph index into the glyphs array. 0 if the glyph does not */ - /* exist. */ + /* Glyph index into the glyphs array. 0 if the glyph does not exist. */ /* */ static TT_UInt code_to_index4( TT_CMapTable* cmap, @@ -434,6 +443,7 @@ TT_CMap4* cmap4; TT_CMap4Segment *seg4, *limit; + cmap4 = &cmap->c.cmap4; result = 0; segCount = cmap4->segCountX2 / 2; @@ -448,8 +458,8 @@ for ( seg4 = cmap4->segments; seg4 < limit; seg4++, segCount-- ) { - /* the ranges are sorted in increasing order, if we're out of */ - /* the range here, the char code isn't in the charmap, so exit */ + /* the ranges are sorted in increasing order. If we are out of */ + /* the range here, the char code isn't in the charmap, so exit. */ if ( charCode > seg4->endCount ) continue; @@ -461,24 +471,23 @@ Found: cmap4->last_segment = seg4; - /* when the idRangeOffset is 0, we can compute the glyph index */ - /* directly.. */ + /* if the idRangeOffset is 0, we can compute the glyph index */ + /* directly */ if ( seg4->idRangeOffset == 0 ) - result = (charCode + seg4->idDelta) & 0xFFFF; - + result = ( charCode + seg4->idDelta ) & 0xFFFF; else - /* otherwise, we must use the glyphIdArray to do it */ { - index1 = seg4->idRangeOffset/2 + (charCode - seg4->startCount) + /* otherwise, we must use the glyphIdArray to do it */ + index1 = seg4->idRangeOffset / 2 + + ( charCode - seg4->startCount ) - segCount; if ( index1 < cmap4->numGlyphId && cmap4->glyphIdArray[index1] != 0 ) - { - result = (cmap4->glyphIdArray[index1] + seg4->idDelta) & 0xFFFF; - } + result = ( cmap4->glyphIdArray[index1] + seg4->idDelta ) & 0xFFFF; } + return result; } @@ -496,16 +505,16 @@ /* cmap6 :: A pointer to a cmap table in format 6. */ /* */ /* */ - /* Glyph index into the glyphs array. 0 if the glyph does not */ - /* exist. */ + /* Glyph index into the glyphs array. 0 if the glyph does not exist. */ /* */ static TT_UInt code_to_index6( TT_CMapTable* cmap, - TT_ULong charCode ) + TT_ULong charCode ) { TT_CMap6* cmap6; TT_UInt result = 0; + cmap6 = &cmap->c.cmap6; result = 0; charCode -= cmap6->firstCode; diff --git a/src/sfnt/ttcmap.h b/src/sfnt/ttcmap.h index 49ac80d35..3439469fd 100644 --- a/src/sfnt/ttcmap.h +++ b/src/sfnt/ttcmap.h @@ -4,11 +4,11 @@ /* */ /* TrueType character mapping table (cmap) support (specification). */ /* */ -/* Copyright 1996-1999 by */ +/* Copyright 1996-2000 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ -/* This file is part of the FreeType project, and may only be used */ -/* modified and distributed under the terms of the FreeType project */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ @@ -26,50 +26,11 @@ #endif - /*************************************************************************/ - /* */ - /* */ - /* TT_CharMap_Load */ - /* */ - /* */ - /* Loads a given TrueType character map into memory. */ - /* */ - /* */ - /* face :: A handle to the parent face object. */ - /* stream :: A handle to the current stream object. */ - /* */ - /* */ - /* cmap :: A pointer to a cmap object. */ - /* */ - /* */ - /* Error code. 0 means success. */ - /* */ - /* */ - /* The function assumes that the stream is already in use (i.e., */ - /* opened). In case of error, all partially allocated tables are */ - /* released. */ - /* */ LOCAL_DEF TT_Error TT_CharMap_Load( TT_Face face, TT_CMapTable* cmap, FT_Stream input ); - - /*************************************************************************/ - /* */ - /* */ - /* TT_CharMap_Free */ - /* */ - /* */ - /* Destroys a character mapping table. */ - /* */ - /* */ - /* face :: A handle to the parent face object. */ - /* cmap :: A handle to a cmap object. */ - /* */ - /* */ - /* Error code. 0 means success. */ - /* */ LOCAL_DEF TT_Error TT_CharMap_Free( TT_Face face, TT_CMapTable* cmap ); diff --git a/src/sfnt/ttload.c b/src/sfnt/ttload.c index 8b1c7d9ed..595ed6d11 100644 --- a/src/sfnt/ttload.c +++ b/src/sfnt/ttload.c @@ -2,22 +2,18 @@ /* */ /* ttload.c */ /* */ -/* TrueType tables loader (body). */ +/* Load the basic TrueType tables, i.e., tables that can be either in */ +/* TTF or OTF fonts (body). */ /* */ -/* Copyright 1996-1999 by */ +/* Copyright 1996-2000 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ -/* This file is part of the FreeType project, and may only be used */ -/* modified and distributed under the terms of the FreeType project */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ -/* */ -/* WARNING: This file should not be compiled directly; it is meant to be */ -/* included in the source of several font drivers (i.e., the TTF */ -/* and OTF drivers). */ -/* */ /***************************************************************************/ @@ -28,11 +24,15 @@ #include #include -/* required by the tracing mode */ -#undef FT_COMPONENT -#define FT_COMPONENT trace_ttload -#define READ_FIELDS + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttload /*************************************************************************/ @@ -45,10 +45,10 @@ /* */ /* */ /* face :: A face object handle. */ - /* tag :: The searched tag. */ + /* tag :: The searched tag. */ /* */ /* */ - /* pointer to table directory entry. 0 if not found.. */ + /* A pointer to the table directory entry. 0 if not found. */ /* */ LOCAL_FUNC TT_Table* TT_LookUp_Table( TT_Face face, @@ -57,24 +57,28 @@ TT_Table* entry; TT_Table* limit; - FT_TRACE4(( "TT_LookUp_Table( %08p, %c%c%c%c )\n", + + FT_TRACE3(( "TT_LookUp_Table: %08p, `%c%c%c%c' )\n", face, - (TT_Char)(tag >> 24), - (TT_Char)(tag >> 16), - (TT_Char)(tag >> 8), - (TT_Char)(tag) )); + (TT_Char)( tag >> 24 ), + (TT_Char)( tag >> 16 ), + (TT_Char)( tag >> 8 ), + (TT_Char)( tag ) )); entry = face->dir_tables; limit = entry + face->num_tables; + for ( ; entry < limit; entry++ ) { if ( entry->Tag == tag ) return entry; } - FT_TRACE4(( " Could not find table!\n" )); + + FT_TRACE3(( " Could not find table!\n" )); return 0; } + /*************************************************************************/ /* */ /* */ @@ -84,26 +88,30 @@ /* Looks for a TrueType table by name, then seek a stream to it. */ /* */ /* */ - /* face :: a face object handle. */ - /* tag :: the searched tag. */ - /* stream :: the stream to seek when the table is found */ + /* face :: A face object handle. */ + /* tag :: The searched tag. */ + /* stream :: The stream to seek when the table is found. */ + /* */ + /* */ + /* length :: The length of the table if found, undefined otherwise. */ /* */ /* */ - /* pointer to table directory entry. 0 if not found.. */ + /* TrueType error code. 0 means success. */ /* */ LOCAL_FUNC - TT_Error TT_Goto_Table( TT_Face face, - TT_ULong tag, - FT_Stream stream, - TT_ULong *length ) + TT_Error TT_Goto_Table( TT_Face face, + TT_ULong tag, + FT_Stream stream, + TT_ULong* length ) { TT_Table* table; TT_Error error; + table = TT_LookUp_Table( face, tag ); - if (table) + if ( table ) { - if (length) + if ( length ) *length = table->Length; (void)FILE_Seek( table->Offset ); @@ -117,54 +125,61 @@ /*************************************************************************/ /* */ - /* */ + /* */ /* TT_Load_SFNT_Header */ /* */ /* */ - /* Loads the header of a SFNT font file. Supports collections.. */ + /* Loads the header of a SFNT font file. Supports collections. */ /* */ /* */ - /* face :: A handle to the target face object. */ - /* stream :: The input stream. */ + /* 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. */ /* */ /* */ - /* sfnt :: the sfnt header */ + /* sfnt :: The SFNT header. */ /* */ /* */ /* TrueType error code. 0 means success. */ /* */ /* */ - /* The stream cursor must be at the font file's origin */ - /* This function recognizes fonts embedded in a "TrueType collection" */ + /* The stream cursor must be at the font file's origin. */ /* */ - /* This function checks that the header is valid by looking at the */ - /* values of "search_range", "entry_selector" and "range_shift".. */ + /* This function recognizes fonts embedded in a `TrueType collection' */ + /* */ + /* The header will be checked whether it is valid by looking at the */ + /* values of `search_range', `entry_selector', and `range_shift'. */ /* */ LOCAL_FUNC - TT_Error TT_Load_SFNT_Header( TT_Face face, - FT_Stream stream, - TT_Long face_index, - SFNT_Header* sfnt ) + TT_Error TT_Load_SFNT_Header( TT_Face face, + FT_Stream stream, + TT_Long face_index, + SFNT_Header* sfnt ) { TT_Error error; TT_ULong format_tag; FT_Memory memory = stream->memory; - const FT_Frame_Field sfnt_header_fields[] = { - FT_FRAME_START(8), - FT_FRAME_USHORT( SFNT_Header, num_tables ), - FT_FRAME_USHORT( SFNT_Header, search_range ), - FT_FRAME_USHORT( SFNT_Header, entry_selector ), - FT_FRAME_USHORT( SFNT_Header, range_shift ), - FT_FRAME_END }; + const FT_Frame_Field sfnt_header_fields[] = + { + FT_FRAME_START( 8 ), + FT_FRAME_USHORT( SFNT_Header, num_tables ), + FT_FRAME_USHORT( SFNT_Header, search_range ), + FT_FRAME_USHORT( SFNT_Header, entry_selector ), + FT_FRAME_USHORT( SFNT_Header, range_shift ), + FT_FRAME_END + }; - const FT_Frame_Field ttc_header_fields[] = { - FT_FRAME_START(8), /* frame of 8 bytes */ - FT_FRAME_LONG( TTC_Header, version ), - FT_FRAME_LONG( TTC_Header, DirCount ), - FT_FRAME_END }; + const FT_Frame_Field ttc_header_fields[] = + { + FT_FRAME_START( 8 ), + FT_FRAME_LONG( TTC_Header, version ), + FT_FRAME_LONG( TTC_Header, DirCount ), + FT_FRAME_END }; - FT_TRACE2(( "TT_Load_SFNT_Header(%08p, %ld )\n", + + FT_TRACE2(( "TT_Load_SFNT_Header: %08p, %ld\n", face, face_index )); face->ttc_header.Tag = 0; @@ -173,25 +188,25 @@ face->num_tables = 0; - /* first of all, read the first 4 bytes. If it's `ttcf', then the */ + /* first of all, read the first 4 bytes. If it's `ttcf', then the */ /* file is a TrueType collection, otherwise it can be any other */ - /* kind of font.. */ - if ( READ_ULong(format_tag) ) goto Exit; + /* kind of font. */ + if ( READ_ULong( format_tag ) ) + goto Exit; if ( format_tag == TTAG_ttcf ) { TT_Int n; - FT_TRACE4(( "TT_Load_SFNT_Header: file is a collection\n" )); + + FT_TRACE3(( "TT_Load_SFNT_Header: file is a collection\n" )); /* it's a TrueType collection, i.e. a file containing several */ - /* font files. Read the font directory now */ - /* */ + /* font files. Read the font directory now */ if ( READ_Fields( ttc_header_fields, &face->ttc_header ) ) goto Exit; - /* now read the offsets of each font in the file */ - /* */ + /* now read the offsets of each font in the file */ if ( ALLOC_ARRAY( face->ttc_header.TableDirectory, face->ttc_header.DirCount, TT_ULong ) || @@ -204,7 +219,7 @@ FORGET_Frame(); /* check face index */ - if (face_index >= face->ttc_header.DirCount) + if ( face_index >= face->ttc_header.DirCount ) { error = TT_Err_Bad_Argument; goto Exit; @@ -221,19 +236,20 @@ if ( READ_Fields( sfnt_header_fields, sfnt ) ) goto Exit; - /* now, check the values of "num_tables", "seach_range", etc.. */ + /* now, check the values of `num_tables', `seach_range', etc. */ { TT_UInt num_tables = sfnt->num_tables; TT_ULong entry_selector = 1L << sfnt->entry_selector; - /* IMPORTANT: Many fonts have an incorrect "search_range" value, so */ - /* we only check the "entry_selector" correctness here.. */ - /* */ - if ( num_tables == 0 || - entry_selector > num_tables || - entry_selector*2 <= num_tables ) + + /* IMPORTANT: Many fonts have an incorrect `search_range' value, so */ + /* we only check the `entry_selector' correctness here. */ + /* */ + if ( num_tables == 0 || + entry_selector > num_tables || + entry_selector * 2 <= num_tables ) { - FT_TRACE2(( "TT_Load_SFNT_Header: file is not SFNT !\n" )); + FT_TRACE2(( "TT_Load_SFNT_Header: file is not SFNT!\n" )); error = FT_Err_Unknown_File_Format; } } @@ -243,7 +259,6 @@ } - /*************************************************************************/ /* */ /* */ @@ -252,16 +267,18 @@ /* */ /* Loads the table directory into a face object. */ /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ /* */ - /* face :: A handle to the target face object. */ - /* stream :: The input stream. */ - /* sfnt :: sfnt directory header */ + /* stream :: The input stream. */ + /* sfnt :: The SFNT directory header. */ /* */ /* */ /* TrueType error code. 0 means success. */ /* */ /* */ - /* The stream cursor must be at the font file's origin */ + /* The stream cursor must be at the font file's origin. */ /* */ LOCAL_FUNC TT_Error TT_Load_Directory( TT_Face face, @@ -273,11 +290,11 @@ TT_Table *entry, *limit; - FT_TRACE2(( "TT_Load_Directory( %08p )\n", - face )); - FT_TRACE2(( "-- Tables count : %12u\n", sfnt->num_tables )); - FT_TRACE2(( "-- Format version : %08lx\n", sfnt->format_tag )); + FT_TRACE2(( "TT_Load_Directory: %08p\n", face )); + + FT_TRACE2(( "-- Tables count: %12u\n", sfnt->num_tables )); + FT_TRACE2(( "-- Format version: %08lx\n", sfnt->format_tag )); face->num_tables = sfnt->num_tables; @@ -300,12 +317,12 @@ entry->Length = GET_Long(); FT_TRACE2(( " %c%c%c%c - %08lx - %08lx\n", - (TT_Char)(entry->Tag >> 24), - (TT_Char)(entry->Tag >> 16), - (TT_Char)(entry->Tag >> 8 ), - (TT_Char)(entry->Tag), - entry->Offset, - entry->Length )); + (TT_Char)( entry->Tag >> 24 ), + (TT_Char)( entry->Tag >> 16 ), + (TT_Char)( entry->Tag >> 8 ), + (TT_Char)( entry->Tag ), + entry->Offset, + entry->Length )); } FORGET_Frame(); @@ -329,7 +346,7 @@ /* */ /* face :: The face object to look for. */ /* */ - /* tag :: The tag of table to load. Use the value 0 if you want */ + /* tag :: The tag of table to load. Use the value 0 if you want */ /* to access the whole font file, else set this parameter */ /* to a valid TrueType table tag that you can forge with */ /* the MAKE_TT_TAG macro. */ @@ -370,6 +387,7 @@ TT_Table* table; TT_ULong size; + if ( tag != 0 ) { /* look for tag in font directory */ @@ -384,14 +402,13 @@ size = table->Length; } else - /* tag = 0 -- the use want to access the font file directly */ - { + /* tag == 0 -- the user wants to access the font file directly */ size = face->root.stream->size; - } if ( length && *length == 0 ) { *length = size; + return TT_Err_Ok; } @@ -428,30 +445,33 @@ TT_Error error; TT_Header* header; - static const FT_Frame_Field header_fields[] = { - FT_FRAME_START(54), - FT_FRAME_ULONG( TT_Header, Table_Version ), - FT_FRAME_ULONG( TT_Header, Font_Revision ), - FT_FRAME_LONG( TT_Header, CheckSum_Adjust ), - FT_FRAME_LONG( TT_Header, Magic_Number ), - FT_FRAME_USHORT( TT_Header, Flags ), - FT_FRAME_USHORT( TT_Header, Units_Per_EM ), - FT_FRAME_LONG( TT_Header, Created[0] ), - FT_FRAME_LONG( TT_Header, Created[1] ), - FT_FRAME_LONG( TT_Header, Modified[0] ), - FT_FRAME_LONG( TT_Header, Modified[1] ), - FT_FRAME_SHORT( TT_Header, xMin ), - FT_FRAME_SHORT( TT_Header, yMin ), - FT_FRAME_SHORT( TT_Header, xMax ), - FT_FRAME_SHORT( TT_Header, yMax ), - FT_FRAME_USHORT( TT_Header, Mac_Style ), - FT_FRAME_USHORT( TT_Header, Lowest_Rec_PPEM ), - FT_FRAME_SHORT( TT_Header, Font_Direction ), - FT_FRAME_SHORT( TT_Header, Index_To_Loc_Format ), - FT_FRAME_SHORT( TT_Header, Glyph_Data_Format ), - FT_FRAME_END }; + static const FT_Frame_Field header_fields[] = + { + FT_FRAME_START( 54 ), + FT_FRAME_ULONG( TT_Header, Table_Version ), + FT_FRAME_ULONG( TT_Header, Font_Revision ), + FT_FRAME_LONG( TT_Header, CheckSum_Adjust ), + FT_FRAME_LONG( TT_Header, Magic_Number ), + FT_FRAME_USHORT( TT_Header, Flags ), + FT_FRAME_USHORT( TT_Header, Units_Per_EM ), + FT_FRAME_LONG( TT_Header, Created[0] ), + FT_FRAME_LONG( TT_Header, Created[1] ), + FT_FRAME_LONG( TT_Header, Modified[0] ), + FT_FRAME_LONG( TT_Header, Modified[1] ), + FT_FRAME_SHORT( TT_Header, xMin ), + FT_FRAME_SHORT( TT_Header, yMin ), + FT_FRAME_SHORT( TT_Header, xMax ), + FT_FRAME_SHORT( TT_Header, yMax ), + FT_FRAME_USHORT( TT_Header, Mac_Style ), + FT_FRAME_USHORT( TT_Header, Lowest_Rec_PPEM ), + FT_FRAME_SHORT( TT_Header, Font_Direction ), + FT_FRAME_SHORT( TT_Header, Index_To_Loc_Format ), + FT_FRAME_SHORT( TT_Header, Glyph_Data_Format ), + FT_FRAME_END + }; - FT_TRACE2(( "Load_TT_Header( %08p )\n", face )); + + FT_TRACE2(( "Load_TT_Header: %08p\n", face )); error = face->goto_table( face, TTAG_head, stream, 0 ); if ( error ) @@ -465,8 +485,8 @@ if ( READ_Fields( header_fields, header ) ) goto Exit; - FT_TRACE2(( " Units per EM : %8u\n", header->Units_Per_EM )); - FT_TRACE2(( " IndexToLoc : %8d\n", header->Index_To_Loc_Format )); + FT_TRACE2(( " Units per EM: %8u\n", header->Units_Per_EM )); + FT_TRACE2(( " IndexToLoc: %8d\n", header->Index_To_Loc_Format )); FT_TRACE2(( "Font Header Loaded.\n" )); Exit: @@ -496,31 +516,35 @@ TT_Error error; TT_MaxProfile* maxProfile = &face->max_profile; - const FT_Frame_Field maxp_fields[] = { - FT_FRAME_START(32), - FT_FRAME_ULONG( TT_MaxProfile, version ), - FT_FRAME_USHORT( TT_MaxProfile, numGlyphs ), - FT_FRAME_USHORT( TT_MaxProfile, maxPoints ), - FT_FRAME_USHORT( TT_MaxProfile, maxContours ), - FT_FRAME_USHORT( TT_MaxProfile, maxCompositePoints ), - FT_FRAME_USHORT( TT_MaxProfile, maxCompositeContours ), - FT_FRAME_USHORT( TT_MaxProfile, maxZones ), - FT_FRAME_USHORT( TT_MaxProfile, maxTwilightPoints ), - FT_FRAME_USHORT( TT_MaxProfile, maxStorage ), - FT_FRAME_USHORT( TT_MaxProfile, maxFunctionDefs ), - FT_FRAME_USHORT( TT_MaxProfile, maxInstructionDefs ), - FT_FRAME_USHORT( TT_MaxProfile, maxStackElements ), - FT_FRAME_USHORT( TT_MaxProfile, maxSizeOfInstructions ), - FT_FRAME_USHORT( TT_MaxProfile, maxComponentElements ), - FT_FRAME_USHORT( TT_MaxProfile, maxComponentDepth ), - FT_FRAME_END }; + const FT_Frame_Field maxp_fields[] = + { + FT_FRAME_START( 32 ), + FT_FRAME_ULONG( TT_MaxProfile, version ), + FT_FRAME_USHORT( TT_MaxProfile, numGlyphs ), + FT_FRAME_USHORT( TT_MaxProfile, maxPoints ), + FT_FRAME_USHORT( TT_MaxProfile, maxContours ), + FT_FRAME_USHORT( TT_MaxProfile, maxCompositePoints ), + FT_FRAME_USHORT( TT_MaxProfile, maxCompositeContours ), + FT_FRAME_USHORT( TT_MaxProfile, maxZones ), + FT_FRAME_USHORT( TT_MaxProfile, maxTwilightPoints ), + FT_FRAME_USHORT( TT_MaxProfile, maxStorage ), + FT_FRAME_USHORT( TT_MaxProfile, maxFunctionDefs ), + FT_FRAME_USHORT( TT_MaxProfile, maxInstructionDefs ), + FT_FRAME_USHORT( TT_MaxProfile, maxStackElements ), + FT_FRAME_USHORT( TT_MaxProfile, maxSizeOfInstructions ), + FT_FRAME_USHORT( TT_MaxProfile, maxComponentElements ), + FT_FRAME_USHORT( TT_MaxProfile, maxComponentDepth ), + FT_FRAME_END }; - FT_TRACE2(( "Load_TT_MaxProfile( %08p )\n", face )); + + FT_TRACE2(( "Load_TT_MaxProfile: %08p\n", face )); error = face->goto_table( face, TTAG_maxp, stream, 0 ); - if (error) goto Exit; + if ( error ) + goto Exit; - if ( READ_Fields( maxp_fields, maxProfile ) ) goto Exit; + if ( READ_Fields( maxp_fields, maxProfile ) ) + goto Exit; /* XXX: an adjustment that is necessary to load certain */ /* broken fonts like `Keystrokes MT' :-( */ @@ -553,6 +577,7 @@ face->root.max_contours += 4; FT_TRACE2(( "MAXP loaded.\n" )); + Exit: return error; } @@ -588,8 +613,8 @@ TT_LongMetrics** longs; TT_ShortMetrics** shorts; - FT_TRACE2(( "TT_Load_%s_Metrics( %08p )\n", - vertical ? "Vertical" : "Horizontal", face )); + FT_TRACE2(( "TT_Load_%s_Metrics: %08p\n", + vertical ? "Vertical" : "Horizontal", face )); if ( vertical ) { @@ -603,7 +628,7 @@ error = face->goto_table( face, TTAG_vmtx, stream, &table_len ); if ( error ) { - /* Set the number_Of_VMetrics to 0! */ + /* Set number_Of_VMetrics to 0! */ FT_TRACE2(( " no vertical header in file.\n" )); face->vertical.number_Of_VMetrics = 0; error = TT_Err_Ok; @@ -617,7 +642,7 @@ else { error = face->goto_table( face, TTAG_hmtx, stream, &table_len ); - if (error) + if ( error ) { FT_ERROR(( " no horizontal metrics in file!\n" )); error = TT_Err_Hmtx_Table_Missing; @@ -632,17 +657,18 @@ /* never trust derived values */ num_shorts = face->max_profile.numGlyphs - num_longs; - num_shorts_checked = ( table_len - num_longs*4L )/2; + num_shorts_checked = ( table_len - num_longs * 4L ) / 2; if ( num_shorts < 0 ) { FT_ERROR(( "!! more metrics than glyphs!\n" )); - error = ( vertical ? TT_Err_Invalid_Vert_Metrics - : TT_Err_Invalid_Horiz_Metrics ); + + error = vertical ? TT_Err_Invalid_Vert_Metrics + : TT_Err_Invalid_Horiz_Metrics; goto Exit; } - if ( ALLOC_ARRAY( *longs, num_longs, TT_LongMetrics ) || + if ( ALLOC_ARRAY( *longs, num_longs, TT_LongMetrics ) || ALLOC_ARRAY( *shorts, num_shorts, TT_ShortMetrics ) ) goto Exit; @@ -653,6 +679,7 @@ TT_LongMetrics* cur = *longs; TT_LongMetrics* limit = cur + num_longs; + for ( ; cur < limit; cur++ ) { cur->advance = GET_UShort(); @@ -660,20 +687,22 @@ } } - /* do we have an inconsistent number of metric values ? */ + /* do we have an inconsistent number of metric values? */ { TT_ShortMetrics* cur = *shorts; TT_ShortMetrics* limit = cur + MIN( num_shorts, num_shorts_checked ); + for ( ; cur < limit; cur++ ) *cur = GET_Short(); - /* we fill up the missing left side bearings with the */ - /* last valid value. Since this will occur for buggy CJK */ - /* fonts usually, nothing serious will happen */ + /* we fill up the missing left side bearings with the */ + /* last valid value. Since this will occur for buggy CJK */ + /* fonts usually only, nothing serious will happen */ if ( num_shorts > num_shorts_checked && num_shorts_checked > 0 ) { - TT_Short val = *(shorts)[num_shorts_checked-1]; + TT_Short val = *(shorts)[num_shorts_checked - 1]; + limit = *shorts + num_shorts; for ( ; cur < limit; cur++ ) @@ -714,26 +743,29 @@ TT_Error error; TT_HoriHeader* header; - const FT_Frame_Field metrics_header_fields[] = { - FT_FRAME_START(36), - FT_FRAME_ULONG( TT_HoriHeader, Version ), - FT_FRAME_SHORT( TT_HoriHeader, Ascender ), - FT_FRAME_SHORT( TT_HoriHeader, Descender ), - FT_FRAME_SHORT( TT_HoriHeader, Line_Gap ), - FT_FRAME_USHORT( TT_HoriHeader, advance_Width_Max ), - FT_FRAME_SHORT( TT_HoriHeader, min_Left_Side_Bearing ), - FT_FRAME_SHORT( TT_HoriHeader, min_Right_Side_Bearing ), - FT_FRAME_SHORT( TT_HoriHeader, xMax_Extent ), - FT_FRAME_SHORT( TT_HoriHeader, caret_Slope_Rise ), - FT_FRAME_SHORT( TT_HoriHeader, caret_Slope_Run ), - FT_FRAME_SHORT( TT_HoriHeader, Reserved[0] ), - FT_FRAME_SHORT( TT_HoriHeader, Reserved[1] ), - FT_FRAME_SHORT( TT_HoriHeader, Reserved[2] ), - FT_FRAME_SHORT( TT_HoriHeader, Reserved[3] ), - FT_FRAME_SHORT( TT_HoriHeader, Reserved[4] ), - FT_FRAME_SHORT( TT_HoriHeader, metric_Data_Format ), - FT_FRAME_USHORT( TT_HoriHeader, number_Of_HMetrics ), - FT_FRAME_END }; + const FT_Frame_Field metrics_header_fields[] = + { + FT_FRAME_START( 36 ), + FT_FRAME_ULONG( TT_HoriHeader, Version ), + FT_FRAME_SHORT( TT_HoriHeader, Ascender ), + FT_FRAME_SHORT( TT_HoriHeader, Descender ), + FT_FRAME_SHORT( TT_HoriHeader, Line_Gap ), + FT_FRAME_USHORT( TT_HoriHeader, advance_Width_Max ), + FT_FRAME_SHORT( TT_HoriHeader, min_Left_Side_Bearing ), + FT_FRAME_SHORT( TT_HoriHeader, min_Right_Side_Bearing ), + FT_FRAME_SHORT( TT_HoriHeader, xMax_Extent ), + FT_FRAME_SHORT( TT_HoriHeader, caret_Slope_Rise ), + FT_FRAME_SHORT( TT_HoriHeader, caret_Slope_Run ), + FT_FRAME_SHORT( TT_HoriHeader, Reserved[0] ), + FT_FRAME_SHORT( TT_HoriHeader, Reserved[1] ), + FT_FRAME_SHORT( TT_HoriHeader, Reserved[2] ), + FT_FRAME_SHORT( TT_HoriHeader, Reserved[3] ), + FT_FRAME_SHORT( TT_HoriHeader, Reserved[4] ), + FT_FRAME_SHORT( TT_HoriHeader, metric_Data_Format ), + FT_FRAME_USHORT( TT_HoriHeader, number_Of_HMetrics ), + FT_FRAME_END + }; + FT_TRACE2(( vertical ? "Vertical header " : "Horizontal header " )); @@ -744,7 +776,7 @@ /* The vertical header table is optional, so return quietly if */ /* we don't find it. */ error = face->goto_table( face, TTAG_vhea, stream, 0 ); - if (error) + if ( error ) { error = TT_Err_Ok; goto Exit; @@ -758,7 +790,7 @@ /* The horizontal header is mandatory, return an error if we */ /* don't find it. */ error = face->goto_table( face, TTAG_hhea, stream, 0 ); - if (error) + if ( error ) { error = TT_Err_Horiz_Header_Missing; goto Exit; @@ -767,7 +799,8 @@ header = &face->horizontal; } - if ( READ_Fields( metrics_header_fields, header ) ) goto Exit; + if ( READ_Fields( metrics_header_fields, header ) ) + goto Exit; header->long_metrics = NULL; header->short_metrics = NULL; @@ -777,6 +810,7 @@ /* Now try to load the corresponding metrics */ error = TT_Load_Metrics( face, stream, vertical ); + Exit: return error; } @@ -798,7 +832,8 @@ /* TrueType error code. 0 means success. */ /* */ LOCAL_FUNC - TT_Error TT_Load_Names( TT_Face face, FT_Stream stream ) + TT_Error TT_Load_Names( TT_Face face, + FT_Stream stream ) { TT_Error error; FT_Memory memory = stream->memory; @@ -808,27 +843,32 @@ TT_NameTable* names; - const FT_Frame_Field name_table_fields[] = { - FT_FRAME_START(6), - FT_FRAME_USHORT( TT_NameTable, format ), - FT_FRAME_USHORT( TT_NameTable, numNameRecords ), - FT_FRAME_USHORT( TT_NameTable, storageOffset ), - FT_FRAME_END }; + const FT_Frame_Field name_table_fields[] = + { + FT_FRAME_START( 6 ), + FT_FRAME_USHORT( TT_NameTable, format ), + FT_FRAME_USHORT( TT_NameTable, numNameRecords ), + FT_FRAME_USHORT( TT_NameTable, storageOffset ), + FT_FRAME_END + }; - const FT_Frame_Field name_record_fields[] = { - FT_FRAME_USHORT( TT_NameRec, platformID ), - FT_FRAME_USHORT( TT_NameRec, encodingID ), - FT_FRAME_USHORT( TT_NameRec, languageID ), - FT_FRAME_USHORT( TT_NameRec, nameID ), - FT_FRAME_USHORT( TT_NameRec, stringLength ), - FT_FRAME_USHORT( TT_NameRec, stringOffset ), - FT_FRAME_END }; + const FT_Frame_Field name_record_fields[] = + { + /* no FT_FRAME_START */ + FT_FRAME_USHORT( TT_NameRec, platformID ), + FT_FRAME_USHORT( TT_NameRec, encodingID ), + FT_FRAME_USHORT( TT_NameRec, languageID ), + FT_FRAME_USHORT( TT_NameRec, nameID ), + FT_FRAME_USHORT( TT_NameRec, stringLength ), + FT_FRAME_USHORT( TT_NameRec, stringOffset ), + FT_FRAME_END + }; FT_TRACE2(( "Names " )); error = face->goto_table( face, TTAG_name, stream, &table_len ); - if (error) + if ( error ) { /* The name table is required so indicate failure. */ FT_TRACE2(( "is missing!\n" )); @@ -840,7 +880,8 @@ names = &face->name_table; - if ( READ_Fields( name_table_fields, names ) ) goto Exit; + if ( READ_Fields( name_table_fields, names ) ) + goto Exit; /* Allocate the array of name records. */ if ( ALLOC_ARRAY( names->names, @@ -852,8 +893,9 @@ /* Load the name records and determine how much storage is needed */ /* to hold the strings themselves. */ { - TT_NameRec* cur = names->names; - TT_NameRec* limit = cur + names->numNameRecords; + TT_NameRec* cur = names->names; + TT_NameRec* limit = cur + names->numNameRecords; + storageSize = 0; @@ -861,19 +903,21 @@ { TT_ULong upper; + (void)READ_Fields( name_record_fields, cur ); - upper = (TT_ULong)(cur->stringOffset + cur->stringLength); - if ( upper > storageSize ) storageSize = upper; + upper = (TT_ULong)( cur->stringOffset + cur->stringLength ); + if ( upper > storageSize ) + storageSize = upper; } } FORGET_Frame(); - if (storageSize > 0) + if ( storageSize > 0 ) { /* allocate the name storage area in memory, then read it */ - if ( ALLOC( names->storage, storageSize ) || + if ( ALLOC( names->storage, storageSize ) || FILE_Read_At( table_pos + names->storageOffset, (void*)names->storage, storageSize ) ) goto Exit; @@ -883,21 +927,25 @@ TT_NameRec* cur = names->names; TT_NameRec* limit = cur + names->numNameRecords; + for ( ; cur < limit; cur++ ) cur->string = names->storage + cur->stringOffset; } #ifdef FT_DEBUG_LEVEL_TRACE + /* Print Name Record Table in case of debugging */ { TT_NameRec* cur = names->names; TT_NameRec* limit = cur + names->numNameRecords; + for ( ; cur < limit; cur++ ) { TT_UInt j; - FT_TRACE2(( "%d %d %x %d ", + + FT_TRACE3(( "%d %d %x %d\n ", cur->platformID, cur->encodingID, cur->languageID, @@ -910,13 +958,16 @@ { TT_Char c = *(cur->string + j); + if ( (TT_Byte)c < 128 ) - FT_TRACE2(( "%c", c )); + FT_TRACE3(( "%c", c )); } } } - FT_TRACE2(( "\n" )); -#endif + FT_TRACE3(( "\n" )); + +#endif /* FT_DEBUG_LEVEL_TRACE */ + } FT_TRACE2(( "loaded\n" )); @@ -965,8 +1016,8 @@ /* loaded on demand in the `ttcmap.c' module. */ /* */ /* */ - /* face :: A handle to the target face object. */ - /* stream :: A handle to the input stream. */ + /* face :: A handle to the target face object. */ + /* stream :: A handle to the input stream. */ /* */ /* */ /* TrueType error code. 0 means success. */ @@ -980,23 +1031,28 @@ TT_Long table_start; TT_CMapDir cmap_dir; - const FT_Frame_Field cmap_fields[] = { - FT_FRAME_START(4), - FT_FRAME_USHORT( TT_CMapDir, tableVersionNumber ), - FT_FRAME_USHORT( TT_CMapDir, numCMaps ), - FT_FRAME_END }; + const FT_Frame_Field cmap_fields[] = + { + FT_FRAME_START( 4 ), + FT_FRAME_USHORT( TT_CMapDir, tableVersionNumber ), + FT_FRAME_USHORT( TT_CMapDir, numCMaps ), + FT_FRAME_END + }; + + const FT_Frame_Field cmap_rec_fields[] = + { + FT_FRAME_START( 6 ), + FT_FRAME_USHORT( TT_CMapTable, format ), + FT_FRAME_USHORT( TT_CMapTable, length ), + FT_FRAME_USHORT( TT_CMapTable, version ), + FT_FRAME_END + }; - const FT_Frame_Field cmap_rec_fields[] = { - FT_FRAME_START(6), - FT_FRAME_USHORT( TT_CMapTable, format ), - FT_FRAME_USHORT( TT_CMapTable, length ), - FT_FRAME_USHORT( TT_CMapTable, version ), - FT_FRAME_END }; FT_TRACE2(( "CMaps " )); error = face->goto_table( face, TTAG_cmap, stream, 0 ); - if (error) + if ( error ) { error = TT_Err_CMap_Table_Missing; goto Exit; @@ -1004,7 +1060,8 @@ table_start = FILE_Pos(); - if ( READ_Fields( cmap_fields, &cmap_dir ) ) goto Exit; + if ( READ_Fields( cmap_fields, &cmap_dir ) ) + goto Exit; /* save space in face table for cmap tables */ if ( ALLOC_ARRAY( face->charmaps, @@ -1017,12 +1074,16 @@ TT_CharMap charmap = face->charmaps; TT_CharMap limit = charmap + face->num_charmaps; + /* read the header of each charmap first */ - if ( ACCESS_Frame( face->num_charmaps*8L ) ) goto Exit; + if ( ACCESS_Frame( face->num_charmaps * 8L ) ) + goto Exit; + for ( ; charmap < limit; charmap++ ) { TT_CMapTable* cmap; + charmap->root.face = (FT_Face)face; cmap = &charmap->cmap; @@ -1031,6 +1092,7 @@ cmap->platformEncodingID = GET_UShort(); cmap->offset = (TT_ULong)GET_Long(); } + FORGET_Frame(); /* now read the rest of each table */ @@ -1038,6 +1100,7 @@ { TT_CMapTable* cmap = &charmap->cmap; + if ( FILE_Seek( table_start + (TT_Long)cmap->offset ) || READ_Fields( cmap_rec_fields, cmap ) ) goto Exit; @@ -1047,6 +1110,7 @@ } FT_TRACE2(( "loaded\n" )); + Exit: return error; } @@ -1074,67 +1138,74 @@ TT_Error error; TT_OS2* os2; - const FT_Frame_Field os2_fields[] = { - FT_FRAME_START(78), - FT_FRAME_USHORT( TT_OS2, version ), - FT_FRAME_SHORT( TT_OS2, xAvgCharWidth ), - FT_FRAME_USHORT( TT_OS2, usWeightClass ), - FT_FRAME_USHORT( TT_OS2, usWidthClass ), - FT_FRAME_SHORT( TT_OS2, fsType ), - FT_FRAME_SHORT( TT_OS2, ySubscriptXSize ), - FT_FRAME_SHORT( TT_OS2, ySubscriptYSize ), - FT_FRAME_SHORT( TT_OS2, ySubscriptXOffset ), - FT_FRAME_SHORT( TT_OS2, ySubscriptYOffset ), - FT_FRAME_SHORT( TT_OS2, ySuperscriptXSize ), - FT_FRAME_SHORT( TT_OS2, ySuperscriptYSize ), - FT_FRAME_SHORT( TT_OS2, ySuperscriptXOffset ), - FT_FRAME_SHORT( TT_OS2, ySuperscriptYOffset ), - FT_FRAME_SHORT( TT_OS2, yStrikeoutSize ), - FT_FRAME_SHORT( TT_OS2, yStrikeoutPosition ), - FT_FRAME_SHORT( TT_OS2, sFamilyClass ), - FT_FRAME_BYTE( TT_OS2, panose[0] ), - FT_FRAME_BYTE( TT_OS2, panose[1] ), - FT_FRAME_BYTE( TT_OS2, panose[2] ), - FT_FRAME_BYTE( TT_OS2, panose[3] ), - FT_FRAME_BYTE( TT_OS2, panose[4] ), - FT_FRAME_BYTE( TT_OS2, panose[5] ), - FT_FRAME_BYTE( TT_OS2, panose[6] ), - FT_FRAME_BYTE( TT_OS2, panose[7] ), - FT_FRAME_BYTE( TT_OS2, panose[8] ), - FT_FRAME_BYTE( TT_OS2, panose[9] ), - FT_FRAME_ULONG( TT_OS2, ulUnicodeRange1 ), - FT_FRAME_ULONG( TT_OS2, ulUnicodeRange2 ), - FT_FRAME_ULONG( TT_OS2, ulUnicodeRange3 ), - FT_FRAME_ULONG( TT_OS2, ulUnicodeRange4 ), - FT_FRAME_BYTE( TT_OS2, achVendID[0] ), - FT_FRAME_BYTE( TT_OS2, achVendID[1] ), - FT_FRAME_BYTE( TT_OS2, achVendID[2] ), - FT_FRAME_BYTE( TT_OS2, achVendID[3] ), + const FT_Frame_Field os2_fields[] = + { + FT_FRAME_START( 78 ), + FT_FRAME_USHORT( TT_OS2, version ), + FT_FRAME_SHORT( TT_OS2, xAvgCharWidth ), + FT_FRAME_USHORT( TT_OS2, usWeightClass ), + FT_FRAME_USHORT( TT_OS2, usWidthClass ), + FT_FRAME_SHORT( TT_OS2, fsType ), + FT_FRAME_SHORT( TT_OS2, ySubscriptXSize ), + FT_FRAME_SHORT( TT_OS2, ySubscriptYSize ), + FT_FRAME_SHORT( TT_OS2, ySubscriptXOffset ), + FT_FRAME_SHORT( TT_OS2, ySubscriptYOffset ), + FT_FRAME_SHORT( TT_OS2, ySuperscriptXSize ), + FT_FRAME_SHORT( TT_OS2, ySuperscriptYSize ), + FT_FRAME_SHORT( TT_OS2, ySuperscriptXOffset ), + FT_FRAME_SHORT( TT_OS2, ySuperscriptYOffset ), + FT_FRAME_SHORT( TT_OS2, yStrikeoutSize ), + FT_FRAME_SHORT( TT_OS2, yStrikeoutPosition ), + FT_FRAME_SHORT( TT_OS2, sFamilyClass ), + FT_FRAME_BYTE( TT_OS2, panose[0] ), + FT_FRAME_BYTE( TT_OS2, panose[1] ), + FT_FRAME_BYTE( TT_OS2, panose[2] ), + FT_FRAME_BYTE( TT_OS2, panose[3] ), + FT_FRAME_BYTE( TT_OS2, panose[4] ), + FT_FRAME_BYTE( TT_OS2, panose[5] ), + FT_FRAME_BYTE( TT_OS2, panose[6] ), + FT_FRAME_BYTE( TT_OS2, panose[7] ), + FT_FRAME_BYTE( TT_OS2, panose[8] ), + FT_FRAME_BYTE( TT_OS2, panose[9] ), + FT_FRAME_ULONG( TT_OS2, ulUnicodeRange1 ), + FT_FRAME_ULONG( TT_OS2, ulUnicodeRange2 ), + FT_FRAME_ULONG( TT_OS2, ulUnicodeRange3 ), + FT_FRAME_ULONG( TT_OS2, ulUnicodeRange4 ), + FT_FRAME_BYTE( TT_OS2, achVendID[0] ), + FT_FRAME_BYTE( TT_OS2, achVendID[1] ), + FT_FRAME_BYTE( TT_OS2, achVendID[2] ), + FT_FRAME_BYTE( TT_OS2, achVendID[3] ), - FT_FRAME_USHORT( TT_OS2, fsSelection ), - FT_FRAME_USHORT( TT_OS2, usFirstCharIndex ), - FT_FRAME_USHORT( TT_OS2, usLastCharIndex ), - FT_FRAME_SHORT( TT_OS2, sTypoAscender ), - FT_FRAME_SHORT( TT_OS2, sTypoDescender ), - FT_FRAME_SHORT( TT_OS2, sTypoLineGap ), - FT_FRAME_USHORT( TT_OS2, usWinAscent ), - FT_FRAME_USHORT( TT_OS2, usWinDescent ), - FT_FRAME_END }; + FT_FRAME_USHORT( TT_OS2, fsSelection ), + FT_FRAME_USHORT( TT_OS2, usFirstCharIndex ), + FT_FRAME_USHORT( TT_OS2, usLastCharIndex ), + FT_FRAME_SHORT( TT_OS2, sTypoAscender ), + FT_FRAME_SHORT( TT_OS2, sTypoDescender ), + FT_FRAME_SHORT( TT_OS2, sTypoLineGap ), + FT_FRAME_USHORT( TT_OS2, usWinAscent ), + FT_FRAME_USHORT( TT_OS2, usWinDescent ), + FT_FRAME_END + }; - const FT_Frame_Field os2_fields_extra[] = { - FT_FRAME_START(8), - FT_FRAME_ULONG( TT_OS2, ulCodePageRange1 ), - FT_FRAME_ULONG( TT_OS2, ulCodePageRange2 ), - FT_FRAME_END }; + const FT_Frame_Field os2_fields_extra[] = + { + FT_FRAME_START( 8 ), + FT_FRAME_ULONG( TT_OS2, ulCodePageRange1 ), + FT_FRAME_ULONG( TT_OS2, ulCodePageRange2 ), + FT_FRAME_END + }; + + const FT_Frame_Field os2_fields_extra2[] = + { + FT_FRAME_START( 10 ), + FT_FRAME_SHORT( TT_OS2, sxHeight ), + FT_FRAME_SHORT( TT_OS2, sCapHeight ), + FT_FRAME_USHORT( TT_OS2, usDefaultChar ), + FT_FRAME_USHORT( TT_OS2, usBreakChar ), + FT_FRAME_USHORT( TT_OS2, usMaxContext ), + FT_FRAME_END + }; - const FT_Frame_Field os2_fields_extra2[] = { - FT_FRAME_START(10), - FT_FRAME_SHORT( TT_OS2, sxHeight ), - FT_FRAME_SHORT( TT_OS2, sCapHeight ), - FT_FRAME_USHORT( TT_OS2, usDefaultChar ), - FT_FRAME_USHORT( TT_OS2, usBreakChar ), - FT_FRAME_USHORT( TT_OS2, usMaxContext ), - FT_FRAME_END }; FT_TRACE2(( "OS/2 Table " )); @@ -1142,7 +1213,7 @@ /* exist. Simply put, we set the `version' field to 0xFFFF */ /* and test this value each time we need to access the table. */ error = face->goto_table( face, TTAG_OS2, stream, 0 ); - if (error) + if ( error ) { FT_TRACE2(( "is missing\n!" )); face->os2.version = 0xFFFF; @@ -1152,7 +1223,8 @@ os2 = &face->os2; - if ( READ_Fields( os2_fields, os2 ) ) goto Exit; + if ( READ_Fields( os2_fields, os2 ) ) + goto Exit; os2->ulCodePageRange1 = 0; os2->ulCodePageRange2 = 0; @@ -1160,12 +1232,14 @@ if ( os2->version >= 0x0001 ) { /* only version 1 tables */ - if ( READ_Fields( os2_fields_extra, os2 ) ) goto Exit; + if ( READ_Fields( os2_fields_extra, os2 ) ) + goto Exit; if ( os2->version >= 0x0002 ) { /* only version 2 tables */ - if ( READ_Fields( os2_fields_extra2, os2 ) ) goto Exit; + if ( READ_Fields( os2_fields_extra2, os2 ) ) + goto Exit; } } @@ -1198,26 +1272,30 @@ TT_Error error; TT_Postscript* post = &face->postscript; - static const FT_Frame_Field post_fields[] = { - FT_FRAME_START(32), - FT_FRAME_ULONG( TT_Postscript, FormatType ), - FT_FRAME_ULONG( TT_Postscript, italicAngle ), - FT_FRAME_SHORT( TT_Postscript, underlinePosition ), - FT_FRAME_SHORT( TT_Postscript, underlineThickness ), - FT_FRAME_ULONG( TT_Postscript, isFixedPitch ), - FT_FRAME_ULONG( TT_Postscript, minMemType42 ), - FT_FRAME_ULONG( TT_Postscript, maxMemType42 ), - FT_FRAME_ULONG( TT_Postscript, minMemType1 ), - FT_FRAME_ULONG( TT_Postscript, maxMemType1 ), - FT_FRAME_END }; + static const FT_Frame_Field post_fields[] = + { + FT_FRAME_START( 32 ), + FT_FRAME_ULONG( TT_Postscript, FormatType ), + FT_FRAME_ULONG( TT_Postscript, italicAngle ), + FT_FRAME_SHORT( TT_Postscript, underlinePosition ), + FT_FRAME_SHORT( TT_Postscript, underlineThickness ), + FT_FRAME_ULONG( TT_Postscript, isFixedPitch ), + FT_FRAME_ULONG( TT_Postscript, minMemType42 ), + FT_FRAME_ULONG( TT_Postscript, maxMemType42 ), + FT_FRAME_ULONG( TT_Postscript, minMemType1 ), + FT_FRAME_ULONG( TT_Postscript, maxMemType1 ), + FT_FRAME_END + }; + FT_TRACE2(( "PostScript " )); error = face->goto_table( face, TTAG_post, stream, 0 ); - if (error) + if ( error ) return TT_Err_Post_Table_Missing; - if ( READ_Fields( post_fields, post ) ) return error; + if ( READ_Fields( post_fields, post ) ) + return error; /* we don't load the glyph names, we do that in another */ /* module (ttpost). */ @@ -1246,50 +1324,57 @@ TT_Error TT_Load_PCLT( TT_Face face, FT_Stream stream ) { - static const FT_Frame_Field pclt_fields[] = { - FT_FRAME_START( 20 ), - FT_FRAME_ULONG ( TT_PCLT, Version ), - FT_FRAME_ULONG ( TT_PCLT, FontNumber ), - FT_FRAME_USHORT( TT_PCLT, Pitch ), - FT_FRAME_USHORT( TT_PCLT, xHeight ), - FT_FRAME_USHORT( TT_PCLT, Style ), - FT_FRAME_USHORT( TT_PCLT, TypeFamily ), - FT_FRAME_USHORT( TT_PCLT, CapHeight ), - FT_FRAME_END }; + static const FT_Frame_Field pclt_fields[] = + { + FT_FRAME_START( 20 ), + FT_FRAME_ULONG ( TT_PCLT, Version ), + FT_FRAME_ULONG ( TT_PCLT, FontNumber ), + FT_FRAME_USHORT( TT_PCLT, Pitch ), + FT_FRAME_USHORT( TT_PCLT, xHeight ), + FT_FRAME_USHORT( TT_PCLT, Style ), + FT_FRAME_USHORT( TT_PCLT, TypeFamily ), + FT_FRAME_USHORT( TT_PCLT, CapHeight ), + FT_FRAME_END + }; - static const FT_Frame_Field pclt_fields2[] = { - FT_FRAME_START( 4 ), - FT_FRAME_CHAR( TT_PCLT, StrokeWeight ), - FT_FRAME_CHAR( TT_PCLT, WidthType ), - FT_FRAME_BYTE( TT_PCLT, SerifStyle ), - FT_FRAME_BYTE( TT_PCLT, Reserved ), - FT_FRAME_END }; + static const FT_Frame_Field pclt_fields2[] = + { + FT_FRAME_START( 4 ), + FT_FRAME_CHAR( TT_PCLT, StrokeWeight ), + FT_FRAME_CHAR( TT_PCLT, WidthType ), + FT_FRAME_BYTE( TT_PCLT, SerifStyle ), + FT_FRAME_BYTE( TT_PCLT, Reserved ), + FT_FRAME_END + }; - TT_Error error; - TT_PCLT* pclt = &face->pclt; - + TT_Error error; + TT_PCLT* pclt = &face->pclt; + + FT_TRACE2(( "PCLT " )); - /* optional table */ - error = face->goto_table( face, TTAG_PCLT, stream, 0 ); - if (error) - { - FT_TRACE2(( "missing (optional)\n" )); - pclt->Version = 0; - return 0; - } - - if ( READ_Fields( pclt_fields, pclt ) || - FILE_Read ( pclt->TypeFace, 16 ) || - FILE_Read ( pclt->CharacterComplement, 8 ) || - FILE_Read ( pclt->FileName, 6 ) || - READ_Fields( pclt_fields2, pclt ) ) + /* optional table */ + error = face->goto_table( face, TTAG_PCLT, stream, 0 ); + if ( error ) + { + FT_TRACE2(( "missing (optional)\n" )); + pclt->Version = 0; + return TT_Err_Ok; + } + + if ( READ_Fields( pclt_fields, pclt ) || + FILE_Read ( pclt->TypeFace, 16 ) || + FILE_Read ( pclt->CharacterComplement, 8 ) || + FILE_Read ( pclt->FileName, 6 ) || + READ_Fields( pclt_fields2, pclt ) ) goto Exit; - - FT_TRACE2(( "loaded\n" )); - Exit: - return error; - } + + FT_TRACE2(( "loaded\n" )); + + Exit: + return error; + } + /*************************************************************************/ /* */ @@ -1317,11 +1402,12 @@ TT_GaspRange* gaspranges; - FT_TRACE2(( "TT_Load_Gasp( %08p )\n", face )); + FT_TRACE2(( "TT_Load_Gasp: %08p\n", face )); /* the gasp table is optional */ error = face->goto_table( face, TTAG_gasp, stream, 0 ); - if (error) return TT_Err_Ok; + if ( error ) + return TT_Err_Ok; if ( ACCESS_Frame( 4L ) ) goto Exit; @@ -1335,7 +1421,7 @@ FT_TRACE3(( "number of ranges = %d\n", num_ranges )); if ( ALLOC_ARRAY( gaspranges, num_ranges, TT_GaspRange ) || - ACCESS_Frame( num_ranges * 4L ) ) + ACCESS_Frame( num_ranges * 4L ) ) goto Exit; face->gasp.gaspRanges = gaspranges; @@ -1346,8 +1432,8 @@ gaspranges[j].gaspFlag = GET_UShort(); FT_TRACE3(( " [max:%d flag:%d]", - gaspranges[j].maxPPEM, - gaspranges[j].gaspFlag )); + gaspranges[j].maxPPEM, + gaspranges[j].gaspFlag )); } FT_TRACE3(( "\n" )); @@ -1386,11 +1472,14 @@ TT_UInt n, num_tables, version; - /* the kern table is optional. exit silently if it's missing */ - error = face->goto_table( face, TTAG_kern, stream, 0 ); - if ( error ) return TT_Err_Ok; - if ( ACCESS_Frame( 4L ) ) goto Exit; + /* the kern table is optional. exit silently if it is missing */ + error = face->goto_table( face, TTAG_kern, stream, 0 ); + if ( error ) + return TT_Err_Ok; + + if ( ACCESS_Frame( 4L ) ) + goto Exit; version = GET_UShort(); num_tables = GET_UShort(); @@ -1402,7 +1491,9 @@ TT_UInt coverage; TT_UInt length; - if ( ACCESS_Frame( 6L ) ) goto Exit; + + if ( ACCESS_Frame( 6L ) ) + goto Exit; version = GET_UShort(); /* version */ length = GET_UShort() - 6; /* substract header length */ @@ -1416,11 +1507,13 @@ TT_Kern_0_Pair* pair; TT_Kern_0_Pair* limit; - /* found a horizontal format 0 kerning table ! */ - if ( ACCESS_Frame(8L) ) + + /* found a horizontal format 0 kerning table! */ + if ( ACCESS_Frame( 8L ) ) goto Exit; num_pairs = GET_UShort(); + /* skip the rest */ FORGET_Frame(); @@ -1482,9 +1575,10 @@ TT_Error error; FT_Memory memory = stream->memory; - TT_Hdmx* hdmx = &face->hdmx; - TT_Long num_glyphs; - TT_Long record_size; + TT_Hdmx* hdmx = &face->hdmx; + TT_Long num_glyphs; + TT_Long record_size; + hdmx->version = 0; hdmx->num_records = 0; @@ -1492,9 +1586,11 @@ /* this table is optional */ error = face->goto_table( face, TTAG_hdmx, stream, 0 ); - if (error) return TT_Err_Ok; + if ( error ) + return TT_Err_Ok; - if ( ACCESS_Frame( 8L ) ) goto Exit; + if ( ACCESS_Frame( 8L ) ) + goto Exit; hdmx->version = GET_UShort(); hdmx->num_records = GET_Short(); @@ -1516,6 +1612,7 @@ TT_HdmxRec* cur = hdmx->records; TT_HdmxRec* limit = cur + hdmx->num_records; + for ( ; cur < limit; cur++ ) { /* read record */ @@ -1523,12 +1620,12 @@ READ_Byte( cur->max_width ) ) goto Exit; - if ( ALLOC( cur->widths, num_glyphs ) || + if ( ALLOC( cur->widths, num_glyphs ) || FILE_Read( cur->widths, num_glyphs ) ) goto Exit; /* skip padding bytes */ - if ( record_size > 0 && FILE_Skip(record_size) ) + if ( record_size > 0 && FILE_Skip( record_size ) ) goto Exit; } } @@ -1557,6 +1654,7 @@ TT_Int n; FT_Memory memory = face->root.driver->memory; + for ( n = 0; n < face->hdmx.num_records; n++ ) FREE( face->hdmx.records[n].widths ); diff --git a/src/sfnt/ttload.h b/src/sfnt/ttload.h index 37efb4146..02bf36907 100644 --- a/src/sfnt/ttload.h +++ b/src/sfnt/ttload.h @@ -5,11 +5,11 @@ /* Load the basic TrueType tables, i.e., tables that can be either in */ /* TTF or OTF font (specification). */ /* */ -/* Copyright 1996-1999 by */ +/* Copyright 1996-2000 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ -/* This file is part of the FreeType project, and may only be used */ -/* modified and distributed under the terms of the FreeType project */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ @@ -23,9 +23,10 @@ #include #include -/* + +#if 0 #include -*/ +#endif #ifdef __cplusplus extern "C" { @@ -37,17 +38,17 @@ TT_ULong tag ); LOCAL_DEF - TT_Error TT_Goto_Table( TT_Face face, - TT_ULong tag, - FT_Stream stream, - TT_ULong *length ); + TT_Error TT_Goto_Table( TT_Face face, + TT_ULong tag, + FT_Stream stream, + TT_ULong* length ); LOCAL_DEF - TT_Error TT_Load_SFNT_Header( TT_Face face, - FT_Stream stream, - TT_Long face_index, - SFNT_Header* sfnt ); + TT_Error TT_Load_SFNT_Header( TT_Face face, + FT_Stream stream, + TT_Long face_index, + SFNT_Header* sfnt ); LOCAL_DEF TT_Error TT_Load_Directory( TT_Face face, FT_Stream stream,