From 91f450c2957ceafd3f5a18e5e1c4eee773a4eb94 Mon Sep 17 00:00:00 2001 From: Tom Kacvinsky Date: Wed, 7 Feb 2001 01:11:54 +0000 Subject: [PATCH] In function cff_parse_font_matrix, added logic to get the units_per_EM from the FontMatrix. Added a new function (cff_parse_fixed_thousand) that gets a real number fromt he CFF font, but multiplies by 1000 (this is to avoid rounding errors when placing this real number into a 16.16 fixed number). In function cff_parse_real, added code so that the integer part is moved into the high sixtenn bits of the 16.16 fixed number. --- src/cff/cffparse.c | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/cff/cffparse.c b/src/cff/cffparse.c index 51f9c12f1..7ba385b1e 100644 --- a/src/cff/cffparse.c +++ b/src/cff/cffparse.c @@ -267,8 +267,12 @@ power_ten++; } + /* Move the integer part into the high 16 bits. */ + result <<= 16; + + /* Place the decimal part into the low 16 bits. */ if ( num ) - result += FT_DivFix( num, divider ); + result |= FT_DivFix( num, divider ); if ( sign ) result = -result; @@ -299,6 +303,14 @@ : cff_parse_integer( d[0], d[1] ) << 16 ); } + /* read a floating point number, either integer or real, */ + /* but return 1000 times the number read in. */ + static + FT_Fixed cff_parse_fixed_thousand( FT_Byte** d ) + { + return ( **d == 30 ? cff_parse_real ( d[0], d[1], 3 ) + : (FT_Fixed)FT_MulFix ( cff_parse_integer( d[0], d[1] ) << 16, 1000 ) ); + } static FT_Error cff_parse_font_matrix( CFF_Parser* parser ) @@ -306,6 +318,7 @@ CFF_Font_Dict* dict = (CFF_Font_Dict*)parser->object; FT_Matrix* matrix = &dict->font_matrix; FT_Vector* offset = &dict->font_offset; + FT_UShort* upm = &dict->units_per_em; FT_Byte** data = parser->stack; FT_Error error; FT_Fixed temp; @@ -315,15 +328,18 @@ if ( parser->top >= parser->stack + 6 ) { - matrix->xx = cff_parse_fixed( data++ ); - matrix->yx = cff_parse_fixed( data++ ); - matrix->xy = cff_parse_fixed( data++ ); - matrix->yy = cff_parse_fixed( data++ ); - offset->x = cff_parse_fixed( data++ ); - offset->y = cff_parse_fixed( data ); + matrix->xx = cff_parse_fixed_thousand( data++ ); + matrix->yx = cff_parse_fixed_thousand( data++ ); + matrix->xy = cff_parse_fixed_thousand( data++ ); + matrix->yy = cff_parse_fixed_thousand( data++ ); + offset->x = cff_parse_fixed_thousand( data++ ); + offset->y = cff_parse_fixed_thousand( data ); temp = ABS( matrix->yy ); + *upm = (FT_UShort)FT_DivFix( 0x10000L, FT_DivFix( temp, 1000 ) ); + fprintf (stderr, "cff_parse_font_matrix: matrix->xx = %08lX, upm = %d\n", matrix->xx, *upm) ; + if ( temp != 0x10000L ) { matrix->xx = FT_DivFix( matrix->xx, temp );