formatting

This commit is contained in:
Werner Lemberg 2007-06-11 21:15:09 +00:00
parent a48162759e
commit 49e18b8d5f
6 changed files with 102 additions and 52 deletions

View File

@ -1,12 +1,49 @@
2007-06-11 David Turner <david@freetype.org> 2007-06-11 David Turner <david@freetype.org>
* src/autofit/aflatin,c: fix incorrect segment linking computation, * src/autofit/aflatin.c (af_latin_hints_link_segments): Fix
this was the root cause of bug #19565. incorrect segment linking computation. This was the root cause of
Savannah bug #19565.
* src/autofit/*: some very experimental changes to improve the Latin * src/autofit/* [FT_OPTION_AUTOFIT2]: Some very experimental changes
auto-hinter. note that the new code is disabled by default since this to improve the Latin auto-hinter. Note that the new code is
is not stablizied yet. disabled by default since it is not stabilized yet.
* src/autofit/aflatin2.c, src/autofit/aflatin2.h: New files
(disabled currently).
* src/autofit/afhints.c: Remove dead code.
(af_axis_hints_new_edge): Add argument to handle segment directions.
(af_edge_flags_to_string): New function.
(af_glyph_hints_dump_segments, af_glyph_hints_dump_edges): Handle
option flags.
(af_glyph_hints_reload): Add argument to handle inflections.
Simplify.
(af_direction_compute): Fine tuning.
(af_glyph_hints_align_edge_points): Fix logic.
(af_glyph_hints_align_strong_points): Do linear search for small
edge counts.
(af_glyph_hints_align_weak_points): Skip any touched neighbors.
(af_iup_shift): Handle zero `delta'.
* src/autofit/afhints.h: Updated.
(AF_SORT_SEGMENTS): New macro (disabled).
(AF_AxisHintsRec) [AF_SORT_SEGMENTS]: New member `mid_segments'.
* src/autofit/afglobal.c (af_face_globals_get_metrics): Add
argument to pass option flags for handling scripts.
* src/autofit/afglobal.h: Updated.
* src/autofit/afcjk.c: Updated.
* src/autofit/aflatin.c: Updated.
(af_latin_metrics_scale_dim): Don't reduce scale by 2%.
(af_latin_hints_compute_segments) [AF_HINT_METRICS]: Remove dead code.
(af_latin_hints_compute_edges) [AF_HINT_METRICS]: Remove dead code.
Don't set `edge->dir'
(af_latin_hint_edges): Add more logging.
* src/autofit/afloader.c: Updated.
2007-06-11 Werner Lemberg <wl@gnu.org> 2007-06-11 Werner Lemberg <wl@gnu.org>

View File

@ -229,10 +229,10 @@
AF_ScriptMetrics metrics = NULL; AF_ScriptMetrics metrics = NULL;
FT_UInt gidx; FT_UInt gidx;
AF_ScriptClass clazz; AF_ScriptClass clazz;
FT_UInt script = (options & 15); FT_UInt script = options & 15;
const FT_UInt script_max = sizeof(af_script_classes)/ const FT_UInt script_max = sizeof ( af_script_classes ) /
sizeof(af_script_classes[0]); sizeof ( af_script_classes[0] );
FT_Error error = AF_Err_Ok; FT_Error error = AF_Err_Ok;
if ( gindex >= globals->glyph_count ) if ( gindex >= globals->glyph_count )
@ -242,11 +242,11 @@
} }
gidx = script; gidx = script;
if (gidx == 0 || gidx+1 >= script_max) if ( gidx == 0 || gidx + 1 >= script_max )
gidx = globals->glyph_scripts[gindex]; gidx = globals->glyph_scripts[gindex];
clazz = af_script_classes[gidx]; clazz = af_script_classes[gidx];
if (script == 0) if ( script == 0 )
script = clazz->script; script = clazz->script;
metrics = globals->metrics[clazz->script]; metrics = globals->metrics[clazz->script];

View File

@ -5,7 +5,7 @@
/* Auto-fitter routines to compute global hinting values */ /* Auto-fitter routines to compute global hinting values */
/* (specification). */ /* (specification). */
/* */ /* */
/* Copyright 2003, 2004, 2005 by */ /* Copyright 2003, 2004, 2005, 2007 by */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */ /* */
/* This file is part of the FreeType project, and may only be used, */ /* This file is part of the FreeType project, and may only be used, */

View File

