From 1ef648350efa495969d408d01b77f72cad2d8808 Mon Sep 17 00:00:00 2001 From: David Turner Date: Fri, 14 Mar 2003 07:31:35 +0000 Subject: [PATCH] trying to fix TrueType rendering glitches --- ChangeLog | 5 +++++ src/truetype/ttdriver.c | 25 ++++++++++++++++--------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index 409e3bda5..73319f549 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2003-03-14 David Turner + + * src/truetype/ttdriver.c: fixing the small TrueType native rendering + glitches, they came from a small rounding error. + 2003-03-13 David Turner * src/base/ftdbgmem.c, docs/DEBUG.TXT: added new environment variables diff --git a/src/truetype/ttdriver.c b/src/truetype/ttdriver.c index cc58b0606..174cd8543 100644 --- a/src/truetype/ttdriver.c +++ b/src/truetype/ttdriver.c @@ -193,6 +193,7 @@ FT_Size_Metrics* metrics = &size->root.metrics; FT_Size_Metrics* metrics2 = &size->metrics; TT_Face face = (TT_Face)size->root.face; + FT_Long dim_x, dim_y; *metrics2 = *metrics; @@ -203,19 +204,25 @@ /* */ if ( ( face->header.Flags & 8 ) != 0 ) { - FT_Long dim_x, dim_y; - /* we need to use rounding in the following computations. Otherwise, * the resulting hinted outlines will be very slightly distorted */ - dim_x = ( char_width * horz_resolution + 36 ) / 72; - dim_y = ( char_height * vert_resolution + 36 ) / 72; - - metrics2->x_ppem = (FT_UShort)( dim_x >> 6 ); - metrics2->y_ppem = (FT_UShort)( dim_y >> 6 ); - metrics2->x_scale = FT_DivFix( dim_x, face->root.units_per_EM ); - metrics2->y_scale = FT_DivFix( dim_y, face->root.units_per_EM ); + dim_x = ( ( ( char_width * horz_resolution ) / 72 ) + 32 ) & -64; + dim_y = ( ( ( char_height * vert_resolution ) / 72 ) + 32 ) & -64; } + else + { + dim_x = ( ( char_width * horz_resolution + 36 ) / 72 ); + dim_y = ( ( char_height * vert_resolution + 36 ) / 72 ); + } + + /* we only modify "metrics2", not "metrics", so these changes have */ + /* no effect on the result of the auto-hinter when it is used */ + /* */ + metrics2->x_ppem = (FT_UShort)( dim_x >> 6 ); + metrics2->y_ppem = (FT_UShort)( dim_y >> 6 ); + metrics2->x_scale = FT_DivFix( dim_x, face->root.units_per_EM ); + metrics2->y_scale = FT_DivFix( dim_y, face->root.units_per_EM ); size->ttmetrics.valid = FALSE; #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS