Index: t1load.c =================================================================== RCS file: /cvs/freetype/freetype2/src/type1/t1load.c,v retrieving revision 1.39 diff -u -r1.39 t1load.c --- t1load.c 2001/04/02 23:54:01 1.39 +++ t1load.c 2001/04/08 13:57:17 @@ -1044,7 +1044,7 @@ len = (FT_Int)( cur2 - cur - 1 ); parser->root.error = T1_Add_Table( char_table, charcode, - cur + 1, len + 1 ); + cur + 1, len + 1 ); char_table->elements[charcode][len] = '\0'; if ( parser->root.error ) return; @@ -1173,6 +1173,7 @@ PS_Table* code_table = &loader->charstrings; PS_Table* name_table = &loader->glyph_names; FT_Memory memory = parser->root.memory; + PS_Table* temp_table; FT_Error error; PSAux_Interface* psaux = (PSAux_Interface*)face->psaux; @@ -1192,7 +1193,8 @@ if ( parser->root.error ) return; - /* initialize tables, adding space for `swap' at table end */ + /* initialize tables (leaving room for addition of .notdef, */ + /* if necessary). */ error = psaux->ps_table_funcs->init( code_table, loader->num_glyphs + 1, memory ); @@ -1205,6 +1207,15 @@ if ( error ) goto Fail; + /* Initialize table for swapping index notdef_index and */ + /* index 0 names and codes (if necessary). */ + temp_table->init = 0; + error = psaux->ps_table_funcs->init( temp_table, 4, memory ); + + if ( error ) + goto Fail; + + n = 0; for (;;) { @@ -1292,43 +1303,55 @@ 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. */ + /* Swap glyph in index 0 with /.notdef glyph. First, add index 0 */ + /* name/code to temp_table. Then place notdef_index name/code into */ + /* temp_table. Then swap name/code entries in index index 0 and */ + /* notdef_index using values stored in temp_table. */ - error = T1_Add_Table( name_table, n, + error = T1_Add_Table( temp_table, 0, name_table->elements[0], name_table->lengths [0] ); if ( error ) goto Fail; - error = T1_Add_Table( code_table, n, + error = T1_Add_Table( temp_table, 1, code_table->elements[0], code_table->lengths [0] ); if ( error ) goto Fail; - error = T1_Add_Table( name_table, 0, + error = T1_Add_Table( temp_table, 2, name_table->elements[notdef_index], name_table->lengths [notdef_index] ); if ( error ) goto Fail; - error = T1_Add_Table( code_table, 0, + error = T1_Add_Table( temp_table, 3, code_table->elements[notdef_index], code_table->lengths [notdef_index] ); if ( error ) goto Fail; error = T1_Add_Table( name_table, notdef_index, - name_table->elements[n], - name_table->lengths [n] ); + temp_table->elements[0], + temp_table->lengths [0] ); if ( error ) goto Fail; error = T1_Add_Table( code_table, notdef_index, - code_table->elements[n], - code_table->lengths [n] ); + temp_table->elements[1], + temp_table->lengths [1] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( name_table, 0, + temp_table->elements[2], + temp_table->lengths [2] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( code_table, 0, + temp_table->elements[3], + temp_table->lengths [3] ); if ( error ) goto Fail; @@ -1338,7 +1361,7 @@ /* 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) */ + /* 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 */ @@ -1346,13 +1369,13 @@ char* notdef_name = (char *)".notdef"; - error = T1_Add_Table( name_table, n, + error = T1_Add_Table( temp_table, 0, name_table->elements[0], name_table->lengths [0] ); if ( error ) goto Fail; - error = T1_Add_Table( code_table, n, + error = T1_Add_Table( temp_table, 1, code_table->elements[0], code_table->lengths [0] ); if ( error ) @@ -1367,10 +1390,25 @@ if ( error ) goto Fail; + error = T1_Add_Table( name_table, n, + temp_table->elements[0], + temp_table->lengths [0] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( code_table, n, + temp_table->elements[1], + temp_table->lengths [1] ); + if ( error ) + goto Fail; + /* we added a glyph. */ loader->num_glyphs = n + 1; } + + /* Clean up temporary table. */ + T1_Release_Table( temp_table ); return;