Integrate autofitter debugging stuff.
* devel/ftoption.h, include/freetype/config/ftoption.h (FT_DEBUG_AUTOFIT): New macro. * include/freetype/internal/fttrace.h: Add trace components for autofitter. * src/autofit/aftypes.h (AF_LOG): Removed. (_af_debug): Removed. * src/autofit/*: s/AF_DEBUG/FT_DEBUG_AUTOFIT/. s/AF_LOG/FT_TRACE5/. Define FT_COMPONENT where necessary.
This commit is contained in:
parent
de2de6b1fb
commit
d503b1bce2
17
ChangeLog
17
ChangeLog
@ -1,3 +1,20 @@
|
||||
2011-04-18 Werner Lemberg <wl@gnu.org>
|
||||
|
||||
Integrate autofitter debugging stuff.
|
||||
|
||||
* devel/ftoption.h, include/freetype/config/ftoption.h
|
||||
(FT_DEBUG_AUTOFIT): New macro.
|
||||
|
||||
* include/freetype/internal/fttrace.h: Add trace components for
|
||||
autofitter.
|
||||
|
||||
* src/autofit/aftypes.h (AF_LOG): Removed.
|
||||
(_af_debug): Removed.
|
||||
|
||||
* src/autofit/*: s/AF_DEBUG/FT_DEBUG_AUTOFIT/.
|
||||
s/AF_LOG/FT_TRACE5/.
|
||||
Define FT_COMPONENT where necessary.
|
||||
|
||||
2011-04-18 Werner Lemberg <wl@gnu.org>
|
||||
|
||||
Synchronize config files.
|
||||
|
@ -378,6 +378,39 @@ FT_BEGIN_HEADER
|
||||
#define FT_DEBUG_LEVEL_TRACE
|
||||
|
||||
|
||||
/*************************************************************************/
|
||||
/* */
|
||||
/* Autofitter debugging */
|
||||
/* */
|
||||
/* If FT_DEBUG_AUTOFIT is defined, FreeType provides some means to */
|
||||
/* control the autofitter behaviour for debugging purposes with global */
|
||||
/* boolean variables (consequently, you should *never* enable this */
|
||||
/* while compiling in `release' mode): */
|
||||
/* */
|
||||
/* _af_debug_disable_horz_hints */
|
||||
/* _af_debug_disable_vert_hints */
|
||||
/* _af_debug_disable_blue_hints */
|
||||
/* */
|
||||
/* Additionally, the following functions provide dumps of various */
|
||||
/* internal autofit structures to stdout (using `printf'): */
|
||||
/* */
|
||||
/* af_glyph_hints_dump_points */
|
||||
/* af_glyph_hints_dump_segments */
|
||||
/* af_glyph_hints_dump_edges */
|
||||
/* */
|
||||
/* As an argument, they use another global variable: */
|
||||
/* */
|
||||
/* _af_debug_hints */
|
||||
/* */
|
||||
/* Please have a look at the `ftgrid' demo program to see how those */
|
||||
/* variables and macros should be used. */
|
||||
/* */
|
||||
/* Do not #undef these macros here since the build system might define */
|
||||
/* them for certain configurations only. */
|
||||
/* */
|
||||
#define FT_DEBUG_AUTOFIT
|
||||
|
||||
|
||||
/*************************************************************************/
|
||||
/* */
|
||||
/* Memory Debugging */
|
||||
|
@ -378,6 +378,39 @@ FT_BEGIN_HEADER
|
||||
/* #define FT_DEBUG_LEVEL_TRACE */
|
||||
|
||||
|
||||
/*************************************************************************/
|
||||
/* */
|
||||
/* Autofitter debugging */
|
||||
/* */
|
||||
/* If FT_DEBUG_AUTOFIT is defined, FreeType provides some means to */
|
||||
/* control the autofitter behaviour for debugging purposes with global */
|
||||
/* boolean variables (consequently, you should *never* enable this */
|
||||
/* while compiling in `release' mode): */
|
||||
/* */
|
||||
/* _af_debug_disable_horz_hints */
|
||||
/* _af_debug_disable_vert_hints */
|
||||
/* _af_debug_disable_blue_hints */
|
||||
/* */
|
||||
/* Additionally, the following functions provide dumps of various */
|
||||
/* internal autofit structures to stdout (using `printf'): */
|
||||
/* */
|
||||
/* af_glyph_hints_dump_points */
|
||||
/* af_glyph_hints_dump_segments */
|
||||
/* af_glyph_hints_dump_edges */
|
||||
/* */
|
||||
/* As an argument, they use another global variable: */
|
||||
/* */
|
||||
/* _af_debug_hints */
|
||||
/* */
|
||||
/* Please have a look at the `ftgrid' demo program to see how those */
|
||||
/* variables and macros should be used. */
|
||||
/* */
|
||||
/* Do not #undef these macros here since the build system might define */
|
||||
/* them for certain configurations only. */
|
||||
/* */
|
||||
/* #define FT_DEBUG_AUTOFIT */
|
||||
|
||||
|
||||
/*************************************************************************/
|
||||
/* */
|
||||
/* Memory Debugging */
|
||||
|
@ -4,7 +4,7 @@
|
||||
/* */
|
||||
/* Tracing handling (specification only). */
|
||||
/* */
|
||||
/* Copyright 2002, 2004, 2005, 2006, 2007 by */
|
||||
/* Copyright 2002, 2004-2007, 2009, 2011 by */
|
||||
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
|
||||
/* */
|
||||
/* This file is part of the FreeType project, and may only be used, */
|
||||
@ -135,5 +135,9 @@ FT_TRACE_DEF( gxvtrak )
|
||||
FT_TRACE_DEF( gxvprop )
|
||||
FT_TRACE_DEF( gxvlcar )
|
||||
|
||||
/* autofit components */
|
||||
FT_TRACE_DEF( aflatin )
|
||||
FT_TRACE_DEF( aflatin2 )
|
||||
FT_TRACE_DEF( afwarp )
|
||||
|
||||
/* END */
|
||||
|
@ -129,7 +129,7 @@
|
||||
}
|
||||
|
||||
|
||||
#ifdef AF_DEBUG
|
||||
#ifdef FT_DEBUG_AUTOFIT
|
||||
|
||||
#include FT_CONFIG_STANDARD_LIBRARY_H
|
||||
|
||||
@ -326,10 +326,10 @@
|
||||
}
|
||||
#endif
|
||||
|
||||
#else /* !AF_DEBUG */
|
||||
#else /* !FT_DEBUG_AUTOFIT */
|
||||
|
||||
/* these empty stubs are only used to link the `ftgrid' test program */
|
||||
/* when debugging is disabled */
|
||||
/* if debugging is disabled */
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
@ -359,7 +359,7 @@
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* !AF_DEBUG */
|
||||
#endif /* !FT_DEBUG_AUTOFIT */
|
||||
|
||||
|
||||
/* Compute the direction value of a given vector. */
|
||||
|
@ -364,7 +364,7 @@ FT_BEGIN_HEADER
|
||||
#define AF_HINTS_TEST_OTHER( h, f ) ( (h)->other_flags & (f) )
|
||||
|
||||
|
||||
#ifdef AF_DEBUG
|
||||
#ifdef FT_DEBUG_AUTOFIT
|
||||
|
||||
#define AF_HINTS_DO_HORIZONTAL( h ) \
|
||||
( !_af_debug_disable_horz_hints && \
|
||||
@ -379,7 +379,7 @@ FT_BEGIN_HEADER
|
||||
|
||||
#define AF_HINTS_DO_BLUES( h ) ( !_af_debug_disable_blue_hints )
|
||||
|
||||
#else /* !AF_DEBUG */
|
||||
#else /* !FT_DEBUG_AUTOFIT */
|
||||
|
||||
#define AF_HINTS_DO_HORIZONTAL( h ) \
|
||||
!AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_HORIZONTAL )
|
||||
@ -392,7 +392,7 @@ FT_BEGIN_HEADER
|
||||
|
||||
#define AF_HINTS_DO_BLUES( h ) 1
|
||||
|
||||
#endif /* !AF_DEBUG */
|
||||
#endif /* !FT_DEBUG_AUTOFIT */
|
||||
|
||||
|
||||
FT_LOCAL( AF_Direction )
|
||||
|
@ -18,6 +18,7 @@
|
||||
|
||||
#include <ft2build.h>
|
||||
#include FT_ADVANCES_H
|
||||
#include FT_INTERNAL_DEBUG_H
|
||||
|
||||
#include "aflatin.h"
|
||||
#include "aferrors.h"
|
||||
@ -28,6 +29,16 @@
|
||||
#endif
|
||||
|
||||
|
||||
/*************************************************************************/
|
||||
/* */
|
||||
/* 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_aflatin
|
||||
|
||||
|
||||
/*************************************************************************/
|
||||
/*************************************************************************/
|
||||
/***** *****/
|
||||
@ -191,8 +202,8 @@
|
||||
/* `af_latin_blue_chars[blues]' string, then finding its top-most or */
|
||||
/* bottom-most points (depending on `AF_IS_TOP_BLUE') */
|
||||
|
||||
AF_LOG(( "blue zones computation\n" ));
|
||||
AF_LOG(( "------------------------------------------------\n" ));
|
||||
FT_TRACE5(( "blue zones computation\n" ));
|
||||
FT_TRACE5(( "------------------------------------------------\n" ));
|
||||
|
||||
for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ )
|
||||
{
|
||||
@ -202,7 +213,7 @@
|
||||
FT_Pos* blue_shoot;
|
||||
|
||||
|
||||
AF_LOG(( "blue %3d: ", bb ));
|
||||
FT_TRACE5(( "blue %3d: ", bb ));
|
||||
|
||||
num_flats = 0;
|
||||
num_rounds = 0;
|
||||
@ -216,7 +227,7 @@
|
||||
FT_Bool round = 0;
|
||||
|
||||
|
||||
AF_LOG(( "'%c'", *p ));
|
||||
FT_TRACE5(( "'%c'", *p ));
|
||||
|
||||
/* load the character in the face -- skip unknown or empty ones */
|
||||
glyph_index = FT_Get_Char_Index( face, (FT_UInt)*p );
|
||||
@ -281,7 +292,7 @@
|
||||
best_last = last;
|
||||
}
|
||||
}
|
||||
AF_LOG(( "%5d", best_y ));
|
||||
FT_TRACE5(( "%5d", best_y ));
|
||||
}
|
||||
|
||||
/* now check whether the point belongs to a straight or round */
|
||||
@ -329,7 +340,7 @@
|
||||
FT_CURVE_TAG( glyph->outline.tags[prev] ) != FT_CURVE_TAG_ON ||
|
||||
FT_CURVE_TAG( glyph->outline.tags[next] ) != FT_CURVE_TAG_ON );
|
||||
|
||||
AF_LOG(( "%c ", round ? 'r' : 'f' ));
|
||||
FT_TRACE5(( "%c ", round ? 'r' : 'f' ));
|
||||
}
|
||||
|
||||
if ( round )
|
||||
@ -338,7 +349,7 @@
|
||||
flats[num_flats++] = best_y;
|
||||
}
|
||||
|
||||
AF_LOG(( "\n" ));
|
||||
FT_TRACE5(( "\n" ));
|
||||
|
||||
if ( num_flats == 0 && num_rounds == 0 )
|
||||
{
|
||||
@ -346,7 +357,7 @@
|
||||
* we couldn't find a single glyph to compute this blue zone,
|
||||
* we will simply ignore it then
|
||||
*/
|
||||
AF_LOG(( "empty\n" ));
|
||||
FT_TRACE5(( "empty\n" ));
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -405,7 +416,7 @@
|
||||
if ( bb == AF_LATIN_BLUE_SMALL_TOP )
|
||||
blue->flags |= AF_LATIN_BLUE_ADJUSTMENT;
|
||||
|
||||
AF_LOG(( "-- ref = %ld, shoot = %ld\n", *blue_ref, *blue_shoot ));
|
||||
FT_TRACE5(( "-- ref = %ld, shoot = %ld\n", *blue_ref, *blue_shoot ));
|
||||
}
|
||||
|
||||
return;
|
||||
@ -1716,10 +1727,10 @@
|
||||
|
||||
stem_edge->pos = base_edge->pos + fitted_width;
|
||||
|
||||
AF_LOG(( "LINK: edge %d (opos=%.2f) linked to (%.2f),"
|
||||
" dist was %.2f, now %.2f\n",
|
||||
stem_edge-hints->axis[dim].edges, stem_edge->opos / 64.0,
|
||||
stem_edge->pos / 64.0, dist / 64.0, fitted_width / 64.0 ));
|
||||
FT_TRACE5(( "LINK: edge %d (opos=%.2f) linked to (%.2f),"
|
||||
" dist was %.2f, now %.2f\n",
|
||||
stem_edge-hints->axis[dim].edges, stem_edge->opos / 64.0,
|
||||
stem_edge->pos / 64.0, dist / 64.0, fitted_width / 64.0 ));
|
||||
}
|
||||
|
||||
|
||||
@ -1794,10 +1805,10 @@
|
||||
if ( !edge1 )
|
||||
continue;
|
||||
|
||||
AF_LOG(( "BLUE: edge %d (opos=%.2f) snapped to (%.2f),"
|
||||
" was (%.2f)\n",
|
||||
edge1 - edges, edge1->opos / 64.0, blue->fit / 64.0,
|
||||
edge1->pos / 64.0 ));
|
||||
FT_TRACE5(( "BLUE: edge %d (opos=%.2f) snapped to (%.2f),"
|
||||
" was (%.2f)\n",
|
||||
edge1 - edges, edge1->opos / 64.0, blue->fit / 64.0,
|
||||
edge1->pos / 64.0 ));
|
||||
|
||||
edge1->pos = blue->fit;
|
||||
edge1->flags |= AF_EDGE_DONE;
|
||||
@ -1836,7 +1847,7 @@
|
||||
/* this should not happen, but it's better to be safe */
|
||||
if ( edge2->blue_edge )
|
||||
{
|
||||
AF_LOG(( "ASSERTION FAILED for edge %d\n", edge2-edges ));
|
||||
FT_TRACE5(( "ASSERTION FAILED for edge %d\n", edge2-edges ));
|
||||
|
||||
af_latin_align_linked_edge( hints, dim, edge2, edge );
|
||||
edge->flags |= AF_EDGE_DONE;
|
||||
@ -1891,11 +1902,11 @@
|
||||
else
|
||||
edge->pos = FT_PIX_ROUND( edge->opos );
|
||||
|
||||
AF_LOG(( "ANCHOR: edge %d (opos=%.2f) and %d (opos=%.2f)"
|
||||
" snapped to (%.2f) (%.2f)\n",
|
||||
edge - edges, edge->opos / 64.0,
|
||||
edge2 - edges, edge2->opos / 64.0,
|
||||
edge->pos / 64.0, edge2->pos / 64.0 ));
|
||||
FT_TRACE5(( "ANCHOR: edge %d (opos=%.2f) and %d (opos=%.2f)"
|
||||
" snapped to (%.2f) (%.2f)\n",
|
||||
edge - edges, edge->opos / 64.0,
|
||||
edge2 - edges, edge2->opos / 64.0,
|
||||
edge->pos / 64.0, edge2->pos / 64.0 ));
|
||||
anchor = edge;
|
||||
|
||||
edge->flags |= AF_EDGE_DONE;
|
||||
@ -1954,11 +1965,11 @@
|
||||
edge->pos = cur_pos1 - cur_len / 2;
|
||||
edge2->pos = cur_pos1 + cur_len / 2;
|
||||
|
||||
AF_LOG(( "STEM: %d (opos=%.2f) to %d (opos=%.2f)"
|
||||
" snapped to (%.2f) and (%.2f)\n",
|
||||
edge - edges, edge->opos / 64.0,
|
||||
edge2 - edges, edge2->opos / 64.0,
|
||||
edge->pos / 64.0, edge2->pos / 64.0 ));
|
||||
FT_TRACE5(( "STEM: %d (opos=%.2f) to %d (opos=%.2f)"
|
||||
" snapped to (%.2f) and (%.2f)\n",
|
||||
edge - edges, edge->opos / 64.0,
|
||||
edge2 - edges, edge2->opos / 64.0,
|
||||
edge->pos / 64.0, edge2->pos / 64.0 ));
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1984,11 +1995,11 @@
|
||||
edge->pos = ( delta1 < delta2 ) ? cur_pos1 : cur_pos2;
|
||||
edge2->pos = edge->pos + cur_len;
|
||||
|
||||
AF_LOG(( "STEM: %d (opos=%.2f) to %d (opos=%.2f)"
|
||||
" snapped to (%.2f) and (%.2f)\n",
|
||||
edge - edges, edge->opos / 64.0,
|
||||
edge2 - edges, edge2->opos / 64.0,
|
||||
edge->pos / 64.0, edge2->pos / 64.0 ));
|
||||
FT_TRACE5(( "STEM: %d (opos=%.2f) to %d (opos=%.2f)"
|
||||
" snapped to (%.2f) and (%.2f)\n",
|
||||
edge - edges, edge->opos / 64.0,
|
||||
edge2 - edges, edge2->opos / 64.0,
|
||||
edge->pos / 64.0, edge2->pos / 64.0 ));
|
||||
}
|
||||
|
||||
edge->flags |= AF_EDGE_DONE;
|
||||
@ -1996,8 +2007,8 @@
|
||||
|
||||
if ( edge > edges && edge->pos < edge[-1].pos )
|
||||
{
|
||||
AF_LOG(( "BOUND: %d (pos=%.2f) to (%.2f)\n",
|
||||
edge - edges, edge->pos / 64.0, edge[-1].pos / 64.0 ));
|
||||
FT_TRACE5(( "BOUND: %d (pos=%.2f) to (%.2f)\n",
|
||||
edge - edges, edge->pos / 64.0, edge[-1].pos / 64.0 ));
|
||||
edge->pos = edge[-1].pos;
|
||||
}
|
||||
}
|
||||
@ -2091,16 +2102,17 @@
|
||||
if ( delta < 64 + 16 )
|
||||
{
|
||||
af_latin_align_serif_edge( hints, edge->serif, edge );
|
||||
AF_LOG(( "SERIF: edge %d (opos=%.2f) serif to %d (opos=%.2f)"
|
||||
" aligned to (%.2f)\n",
|
||||
edge - edges, edge->opos / 64.0,
|
||||
edge->serif - edges, edge->serif->opos / 64.0,
|
||||
edge->pos / 64.0 ));
|
||||
FT_TRACE5(( "SERIF: edge %d (opos=%.2f) serif to %d (opos=%.2f)"
|
||||
" aligned to (%.2f)\n",
|
||||
edge - edges, edge->opos / 64.0,
|
||||
edge->serif - edges, edge->serif->opos / 64.0,
|
||||
edge->pos / 64.0 ));
|
||||
}
|
||||
else if ( !anchor )
|
||||
{
|
||||
AF_LOG(( "SERIF_ANCHOR: edge %d (opos=%.2f) snapped to (%.2f)\n",
|
||||
edge-edges, edge->opos / 64.0, edge->pos / 64.0 ));
|
||||
FT_TRACE5(( "SERIF_ANCHOR: edge %d (opos=%.2f)"
|
||||
" snapped to (%.2f)\n",
|
||||
edge-edges, edge->opos / 64.0, edge->pos / 64.0 ));
|
||||
edge->pos = FT_PIX_ROUND( edge->opos );
|
||||
anchor = edge;
|
||||
}
|
||||
@ -2128,19 +2140,20 @@
|
||||
after->pos - before->pos,
|
||||
after->opos - before->opos );
|
||||
|
||||
AF_LOG(( "SERIF_LINK1: edge %d (opos=%.2f) snapped to (%.2f)"
|
||||
" from %d (opos=%.2f)\n",
|
||||
edge - edges, edge->opos / 64.0,
|
||||
edge->pos / 64.0,
|
||||
before - edges, before->opos / 64.0 ));
|
||||
FT_TRACE5(( "SERIF_LINK1: edge %d (opos=%.2f) snapped to (%.2f)"
|
||||
" from %d (opos=%.2f)\n",
|
||||
edge - edges, edge->opos / 64.0,
|
||||
edge->pos / 64.0,
|
||||
before - edges, before->opos / 64.0 ));
|
||||
}
|
||||
else
|
||||
{
|
||||
edge->pos = anchor->pos +
|
||||
( ( edge->opos - anchor->opos + 16 ) & ~31 );
|
||||
|
||||
AF_LOG(( "SERIF_LINK2: edge %d (opos=%.2f) snapped to (%.2f)\n",
|
||||
edge - edges, edge->opos / 64.0, edge->pos / 64.0 ));
|
||||
FT_TRACE5(( "SERIF_LINK2: edge %d (opos=%.2f)"
|
||||
" snapped to (%.2f)\n",
|
||||
edge - edges, edge->opos / 64.0, edge->pos / 64.0 ));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -27,6 +27,17 @@
|
||||
#include "afwarp.h"
|
||||
#endif
|
||||
|
||||
|
||||
/*************************************************************************/
|
||||
/* */
|
||||
/* 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_aflatin2
|
||||
|
||||
|
||||
FT_LOCAL_DEF( FT_Error )
|
||||
af_latin2_hints_compute_segments( AF_GlyphHints hints,
|
||||
AF_Dimension dim );
|
||||
@ -187,8 +198,8 @@
|
||||
/* 'af_latin2_blue_chars[blues]' string, then compute its top-most or */
|
||||
/* bottom-most points (depending on `AF_IS_TOP_BLUE') */
|
||||
|
||||
AF_LOG(( "blue zones computation\n" ));
|
||||
AF_LOG(( "------------------------------------------------\n" ));
|
||||
FT_TRACE5(( "blue zones computation\n" ));
|
||||
FT_TRACE5(( "------------------------------------------------\n" ));
|
||||
|
||||
for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ )
|
||||
{
|
||||
@ -198,7 +209,7 @@
|
||||
FT_Pos* blue_shoot;
|
||||
|
||||
|
||||
AF_LOG(( "blue %3d: ", bb ));
|
||||
FT_TRACE5(( "blue %3d: ", bb ));
|
||||
|
||||
num_flats = 0;
|
||||
num_rounds = 0;
|
||||
@ -211,7 +222,7 @@
|
||||
FT_Bool round;
|
||||
|
||||
|
||||
AF_LOG(( "'%c'", *p ));
|
||||
FT_TRACE5(( "'%c'", *p ));
|
||||
|
||||
/* load the character in the face -- skip unknown or empty ones */
|
||||
glyph_index = FT_Get_Char_Index( face, (FT_UInt)*p );
|
||||
@ -274,7 +285,7 @@
|
||||
best_last = last;
|
||||
}
|
||||
}
|
||||
AF_LOG(( "%5d", best_y ));
|
||||
FT_TRACE5(( "%5d", best_y ));
|
||||
}
|
||||
|
||||
/* now check whether the point belongs to a straight or round */
|
||||
@ -322,7 +333,7 @@
|
||||
FT_CURVE_TAG( glyph->outline.tags[start] ) != FT_CURVE_TAG_ON ||
|
||||
FT_CURVE_TAG( glyph->outline.tags[ end ] ) != FT_CURVE_TAG_ON );
|
||||
|
||||
AF_LOG(( "%c ", round ? 'r' : 'f' ));
|
||||
FT_TRACE5(( "%c ", round ? 'r' : 'f' ));
|
||||
}
|
||||
|
||||
if ( round )
|
||||
@ -331,7 +342,7 @@
|
||||
flats[num_flats++] = best_y;
|
||||
}
|
||||
|
||||
AF_LOG(( "\n" ));
|
||||
FT_TRACE5(( "\n" ));
|
||||
|
||||
if ( num_flats == 0 && num_rounds == 0 )
|
||||
{
|
||||
@ -339,7 +350,7 @@
|
||||
* we couldn't find a single glyph to compute this blue zone,
|
||||
* we will simply ignore it then
|
||||
*/
|
||||
AF_LOG(( "empty\n" ));
|
||||
FT_TRACE5(( "empty\n" ));
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -397,7 +408,7 @@
|
||||
if ( bb == AF_LATIN_BLUE_SMALL_TOP )
|
||||
blue->flags |= AF_LATIN_BLUE_ADJUSTMENT;
|
||||
|
||||
AF_LOG(( "-- ref = %ld, shoot = %ld\n", *blue_ref, *blue_shoot ));
|
||||
FT_TRACE5(( "-- ref = %ld, shoot = %ld\n", *blue_ref, *blue_shoot ));
|
||||
}
|
||||
|
||||
return;
|
||||
@ -549,8 +560,10 @@
|
||||
if ( scaled != fitted )
|
||||
{
|
||||
scale = FT_MulDiv( scale, fitted, scaled );
|
||||
AF_LOG(( "== scaled x-top = %.2g fitted = %.2g, scaling = %.4g\n",
|
||||
scaled / 64.0, fitted / 64.0, ( fitted * 1.0 ) / scaled ));
|
||||
FT_TRACE5(( "== scaled x-top = %.2g"
|
||||
" fitted = %.2g, scaling = %.4g\n",
|
||||
scaled / 64.0, fitted / 64.0,
|
||||
( fitted * 1.0 ) / scaled ));
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@ -626,11 +639,11 @@
|
||||
blue->ref.fit = FT_PIX_ROUND( blue->ref.cur );
|
||||
blue->shoot.fit = blue->ref.fit + delta2;
|
||||
|
||||
AF_LOG(( ">> activating blue zone %d:"
|
||||
" ref.cur=%.2g ref.fit=%.2g"
|
||||
" shoot.cur=%.2g shoot.fit=%.2g\n",
|
||||
nn, blue->ref.cur / 64.0, blue->ref.fit / 64.0,
|
||||
blue->shoot.cur / 64.0, blue->shoot.fit / 64.0 ));
|
||||
FT_TRACE5(( ">> activating blue zone %d:"
|
||||
" ref.cur=%.2g ref.fit=%.2g"
|
||||
" shoot.cur=%.2g shoot.fit=%.2g\n",
|
||||
nn, blue->ref.cur / 64.0, blue->ref.fit / 64.0,
|
||||
blue->shoot.cur / 64.0, blue->shoot.fit / 64.0 ));
|
||||
|
||||
blue->flags |= AF_LATIN_BLUE_ACTIVE;
|
||||
}
|
||||
@ -1762,10 +1775,10 @@
|
||||
|
||||
stem_edge->pos = base_edge->pos + fitted_width;
|
||||
|
||||
AF_LOG(( "LINK: edge %d (opos=%.2f) linked to (%.2f), "
|
||||
"dist was %.2f, now %.2f\n",
|
||||
stem_edge-hints->axis[dim].edges, stem_edge->opos / 64.0,
|
||||
stem_edge->pos / 64.0, dist / 64.0, fitted_width / 64.0 ));
|
||||
FT_TRACE5(( "LINK: edge %d (opos=%.2f) linked to (%.2f), "
|
||||
"dist was %.2f, now %.2f\n",
|
||||
stem_edge-hints->axis[dim].edges, stem_edge->opos / 64.0,
|
||||
stem_edge->pos / 64.0, dist / 64.0, fitted_width / 64.0 ));
|
||||
}
|
||||
|
||||
|
||||
@ -1805,8 +1818,8 @@
|
||||
|
||||
|
||||
|
||||
AF_LOG(( "==== hinting %s edges =====\n",
|
||||
dim == AF_DIMENSION_HORZ ? "vertical" : "horizontal" ));
|
||||
FT_TRACE5(( "==== hinting %s edges =====\n",
|
||||
dim == AF_DIMENSION_HORZ ? "vertical" : "horizontal" ));
|
||||
|
||||
/* we begin by aligning all stems relative to the blue zone */
|
||||
/* if needed -- that's only for horizontal edges */
|
||||
@ -1840,10 +1853,10 @@
|
||||
if ( !edge1 )
|
||||
continue;
|
||||
|
||||
AF_LOG(( "BLUE: edge %d (opos=%.2f) snapped to (%.2f), "
|
||||
"was (%.2f)\n",
|
||||
edge1-edges, edge1->opos / 64.0, blue->fit / 64.0,
|
||||
edge1->pos / 64.0 ));
|
||||
FT_TRACE5(( "BLUE: edge %d (opos=%.2f) snapped to (%.2f), "
|
||||
"was (%.2f)\n",
|
||||
edge1-edges, edge1->opos / 64.0, blue->fit / 64.0,
|
||||
edge1->pos / 64.0 ));
|
||||
|
||||
edge1->pos = blue->fit;
|
||||
edge1->flags |= AF_EDGE_DONE;
|
||||
@ -1888,7 +1901,7 @@
|
||||
/* this should not happen, but it's better to be safe */
|
||||
if ( edge2->blue_edge )
|
||||
{
|
||||
AF_LOG(( "ASSERTION FAILED for edge %d\n", edge2-edges ));
|
||||
FT_TRACE5(( "ASSERTION FAILED for edge %d\n", edge2-edges ));
|
||||
|
||||
af_latin2_align_linked_edge( hints, dim, edge2, edge );
|
||||
edge->flags |= AF_EDGE_DONE;
|
||||
@ -1939,11 +1952,11 @@
|
||||
else
|
||||
edge->pos = FT_PIX_ROUND( edge->opos );
|
||||
|
||||
AF_LOG(( "ANCHOR: edge %d (opos=%.2f) and %d (opos=%.2f) "
|
||||
"snapped to (%.2f) (%.2f)\n",
|
||||
edge-edges, edge->opos / 64.0,
|
||||
edge2-edges, edge2->opos / 64.0,
|
||||
edge->pos / 64.0, edge2->pos / 64.0 ));
|
||||
FT_TRACE5(( "ANCHOR: edge %d (opos=%.2f) and %d (opos=%.2f)"
|
||||
" snapped to (%.2f) (%.2f)\n",
|
||||
edge-edges, edge->opos / 64.0,
|
||||
edge2-edges, edge2->opos / 64.0,
|
||||
edge->pos / 64.0, edge2->pos / 64.0 ));
|
||||
anchor = edge;
|
||||
|
||||
edge->flags |= AF_EDGE_DONE;
|
||||
@ -1955,7 +1968,7 @@
|
||||
anchor_drift = ( (anchor->pos - anchor->opos) +
|
||||
(edge2->pos - edge2->opos)) >> 1;
|
||||
|
||||
AF_LOG(( "DRIFT: %.2f\n", anchor_drift/64.0 ));
|
||||
FT_TRACE5(( "DRIFT: %.2f\n", anchor_drift/64.0 ));
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1975,13 +1988,13 @@
|
||||
org_left = org_pos + ((org_len - cur_len) >> 1);
|
||||
org_right = org_pos + ((org_len + cur_len) >> 1);
|
||||
|
||||
AF_LOG(( "ALIGN: left=%.2f right=%.2f ",
|
||||
org_left / 64.0, org_right / 64.0 ));
|
||||
FT_TRACE5(( "ALIGN: left=%.2f right=%.2f ",
|
||||
org_left / 64.0, org_right / 64.0 ));
|
||||
cur_center = org_center;
|
||||
|
||||
if ( edge2->flags & AF_EDGE_DONE )
|
||||
{
|
||||
AF_LOG(( "\n" ));
|
||||
FT_TRACE5(( "\n" ));
|
||||
edge->pos = edge2->pos - cur_len;
|
||||
}
|
||||
else
|
||||
@ -1996,14 +2009,14 @@
|
||||
/* note: don't even try to fit tiny stems */
|
||||
if ( cur_len < 32 )
|
||||
{
|
||||
AF_LOG(( "tiny stem\n" ));
|
||||
FT_TRACE5(( "tiny stem\n" ));
|
||||
goto AlignStem;
|
||||
}
|
||||
|
||||
/* if the span is within a single pixel, don't touch it */
|
||||
if ( FT_PIX_FLOOR(org_left) == FT_PIX_CEIL(org_right) )
|
||||
{
|
||||
AF_LOG(( "single pixel stem\n" ));
|
||||
FT_TRACE5(( "single pixel stem\n" ));
|
||||
goto AlignStem;
|
||||
}
|
||||
|
||||
@ -2026,14 +2039,14 @@
|
||||
delta = FT_ABS(fit - org);
|
||||
displacements[count] = fit - org;
|
||||
scores[count++] = delta;
|
||||
AF_LOG(( "dispA=%.2f (%d) ", (fit - org)/64.0, delta ));
|
||||
FT_TRACE5(( "dispA=%.2f (%d) ", (fit - org) / 64.0, delta ));
|
||||
|
||||
org = frac_right;
|
||||
fit = (org <= 32) ? 16 : 48;
|
||||
delta = FT_ABS(fit - org);
|
||||
displacements[count] = fit - org;
|
||||
scores[count++] = delta;
|
||||
AF_LOG(( "dispB=%.2f (%d) ", (fit - org)/64.0, delta ));
|
||||
FT_TRACE5(( "dispB=%.2f (%d) ", (fit - org) / 64.0, delta ));
|
||||
}
|
||||
}
|
||||
|
||||
@ -2043,7 +2056,7 @@
|
||||
delta = FT_ABS(fit - org);
|
||||
displacements[count] = fit - org;
|
||||
scores[count++] = delta;
|
||||
AF_LOG(( "dispC=%.2f (%d) ", (fit - org)/64.0, delta ));
|
||||
FT_TRACE5(( "dispC=%.2f (%d) ", (fit - org) / 64.0, delta ));
|
||||
|
||||
/* snapping the right edge to the grid */
|
||||
org = org_right;
|
||||
@ -2051,7 +2064,7 @@
|
||||
delta = FT_ABS(fit - org);
|
||||
displacements[count] = fit - org;
|
||||
scores[count++] = delta;
|
||||
AF_LOG(( "dispD=%.2f (%d) ", (fit - org)/64.0, delta ));
|
||||
FT_TRACE5(( "dispD=%.2f (%d) ", (fit - org) / 64.0, delta ));
|
||||
|
||||
/* now find the best displacement */
|
||||
{
|
||||
@ -2070,27 +2083,28 @@
|
||||
|
||||
cur_center = org_center + best_disp;
|
||||
}
|
||||
AF_LOG(( "\n" ));
|
||||
FT_TRACE5(( "\n" ));
|
||||
}
|
||||
|
||||
AlignStem:
|
||||
edge->pos = cur_center - (cur_len >> 1);
|
||||
edge2->pos = edge->pos + cur_len;
|
||||
|
||||
AF_LOG(( "STEM1: %d (opos=%.2f) to %d (opos=%.2f)"
|
||||
" snapped to (%.2f) and (%.2f), org_len=%.2f cur_len=%.2f\n",
|
||||
edge-edges, edge->opos / 64.0,
|
||||
edge2-edges, edge2->opos / 64.0,
|
||||
edge->pos / 64.0, edge2->pos / 64.0,
|
||||
org_len / 64.0, cur_len / 64.0 ));
|
||||
FT_TRACE5(( "STEM1: %d (opos=%.2f) to %d (opos=%.2f)"
|
||||
" snapped to (%.2f) and (%.2f),"
|
||||
" org_len=%.2f cur_len=%.2f\n",
|
||||
edge-edges, edge->opos / 64.0,
|
||||
edge2-edges, edge2->opos / 64.0,
|
||||
edge->pos / 64.0, edge2->pos / 64.0,
|
||||
org_len / 64.0, cur_len / 64.0 ));
|
||||
|
||||
edge->flags |= AF_EDGE_DONE;
|
||||
edge2->flags |= AF_EDGE_DONE;
|
||||
|
||||
if ( edge > edges && edge->pos < edge[-1].pos )
|
||||
{
|
||||
AF_LOG(( "BOUND: %d (pos=%.2f) to (%.2f)\n",
|
||||
edge-edges, edge->pos / 64.0, edge[-1].pos / 64.0 ));
|
||||
FT_TRACE5(( "BOUND: %d (pos=%.2f) to (%.2f)\n",
|
||||
edge-edges, edge->pos / 64.0, edge[-1].pos / 64.0 ));
|
||||
edge->pos = edge[-1].pos;
|
||||
}
|
||||
}
|
||||
@ -2190,16 +2204,17 @@
|
||||
if ( delta < 64 + 16 )
|
||||
{
|
||||
af_latin2_align_serif_edge( hints, edge->serif, edge );
|
||||
AF_LOG(( "SERIF: edge %d (opos=%.2f) serif to %d (opos=%.2f) "
|
||||
"aligned to (%.2f)\n",
|
||||
edge-edges, edge->opos / 64.0,
|
||||
edge->serif - edges, edge->serif->opos / 64.0,
|
||||
edge->pos / 64.0 ));
|
||||
FT_TRACE5(( "SERIF: edge %d (opos=%.2f) serif to %d (opos=%.2f)"
|
||||
" aligned to (%.2f)\n",
|
||||
edge-edges, edge->opos / 64.0,
|
||||
edge->serif - edges, edge->serif->opos / 64.0,
|
||||
edge->pos / 64.0 ));
|
||||
}
|
||||
else if ( !anchor )
|
||||
{
|
||||
AF_LOG(( "SERIF_ANCHOR: edge %d (opos=%.2f) snapped to (%.2f)\n",
|
||||
edge-edges, edge->opos / 64.0, edge->pos / 64.0 ));
|
||||
FT_TRACE5(( "SERIF_ANCHOR: edge %d (opos=%.2f)"
|
||||
" snapped to (%.2f)\n",
|
||||
edge-edges, edge->opos / 64.0, edge->pos / 64.0 ));
|
||||
edge->pos = FT_PIX_ROUND( edge->opos );
|
||||
anchor = edge;
|
||||
}
|
||||
@ -2226,18 +2241,19 @@
|
||||
FT_MulDiv( edge->opos - before->opos,
|
||||
after->pos - before->pos,
|
||||
after->opos - before->opos );
|
||||
AF_LOG(( "SERIF_LINK1: edge %d (opos=%.2f) snapped to (%.2f)"
|
||||
" from %d (opos=%.2f)\n",
|
||||
edge-edges, edge->opos / 64.0, edge->pos / 64.0,
|
||||
before - edges, before->opos / 64.0 ));
|
||||
FT_TRACE5(( "SERIF_LINK1: edge %d (opos=%.2f) snapped to (%.2f)"
|
||||
" from %d (opos=%.2f)\n",
|
||||
edge-edges, edge->opos / 64.0, edge->pos / 64.0,
|
||||
before - edges, before->opos / 64.0 ));
|
||||
}
|
||||
else
|
||||
{
|
||||
edge->pos = anchor->pos +
|
||||
( ( edge->opos - anchor->opos + 16 ) & ~31 );
|
||||
|
||||
AF_LOG(( "SERIF_LINK2: edge %d (opos=%.2f) snapped to (%.2f)\n",
|
||||
edge-edges, edge->opos / 64.0, edge->pos / 64.0 ));
|
||||
FT_TRACE5(( "SERIF_LINK2: edge %d (opos=%.2f)"
|
||||
" snapped to (%.2f)\n",
|
||||
edge-edges, edge->opos / 64.0, edge->pos / 64.0 ));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -31,7 +31,7 @@
|
||||
FT_ZERO( loader );
|
||||
|
||||
af_glyph_hints_init( &loader->hints, memory );
|
||||
#ifdef AF_DEBUG
|
||||
#ifdef FT_DEBUG_AUTOFIT
|
||||
_af_debug_hints = &loader->hints;
|
||||
#endif
|
||||
return FT_GlyphLoader_New( memory, &loader->gloader );
|
||||
@ -78,7 +78,7 @@
|
||||
loader->face = NULL;
|
||||
loader->globals = NULL;
|
||||
|
||||
#ifdef AF_DEBUG
|
||||
#ifdef FT_DEBUG_AUTOFIT
|
||||
_af_debug_hints = NULL;
|
||||
#endif
|
||||
FT_GlyphLoader_Done( loader->gloader );
|
||||
|
@ -20,8 +20,7 @@
|
||||
#include "afloader.h"
|
||||
#include "afpic.h"
|
||||
|
||||
#ifdef AF_DEBUG
|
||||
int _af_debug;
|
||||
#ifdef FT_DEBUG_AUTOFIT
|
||||
int _af_debug_disable_horz_hints;
|
||||
int _af_debug_disable_vert_hints;
|
||||
int _af_debug_disable_blue_hints;
|
||||
|
@ -53,25 +53,16 @@ FT_BEGIN_HEADER
|
||||
/*************************************************************************/
|
||||
/*************************************************************************/
|
||||
|
||||
#define xxAF_DEBUG
|
||||
|
||||
#ifdef AF_DEBUG
|
||||
#ifdef FT_DEBUG_AUTOFIT
|
||||
|
||||
#include FT_CONFIG_STANDARD_LIBRARY_H
|
||||
|
||||
#define AF_LOG( x ) do { if ( _af_debug ) printf x; } while ( 0 )
|
||||
|
||||
extern int _af_debug;
|
||||
extern int _af_debug_disable_horz_hints;
|
||||
extern int _af_debug_disable_vert_hints;
|
||||
extern int _af_debug_disable_blue_hints;
|
||||
extern void* _af_debug_hints;
|
||||
|
||||
#else /* !AF_DEBUG */
|
||||
|
||||
#define AF_LOG( x ) do { } while ( 0 ) /* nothing */
|
||||
|
||||
#endif /* !AF_DEBUG */
|
||||
#endif /* FT_DEBUG_AUTOFIT */
|
||||
|
||||
|
||||
/*************************************************************************/
|
||||
|
@ -27,6 +27,16 @@
|
||||
|
||||
#ifdef AF_CONFIG_OPTION_USE_WARPER
|
||||
|
||||
/*************************************************************************/
|
||||
/* */
|
||||
/* 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_afwarp
|
||||
|
||||
|
||||
/* The weights cover the range 0/64 - 63/64 of a pixel. Obviously, */
|
||||
/* values around a half pixel (which means exactly between two grid */
|
||||
/* lines) gets the worst weight. */
|
||||
@ -97,12 +107,12 @@
|
||||
|
||||
if ( idx_min < 0 || idx_min > idx_max || idx_max > 64 )
|
||||
{
|
||||
AF_LOG(( "invalid indices:\n"
|
||||
" min=%d max=%d, xx1=%ld xx2=%ld,\n"
|
||||
" x1min=%ld x1max=%ld, x2min=%ld x2max=%ld\n",
|
||||
idx_min, idx_max, xx1, xx2,
|
||||
warper->x1min, warper->x1max,
|
||||
warper->x2min, warper->x2max ));
|
||||
FT_TRACE5(( "invalid indices:\n"
|
||||
" min=%d max=%d, xx1=%ld xx2=%ld,\n"
|
||||
" x1min=%ld x1max=%ld, x2min=%ld x2max=%ld\n",
|
||||
idx_min, idx_max, xx1, xx2,
|
||||
warper->x1min, warper->x1max,
|
||||
warper->x2min, warper->x2max ));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user