[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Devel] losing less when calculating root->units_per_EM
From: |
Martin Muskens |
Subject: |
[Devel] losing less when calculating root->units_per_EM |
Date: |
Tue, 28 Aug 2001 15:54:23 +0200 |
Hi all,
in the file t1load.c the calculation of root->units_per_EM is not precise
enough.
I think this is a better solution:
bye
Martin Muskens
Aurelon
#ifdef AURELON
#define Int2Fixed( x ) ( (FT_Fixed)( x ) << 16 )
#endif
static void
parse_font_matrix( T1_Face face,
T1_Loader* loader )
{
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 )
/* with synthetic fonts, it's possible we get here twice */
return;
(void)T1_ToFixedArray( parser, 6, temp, 3 );
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). */
#ifdef AURELON
root->units_per_EM = (FT_UShort)( FT_DivFix( Int2Fixed( 1000 ),
temp_scale ) >> 16 );
#else
root->units_per_EM = (FT_UShort)FT_DivFix( 0x10000L,
FT_DivFix( temp_scale, 1000 )
);
#endif
/* we need to scale the values by 1.0/temp_scale */
if ( temp_scale != 0x10000L )
{
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;
}
matrix->xx = temp[0];
matrix->yx = temp[1];
matrix->xy = temp[2];
matrix->yy = temp[3];
/* note that the offsets must be expressed in integer font units */
offset->x = temp[4] >> 16;
offset->y = temp[5] >> 16;
}
- [Devel] losing less when calculating root->units_per_EM,
Martin Muskens <=