- improve autofitter's handling of serif fonts (results are much better)
- make GCC 4 happy when compiling our zlib sources
This commit is contained in:
parent
effd15de89
commit
91b44e65c2
|
@ -1,5 +1,10 @@
|
||||||
2006-11-02 David Turner <david@freetype.org>
|
2006-11-02 David Turner <david@freetype.org>
|
||||||
|
|
||||||
|
* src/autofit/aflatin.c: adding a few tweaks to better handle
|
||||||
|
serif fonts (we now ignore vertical segments that are less than
|
||||||
|
1 pixels in height, which get rids of *many* corner cases with
|
||||||
|
serifs)
|
||||||
|
|
||||||
* src/autofit/afhints.c, src/autofit/afmodule.c,
|
* src/autofit/afhints.c, src/autofit/afmodule.c,
|
||||||
src/autofit/aftypes.h: adding more debug messages and fixing a small
|
src/autofit/aftypes.h: adding more debug messages and fixing a small
|
||||||
bug in af_compute_direction which produced garbage by missing lots of
|
bug in af_compute_direction which produced garbage by missing lots of
|
||||||
|
|
|
@ -949,6 +949,7 @@
|
||||||
AF_Direction up_dir;
|
AF_Direction up_dir;
|
||||||
FT_Fixed scale;
|
FT_Fixed scale;
|
||||||
FT_Pos edge_distance_threshold;
|
FT_Pos edge_distance_threshold;
|
||||||
|
FT_Pos segment_length_threshold;
|
||||||
|
|
||||||
|
|
||||||
axis->num_edges = 0;
|
axis->num_edges = 0;
|
||||||
|
@ -959,6 +960,16 @@
|
||||||
up_dir = ( dim == AF_DIMENSION_HORZ ) ? AF_DIR_UP
|
up_dir = ( dim == AF_DIMENSION_HORZ ) ? AF_DIR_UP
|
||||||
: AF_DIR_RIGHT;
|
: AF_DIR_RIGHT;
|
||||||
|
|
||||||
|
/* we want to ignore all segments that are less than 1.5
|
||||||
|
* pixels in length, to avoid many problems with serif
|
||||||
|
* fonts. we compute the corresponding threshold in font
|
||||||
|
* units
|
||||||
|
*/
|
||||||
|
if ( dim == AF_DIMENSION_VERT )
|
||||||
|
segment_length_threshold = FT_DivFix( 64, hints->y_scale );
|
||||||
|
else
|
||||||
|
segment_length_threshold = 0;
|
||||||
|
|
||||||
/*********************************************************************/
|
/*********************************************************************/
|
||||||
/* */
|
/* */
|
||||||
/* We will begin by generating a sorted table of edges for the */
|
/* We will begin by generating a sorted table of edges for the */
|
||||||
|
@ -988,6 +999,8 @@
|
||||||
AF_Edge found = 0;
|
AF_Edge found = 0;
|
||||||
FT_Int ee;
|
FT_Int ee;
|
||||||
|
|
||||||
|
if ( seg->max_coord - seg->min_coord < segment_length_threshold )
|
||||||
|
continue;
|
||||||
|
|
||||||
/* look for an edge corresponding to the segment */
|
/* look for an edge corresponding to the segment */
|
||||||
for ( ee = 0; ee < axis->num_edges; ee++ )
|
for ( ee = 0; ee < axis->num_edges; ee++ )
|
||||||
|
@ -1106,9 +1119,10 @@
|
||||||
|
|
||||||
/* check for links -- if seg->serif is set, then seg->link must */
|
/* check for links -- if seg->serif is set, then seg->link must */
|
||||||
/* be ignored */
|
/* be ignored */
|
||||||
is_serif = (FT_Bool)( seg->serif && seg->serif->edge != edge );
|
is_serif = (FT_Bool)( seg->serif && seg->serif->edge &&
|
||||||
|
seg->serif->edge != edge );
|
||||||
|
|
||||||
if ( seg->link || is_serif )
|
if ( (seg->link && seg->link->edge != NULL) || is_serif )
|
||||||
{
|
{
|
||||||
AF_Edge edge2;
|
AF_Edge edge2;
|
||||||
AF_Segment seg2;
|
AF_Segment seg2;
|
||||||
|
@ -1700,7 +1714,7 @@
|
||||||
/* this should not happen, but it's better to be safe */
|
/* this should not happen, but it's better to be safe */
|
||||||
if ( edge2->blue_edge || edge2 < edge )
|
if ( edge2->blue_edge || edge2 < edge )
|
||||||
{
|
{
|
||||||
AF_LOG(( "BLUE: ASSERT FAILED for edge %d\n", edge2-edges ));
|
AF_LOG(( "ASSERT FAILED for edge %d\n", edge2-edges ));
|
||||||
af_latin_align_linked_edge( hints, dim, edge2, edge );
|
af_latin_align_linked_edge( hints, dim, edge2, edge );
|
||||||
edge->flags |= AF_EDGE_DONE;
|
edge->flags |= AF_EDGE_DONE;
|
||||||
continue;
|
continue;
|
||||||
|
@ -1774,7 +1788,11 @@
|
||||||
(AF_Edge_Flags)edge->flags,
|
(AF_Edge_Flags)edge->flags,
|
||||||
(AF_Edge_Flags)edge2->flags );
|
(AF_Edge_Flags)edge2->flags );
|
||||||
|
|
||||||
if ( cur_len < 96 )
|
if ( edge2->flags & AF_EDGE_DONE )
|
||||||
|
{
|
||||||
|
edge->pos = edge2->pos - cur_len;
|
||||||
|
}
|
||||||
|
else if ( cur_len < 96 )
|
||||||
{
|
{
|
||||||
FT_Pos u_off, d_off;
|
FT_Pos u_off, d_off;
|
||||||
|
|
||||||
|
|
|
@ -131,6 +131,9 @@ uIntf *v /* working area: values in order of bit length */
|
||||||
uInt z; /* number of entries in current table */
|
uInt z; /* number of entries in current table */
|
||||||
|
|
||||||
|
|
||||||
|
/* Make comiler happy */
|
||||||
|
r.base = 0;
|
||||||
|
|
||||||
/* Generate counts for each bit length */
|
/* Generate counts for each bit length */
|
||||||
p = c;
|
p = c;
|
||||||
#define C0 *p++ = 0;
|
#define C0 *p++ = 0;
|
||||||
|
|
Loading…
Reference in New Issue