From d60dbcd2a881508b35e8f1dc35d2709c5639eae1 Mon Sep 17 00:00:00 2001 From: Tom Kacvinsky Date: Wed, 24 Jan 2001 22:41:20 +0000 Subject: [PATCH] In function parse_font_matrix, added heuristic to get units_per_EM from the font matrix. In parse_dict, deleted test to see if the FontInfo keyword has been seen. Deletion of this test allows fonts without FontInfo dictionaries to be parsed by the Type 1 driver. In T1_Open_Face, deleted empty subroutines array test to make sure fonts with no subroutines still are parsed. --- src/type1/t1load.c | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/src/type1/t1load.c b/src/type1/t1load.c index f7133d438..53d2a4a6f 100644 --- a/src/type1/t1load.c +++ b/src/type1/t1load.c @@ -878,7 +878,9 @@ T1_ParserRec* parser = &loader->parser; FT_Matrix* matrix = &face->type1.font_matrix; FT_Vector* offset = &face->type1.font_offset; + FT_Face root = (FT_Face)&face->root; FT_Fixed temp[6]; + FT_Fixed temp_scale; if ( matrix->xx || matrix->yx ) @@ -887,14 +889,21 @@ (void)T1_ToFixedArray( parser, 6, temp, 3 ); - /* we need to scale the values by 1.0/temp[3] */ - if ( temp[3] != 0x10000L ) + temp_scale = ABS( temp[3] ); + + /* Set Units per EM based on FontMatrix values. We set the value to */ + /* 1000 / temp_scale, because temp_scale was already multiplied by */ + /* 1000 (in t1_tofixed, from psobjs.c). */ + root->units_per_EM = FT_DivFix( 0x10000L, FT_DivFix( temp_scale, 1000 ) ); + + /* we need to scale the values by 1.0/temp_scale */ + if ( temp_scale != 0x10000L ) { - temp[0] = FT_DivFix( temp[0], temp[3] ); - temp[1] = FT_DivFix( temp[1], temp[3] ); - temp[2] = FT_DivFix( temp[2], temp[3] ); - temp[4] = FT_DivFix( temp[4], temp[3] ); - temp[5] = FT_DivFix( temp[5], temp[3] ); + temp[0] = FT_DivFix( temp[0], temp_scale ); + temp[1] = FT_DivFix( temp[1], temp_scale ); + temp[2] = FT_DivFix( temp[2], temp_scale ); + temp[4] = FT_DivFix( temp[4], temp_scale ); + temp[5] = FT_DivFix( temp[5], temp_scale ); temp[3] = 0x10000L; } @@ -1461,12 +1470,6 @@ len = cur2 - cur; if ( len > 0 && len < 22 ) { - if ( !loader->fontdata ) - { - if ( strncmp( (char*)cur, "FontInfo", 8 ) == 0 ) - loader->fontdata = 1; - } - else { /* now, compare the immediate name to the keyword table */ T1_Field* keyword = (T1_Field*)t1_keywords; @@ -1594,10 +1597,13 @@ /* to the Type1 data */ type1->num_glyphs = loader.num_glyphs; - if ( !loader.subrs.init ) + if ( loader.subrs.init ) { - FT_ERROR(( "T1_Open_Face: no subrs array in face!\n" )); - error = T1_Err_Invalid_File_Format; + loader.subrs.init = 0; + type1->num_subrs = loader.num_subrs; + type1->subrs_block = loader.subrs.block; + type1->subrs = loader.subrs.elements; + type1->subrs_len = loader.subrs.lengths; } if ( !loader.charstrings.init ) @@ -1606,12 +1612,6 @@ error = T1_Err_Invalid_File_Format; } - loader.subrs.init = 0; - type1->num_subrs = loader.num_subrs; - type1->subrs_block = loader.subrs.block; - type1->subrs = loader.subrs.elements; - type1->subrs_len = loader.subrs.lengths; - loader.charstrings.init = 0; type1->charstrings_block = loader.charstrings.block; type1->charstrings = loader.charstrings.elements;