forked from minhngoc25a/freetype2
[autofit] Improve recognition of flat segments.
Problem reported by Brad Dunzer <BDunzer@extensis.com>. * src/autofit/aflatin.c (af_latin_metrics_init_blues): We have a flat segment if the horizontal distance of best on-points is larger than a given threshold.
This commit is contained in:
parent
e194d7cd61
commit
5b995a8dd8
10
ChangeLog
10
ChangeLog
|
@ -1,3 +1,13 @@
|
||||||
|
2012-08-05 Werner Lemberg <wl@gnu.org>
|
||||||
|
|
||||||
|
[autofit] Improve recognition of flat segments.
|
||||||
|
|
||||||
|
Problem reported by Brad Dunzer <BDunzer@extensis.com>.
|
||||||
|
|
||||||
|
* src/autofit/aflatin.c (af_latin_metrics_init_blues): We have
|
||||||
|
a flat segment if the horizontal distance of best on-points is
|
||||||
|
larger than a given threshold.
|
||||||
|
|
||||||
2012-08-05 Werner Lemberg <wl@gnu.org>
|
2012-08-05 Werner Lemberg <wl@gnu.org>
|
||||||
|
|
||||||
[autofit] Variable renamings.
|
[autofit] Variable renamings.
|
||||||
|
|
|
@ -302,11 +302,23 @@
|
||||||
{
|
{
|
||||||
FT_Pos best_x = points[best_point].x;
|
FT_Pos best_x = points[best_point].x;
|
||||||
FT_Int prev, next;
|
FT_Int prev, next;
|
||||||
|
FT_Int best_on_point_first, best_on_point_last;
|
||||||
FT_Pos dist;
|
FT_Pos dist;
|
||||||
|
|
||||||
|
|
||||||
/* now look for the previous and next points that are not on the */
|
if ( FT_CURVE_TAG( outline.tags[best_point] ) == FT_CURVE_TAG_ON )
|
||||||
/* same Y coordinate. Threshold the `closeness'... */
|
{
|
||||||
|
best_on_point_first = best_point;
|
||||||
|
best_on_point_last = best_point;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
best_on_point_first = -1;
|
||||||
|
best_on_point_last = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* look for the previous and next points that are not on the */
|
||||||
|
/* same Y coordinate, then threshold the `closeness'... */
|
||||||
prev = best_point;
|
prev = best_point;
|
||||||
next = prev;
|
next = prev;
|
||||||
|
|
||||||
|
@ -324,6 +336,13 @@
|
||||||
if ( FT_ABS( points[prev].x - best_x ) <= 20 * dist )
|
if ( FT_ABS( points[prev].x - best_x ) <= 20 * dist )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
if ( FT_CURVE_TAG( outline.tags[prev] ) == FT_CURVE_TAG_ON )
|
||||||
|
{
|
||||||
|
best_on_point_first = prev;
|
||||||
|
if ( best_on_point_last < 0 )
|
||||||
|
best_on_point_last = prev;
|
||||||
|
}
|
||||||
|
|
||||||
} while ( prev != best_point );
|
} while ( prev != best_point );
|
||||||
|
|
||||||
do
|
do
|
||||||
|
@ -338,9 +357,24 @@
|
||||||
if ( FT_ABS( points[next].x - best_x ) <= 20 * dist )
|
if ( FT_ABS( points[next].x - best_x ) <= 20 * dist )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
if ( FT_CURVE_TAG( outline.tags[next] ) == FT_CURVE_TAG_ON )
|
||||||
|
{
|
||||||
|
best_on_point_last = next;
|
||||||
|
if ( best_on_point_first < 0 )
|
||||||
|
best_on_point_first = next;
|
||||||
|
}
|
||||||
|
|
||||||
} while ( next != best_point );
|
} while ( next != best_point );
|
||||||
|
|
||||||
/* now set the `round' flag depending on the segment's kind */
|
/* now set the `round' flag depending on the segment's kind */
|
||||||
|
/* (value 8 is heuristic) */
|
||||||
|
if ( best_on_point_first >= 0 &&
|
||||||
|
best_on_point_last >= 0 &&
|
||||||
|
(FT_UInt)( FT_ABS( points[best_on_point_last].x -
|
||||||
|
points[best_on_point_first].x ) ) >
|
||||||
|
metrics->units_per_em / 8 )
|
||||||
|
round = 0;
|
||||||
|
else
|
||||||
round = FT_BOOL(
|
round = FT_BOOL(
|
||||||
FT_CURVE_TAG( outline.tags[prev] ) != FT_CURVE_TAG_ON ||
|
FT_CURVE_TAG( outline.tags[prev] ) != FT_CURVE_TAG_ON ||
|
||||||
FT_CURVE_TAG( outline.tags[next] ) != FT_CURVE_TAG_ON );
|
FT_CURVE_TAG( outline.tags[next] ) != FT_CURVE_TAG_ON );
|
||||||
|
|
Loading…
Reference in New Issue