ref: 9d7e5e8b8b455c10e6429827f2e8f00047261c52
parent: b92479b8c246e5ed1757d6dff2b5687085e0e451
author: David Turner <[email protected]>
date: Mon Oct 29 12:22:12 EST 2001
other auto-hinter experiments not worthy of a Changelog entry
--- a/src/autohint/ahglyph.c
+++ b/src/autohint/ahglyph.c
@@ -29,7 +29,6 @@
#include <stdio.h>
-
#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;
+ }
}
}
--- 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 )
{
--- a/src/autohint/ahtypes.h
+++ b/src/autohint/ahtypes.h
@@ -83,7 +83,7 @@
/* detected and later hinted through strong interpolation to correct */
/* some unpleasant artefacts. */
/* */
-#define AH_OPTION_NO_STRONG_INTERPOLATION
+#undef AH_OPTION_NO_STRONG_INTERPOLATION
/*************************************************************************/
--- 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;
--- a/tests/gview.c
+++ b/tests/gview.c
@@ -858,6 +858,42 @@
}
}
}
+
+ 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 );
+ }
+ }
+ }
}
}
}