In function parse_encoding, initialize encoding_table.elements to have
.notdef in each entry. In function parse_charstrings, place the .notdef glyph in index 0, and add a .notdef glyph if it is missing. In function Z1_Open_Face, only change min/max encoded char if it is not .notdef.
This commit is contained in:
parent
d2e9536258
commit
968b31154f
@ -969,6 +969,13 @@
|
||||
return;
|
||||
}
|
||||
|
||||
/* We need to `zero' out encoding_table.elements */
|
||||
for ( n = 0 ; n < count ; n++ )
|
||||
{
|
||||
char *notdef = ".notdef";
|
||||
Z1_Add_Table( char_table, n, notdef, 8 );
|
||||
}
|
||||
|
||||
/* Now, we will need to read a record of the form */
|
||||
/* ... charcode /charname ... for each entry in our table */
|
||||
/* */
|
||||
@ -1170,7 +1177,8 @@
|
||||
FT_Byte* cur;
|
||||
FT_Byte* limit = parser->root.limit;
|
||||
FT_Int n;
|
||||
|
||||
FT_UInt notdef_index = 0;
|
||||
FT_Byte notdef_found = 0;
|
||||
|
||||
if ( loader->num_glyphs )
|
||||
/* with synthetic fonts, it's possible we get here twice */
|
||||
@ -1180,15 +1188,15 @@
|
||||
if ( parser->root.error )
|
||||
return;
|
||||
|
||||
/* initialize tables */
|
||||
/* initialize tables, adding space for `swap' at table end */
|
||||
error = psaux->ps_table_funcs->init( code_table,
|
||||
loader->num_glyphs,
|
||||
loader->num_glyphs + 1,
|
||||
memory );
|
||||
if ( error )
|
||||
goto Fail;
|
||||
|
||||
error = psaux->ps_table_funcs->init( name_table,
|
||||
loader->num_glyphs,
|
||||
loader->num_glyphs + 1,
|
||||
memory );
|
||||
if ( error )
|
||||
goto Fail;
|
||||
@ -1199,7 +1207,6 @@
|
||||
FT_Int size;
|
||||
FT_Byte* base;
|
||||
|
||||
|
||||
/* the format is simple: */
|
||||
/* `/glyphname' + binary data */
|
||||
/* */
|
||||
@ -1243,6 +1250,14 @@
|
||||
/* add a trailing zero to the name table */
|
||||
name_table->elements[n][len] = '\0';
|
||||
|
||||
/* record index of /.notdef */
|
||||
if ( strcmp( (const char*)".notdef",
|
||||
(const char*)(name_table->elements[n]) ) == 0 )
|
||||
{
|
||||
notdef_index = n;
|
||||
notdef_found = 1;
|
||||
}
|
||||
|
||||
parser->root.cursor = cur2;
|
||||
if ( !read_binary_data( parser, &size, &base ) )
|
||||
return;
|
||||
@ -1263,7 +1278,94 @@
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
loader->num_glyphs = n;
|
||||
|
||||
/* if /.notdef is found but does not occupy index 0, do our magic. */
|
||||
if ( strcmp( (const char*)".notdef",
|
||||
(const char*)name_table->elements[0] ) &&
|
||||
notdef_found )
|
||||
{
|
||||
|
||||
/* Swap glyph in index 0 with /.notdef glyph. First, add index 0 */
|
||||
/* name/code to end of table. Then place notdef_index name/code into */
|
||||
/* index 0. Then take end of table name/code and place it into index */
|
||||
/* notdef_index. */
|
||||
|
||||
error = Z1_Add_Table( name_table, n,
|
||||
name_table->elements[0],
|
||||
name_table->lengths [0] );
|
||||
if ( error )
|
||||
goto Fail;
|
||||
error = Z1_Add_Table( code_table, n,
|
||||
code_table->elements[0],
|
||||
code_table->lengths [0] );
|
||||
if ( error )
|
||||
goto Fail;
|
||||
|
||||
error = Z1_Add_Table( name_table, 0,
|
||||
name_table->elements[notdef_index],
|
||||
name_table->lengths [notdef_index] );
|
||||
if ( error )
|
||||
goto Fail;
|
||||
|
||||
error = Z1_Add_Table( code_table, 0,
|
||||
code_table->elements[notdef_index],
|
||||
code_table->lengths [notdef_index] );
|
||||
if ( error )
|
||||
goto Fail;
|
||||
|
||||
error = Z1_Add_Table( name_table, notdef_index,
|
||||
name_table->elements[n],
|
||||
name_table->lengths [n] );
|
||||
if ( error )
|
||||
goto Fail;
|
||||
|
||||
error = Z1_Add_Table( code_table, notdef_index,
|
||||
code_table->elements[n],
|
||||
code_table->lengths [n] );
|
||||
if ( error )
|
||||
goto Fail;
|
||||
|
||||
}
|
||||
else if ( !notdef_found )
|
||||
{
|
||||
|
||||
/* notdef_index is already 0, or /.notdef is undefined in */
|
||||
/* charstrings dictionary. Worry about /.notdef undefined. */
|
||||
/* we take index 0 and add it to the end of the table(s) */
|
||||
/* and add our own /.notdef glyph to index 0. */
|
||||
|
||||
/* 0 333 hsbw endchar */
|
||||
FT_Byte notdef_glyph[] = {0x8B,0xF7,0xE1,0x0D,0x0E};
|
||||
char *notdef_name = ".notdef";
|
||||
|
||||
error = Z1_Add_Table( name_table, n,
|
||||
name_table->elements[0],
|
||||
name_table->lengths [0] );
|
||||
if ( error )
|
||||
goto Fail;
|
||||
|
||||
error = Z1_Add_Table( code_table, n,
|
||||
code_table->elements[0],
|
||||
code_table->lengths [0] );
|
||||
if ( error )
|
||||
goto Fail;
|
||||
|
||||
error = Z1_Add_Table( name_table, 0, notdef_name, 8 );
|
||||
if ( error )
|
||||
goto Fail;
|
||||
|
||||
error = Z1_Add_Table( code_table, 0, notdef_glyph, 5 );
|
||||
|
||||
if ( error )
|
||||
goto Fail;
|
||||
|
||||
/* we added a glyph. */
|
||||
loader->num_glyphs = n + 1;
|
||||
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
Fail:
|
||||
@ -1569,8 +1671,14 @@
|
||||
type1->encoding.char_index[charcode] = index;
|
||||
type1->encoding.char_name [charcode] = (char*)glyph_name;
|
||||
|
||||
if (charcode < min_char) min_char = charcode;
|
||||
if (charcode > max_char) max_char = charcode;
|
||||
/* Change min/max encoded char only if glyph name is */
|
||||
/* not /.notdef */
|
||||
if ( strcmp( (const char*)".notdef",
|
||||
(const char*)glyph_name ) != 0 )
|
||||
{
|
||||
if (charcode < min_char) min_char = charcode;
|
||||
if (charcode > max_char) max_char = charcode;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user