From 7946aa6f7b473fb4deb99c86b6e77d0a44ce5947 Mon Sep 17 00:00:00 2001 From: David Turner Date: Tue, 18 Feb 2003 22:25:22 +0000 Subject: [PATCH] * src/truetype/ttdriver.c, src/truetype/ttobjs.h, src/truetype/ttobjs.c, src/truetype/ttinterp.c, src/base/ftobjs.c: fixing the slight distortion problem that occured due to the latest auto-hinter changes --- ChangeLog | 22 ++++++++++++++------- src/base/ftobjs.c | 4 ++-- src/truetype/ttdriver.c | 42 ++++++++++++++++------------------------- src/truetype/ttinterp.c | 2 +- src/truetype/ttobjs.c | 18 ++++-------------- src/truetype/ttobjs.h | 1 + 6 files changed, 39 insertions(+), 50 deletions(-) diff --git a/ChangeLog b/ChangeLog index 39cb00d65..6b8f14928 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,12 +1,20 @@ +2003-02-18 David Turner + + * src/truetype/ttdriver.c, src/truetype/ttobjs.h, src/truetype/ttobjs.c, + src/truetype/ttinterp.c, src/base/ftobjs.c: fixing the slight distortion + problem that occured due to the latest auto-hinter changes + + + 2003-02-13 Graham Asher - * include/freetype/ftincrem.h, src/cff/cffgload.c, src/cid/cidgload.c, - src/truetype/ttgload.c, src/type1/t1gload.c - [FT_CONFIG_OPTION_INCREMENTAL]: I have changed the incremental loading - interface in a way that makes it simpler and allows glyph metrics to - be changed (e.g., by adding a constant, as required by CFF fonts) - rather than just overridden. This was required to make the GhsotScript- - to-FreeType bridge work. + * include/freetype/ftincrem.h, src/cff/cffgload.c, src/cid/cidgload.c, + src/truetype/ttgload.c, src/type1/t1gload.c + [FT_CONFIG_OPTION_INCREMENTAL]: I have changed the incremental loading + interface in a way that makes it simpler and allows glyph metrics to + be changed (e.g., by adding a constant, as required by CFF fonts) + rather than just overridden. This was required to make the GhsotScript- + to-FreeType bridge work. 2003-01-31 David Turner diff --git a/src/base/ftobjs.c b/src/base/ftobjs.c index 2852d4682..3254738c7 100644 --- a/src/base/ftobjs.c +++ b/src/base/ftobjs.c @@ -1330,10 +1330,10 @@ /* Compute root ascender, descender, test height, and max_advance */ metrics->ascender = ( FT_MulFix( face->ascender, - metrics->y_scale ) + 32 ) & -64; + metrics->y_scale ) + 63 ) & -64; metrics->descender = ( FT_MulFix( face->descender, - metrics->y_scale ) + 32 ) & -64; + metrics->y_scale ) + 0 ) & -64; metrics->height = ( FT_MulFix( face->height, metrics->y_scale ) + 32 ) & -64; diff --git a/src/truetype/ttdriver.c b/src/truetype/ttdriver.c index 1f5448833..c4d1de484 100644 --- a/src/truetype/ttdriver.c +++ b/src/truetype/ttdriver.c @@ -190,43 +190,32 @@ FT_UInt horz_resolution, FT_UInt vert_resolution ) { - FT_Size_Metrics* metrics = &size->root.metrics; - TT_Face face = (TT_Face)size->root.face; + FT_Size_Metrics* metrics = &size->root.metrics; + FT_Size_Metrics* metrics2 = &size->metrics; + TT_Face face = (TT_Face)size->root.face; + *metrics2 = *metrics; + /* This bit flag, when set, indicates that the pixel size must be */ /* truncated to an integer. Nearly all TrueType fonts have this */ /* bit set, as hinting won't work really well otherwise. */ /* */ - /* However, for those rare fonts who do not set it, we override */ - /* the default computations performed by the base layer. I */ - /* really don't know whether this is useful, but hey, that's the */ - /* spec :-) */ - /* */ -#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER - if ( ( face->header.Flags & 8 ) == 0 ) + if ( ( face->header.Flags & 8 ) != 0 ) { - /* Compute pixel sizes in 26.6 units */ FT_Long dim_x, dim_y; - dim_x = ( char_width * horz_resolution + 36 ) / 72; - dim_y = ( char_height * vert_resolution + 36 ) / 72; + /* 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 ) / 72 ) + 32 ) & -64; + dim_y = ( ( ( char_height * vert_resolution ) / 72 ) + 32 ) & -64; - metrics->x_scale = FT_DivFix( dim_x, face->root.units_per_EM ); - metrics->y_scale = FT_DivFix( dim_y, face->root.units_per_EM ); - - metrics->x_ppem = (FT_UShort)( dim_x >> 6 ); - metrics->y_ppem = (FT_UShort)( dim_y >> 6 ); + 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 ); } -#else - FT_UNUSED( vert_resolution ); - FT_UNUSED( horz_resolution ); - FT_UNUSED( char_height ); - FT_UNUSED( char_width ); - - FT_UNUSED( face ); - FT_UNUSED( metrics ); -#endif size->ttmetrics.valid = FALSE; #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS @@ -267,6 +256,7 @@ /* many things have been pre-computed by the base layer */ + size->metrics = size->root.metrics; size->ttmetrics.valid = FALSE; #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS size->strike_index = 0xFFFF; diff --git a/src/truetype/ttinterp.c b/src/truetype/ttinterp.c index cee0f78a2..74726a136 100644 --- a/src/truetype/ttinterp.c +++ b/src/truetype/ttinterp.c @@ -568,7 +568,7 @@ exec->FDefs = size->function_defs; exec->IDefs = size->instruction_defs; exec->tt_metrics = size->ttmetrics; - exec->metrics = size->root.metrics; + exec->metrics = size->metrics; exec->maxFunc = size->max_func; exec->maxIns = size->max_ins; diff --git a/src/truetype/ttobjs.c b/src/truetype/ttobjs.c index 41afa35cf..683564804 100644 --- a/src/truetype/ttobjs.c +++ b/src/truetype/ttobjs.c @@ -541,7 +541,7 @@ face = (TT_Face)size->root.face; - metrics = &size->root.metrics; + metrics = &size->metrics; if ( metrics->x_ppem < 1 || metrics->y_ppem < 1 ) return TT_Err_Invalid_PPem; @@ -566,21 +566,11 @@ size->ttmetrics.y_ratio = 0x10000L; } -#ifdef FT_CONFIG_CHESTER_ASCENDER - - /* Compute root ascender, descender, test height, and max_advance */ - metrics->ascender = ( FT_MulFix( face->root.ascender, - metrics->y_scale ) + 63 ) & -64; - metrics->descender = ( FT_MulFix( face->root.descender, - metrics->y_scale ) + 0 ) & -64; -#else /* !CHESTER_ASCENDER */ /* Compute root ascender, descender, test height, and max_advance */ metrics->ascender = ( FT_MulFix( face->root.ascender, metrics->y_scale ) + 32 ) & -64; metrics->descender = ( FT_MulFix( face->root.descender, metrics->y_scale ) + 32 ) & -64; -#endif /* !CHESTER_ASCENDER */ - metrics->height = ( FT_MulFix( face->root.height, metrics->y_scale ) + 32 ) & -64; metrics->max_advance = ( FT_MulFix( face->root.max_advance_width, @@ -701,7 +691,7 @@ SFNT_Service sfnt; - metrics = &size->root.metrics; + metrics = &size->metrics; if ( size->strike_index != 0xFFFFU ) return TT_Err_Ok; @@ -739,8 +729,8 @@ sbit_metrics->descender; /* XXX: Is this correct? */ - sbit_metrics->max_advance = ( strike->hori.min_origin_SB + - strike->hori.max_width + + sbit_metrics->max_advance = ( strike->hori.min_origin_SB + + strike->hori.max_width + strike->hori.min_advance_SB ) << 6; size->strike_index = strike_index; diff --git a/src/truetype/ttobjs.h b/src/truetype/ttobjs.h index 28bcdc425..e462d6404 100644 --- a/src/truetype/ttobjs.h +++ b/src/truetype/ttobjs.h @@ -311,6 +311,7 @@ FT_BEGIN_HEADER { FT_SizeRec root; + FT_Size_Metrics metrics; /* slightly different from the root metrics */ TT_Size_Metrics ttmetrics; #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS