From 7c0d20814a252c4c3fb000dca918428a99bc72b1 Mon Sep 17 00:00:00 2001 From: David Turner Date: Fri, 21 Dec 2001 15:59:43 +0000 Subject: [PATCH] * src/cff/cffgload.c, src/psaux/t1decode.c, src/pshinter/pshrec.c, src/pshinter/ahalgo2.c, src/pshinter/pshglob.h: fixed a bug where the X and Y axis where inversed in the postscript hinter. this caused problem when displaying on non-square surfaces.. --- ChangeLog | 5 +++ src/cff/cffgload.c | 4 +-- src/psaux/t1decode.c | 8 ++--- src/pshinter/pshalgo2.c | 70 ++++++++++++++++++++--------------------- src/pshinter/pshglob.h | 4 ++- src/pshinter/pshrec.h | 4 ++- 6 files changed, 52 insertions(+), 43 deletions(-) diff --git a/ChangeLog b/ChangeLog index 699a5538f..2aca5fb29 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2001-12-21 David Turner + * src/cff/cffgload.c, src/psaux/t1decode.c, src/pshinter/pshrec.c, + src/pshinter/ahalgo2.c, src/pshinter/pshglob.h: fixed a bug where + the X and Y axis where inversed in the postscript hinter. this + caused problem when displaying on non-square surfaces.. + * include/freetype/cache/ftcmanag.h, include/freetype/cache/ftcimage.h, include/freetype/cache/ftcsbits.h: updating documentation to better explain the use of the "anode" output parameter in lookup functions diff --git a/src/cff/cffgload.c b/src/cff/cffgload.c index 2004b8a05..9a1d45fc3 100644 --- a/src/cff/cffgload.c +++ b/src/cff/cffgload.c @@ -1080,7 +1080,7 @@ if ( hinter ) hinter->stems( hinter->hints, - ( op == cff_op_vstem || op == cff_op_vstemhm ), + ( op == cff_op_hstem || op == cff_op_hstemhm ), num_args / 2, args ); @@ -1097,7 +1097,7 @@ { if ( hinter ) hinter->stems( hinter->hints, - 1, + 0, num_args / 2, args ); diff --git a/src/psaux/t1decode.c b/src/psaux/t1decode.c index 36c60549c..7280781ce 100644 --- a/src/psaux/t1decode.c +++ b/src/psaux/t1decode.c @@ -1014,7 +1014,7 @@ if ( hinter ) { /* top[0] += builder->left_bearing.y; */ - hinter->stem( hinter->hints, 0, top ); + hinter->stem( hinter->hints, 1, top ); } break; @@ -1024,7 +1024,7 @@ /* record horizontal counter-controlled hints */ if ( hinter ) - hinter->stem3( hinter->hints, 0, top ); + hinter->stem3( hinter->hints, 1, top ); break; @@ -1035,7 +1035,7 @@ if ( hinter ) { top[0] += orig_x; - hinter->stem( hinter->hints, 1, top ); + hinter->stem( hinter->hints, 0, top ); } break; @@ -1051,7 +1051,7 @@ top[0] += dx; top[2] += dx; top[4] += dx; - hinter->stem3( hinter->hints, 1, top ); + hinter->stem3( hinter->hints, 0, top ); } break; diff --git a/src/pshinter/pshalgo2.c b/src/pshinter/pshalgo2.c index 6b27ec69c..a10da1b74 100644 --- a/src/pshinter/pshalgo2.c +++ b/src/pshinter/pshalgo2.c @@ -330,7 +330,7 @@ ps2_simple_scale( PSH2_Hint_Table table, FT_Fixed scale, FT_Fixed delta, - FT_Int vertical ) + FT_Int dimension ) { PSH2_Hint hint; FT_UInt count; @@ -344,7 +344,7 @@ hint->cur_len = FT_MulFix( hint->org_len, scale ); if ( ps2_debug_hint_func ) - ps2_debug_hint_func( hint, vertical ); + ps2_debug_hint_func( hint, dimension ); } } #endif @@ -353,9 +353,9 @@ static void psh2_hint_align( PSH2_Hint hint, PSH_Globals globals, - FT_Int vertical ) + FT_Int dimension ) { - PSH_Dimension dim = &globals->dimension[vertical]; + PSH_Dimension dim = &globals->dimension[dimension]; FT_Fixed scale = dim->scale_mult; FT_Fixed delta = dim->scale_delta; @@ -388,7 +388,7 @@ align.align = 0; align.align_bot = align.align_top = 0; - if ( !vertical ) + if ( dimension == 1 ) psh_blues_snap_stem( &globals->blues, hint->org_pos + hint->org_len, hint->org_pos, @@ -425,7 +425,7 @@ /* ensure that parent is already fitted */ if ( !psh2_hint_is_fitted( parent ) ) - psh2_hint_align( parent, globals, vertical ); + psh2_hint_align( parent, globals, dimension ); par_org_center = parent->org_pos + ( parent->org_len / 2); par_cur_center = parent->cur_pos + ( parent->cur_len / 2); @@ -461,7 +461,7 @@ #ifdef DEBUG_HINTER if ( ps2_debug_hint_func ) - ps2_debug_hint_func( hint, vertical ); + ps2_debug_hint_func( hint, dimension ); #endif } } @@ -470,26 +470,26 @@ static void psh2_hint_table_align_hints( PSH2_Hint_Table table, PSH_Globals globals, - FT_Int vertical ) + FT_Int dimension ) { PSH2_Hint hint; FT_UInt count; #ifdef DEBUG_HINTER - PSH_Dimension dim = &globals->dimension[vertical]; + PSH_Dimension dim = &globals->dimension[dimension]; FT_Fixed scale = dim->scale_mult; FT_Fixed delta = dim->scale_delta; - if ( ps_debug_no_vert_hints && vertical ) + if ( ps_debug_no_vert_hints && dimension == 0 ) { - ps2_simple_scale( table, scale, delta, vertical ); + ps2_simple_scale( table, scale, delta, dimension ); return; } - if ( ps_debug_no_horz_hints && !vertical ) + if ( ps_debug_no_horz_hints && dimension == 1 ) { - ps2_simple_scale( table, scale, delta, vertical ); + ps2_simple_scale( table, scale, delta, dimension ); return; } #endif @@ -498,7 +498,7 @@ count = table->max_hints; for ( ; count > 0; count--, hint++ ) - psh2_hint_align( hint, globals, vertical ); + psh2_hint_align( hint, globals, dimension ); } @@ -688,13 +688,13 @@ psh2_hint_table_tune_outline( PSH2_Hint_Table table, FT_Outline* outline, PSH_Globals globals, - FT_Int vertical ) + FT_Int dimension ) { FT_UInt count, first, last; PS_Mask_Table hint_masks = table->hint_masks; PS_Mask mask; - PSH_Dimension dim = &globals->dimension[vertical]; + PSH_Dimension dim = &globals->dimension[dimension]; FT_Fixed scale = dim->scale_mult; FT_Fixed delta = dim->scale_delta; @@ -716,7 +716,7 @@ psh2_hint_table_activate_mask( table, mask ); - psh2_hint_table_optimize( table, globals, outline, vertical ); + psh2_hint_table_optimize( table, globals, outline, dimension ); psh2_hint_table_setup_zones( table, scale, delta ); last = mask->end_point; @@ -728,7 +728,7 @@ FT_Pos x, *px; - px = vertical ? &vec->x : &vec->y; + px = dimension ? &vec->y : &vec->x; x = *px; *px = psh2_hint_table_tune_coord( table, (FT_Int)x ); @@ -746,7 +746,7 @@ vec = outline->points; count = outline->n_points; - if ( vertical ) + if ( dimension == 0 ) { for ( ; count > 0; count--, vec++ ) vec->x = FT_MulFix( vec->x, scale ) + delta; @@ -999,7 +999,7 @@ /* load outline point coordinates into hinter glyph */ static void psh2_glyph_load_points( PSH2_Glyph glyph, - FT_Int vertical ) + FT_Int dimension ) { FT_Vector* vec = glyph->outline->points; PSH2_Point point = glyph->points; @@ -1010,7 +1010,7 @@ { point->flags &= PSH2_POINT_OFF | PSH2_POINT_SMOOTH; point->hint = 0; - if ( vertical ) + if ( dimension == 0 ) point->org_u = vec->x; else point->org_u = vec->y; @@ -1026,7 +1026,7 @@ /* save hinted point coordinates back to outline */ static void psh2_glyph_save_points( PSH2_Glyph glyph, - FT_Int vertical ) + FT_Int dimension ) { FT_UInt n; PSH2_Point point = glyph->points; @@ -1036,16 +1036,16 @@ for ( n = 0; n < glyph->num_points; n++ ) { - if ( vertical ) + if ( dimension == 0 ) vec[n].x = point->cur_u; else vec[n].y = point->cur_u; if ( psh2_point_is_strong( point ) ) - tags[n] |= vertical ? 32 : 64; + tags[n] |= (dimension == 0) ? 32 : 64; #ifdef DEBUG_HINTER - if ( vertical ) + if ( dimension == 0 ) { point->cur_x = point->cur_u; point->flags_x = point->flags; @@ -1115,16 +1115,16 @@ /* find strong points in a glyph */ static void psh2_glyph_find_strong_points( PSH2_Glyph glyph, - FT_Int vertical ) + FT_Int dimension ) { /* a point is strong if it is located on a stem */ /* edge and has an "in" or "out" tangent to the hint's direction */ { - PSH2_Hint_Table table = &glyph->hint_tables[vertical]; + PSH2_Hint_Table table = &glyph->hint_tables[dimension]; PS_Mask mask = table->hint_masks->masks; FT_UInt num_masks = table->hint_masks->num_masks; FT_UInt first = 0; - FT_Int major_dir = vertical ? PSH2_DIR_UP : PSH2_DIR_RIGHT; + FT_Int major_dir = dimension == 0 ? PSH2_DIR_UP : PSH2_DIR_RIGHT; /* process secondary hints to "selected" points */ @@ -1186,9 +1186,9 @@ /* interpolate strong points with the help of hinted coordinates */ static void psh2_glyph_interpolate_strong_points( PSH2_Glyph glyph, - FT_Int vertical ) + FT_Int dimension ) { - PSH_Dimension dim = &glyph->globals->dimension[vertical]; + PSH_Dimension dim = &glyph->globals->dimension[dimension]; FT_Fixed scale = dim->scale_mult; @@ -1231,10 +1231,10 @@ static void psh2_glyph_interpolate_normal_points( PSH2_Glyph glyph, - FT_Int vertical ) + FT_Int dimension ) { #if 1 - PSH_Dimension dim = &glyph->globals->dimension[vertical]; + PSH_Dimension dim = &glyph->globals->dimension[dimension]; FT_Fixed scale = dim->scale_mult; @@ -1344,9 +1344,9 @@ /* interpolate other points */ static void psh2_glyph_interpolate_other_points( PSH2_Glyph glyph, - FT_Int vertical ) + FT_Int dimension ) { - PSH_Dimension dim = &glyph->globals->dimension[vertical]; + PSH_Dimension dim = &glyph->globals->dimension[dimension]; FT_Fixed scale = dim->scale_mult; FT_Fixed delta = dim->scale_delta; PSH2_Contour contour = glyph->contours; @@ -1520,7 +1520,7 @@ if ( error ) goto Exit; - for ( dimension = 1; dimension >= 0; dimension-- ) + for ( dimension = 0; dimension < 2; dimension++ ) { /* load outline coordinates into glyph */ psh2_glyph_load_points( glyph, dimension ); diff --git a/src/pshinter/pshglob.h b/src/pshinter/pshglob.h index 569e6e7c2..1058fb172 100644 --- a/src/pshinter/pshglob.h +++ b/src/pshinter/pshglob.h @@ -129,7 +129,9 @@ FT_BEGIN_HEADER } PSH_BluesRec, *PSH_Blues; - /* font globals */ + /* font globals. */ + /* dimension 0 => X coordinates + vertical hints/stems */ + /* dimension 1 => Y coordinates + horizontal hints/stems */ typedef struct PSH_GlobalsRec_ { FT_Memory memory; diff --git a/src/pshinter/pshrec.h b/src/pshinter/pshrec.h index fb5309f65..a939bea68 100644 --- a/src/pshinter/pshrec.h +++ b/src/pshinter/pshrec.h @@ -129,7 +129,9 @@ FT_BEGIN_HEADER #define PS_HINTS_MAGIC 0x68696e74 /* "hint" */ - /* glyph hints descriptor */ + /* glyph hints descriptor */ + /* dimension 0 => X coordinates + vertical hints/stems */ + /* dimension 1 => Y coordinates + horizontal hints/stems */ typedef struct PS_HintsRec_ { FT_Memory memory;