freetype-devel
[Top][All Lists]
Advanced

[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;
  }



reply via email to

[Prev in Thread] Current Thread [Next in Thread]