From 6b76663625fce26634e2d6c72e2a0da90f1616ac Mon Sep 17 00:00:00 2001 From: Werner Lemberg Date: Sat, 30 Dec 2000 22:14:58 +0000 Subject: [PATCH] * src/cff/cffload.c (CFF_Load_Charset): Improved error messages. (CFF_Load_Charset, CFF_Load_Encoding): Remove unnecessary variable definition. * src/cff/t2gload.c (t2_lookup_glyph_by_stdcharcode, t2_operator_seac): Added these functions for use in implementing the seac emulation provided by the Type 2 endchar operator. (T2_Parse_CharStrings): Added seac emulation for the endchar operator. CFF_Done_Encoding, CFF_Done_Charset): Extended to load and parse the charset/encoding tables, and free the memory used by them when the CFF driver is finished with them. Added tables --- ChangeLog | 21 ++-- include/freetype/internal/cfftypes.h | 4 +- src/cff/cffload.c | 143 +++++++++++++-------------- src/cff/cffparse.c | 1 + src/cff/t2gload.c | 39 ++++---- 5 files changed, 104 insertions(+), 104 deletions(-) diff --git a/ChangeLog b/ChangeLog index fce13b052..9cbcc3f31 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2000-12-30 Werner Lemberg + + * src/cff/cffload.c (CFF_Load_Charset): Improved error messages. + (CFF_Load_Charset, CFF_Load_Encoding): Remove unnecessary variable + definition. + 2000-12-30 Tom Kacvinsky * include/freetype/internal/t2types.h, @@ -5,15 +11,16 @@ CFF_Encoding and CFF_Encoding for the new implementations of the charset and encoding parsers in the CFF driver. - * src/cff/t2gload.c (t2_lookup_glyph_by_stdcharcode, t2_operator_seac): - Added these functions for use in implementing the seac emulation - provided by the Type 2 endchar operator. - (T2_Parse_CharStrings): Added seac emulation for the endchar operator. + * src/cff/t2gload.c (t2_lookup_glyph_by_stdcharcode, + t2_operator_seac): Added these functions for use in implementing the + seac emulation provided by the Type 2 endchar operator. + (T2_Parse_CharStrings): Added seac emulation for the endchar + operator. * src/cff/cffload.c (CFF_Load_Encoding, CFF_Load_Charset, - CFF_Done_Encoding, CFF_Done_Charset): Extended to load and parse the - charset/encoding tables, and free the memory used by them when the CFF - driver is finished with them. Added tables + CFF_Done_Encoding, CFF_Done_Charset): Extended to load and parse the + charset/encoding tables, and free the memory used by them when the + CFF driver is finished with them. Added tables cff_isoadobe_charset cff_expert_charset diff --git a/include/freetype/internal/cfftypes.h b/include/freetype/internal/cfftypes.h index c2459316f..f1a0fdff5 100644 --- a/include/freetype/internal/cfftypes.h +++ b/include/freetype/internal/cfftypes.h @@ -64,7 +64,7 @@ FT_BEGIN_HEADER /* a compact CFF Charset table */ - typedef struct CFF_Charset_ + typedef struct CFF_Charset_ { FT_UInt format; FT_ULong offset; @@ -75,7 +75,7 @@ FT_BEGIN_HEADER /* a compact CFF Encoding table */ - typedef struct CFF_Encoding_ + typedef struct CFF_Encoding_ { FT_UInt format; FT_ULong offset; diff --git a/src/cff/cffload.c b/src/cff/cffload.c index a6bf98a01..5ce05dae3 100644 --- a/src/cff/cffload.c +++ b/src/cff/cffload.c @@ -27,6 +27,7 @@ #include FT_SOURCE_FILE(cff,cffload.h) #include FT_SOURCE_FILE(cff,cffparse.h) + /*************************************************************************/ /* */ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ @@ -36,7 +37,9 @@ #undef FT_COMPONENT #define FT_COMPONENT trace_t2load - static const FT_UShort cff_isoadobe_charset[229] = + + static + const FT_UShort cff_isoadobe_charset[229] = { 0, 1, @@ -269,7 +272,8 @@ 228 }; - static const FT_UShort cff_expert_charset[166] = + static + const FT_UShort cff_expert_charset[166] = { 0, 1, @@ -439,7 +443,8 @@ 378 }; - static const FT_UShort cff_expertsubset_charset[87] = + static + const FT_UShort cff_expertsubset_charset[87] = { 0, 1, @@ -530,7 +535,8 @@ 346 }; - static const FT_UShort cff_standard_encoding[256] = + static + const FT_UShort cff_standard_encoding[256] = { 0, 0, @@ -790,8 +796,8 @@ 0 }; - - static const FT_UShort cff_expert_encoding[256] = + static + const FT_UShort cff_expert_encoding[256] = { 0, 0, @@ -1492,12 +1498,14 @@ { FT_Memory memory = stream->memory; + FREE( charset->sids ); charset->format = 0; charset->offset = 0; charset->sids = 0; } + static FT_Error CFF_Load_Charset( CFF_Charset* charset, FT_UInt num_glyphs, @@ -1505,9 +1513,10 @@ FT_ULong base_offset, FT_ULong offset ) { - FT_Memory memory = stream->memory; - FT_Error error = 0; - FT_UShort glyph_sid; + FT_Memory memory = stream->memory; + FT_Error error = 0; + FT_UShort glyph_sid; + charset->offset = base_offset + offset; @@ -1522,8 +1531,9 @@ { FT_UInt j; + /* Allocate memory for sids. */ - if ( ALLOC( charset->sids, num_glyphs * sizeof( FT_UShort ) ) ) + if ( ALLOC( charset->sids, num_glyphs * sizeof ( FT_UShort ) ) ) goto Exit; /* assign the .notdef glyph */ @@ -1532,7 +1542,6 @@ switch ( charset->format ) { case 0: - for ( j = 1; j < num_glyphs; j++ ) { if ( READ_UShort( glyph_sid ) ) @@ -1548,6 +1557,7 @@ FT_UInt nleft; FT_UInt i; + j = 1; while ( j < num_glyphs ) @@ -1572,7 +1582,6 @@ /* Fill in the range of sids -- `nleft + 1' glyphs. */ for ( i = 0; i <= nleft; i++, j++, glyph_sid++ ) charset->sids[j] = glyph_sid; - } } break; @@ -1582,85 +1591,80 @@ error = FT_Err_Invalid_File_Format; goto Exit; } - } else { - /* Parse default tables corresponding to offset == 0, 1, or 2. */ /* CFF specification intimates the following: */ /* */ /* In order to use a predefined charset, the following must be */ - /* true: the charset constructed for the glyphs in the font's */ + /* true: The charset constructed for the glyphs in the font's */ /* charstrings dictionary must match the predefined charset in */ /* the first num_glyphs, and hence must match the predefined */ /* charset *exactly*. */ switch ( offset ) { - case 0: - if ( num_glyphs != 229 ) { - FT_ERROR(("CFF_Load_Charset: implicit charset not equal to predefined charset!\n" )); + FT_ERROR(("CFF_Load_Charset: implicit charset not equal to\n" + "predefined charset (Adobe ISO-Latin)!\n" )); error = FT_Err_Invalid_File_Format; goto Exit; } /* Allocate memory for sids. */ - if ( ALLOC( charset->sids, num_glyphs * sizeof( FT_UShort ) ) ) + if ( ALLOC( charset->sids, num_glyphs * sizeof ( FT_UShort ) ) ) goto Exit; - /* Copy the predefined charset into the allocated memory. */ + /* Copy the predefined charset into the allocated memory. */ MEM_Copy( charset->sids, cff_isoadobe_charset, - num_glyphs * sizeof( FT_UShort ) ); + num_glyphs * sizeof ( FT_UShort ) ); break; case 1: - if ( num_glyphs != 166 ) { - FT_ERROR(( "CFF_Load_Charset: implicit charset not equal to predefined charset!\n" )); + FT_ERROR(( "CFF_Load_Charset: implicit charset not equal to\n" + "predefined charset (Adobe Expert)!\n" )); error = FT_Err_Invalid_File_Format; goto Exit; } /* Allocate memory for sids. */ - if ( ALLOC( charset->sids, num_glyphs * sizeof( FT_UShort ) ) ) + if ( ALLOC( charset->sids, num_glyphs * sizeof ( FT_UShort ) ) ) goto Exit; /* Copy the predefined charset into the allocated memory. */ MEM_Copy( charset->sids, cff_expert_charset, - num_glyphs * sizeof( FT_UShort ) ); + num_glyphs * sizeof ( FT_UShort ) ); break; case 2: - if ( num_glyphs != 87 ) { - FT_ERROR(( "CFF_Load_Charset: implicit charset not equal to predefined charset!\n" )); + FT_ERROR(( "CFF_Load_Charset: implicit charset not equal to\n" + "predefined charset (Adobe Expert Subset)!\n" )); error = FT_Err_Invalid_File_Format; goto Exit; } /* Allocate memory for sids. */ - if ( ALLOC( charset->sids, num_glyphs * sizeof( FT_UShort ) ) ) + if ( ALLOC( charset->sids, num_glyphs * sizeof ( FT_UShort ) ) ) goto Exit; /* Copy the predefined charset into the allocated memory. */ MEM_Copy( charset->sids, cff_expertsubset_charset, - num_glyphs * sizeof( FT_UShort ) ); + num_glyphs * sizeof ( FT_UShort ) ); break; default: - error = FT_Err_Invalid_File_Format; goto Exit; - } } @@ -1670,8 +1674,6 @@ if ( error ) if ( charset->sids ) { - FT_Memory memory = stream->memory; - if ( charset->sids ) FREE( charset->sids ); charset->format = 0; @@ -1682,6 +1684,7 @@ return error; } + static FT_Error CFF_Load_Encoding( CFF_Encoding* encoding, CFF_Charset* charset, @@ -1690,14 +1693,15 @@ FT_ULong base_offset, FT_ULong offset ) { - FT_Memory memory = stream->memory; - FT_Error error = 0; + FT_Memory memory = stream->memory; + FT_Error error = 0; FT_UInt count; FT_UInt j; FT_UShort glyph_sid; FT_Byte glyph_code; - /* Check for charset->sids. If we do not have this, we fail. */ + + /* Check for charset->sids. If we do not have this, we fail. */ if ( !charset->sids ) { error = FT_Err_Invalid_File_Format; @@ -1706,18 +1710,18 @@ /* Allocate memory for sids/codes -- there are at most 256 sids/codes */ /* for an encoding. */ - if ( ALLOC( encoding->sids, 256 * sizeof( FT_UShort ) ) || - ALLOC( encoding->codes, 256 * sizeof( FT_UShort ) ) ) + if ( ALLOC( encoding->sids, 256 * sizeof ( FT_UShort ) ) || + ALLOC( encoding->codes, 256 * sizeof ( FT_UShort ) ) ) goto Exit; - /* Zero out the code to gid/sid mappings. */ + /* Zero out the code to gid/sid mappings. */ for ( j = 0; j < 255; j++ ) { encoding->sids [j] = 0; encoding->codes[j] = 0; } - /* Note: the encoding table in a CFF font is indexed by glyph index, */ + /* Note: The encoding table in a CFF font is indexed by glyph index, */ /* where the first encoded glyph index is 1. Hence, we read the char */ /* code (`glyph_code') at index j and make the assignment: */ /* */ @@ -1743,7 +1747,6 @@ switch ( encoding->format & 0x7F ) { case 0: - for ( j = 1; j <= count; j++ ) { if ( READ_Byte( glyph_code ) ) @@ -1757,7 +1760,6 @@ encoding->codes[glyph_code] = j; /* Assign code to SID mapping. */ - encoding->sids[glyph_code] = charset->sids[j]; } @@ -1769,25 +1771,24 @@ FT_Byte i = 1; FT_Byte k; + /* Parse the Format1 ranges. */ for ( j = 0; j < count; j++, i += nleft ) { - - /* Read the first glyph code of the range. */ + /* Read the first glyph code of the range. */ if ( READ_Byte( glyph_code ) ) goto Exit; - /* Read the number of codes in the range. */ + /* Read the number of codes in the range. */ if ( READ_Byte( nleft ) ) goto Exit; /* Increment nleft, so we read `nleft + 1' codes/sids. */ nleft++; - /* Fill in the range of codes/sids. */ + /* Fill in the range of codes/sids. */ for ( k = i; k < nleft + i; k++, glyph_code++ ) { - /* Make sure k is not too big. */ if ( k > num_glyphs ) goto Exit; @@ -1797,15 +1798,13 @@ /* Assign code to SID mapping. */ encoding->sids[glyph_code] = charset->sids[k]; - } } } - break; default: - FT_ERROR(( "CFF.Load_Encoding: invalid table format!\n" )); + FT_ERROR(( "CFF_Load_Encoding: invalid table format!\n" )); error = FT_Err_Invalid_File_Format; goto Exit; } @@ -1815,27 +1814,25 @@ { FT_UInt glyph_id; + /* count supplements */ if ( READ_Byte( count ) ) goto Exit; for ( j = 0; j < count; j++ ) { - - /* Read supplemental glyph code. */ + /* Read supplemental glyph code. */ if ( READ_Byte( glyph_code ) ) goto Exit; - /* Read the SID associated with this glyph code */ + /* Read the SID associated with this glyph code. */ if ( READ_UShort( glyph_sid ) ) goto Exit; - /* Assign code to SID mapping. */ + /* Assign code to SID mapping. */ encoding->sids[glyph_code] = glyph_sid; - /* Assign code to GID mapping. */ - - /* First, lookup GID which has been assigned */ + /* First, lookup GID which has been assigned to */ /* SID glyph_sid. */ for ( glyph_id = 0; glyph_id < num_glyphs; glyph_id++ ) { @@ -1843,17 +1840,16 @@ break; } - /* Now, make the assignment. */ + /* Now, make the assignment. */ encoding->codes[glyph_code] = glyph_id; - } } - } else { FT_UInt i; + /* We take into account the fact a CFF font can use a predefined */ /* encoding without containing all of the glyphs encoded by this */ /* encoding (see the note at the end of section 12 in the CFF */ @@ -1861,12 +1857,10 @@ switch ( offset ) { - case 0: - - /* First, copy the code to SID mapping. */ + /* First, copy the code to SID mapping. */ MEM_Copy( encoding->sids, cff_standard_encoding, - 256 * sizeof( FT_UShort ) ); + 256 * sizeof ( FT_UShort ) ); /* Construct code to GID mapping from code */ /* to SID mapping and charset. */ @@ -1875,7 +1869,6 @@ /* If j is encoded, find the GID for it. */ if ( encoding->sids[j] ) { - for ( i = 1; i < num_glyphs; i++ ) /* We matched, so break. */ if ( charset->sids[i] == encoding->sids[j] ) @@ -1893,14 +1886,12 @@ encoding->codes[j] = i; } } - break; case 1: - /* First, copy the code to SID mapping. */ MEM_Copy( encoding->sids, cff_expert_encoding, - 256 * sizeof( FT_UShort ) ); + 256 * sizeof ( FT_UShort ) ); /* Construct code to GID mapping from code to SID mapping */ /* and charset. */ @@ -1909,7 +1900,6 @@ /* If j is encoded, find the GID for it. */ if ( encoding->sids[j] ) { - for ( i = 1; i < num_glyphs; i++ ) /* We matched, so break. */ if ( charset->sids[i] == encoding->sids[j] ) @@ -1927,15 +1917,13 @@ encoding->codes[j] = i; } } - break; default: - FT_ERROR(( "CFF.Load_Encoding: invalid table format!\n" )); + FT_ERROR(( "CFF_Load_Encoding: invalid table format!\n" )); error = FT_Err_Invalid_File_Format; goto Exit; break; - } } @@ -1946,8 +1934,6 @@ { if ( encoding->sids || encoding->codes ) { - FT_Memory memory = stream->memory; - if ( encoding->sids ) FREE( encoding->sids ); @@ -1961,7 +1947,6 @@ } return error; - } @@ -2231,8 +2216,12 @@ if ( error ) goto Exit; - error = CFF_Load_Encoding( &font->encoding, &font->charset, font->num_glyphs, - stream, base_offset, dict->encoding_offset ); + error = CFF_Load_Encoding( &font->encoding, + &font->charset, + font->num_glyphs, + stream, + base_offset, + dict->encoding_offset ); if ( error ) goto Exit; diff --git a/src/cff/cffparse.c b/src/cff/cffparse.c index ff4ab71f1..81dab424f 100644 --- a/src/cff/cffparse.c +++ b/src/cff/cffparse.c @@ -310,6 +310,7 @@ FT_Error error; FT_Fixed temp; + error = T2_Err_Stack_Underflow; if ( parser->top >= parser->stack + 6 ) diff --git a/src/cff/t2gload.c b/src/cff/t2gload.c index 9dd83e380..bd43080c8 100644 --- a/src/cff/t2gload.c +++ b/src/cff/t2gload.c @@ -513,6 +513,7 @@ outline->contours[outline->n_contours - 1] = outline->n_points - 1; } + static FT_Int t2_lookup_glyph_by_stdcharcode( CFF_Font* cff, FT_Int charcode ) @@ -520,6 +521,7 @@ FT_UInt n; FT_UShort glyph_sid; + /* check range of standard char code */ if ( charcode < 0 || charcode > 255 ) return -1; @@ -530,7 +532,6 @@ for ( n = 0; n < cff->num_glyphs; n++ ) { - if ( cff->charset.sids[n] == glyph_sid ) return n; } @@ -538,6 +539,7 @@ return -1; } + static FT_Error t2_operator_seac( T2_Decoder* decoder, FT_Pos adx, @@ -554,6 +556,7 @@ FT_Byte* charstring; FT_ULong charstring_len; + bchar_index = t2_lookup_glyph_by_stdcharcode( cff, bchar ); achar_index = t2_lookup_glyph_by_stdcharcode( cff, achar ); @@ -564,7 +567,7 @@ return T2_Err_Syntax_Error; } - /* if we are trying to load a composite glyph, do not load the */ + /* If we are trying to load a composite glyph, do not load the */ /* accent character and return the array of subglyphs. */ if ( decoder->builder.no_recurse ) { @@ -607,7 +610,6 @@ &charstring, &charstring_len ); if ( !error ) { - error = T2_Parse_CharStrings( decoder, charstring, charstring_len ); if ( error ) @@ -618,7 +620,7 @@ n_base_points = base->n_points; - /* save the left bearing and width of the base character */ + /* Save the left bearing and width of the base character */ /* as they will be erased by the next load. */ left_bearing = decoder->builder.left_bearing; @@ -627,12 +629,11 @@ decoder->builder.left_bearing.x = 0; decoder->builder.left_bearing.y = 0; - /* Now load `achar' on top of the base outline */ + /* Now load `achar' on top of the base outline. */ error = CFF_Access_Element( &cff->charstrings_index, achar_index, &charstring, &charstring_len ); if ( !error ) { - error = T2_Parse_CharStrings( decoder, charstring, charstring_len ); if ( error ) @@ -641,15 +642,17 @@ CFF_Forget_Element( &cff->charstrings_index, &charstring ); } - /* restore the left side bearing and advance width of the base character */ + /* Restore the left side bearing and advance width */ + /* of the base character. */ decoder->builder.left_bearing = left_bearing; decoder->builder.advance = advance; - /* Finally, move the accent */ + /* Finally, move the accent. */ if ( decoder->builder.load_points ) { FT_Outline dummy; + dummy.n_points = base->n_points - n_base_points; dummy.points = base->points + n_base_points; @@ -1008,8 +1011,8 @@ break; case t2_op_endchar: - /* If there is a width specified for endchar, we either have 1 */ - /* argument or 5 arguments. We like to argue. */ + /* If there is a width specified for endchar, we either have */ + /* 1 argument or 5 arguments. We like to argue. */ set_width_ok = ( ( num_args == 5 ) || ( num_args == 1 ) ); break; @@ -1579,12 +1582,11 @@ FT_TRACE4(( " endchar" )); /* We are going to emulate the seac operator. */ - if ( num_args == 4) + if ( num_args == 4 ) { - error = t2_operator_seac( decoder, args[0] >> 16, args[1] >> 16, args[2] >> 16, args[3] >> 16 ); - args += 4; + args += 4; } if ( !error ) @@ -2099,6 +2101,7 @@ FT_Matrix font_matrix; FT_Vector font_offset; + if ( load_flags & FT_LOAD_NO_RECURSE ) load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING; @@ -2151,13 +2154,13 @@ /* bearing the yMax. */ if ( !error ) { - - /* for composite glyphs, return only left side bearing and */ - /* advance width */ + /* For composite glyphs, return only left side bearing and */ + /* advance width. */ if ( load_flags & FT_LOAD_NO_RECURSE ) { FT_Slot_Internal internal = glyph->root.internal; + glyph->root.metrics.horiBearingX = decoder.builder.left_bearing.x; glyph->root.metrics.horiAdvance = decoder.glyph_width; internal->glyph_matrix = font_matrix; @@ -2171,8 +2174,8 @@ /* copy the _unscaled_ advance width */ - metrics->horiAdvance = decoder.glyph_width; - glyph->root.linearHoriAdvance = decoder.glyph_width; + metrics->horiAdvance = decoder.glyph_width; + glyph->root.linearHoriAdvance = decoder.glyph_width; glyph->root.internal->glyph_transformed = 0; /* make up vertical metrics */