| Index: src/autofit/afhints.c
|
| diff --git a/src/autofit/afhints.c b/src/autofit/afhints.c
|
| index f51066f02f51db2f36dcdaac2b7b979e98a4a655..e8defaa88db468fa928d30d02fabaa41faa7dff6 100644
|
| --- a/src/autofit/afhints.c
|
| +++ b/src/autofit/afhints.c
|
| @@ -4,7 +4,7 @@
|
| /* */
|
| /* Auto-fitter hinting routines (body). */
|
| /* */
|
| -/* Copyright 2003-2007, 2009-2011 by */
|
| +/* Copyright 2003-2007, 2009-2013 by */
|
| /* David Turner, Robert Wilhelm, and Werner Lemberg. */
|
| /* */
|
| /* This file is part of the FreeType project, and may only be used, */
|
| @@ -19,6 +19,17 @@
|
| #include "afhints.h"
|
| #include "aferrors.h"
|
| #include FT_INTERNAL_CALC_H
|
| +#include FT_INTERNAL_DEBUG_H
|
| +
|
| +
|
| + /*************************************************************************/
|
| + /* */
|
| + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
|
| + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
|
| + /* messages during execution. */
|
| + /* */
|
| +#undef FT_COMPONENT
|
| +#define FT_COMPONENT trace_afhints
|
|
|
|
|
| /* Get new segment for given axis. */
|
| @@ -28,7 +39,7 @@
|
| FT_Memory memory,
|
| AF_Segment *asegment )
|
| {
|
| - FT_Error error = AF_Err_Ok;
|
| + FT_Error error = FT_Err_Ok;
|
| AF_Segment segment = NULL;
|
|
|
|
|
| @@ -41,7 +52,7 @@
|
|
|
| if ( old_max >= big_max )
|
| {
|
| - error = AF_Err_Out_Of_Memory;
|
| + error = FT_THROW( Out_Of_Memory );
|
| goto Exit;
|
| }
|
|
|
| @@ -70,9 +81,9 @@
|
| FT_Int fpos,
|
| AF_Direction dir,
|
| FT_Memory memory,
|
| - AF_Edge *aedge )
|
| + AF_Edge *anedge )
|
| {
|
| - FT_Error error = AF_Err_Ok;
|
| + FT_Error error = FT_Err_Ok;
|
| AF_Edge edge = NULL;
|
| AF_Edge edges;
|
|
|
| @@ -86,7 +97,7 @@
|
|
|
| if ( old_max >= big_max )
|
| {
|
| - error = AF_Err_Out_Of_Memory;
|
| + error = FT_THROW( Out_Of_Memory );
|
| goto Exit;
|
| }
|
|
|
| @@ -124,7 +135,7 @@
|
| edge->dir = (FT_Char)dir;
|
|
|
| Exit:
|
| - *aedge = edge;
|
| + *anedge = edge;
|
| return error;
|
| }
|
|
|
| @@ -175,29 +186,27 @@
|
| AF_Point point;
|
|
|
|
|
| - printf( "Table of points:\n" );
|
| - printf( " [ index | xorg | yorg | xscale | yscale"
|
| - " | xfit | yfit | flags ]\n" );
|
| + FT_TRACE7(( "Table of points:\n"
|
| + " [ index | xorg | yorg | xscale | yscale"
|
| + " | xfit | yfit | flags ]\n" ));
|
|
|
| for ( point = points; point < limit; point++ )
|
| - {
|
| - printf( " [ %5d | %5d | %5d | %6.2f | %6.2f"
|
| - " | %5.2f | %5.2f | %c%c%c%c%c%c ]\n",
|
| - point - points,
|
| - point->fx,
|
| - point->fy,
|
| - point->ox / 64.0,
|
| - point->oy / 64.0,
|
| - point->x / 64.0,
|
| - point->y / 64.0,
|
| - ( point->flags & AF_FLAG_WEAK_INTERPOLATION ) ? 'w' : ' ',
|
| - ( point->flags & AF_FLAG_INFLECTION ) ? 'i' : ' ',
|
| - ( point->flags & AF_FLAG_EXTREMA_X ) ? '<' : ' ',
|
| - ( point->flags & AF_FLAG_EXTREMA_Y ) ? 'v' : ' ',
|
| - ( point->flags & AF_FLAG_ROUND_X ) ? '(' : ' ',
|
| - ( point->flags & AF_FLAG_ROUND_Y ) ? 'u' : ' ');
|
| - }
|
| - printf( "\n" );
|
| + FT_TRACE7(( " [ %5d | %5d | %5d | %6.2f | %6.2f"
|
| + " | %5.2f | %5.2f | %c%c%c%c%c%c ]\n",
|
| + point - points,
|
| + point->fx,
|
| + point->fy,
|
| + point->ox / 64.0,
|
| + point->oy / 64.0,
|
| + point->x / 64.0,
|
| + point->y / 64.0,
|
| + ( point->flags & AF_FLAG_WEAK_INTERPOLATION ) ? 'w' : ' ',
|
| + ( point->flags & AF_FLAG_INFLECTION ) ? 'i' : ' ',
|
| + ( point->flags & AF_FLAG_EXTREMA_X ) ? '<' : ' ',
|
| + ( point->flags & AF_FLAG_EXTREMA_Y ) ? 'v' : ' ',
|
| + ( point->flags & AF_FLAG_ROUND_X ) ? '(' : ' ',
|
| + ( point->flags & AF_FLAG_ROUND_Y ) ? 'u' : ' '));
|
| + FT_TRACE7(( "\n" ));
|
| }
|
| #ifdef __cplusplus
|
| }
|
| @@ -226,7 +235,7 @@
|
| if ( pos == 0 )
|
| return "normal";
|
|
|
| - temp[pos] = 0;
|
| + temp[pos] = '\0';
|
|
|
| return temp;
|
| }
|
| @@ -246,30 +255,41 @@
|
| for ( dimension = 1; dimension >= 0; dimension-- )
|
| {
|
| AF_AxisHints axis = &hints->axis[dimension];
|
| + AF_Point points = hints->points;
|
| + AF_Edge edges = axis->edges;
|
| AF_Segment segments = axis->segments;
|
| AF_Segment limit = segments + axis->num_segments;
|
| AF_Segment seg;
|
|
|
|
|
| - printf ( "Table of %s segments:\n",
|
| - dimension == AF_DIMENSION_HORZ ? "vertical" : "horizontal" );
|
| - printf ( " [ index | pos | dir | link | serif |"
|
| - " height | extra | flags ]\n" );
|
| + FT_TRACE7(( "Table of %s segments:\n",
|
| + dimension == AF_DIMENSION_HORZ ? "vertical"
|
| + : "horizontal" ));
|
| + if ( axis->num_segments )
|
| + FT_TRACE7(( " [ index | pos | dir | from"
|
| + " | to | link | serif | edge"
|
| + " | height | extra | flags ]\n" ));
|
| + else
|
| + FT_TRACE7(( " (none)\n" ));
|
|
|
| for ( seg = segments; seg < limit; seg++ )
|
| - {
|
| - printf ( " [ %5d | %5.2g | %5s | %4d | %5d | %6d | %5d | %11s ]\n",
|
| - seg - segments,
|
| - dimension == AF_DIMENSION_HORZ ? (int)seg->first->ox / 64.0
|
| - : (int)seg->first->oy / 64.0,
|
| - af_dir_str( (AF_Direction)seg->dir ),
|
| - AF_INDEX_NUM( seg->link, segments ),
|
| - AF_INDEX_NUM( seg->serif, segments ),
|
| - seg->height,
|
| - seg->height - ( seg->max_coord - seg->min_coord ),
|
| - af_edge_flags_to_string( (AF_Edge_Flags)seg->flags ) );
|
| - }
|
| - printf( "\n" );
|
| + FT_TRACE7(( " [ %5d | %5.2g | %5s | %4d"
|
| + " | %4d | %4d | %5d | %4d"
|
| + " | %6d | %5d | %11s ]\n",
|
| + seg - segments,
|
| + dimension == AF_DIMENSION_HORZ
|
| + ? (int)seg->first->ox / 64.0
|
| + : (int)seg->first->oy / 64.0,
|
| + af_dir_str( (AF_Direction)seg->dir ),
|
| + AF_INDEX_NUM( seg->first, points ),
|
| + AF_INDEX_NUM( seg->last, points ),
|
| + AF_INDEX_NUM( seg->link, segments ),
|
| + AF_INDEX_NUM( seg->serif, segments ),
|
| + AF_INDEX_NUM( seg->edge, edges ),
|
| + seg->height,
|
| + seg->height - ( seg->max_coord - seg->min_coord ),
|
| + af_edge_flags_to_string( (AF_Edge_Flags)seg->flags ) ));
|
| + FT_TRACE7(( "\n" ));
|
| }
|
| }
|
| #ifdef __cplusplus
|
| @@ -296,7 +316,7 @@
|
| axis = &hints->axis[dim];
|
| *num_segments = axis->num_segments;
|
|
|
| - return AF_Err_Ok;
|
| + return FT_Err_Ok;
|
| }
|
| #ifdef __cplusplus
|
| }
|
| @@ -320,20 +340,20 @@
|
|
|
|
|
| if ( !offset )
|
| - return AF_Err_Invalid_Argument;
|
| + return FT_THROW( Invalid_Argument );
|
|
|
| dim = ( dimension == 0 ) ? AF_DIMENSION_HORZ : AF_DIMENSION_VERT;
|
|
|
| axis = &hints->axis[dim];
|
|
|
| if ( idx < 0 || idx >= axis->num_segments )
|
| - return AF_Err_Invalid_Argument;
|
| + return FT_THROW( Invalid_Argument );
|
|
|
| seg = &axis->segments[idx];
|
| - *offset = (dim == AF_DIMENSION_HORZ) ? seg->first->ox
|
| - : seg->first->oy;
|
| + *offset = ( dim == AF_DIMENSION_HORZ ) ? seg->first->ox
|
| + : seg->first->oy;
|
|
|
| - return AF_Err_Ok;
|
| + return FT_Err_Ok;
|
| }
|
| #ifdef __cplusplus
|
| }
|
| @@ -363,26 +383,28 @@
|
| * note: AF_DIMENSION_HORZ corresponds to _vertical_ edges
|
| * since they have a constant X coordinate.
|
| */
|
| - printf ( "Table of %s edges:\n",
|
| - dimension == AF_DIMENSION_HORZ ? "vertical" : "horizontal" );
|
| - printf ( " [ index | pos | dir | link |"
|
| - " serif | blue | opos | pos | flags ]\n" );
|
| + FT_TRACE7(( "Table of %s edges:\n",
|
| + dimension == AF_DIMENSION_HORZ ? "vertical"
|
| + : "horizontal" ));
|
| + if ( axis->num_edges )
|
| + FT_TRACE7(( " [ index | pos | dir | link"
|
| + " | serif | blue | opos | pos | flags ]\n" ));
|
| + else
|
| + FT_TRACE7(( " (none)\n" ));
|
|
|
| for ( edge = edges; edge < limit; edge++ )
|
| - {
|
| - printf ( " [ %5d | %5.2g | %5s | %4d |"
|
| - " %5d | %c | %5.2f | %5.2f | %11s ]\n",
|
| - edge - edges,
|
| - (int)edge->opos / 64.0,
|
| - af_dir_str( (AF_Direction)edge->dir ),
|
| - AF_INDEX_NUM( edge->link, edges ),
|
| - AF_INDEX_NUM( edge->serif, edges ),
|
| - edge->blue_edge ? 'y' : 'n',
|
| - edge->opos / 64.0,
|
| - edge->pos / 64.0,
|
| - af_edge_flags_to_string( (AF_Edge_Flags)edge->flags ) );
|
| - }
|
| - printf( "\n" );
|
| + FT_TRACE7(( " [ %5d | %5.2g | %5s | %4d"
|
| + " | %5d | %c | %5.2f | %5.2f | %11s ]\n",
|
| + edge - edges,
|
| + (int)edge->opos / 64.0,
|
| + af_dir_str( (AF_Direction)edge->dir ),
|
| + AF_INDEX_NUM( edge->link, edges ),
|
| + AF_INDEX_NUM( edge->serif, edges ),
|
| + edge->blue_edge ? 'y' : 'n',
|
| + edge->opos / 64.0,
|
| + edge->pos / 64.0,
|
| + af_edge_flags_to_string( (AF_Edge_Flags)edge->flags ) ));
|
| + FT_TRACE7(( "\n" ));
|
| }
|
| }
|
| #ifdef __cplusplus
|
| @@ -494,8 +516,8 @@
|
| }
|
| }
|
|
|
| - /* return no direction if arm lengths differ too much */
|
| - /* (value 14 is heuristic) */
|
| + /* return no direction if arm lengths differ too much */
|
| + /* (value 14 is heuristic, corresponding to approx. 4.1 degrees) */
|
| ss *= 14;
|
| if ( FT_ABS( ll ) <= FT_ABS( ss ) )
|
| dir = AF_DIR_NONE;
|
| @@ -516,40 +538,40 @@
|
| FT_LOCAL_DEF( void )
|
| af_glyph_hints_done( AF_GlyphHints hints )
|
| {
|
| - if ( hints && hints->memory )
|
| - {
|
| - FT_Memory memory = hints->memory;
|
| - int dim;
|
| + FT_Memory memory = hints->memory;
|
| + int dim;
|
|
|
|
|
| - /*
|
| - * note that we don't need to free the segment and edge
|
| - * buffers since they are really within the hints->points array
|
| - */
|
| - for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ )
|
| - {
|
| - AF_AxisHints axis = &hints->axis[dim];
|
| + if ( !( hints && hints->memory ) )
|
| + return;
|
|
|
| + /*
|
| + * note that we don't need to free the segment and edge
|
| + * buffers since they are really within the hints->points array
|
| + */
|
| + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ )
|
| + {
|
| + AF_AxisHints axis = &hints->axis[dim];
|
|
|
| - axis->num_segments = 0;
|
| - axis->max_segments = 0;
|
| - FT_FREE( axis->segments );
|
|
|
| - axis->num_edges = 0;
|
| - axis->max_edges = 0;
|
| - FT_FREE( axis->edges );
|
| - }
|
| + axis->num_segments = 0;
|
| + axis->max_segments = 0;
|
| + FT_FREE( axis->segments );
|
|
|
| - FT_FREE( hints->contours );
|
| - hints->max_contours = 0;
|
| - hints->num_contours = 0;
|
| + axis->num_edges = 0;
|
| + axis->max_edges = 0;
|
| + FT_FREE( axis->edges );
|
| + }
|
|
|
| - FT_FREE( hints->points );
|
| - hints->num_points = 0;
|
| - hints->max_points = 0;
|
| + FT_FREE( hints->contours );
|
| + hints->max_contours = 0;
|
| + hints->num_contours = 0;
|
|
|
| - hints->memory = NULL;
|
| - }
|
| + FT_FREE( hints->points );
|
| + hints->num_points = 0;
|
| + hints->max_points = 0;
|
| +
|
| + hints->memory = NULL;
|
| }
|
|
|
|
|
| @@ -571,7 +593,7 @@
|
| af_glyph_hints_reload( AF_GlyphHints hints,
|
| FT_Outline* outline )
|
| {
|
| - FT_Error error = AF_Err_Ok;
|
| + FT_Error error = FT_Err_Ok;
|
| AF_Point points;
|
| FT_UInt old_max, new_max;
|
| FT_Fixed x_scale = hints->x_scale;
|
| @@ -745,7 +767,7 @@
|
|
|
| /* check for weak points */
|
|
|
| - if ( point->flags & ( AF_FLAG_CONIC | AF_FLAG_CUBIC ) )
|
| + if ( point->flags & AF_FLAG_CONTROL )
|
| {
|
| Is_Weak_Point:
|
| point->flags |= AF_FLAG_WEAK_INTERPOLATION;
|
|
|