From 9d7e5e8b8b455c10e6429827f2e8f00047261c52 Mon Sep 17 00:00:00 2001 From: David Turner Date: Mon, 29 Oct 2001 17:22:12 +0000 Subject: [PATCH] other auto-hinter experiments not worthy of a Changelog entry --- src/autohint/ahglyph.c | 49 +++++++++++++++++++---------------------- src/autohint/ahhint.c | 15 +++++++------ src/autohint/ahtypes.h | 2 +- src/pshinter/pshalgo2.c | 11 +++++---- tests/gview.c | 36 ++++++++++++++++++++++++++++++ 5 files changed, 75 insertions(+), 38 deletions(-) diff --git a/src/autohint/ahglyph.c b/src/autohint/ahglyph.c index f809d7e00..667f8306b 100644 --- a/src/autohint/ahglyph.c +++ b/src/autohint/ahglyph.c @@ -29,7 +29,6 @@ #include - #ifdef AH_DEBUG void @@ -40,7 +39,6 @@ AH_Segment* segments; FT_Int dimension; - edges = outline->horz_edges; edge_limit = edges + outline->num_hedges; segments = outline->horz_segments; @@ -938,19 +936,23 @@ AH_Segment* seg1; AH_Segment* seg2; - /* now compare each segment to the others */ for ( seg1 = segments; seg1 < segment_limit; seg1++ ) { - FT_Pos best_score = 32000; - AH_Segment* best_segment = 0; - + FT_Pos best_score; + AH_Segment* best_segment; /* the fake segments are introduced to hint the metrics -- */ /* we must never link them to anything */ if ( seg1->first == seg1->last ) continue; + best_segment = seg1->link; + if ( best_segment ) + best_score = seg1->score; + else + best_score = 32000; + for ( seg2 = segments; seg2 < segment_limit; seg2++ ) if ( seg1 != seg2 && seg1->dir + seg2->dir == 0 ) { @@ -970,17 +972,10 @@ if ( pos1 == pos2 || !(is_dir ^ is_pos) ) continue; - /* Check the two segments. We now have a better algorithm */ - /* that doesn't rely on the segment points themselves but */ - /* on their relative position. This gets rids of many */ - /* unpleasant artefacts and incorrect stem/serifs */ - /* computations. */ - - /* first of all, compute the size of the `common' height */ { FT_Pos min = seg1->min_coord; FT_Pos max = seg1->max_coord; - FT_Pos len, score; + FT_Pos len, dist, score; FT_Pos size1, size2; @@ -990,22 +985,24 @@ if ( min < seg2->min_coord ) min = seg2->min_coord; - if ( max < seg2->max_coord ) + if ( max > seg2->max_coord ) max = seg2->max_coord; len = max - min; - score = seg2->pos - seg1->pos; - if ( score < 0 ) - score = -score; + dist = seg2->pos - seg1->pos; + if ( dist < 0 ) + dist = -dist; - /* before comparing the scores, take care that the segments */ - /* are really facing each other (often not for italics..) */ - if ( 16 * len >= size1 && 16 * len >= size2 ) - if ( score < best_score ) - { - best_score = score; - best_segment = seg2; - } + if ( len < 8 ) + score = 300 + dist; + else + score = dist + 300/len; + + if ( score < best_score ) + { + best_score = score; + best_segment = seg2; + } } } diff --git a/src/autohint/ahhint.c b/src/autohint/ahhint.c index 1e2ebdbac..11ace9fe2 100644 --- a/src/autohint/ahhint.c +++ b/src/autohint/ahhint.c @@ -149,7 +149,8 @@ static void ah_align_serif_edge( AH_Hinter* hinter, AH_Edge* base, - AH_Edge* serif ) + AH_Edge* serif, + int vertical ) { FT_Pos dist; FT_Pos sign = 1; @@ -167,10 +168,10 @@ /* do not strengthen serifs */ if ( base->flags & ah_edge_done ) { - if ( dist > 64 ) - dist = ( dist + 16 ) & -64; + if ( dist >= 64 ) + dist = ( dist + 8 ) & -64; - else if ( dist <= 32 ) + else if ( dist <= 32 && !vertical ) dist = ( dist + 33 ) >> 1; } @@ -257,8 +258,8 @@ if ( !anchor ) anchor = edge; - } - } + } + } /* now, we will align all stem edges, trying to maintain the */ /* relative order of stems in the glyph.. */ @@ -343,7 +344,7 @@ if ( edge->serif ) { - ah_align_serif_edge( hinter, edge->serif, edge ); + ah_align_serif_edge( hinter, edge->serif, edge, dimension ); } else if ( !anchor ) { diff --git a/src/autohint/ahtypes.h b/src/autohint/ahtypes.h index ad12372b5..6593060ff 100644 --- a/src/autohint/ahtypes.h +++ b/src/autohint/ahtypes.h @@ -83,7 +83,7 @@ FT_BEGIN_HEADER /* detected and later hinted through strong interpolation to correct */ /* some unpleasant artefacts. */ /* */ -#define AH_OPTION_NO_STRONG_INTERPOLATION +#undef AH_OPTION_NO_STRONG_INTERPOLATION /*************************************************************************/ diff --git a/src/pshinter/pshalgo2.c b/src/pshinter/pshalgo2.c index 4eb897814..95f167a66 100644 --- a/src/pshinter/pshalgo2.c +++ b/src/pshinter/pshalgo2.c @@ -308,7 +308,7 @@ #ifdef DEBUG_HINTER static void - ps_simple_scale( PSH2_Hint_Table table, + ps2_simple_scale( PSH2_Hint_Table table, FT_Fixed scale, FT_Fixed delta, FT_Int vertical ) @@ -466,13 +466,13 @@ if ( ps_debug_no_vert_hints && vertical ) { - ps_simple_scale( table, scale, delta, vertical ); + ps2_simple_scale( table, scale, delta, vertical ); return; } if ( ps_debug_no_horz_hints && !vertical ) { - ps_simple_scale( table, scale, delta, vertical ); + ps2_simple_scale( table, scale, delta, vertical ); return; } #endif @@ -1435,6 +1435,9 @@ memory = globals->memory; + FT_UNUSED(glyphrec); + + #ifdef DEBUG_HINTER if ( ps2_debug_glyph ) { @@ -1449,7 +1452,7 @@ #else glyph = &glyphrec; #endif - + error = psh2_glyph_init( glyph, outline, ps_hints, globals ); if (error) goto Exit; diff --git a/tests/gview.c b/tests/gview.c index 3bc214fc6..4c1df3741 100644 --- a/tests/gview.c +++ b/tests/gview.c @@ -858,6 +858,42 @@ ah_draw_edges( void ) } } } + + if ( option_show_horz_hints && option_show_links ) + { + AH_Segment* seg = glyph->horz_segments; + FT_UInt count = glyph->num_hsegments; + + for ( ; count > 0; count--, seg++ ) + { + AH_Segment* seg2 = NULL; + NV_Path link; + NV_Vector v1, v2; + + if ( seg->link ) + { + if ( seg->link > seg ) + seg2 = seg->link; + } + else if ( seg->serif ) + seg2 = seg->serif; + + if ( seg2 ) + { + v1.y = seg->first->y; + v2.y = seg2->first->y; + v1.x = (seg->first->x + seg->last->x)/2 - pp1; + v2.x = (seg2->first->x + seg2->last->x)/2 - pp1; + + link = ah_link_path( &v1, &v2, 0 ); + + nv_painter_set_color( painter, seg->serif ? SERIF_LINK_COLOR : LINK_COLOR, 256 ); + nv_painter_fill_path( painter, &size_transform, 0, link ); + + nv_path_destroy( link ); + } + } + } } } }