@ -101,13 +101,12 @@
while ( edge > edges ) while ( edge > edges )
{ {
if (edge[-1].fpos < fpos) if ( edge[-1].fpos < fpos )
break; break;
/* we want the edge with same position and minor direction /* we want the edge with same position and minor direction */
* to appear before those in the major one in the list /* to appear before those in the major one in the list */
*/ if ( edge[-1].fpos == fpos && dir == axis->major_dir )
if (edge[-1].fpos == fpos && dir == axis->major_dir)
break; break;
edge[0] = edge[-1]; edge[0] = edge[-1];
@ -198,28 +197,31 @@
static const char* static const char*
af_edge_flags_to_string( AF_Edge_Flags flags ) af_edge_flags_to_string( AF_Edge_Flags flags )
{ {
static char temp[32]; static char temp[32];
int pos = 0; int pos = 0;
if ( flags & AF_EDGE_ROUND ) if ( flags & AF_EDGE_ROUND )
{ {
memcpy( temp+pos, "round", 5 ); memcpy( temp + pos, "round", 5 );
pos += 5; pos += 5;
} }
if ( flags & AF_EDGE_SERIF ) if ( flags & AF_EDGE_SERIF )
{ {
if (pos > 0) if ( pos > 0 )
temp[pos++] = ' '; temp[pos++] = ' ';
memcpy( temp+pos, "serif", 5 ); memcpy( temp + pos, "serif", 5 );
pos += 5; pos += 5;
} }
if (pos == 0) if ( pos == 0 )
return "normal"; return "normal";
temp[pos] = 0; temp[pos] = 0;
return temp; return temp;
} }
/* A function to dump the array of linked segments. */ /* A function to dump the array of linked segments. */
void void
af_glyph_hints_dump_segments( AF_GlyphHints hints ) af_glyph_hints_dump_segments( AF_GlyphHints hints )
@ -244,13 +246,14 @@
{ {
printf ( " [ %5d | %5.2g | %5s | %4d | %5d | %5d | %5d | %s ]\n", printf ( " [ %5d | %5.2g | %5s | %4d | %5d | %5d | %5d | %s ]\n",
seg - segments, seg - segments,
dimension == AF_DIMENSION_HORZ ? (int)seg->first->ox/64.0 : (int)seg->first->oy/64.0, dimension == AF_DIMENSION_HORZ ? (int)seg->first->ox / 64.0
: (int)seg->first->oy / 64.0,
af_dir_str( (AF_Direction)seg->dir ), af_dir_str( (AF_Direction)seg->dir ),
AF_INDEX_NUM( seg->link, segments ), AF_INDEX_NUM( seg->link, segments ),
AF_INDEX_NUM( seg->serif, segments ), AF_INDEX_NUM( seg->serif, segments ),
seg->height, seg->height,
seg->height - ( seg->max_coord - seg->min_coord ), seg->height - ( seg->max_coord - seg->min_coord ),
af_edge_flags_to_string(seg->flags)); af_edge_flags_to_string( seg->flags ) );
} }
printf( "\n" ); printf( "\n" );
} }
@ -285,14 +288,14 @@
printf ( " [ %5d | %5.2g | %5s | %4d |" printf ( " [ %5d | %5.2g | %5s | %4d |"
" %5d | %c | %5.2f | %5.2f | %s ]\n", " %5d | %c | %5.2f | %5.2f | %s ]\n",
edge - edges, edge - edges,
(int)edge->opos/64.0, (int)edge->opos / 64.0,
af_dir_str( (AF_Direction)edge->dir ), af_dir_str( (AF_Direction)edge->dir ),
AF_INDEX_NUM( edge->link, edges ), AF_INDEX_NUM( edge->link, edges ),
AF_INDEX_NUM( edge->serif, edges ), AF_INDEX_NUM( edge->serif, edges ),
edge->blue_edge ? 'y' : 'n', edge->blue_edge ? 'y' : 'n',
edge->opos / 64.0, edge->opos / 64.0,
edge->pos / 64.0, edge->pos / 64.0,
af_edge_flags_to_string(edge->flags) ); af_edge_flags_to_string( edge->flags ) );
} }
printf( "\n" ); printf( "\n" );
} }
@ -367,7 +370,7 @@
} }
ss *= 14; ss *= 14;
if ( FT_ABS(ll) <= FT_ABS(ss) ) if ( FT_ABS( ll ) <= FT_ABS( ss ) )
dir = AF_DIR_NONE; dir = AF_DIR_NONE;
return dir; return dir;
@ -634,13 +637,14 @@
/* compute coordinates & Bezier flags, next and prev */ /* compute coordinates & Bezier flags, next and prev */
{ {
FT_Vector* vec = outline->points; FT_Vector* vec = outline->points;
char* tag = outline->tags; char* tag = outline->tags;
AF_Point first = points; AF_Point first = points;
AF_Point end = points + outline->contours[0]; AF_Point end = points + outline->contours[0];
AF_Point prev = end; AF_Point prev = end;
FT_Int contour_index = 0; FT_Int contour_index = 0;
for ( point = points; point < point_limit; point++, vec++, tag++ ) for ( point = points; point < point_limit; point++, vec++, tag++ )
{ {
point->fx = (FT_Short)vec->x; point->fx = (FT_Short)vec->x;
@ -664,7 +668,7 @@
prev->next = point; prev->next = point;
prev = point; prev = point;
if (point == end) if ( point == end )
{ {
if ( ++contour_index < outline->n_contours ) if ( ++contour_index < outline->n_contours )
{ {
@ -699,11 +703,13 @@
FT_Pos in_y = 0; FT_Pos in_y = 0;
AF_Direction in_dir = AF_DIR_NONE; AF_Direction in_dir = AF_DIR_NONE;
for ( point = points; point < point_limit; point++ ) for ( point = points; point < point_limit; point++ )
{ {
AF_Point next; AF_Point next;
FT_Pos out_x, out_y; FT_Pos out_x, out_y;
if ( point == first ) if ( point == first )
{ {
prev = first->prev; prev = first->prev;
@ -713,14 +719,14 @@
first = prev + 1; first = prev + 1;
} }
point->in_dir = (FT_Char) in_dir; point->in_dir = (FT_Char)in_dir;
next = point->next; next = point->next;
out_x = next->fx - point->fx; out_x = next->fx - point->fx;
out_y = next->fy - point->fy; out_y = next->fy - point->fy;
in_dir = af_direction_compute( out_x, out_y ); in_dir = af_direction_compute( out_x, out_y );
point->out_dir = (FT_Char) in_dir; point->out_dir = (FT_Char)in_dir;
if ( point->flags & ( AF_FLAG_CONIC | AF_FLAG_CUBIC ) ) if ( point->flags & ( AF_FLAG_CONIC | AF_FLAG_CUBIC ) )
{ {
@ -745,8 +751,9 @@
} }
} }
/* compute inflection points -- disable due to no longer perceived benefits */ /* compute inflection points -- */
if (0 && get_inflections) /* disabled due to no longer perceived benefits */
if ( 0 && get_inflections )
af_glyph_hints_compute_inflections( hints ); af_glyph_hints_compute_inflections( hints );
Exit: Exit:
@ -1021,7 +1028,7 @@
AF_Point p; AF_Point p;
FT_Pos delta = ref->u - ref->v; FT_Pos delta = ref->u - ref->v;
if (delta == 0) if ( delta == 0 )
return; return;
for ( p = p1; p < ref; p++ ) for ( p = p1; p < ref; p++ )
@ -1141,7 +1148,8 @@
for ( ; contour < contour_limit; contour++ ) for ( ; contour < contour_limit; contour++ )
{ {
AF_Point first_touched, last_touched; AF_Point first_touched, last_touched;
point = *contour; point = *contour;
end_point = point->prev; end_point = point->prev;
@ -1164,10 +1172,11 @@
for (;;) for (;;)
{ {
FT_ASSERT( point <= end_point && (point->flags & touch_flag) != 0 ); FT_ASSERT( point <= end_point &&
( point->flags & touch_flag ) != 0 );
/* skip any touched neighbhours */ /* skip any touched neighbhours */
while ( point < end_point && (point[1].flags & touch_flag) != 0 ) while ( point < end_point && ( point[1].flags & touch_flag ) != 0 )
point++; point++;
last_touched = point; last_touched = point;
@ -1179,7 +1188,7 @@
if ( point > end_point ) if ( point > end_point )
goto EndContour; goto EndContour;
if ( (point->flags & touch_flag) != 0 ) if ( ( point->flags & touch_flag ) != 0 )
break; break;
point++; point++;

View File

@ -2009,13 +2009,16 @@
FT_MulDiv( edge->opos - before->opos, FT_MulDiv( edge->opos - before->opos,
after->pos - before->pos, after->pos - before->pos,
after->opos - before->opos ); after->opos - before->opos );
AF_LOG(( "SERIF_LINK1: edge %d (opos=%.2f) snapped to (%.2f) from %d (opos=%.2f)\n", AF_LOG(( "SERIF_LINK1: edge %d (opos=%.2f) snapped to (%.2f) "
edge-edges, edge->opos / 64.0, edge->pos / 64.0, before - edges, before->opos / 64.0 )); "from %d (opos=%.2f)\n",
edge-edges, edge->opos / 64.0,
edge->pos / 64.0, before - edges,
before->opos / 64.0 ));
} }
else else
{ {
edge->pos = anchor->pos + (( edge->opos - anchor->opos + 16) & ~31); edge->pos = anchor->pos +
( ( edge->opos - anchor->opos + 16 ) & ~31 );
AF_LOG(( "SERIF_LINK2: edge %d (opos=%.2f) snapped to (%.2f)\n", AF_LOG(( "SERIF_LINK2: edge %d (opos=%.2f) snapped to (%.2f)\n",
edge-edges, edge->opos / 64.0, edge->pos / 64.0 )); edge-edges, edge->opos / 64.0, edge->pos / 64.0 ));
} }

View File

@ -494,9 +494,10 @@
AF_ScriptMetrics metrics; AF_ScriptMetrics metrics;
FT_UInt options = 0; FT_UInt options = 0;
#ifdef FT_OPTION_AUTOFIT2 #ifdef FT_OPTION_AUTOFIT2
/* XXX: undocumented hook to activate the latin2 hinter */ /* XXX: undocumented hook to activate the latin2 hinter */
if (load_flags & (1UL << 20)) if ( load_flags & ( 1UL << 20 ) )
options = 2; options = 2;
#endif #endif