other auto-hinter experiments not worthy of a Changelog entry

This commit is contained in:
David Turner 2001-10-29 17:22:12 +00:00
parent b92479b8c2
commit 9d7e5e8b8b
5 changed files with 75 additions and 38 deletions

View File

@ -29,7 +29,6 @@
#include <stdio.h> #include <stdio.h>
#ifdef AH_DEBUG #ifdef AH_DEBUG
void void
@ -40,7 +39,6 @@
AH_Segment* segments; AH_Segment* segments;
FT_Int dimension; FT_Int dimension;
edges = outline->horz_edges; edges = outline->horz_edges;
edge_limit = edges + outline->num_hedges; edge_limit = edges + outline->num_hedges;
segments = outline->horz_segments; segments = outline->horz_segments;
@ -938,19 +936,23 @@
AH_Segment* seg1; AH_Segment* seg1;
AH_Segment* seg2; AH_Segment* seg2;
/* now compare each segment to the others */ /* now compare each segment to the others */
for ( seg1 = segments; seg1 < segment_limit; seg1++ ) for ( seg1 = segments; seg1 < segment_limit; seg1++ )
{ {
FT_Pos best_score = 32000; FT_Pos best_score;
AH_Segment* best_segment = 0; AH_Segment* best_segment;
/* the fake segments are introduced to hint the metrics -- */ /* the fake segments are introduced to hint the metrics -- */
/* we must never link them to anything */ /* we must never link them to anything */
if ( seg1->first == seg1->last ) if ( seg1->first == seg1->last )
continue; continue;
best_segment = seg1->link;
if ( best_segment )
best_score = seg1->score;
else
best_score = 32000;
for ( seg2 = segments; seg2 < segment_limit; seg2++ ) for ( seg2 = segments; seg2 < segment_limit; seg2++ )
if ( seg1 != seg2 && seg1->dir + seg2->dir == 0 ) if ( seg1 != seg2 && seg1->dir + seg2->dir == 0 )
{ {
@ -970,17 +972,10 @@
if ( pos1 == pos2 || !(is_dir ^ is_pos) ) if ( pos1 == pos2 || !(is_dir ^ is_pos) )
continue; 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 min = seg1->min_coord;
FT_Pos max = seg1->max_coord; FT_Pos max = seg1->max_coord;
FT_Pos len, score; FT_Pos len, dist, score;
FT_Pos size1, size2; FT_Pos size1, size2;
@ -990,22 +985,24 @@
if ( min < seg2->min_coord ) if ( min < seg2->min_coord )
min = seg2->min_coord; min = seg2->min_coord;
if ( max < seg2->max_coord ) if ( max > seg2->max_coord )
max = seg2->max_coord; max = seg2->max_coord;
len = max - min; len = max - min;
score = seg2->pos - seg1->pos; dist = seg2->pos - seg1->pos;
if ( score < 0 ) if ( dist < 0 )
score = -score; dist = -dist;
/* before comparing the scores, take care that the segments */ if ( len < 8 )
/* are really facing each other (often not for italics..) */ score = 300 + dist;
if ( 16 * len >= size1 && 16 * len >= size2 ) else
if ( score < best_score ) score = dist + 300/len;
{
best_score = score; if ( score < best_score )
best_segment = seg2; {
} best_score = score;
best_segment = seg2;
}
} }
} }

View File

@ -149,7 +149,8 @@
static void static void
ah_align_serif_edge( AH_Hinter* hinter, ah_align_serif_edge( AH_Hinter* hinter,
AH_Edge* base, AH_Edge* base,
AH_Edge* serif ) AH_Edge* serif,
int vertical )
{ {
FT_Pos dist; FT_Pos dist;
FT_Pos sign = 1; FT_Pos sign = 1;
@ -167,10 +168,10 @@
/* do not strengthen serifs */ /* do not strengthen serifs */
if ( base->flags & ah_edge_done ) if ( base->flags & ah_edge_done )
{ {
if ( dist > 64 ) if ( dist >= 64 )
dist = ( dist + 16 ) & -64; dist = ( dist + 8 ) & -64;
else if ( dist <= 32 ) else if ( dist <= 32 && !vertical )
dist = ( dist + 33 ) >> 1; dist = ( dist + 33 ) >> 1;
} }
@ -257,8 +258,8 @@
if ( !anchor ) if ( !anchor )
anchor = edge; anchor = edge;
} }
} }
/* now, we will align all stem edges, trying to maintain the */ /* now, we will align all stem edges, trying to maintain the */
/* relative order of stems in the glyph.. */ /* relative order of stems in the glyph.. */
@ -343,7 +344,7 @@
if ( edge->serif ) if ( edge->serif )
{ {
ah_align_serif_edge( hinter, edge->serif, edge ); ah_align_serif_edge( hinter, edge->serif, edge, dimension );
} }
else if ( !anchor ) else if ( !anchor )
{ {

View File

@ -83,7 +83,7 @@ FT_BEGIN_HEADER
/* detected and later hinted through strong interpolation to correct */ /* detected and later hinted through strong interpolation to correct */
/* some unpleasant artefacts. */ /* some unpleasant artefacts. */
/* */ /* */
#define AH_OPTION_NO_STRONG_INTERPOLATION #undef AH_OPTION_NO_STRONG_INTERPOLATION
/*************************************************************************/ /*************************************************************************/

View File

@ -308,7 +308,7 @@
#ifdef DEBUG_HINTER #ifdef DEBUG_HINTER
static void static void
ps_simple_scale( PSH2_Hint_Table table, ps2_simple_scale( PSH2_Hint_Table table,
FT_Fixed scale, FT_Fixed scale,
FT_Fixed delta, FT_Fixed delta,
FT_Int vertical ) FT_Int vertical )
@ -466,13 +466,13 @@
if ( ps_debug_no_vert_hints && vertical ) if ( ps_debug_no_vert_hints && vertical )
{ {
ps_simple_scale( table, scale, delta, vertical ); ps2_simple_scale( table, scale, delta, vertical );
return; return;
} }
if ( ps_debug_no_horz_hints && !vertical ) if ( ps_debug_no_horz_hints && !vertical )
{ {
ps_simple_scale( table, scale, delta, vertical ); ps2_simple_scale( table, scale, delta, vertical );
return; return;
} }
#endif #endif
@ -1435,6 +1435,9 @@
memory = globals->memory; memory = globals->memory;
FT_UNUSED(glyphrec);
#ifdef DEBUG_HINTER #ifdef DEBUG_HINTER
if ( ps2_debug_glyph ) if ( ps2_debug_glyph )
{ {
@ -1449,7 +1452,7 @@
#else #else
glyph = &glyphrec; glyph = &glyphrec;
#endif #endif
error = psh2_glyph_init( glyph, outline, ps_hints, globals ); error = psh2_glyph_init( glyph, outline, ps_hints, globals );
if (error) goto Exit; if (error) goto Exit;

View File

@ -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 );
}
}
}
} }
} }
} }