diff --git a/ChangeLog b/ChangeLog index b5b69cb6d..10e217bd1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,11 +1,34 @@ +2006-01-21 Werner Lemberg + + * src/autofit/rules.mk (AUTOF_DRV_SRC): Add afwarp.c. + 2006-01-20 David Turner - * src/autofit/aflatin.c, src/autofit/afwarp.h, src/autofit/afwarp.c, - src/autofit/aftypes.h, src/autofit/afloader.c, - src/autofit/autofit.c: Adding experimental implementation of `warp - hinting' (new hinting algorithm for gray-level and LCD rendering). - It is disabled by default, you need to #define AF_USE_WARPER in - aftypes.h to enable it. + Adding experimental implementation of `warp hinting' (new hinting + algorithm for gray-level and LCD rendering). It is disabled by + default, you need to #define AF_USE_WARPER in aftypes.h. + + * src/autofit/afhints.c (af_glyph_hints_scale_dim) [AF_USE_WARPER]: + New function. + * src/autofit/afhints.h: Updated. + + * src/autofit/aflatin.c [AF_USE_WARPER]: Include afwarp.h. + (af_latin_hints_init) [AF_USE_WARPER]: Reset mode to + FT_RENDER_MODE_NORMAL if an LCD mode is selected. + (af_latin_hints_apply) [AF_USE_WARPER]: Call af_warper_compute + appropriately. + + * src/autofit/afloader.c (af_loader_load_g) [!AF_USER_WARPER]: + Isolate code for adjusting metrics. + + * src/autofit/aftypes.h (AF_USE_WARPER): New macro (commented out by + default). + + * src/autofit/afwarp.c, src/autofit/afwarp.h: New files. + + * src/autofit/autofit.c [AF_USE_WARPER]: Include afwarp.c. + + * src/autofit/Jamfile (_sources): Add afwarp. 2006-01-19 David Turner diff --git a/src/autofit/Jamfile b/src/autofit/Jamfile index bf10323e2..9f6dc2a69 100644 --- a/src/autofit/Jamfile +++ b/src/autofit/Jamfile @@ -1,6 +1,6 @@ # FreeType 2 src/autofit Jamfile # -# Copyright 2003, 2004, 2005 by +# Copyright 2003, 2004, 2005, 2006 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/src/autofit/afhints.c b/src/autofit/afhints.c index f38a33ec4..b011c15b0 100644 --- a/src/autofit/afhints.c +++ b/src/autofit/afhints.c @@ -4,7 +4,7 @@ /* */ /* Auto-fitter hinting routines (body). */ /* */ -/* Copyright 2003, 2004, 2005 by */ +/* Copyright 2003, 2004, 2005, 2006 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -1140,7 +1140,9 @@ } } + #ifdef AF_USE_WARPER + FT_LOCAL_DEF( void ) af_glyph_hints_scale_dim( AF_GlyphHints hints, AF_Dimension dim, @@ -1151,6 +1153,7 @@ AF_Point points_limit = points + hints->num_points; AF_Point point; + if ( dim == AF_DIMENSION_HORZ ) { for ( point = points; point < points_limit; point++ ) @@ -1162,6 +1165,7 @@ point->y = FT_MulFix( point->fy, scale ) + delta; } } + #endif /* AF_USE_WARPER */ /* END */ diff --git a/src/autofit/afhints.h b/src/autofit/afhints.h index a5a28ac2f..351e5daf7 100644 --- a/src/autofit/afhints.h +++ b/src/autofit/afhints.h @@ -4,7 +4,7 @@ /* */ /* Auto-fitter hinting routines (specification). */ /* */ -/* Copyright 2003, 2004, 2005 by */ +/* Copyright 2003, 2004, 2005, 2006 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/src/autofit/aflatin.c b/src/autofit/aflatin.c index 7a1b60bc7..ad704569a 100644 --- a/src/autofit/aflatin.c +++ b/src/autofit/aflatin.c @@ -4,7 +4,7 @@ /* */ /* Auto-fitter hinting routines for latin script (body). */ /* */ -/* Copyright 2003, 2004, 2005 by */ +/* Copyright 2003, 2004, 2005, 2006 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -24,6 +24,7 @@ #include "afwarp.h" #endif + /*************************************************************************/ /*************************************************************************/ /***** *****/ @@ -1955,9 +1956,10 @@ if ( dim == AF_DIMENSION_HORZ && metrics->root.scaler.render_mode == FT_RENDER_MODE_NORMAL ) { - AF_WarperRec warper; - FT_Fixed scale; - FT_Pos delta; + AF_WarperRec warper; + FT_Fixed scale; + FT_Pos delta; + af_warper_compute( &warper, hints, dim, &scale, &delta ); af_glyph_hints_scale_dim( hints, dim, scale, delta ); diff --git a/src/autofit/afloader.c b/src/autofit/afloader.c index f0e3cae5f..a24070ec1 100644 --- a/src/autofit/afloader.c +++ b/src/autofit/afloader.c @@ -4,7 +4,7 @@ /* */ /* Auto-fitter glyph loading routines (body). */ /* */ -/* Copyright 2003, 2004, 2005 by */ +/* Copyright 2003, 2004, 2005, 2006 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/src/autofit/aftypes.h b/src/autofit/aftypes.h index fbcf64014..117977bde 100644 --- a/src/autofit/aftypes.h +++ b/src/autofit/aftypes.h @@ -4,7 +4,7 @@ /* */ /* Auto-fitter types (specification only). */ /* */ -/* Copyright 2003, 2004, 2005 by */ +/* Copyright 2003, 2004, 2005, 2006 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/src/autofit/afwarp.c b/src/autofit/afwarp.c index d445cf16d..24129d88a 100644 --- a/src/autofit/afwarp.c +++ b/src/autofit/afwarp.c @@ -1,270 +1,307 @@ +/***************************************************************************/ +/* */ +/* afwarp.c */ +/* */ +/* Auto-fitter warping algorithm (body). */ +/* */ +/* Copyright 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + #include "afwarp.h" + #if 1 -static const AF_WarpScore -af_warper_weights[ 64 ] = -{ - 35, 20, 20, 20, 15, 12, 10, 5, 2, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -1, -2, -5, -8,-10,-10,-20,-20,-30,-30, + static const AF_WarpScore + af_warper_weights[64] = + { + 35, 20, 20, 20, 15, 12, 10, 5, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -1, -2, -5, -8,-10,-10,-20,-20,-30,-30, - -30,-30,-20,-20,-10,-10, -8, -5, -2, -1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 2, 5, 10, 12, 15, 20, 20, 20, -}; + -30,-30,-20,-20,-10,-10, -8, -5, -2, -1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 2, 5, 10, 12, 15, 20, 20, 20, + }; #else -static const AF_WarpScore -af_warper_weights[ 64 ] = -{ - 30, 20, 10, 5, 4, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, -1, -2, -2, -5, -5,-10,-10,-15,-20, + static const AF_WarpScore + af_warper_weights[64] = + { + 30, 20, 10, 5, 4, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -1, -2, -2, -5, -5,-10,-10,-15,-20, - -20,-15,-15,-10,-10, -5, -5, -2, -2, -1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 4, 5, 10, 20, -}; + -20,-15,-15,-10,-10, -5, -5, -2, -2, -1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 4, 5, 10, 20, + }; #endif -static void -af_warper_compute_line_best( AF_Warper warper, - FT_Fixed scale, - FT_Pos delta, - FT_Pos xx1, - FT_Pos xx2, - AF_WarpScore base_distort, - AF_Segment segments, - FT_UInt num_segments ) -{ - FT_Int idx_min, idx_max, idx0, xx1min, xx1max; - FT_UInt nn; - AF_WarpScore scores[64]; - for ( nn = 0; nn < 64; nn++ ) - scores[nn] = 0; - - idx0 = xx1 - warper->t1; - - /* compute minimum and maximum indices */ + static void + af_warper_compute_line_best( AF_Warper warper, + FT_Fixed scale, + FT_Pos delta, + FT_Pos xx1, + FT_Pos xx2, + AF_WarpScore base_distort, + AF_Segment segments, + FT_UInt num_segments ) { - FT_Pos xx1min = warper->x1min; - FT_Pos xx1max = warper->x1max; - FT_Pos w = xx2 - xx1; + FT_Int idx_min, idx_max, idx0, xx1min, xx1max; + FT_UInt nn; + AF_WarpScore scores[64]; - if ( xx1min + w < warper->x2min ) - xx1min = warper->x2min - (xx2-xx1); - xx1max = warper->x1max; - if ( xx1max + w > warper->x2max ) - xx1max = warper->x2max - (xx2-xx1); + for ( nn = 0; nn < 64; nn++ ) + scores[nn] = 0; - idx_min = xx1min - warper->t1; - idx_max = xx1max - warper->t1; + idx0 = xx1 - warper->t1; - if ( idx_min > idx_max ) + /* compute minimum and maximum indices */ { - printf( "invalid indices min=%d max=%d xx1=%d xx2=%d x1min=%d x1max=%d x2min=%d x2max=%d\n", - idx_min, idx_max, xx1, xx2, warper->x1min, warper->x1max, warper->x2min, warper->x2max ); + FT_Pos xx1min = warper->x1min; + FT_Pos xx1max = warper->x1max; + FT_Pos w = xx2 - xx1; + + + if ( xx1min + w < warper->x2min ) + xx1min = warper->x2min - ( xx2 - xx1 ); + + xx1max = warper->x1max; + if ( xx1max + w > warper->x2max ) + xx1max = warper->x2max - ( xx2 - xx1 ); + + idx_min = xx1min - warper->t1; + idx_max = xx1max - warper->t1; + + if ( idx_min > idx_max ) + { + printf( "invalid indices:\n" + " min=%d max=%d, xx1=%d xx2=%d,\n" + " x1min=%d x1max=%d, x2min=%d x2max=%d\n", + idx_min, idx_max, xx1, xx2, + warper->x1min, warper->x1max, warper->x2min, warper->x2max ); + return; + } + } + + for ( nn = 0; nn < num_segments; nn++ ) + { + FT_Pos len = segments[nn].max_coord - segments[nn].min_coord; + FT_Pos y0 = FT_MulFix( segments[nn].pos, scale ) + delta; + FT_Pos y = y0 + ( idx_min - idx0 ); + + FT_Int idx; + + + for ( idx = idx_min; idx <= idx_max; idx++, y++ ) + scores[idx] += af_warper_weights[y & 63] * len; + } + + /* find best score */ + { + FT_Int idx; + + + for ( idx = idx_min; idx <= idx_max; idx++ ) + { + AF_WarpScore score = scores[idx]; + AF_WarpScore distort = base_distort + ( idx - idx0 ); + + + if ( score > warper->best_score || + ( score == warper->best_score && + distort < warper->best_distort ) ) + { + warper->best_score = score; + warper->best_distort = distort; + warper->best_scale = scale; + warper->best_delta = delta + ( idx - idx0 ); + } + } + } + } + + + FT_LOCAL_DEF( void ) + af_warper_compute( AF_Warper warper, + AF_GlyphHints hints, + AF_Dimension dim, + FT_Fixed *a_scale, + FT_Pos *a_delta ) + { + AF_AxisHints axis; + AF_Point points; + + FT_Fixed org_scale; + FT_Pos org_delta; + + FT_UInt nn, num_points, num_segments; + FT_Int X1, X2; + FT_Int w; + + AF_WarpScore base_distort; + AF_Segment segments; + + + /* get original scaling transformation */ + if ( dim == AF_DIMENSION_VERT ) + { + org_scale = hints->y_scale; + org_delta = hints->y_delta; + } + else + { + org_scale = hints->x_scale; + org_delta = hints->x_delta; + } + + warper->best_scale = org_scale; + warper->best_delta = org_delta; + warper->best_score = 0; + warper->best_distort = 0; + + axis = &hints->axis[dim]; + segments = axis->segments; + num_segments = axis->num_segments; + points = hints->points; + num_points = hints->num_points; + + *a_scale = org_scale; + *a_delta = org_delta; + + /* get X1 and X2, minimum and maximum in original coordinates */ + if ( axis->num_segments < 1 ) return; - } - } - - for ( nn = 0; nn < num_segments; nn++ ) - { - FT_Pos len = segments[nn].max_coord - segments[nn].min_coord; - FT_Pos y0 = FT_MulFix( segments[nn].pos, scale ) + delta; - FT_Pos y = y0 + (idx_min - idx0); - FT_Int idx; - - for ( idx = idx_min; idx <= idx_max; idx++, y++ ) - scores[idx] += af_warper_weights[ y & 63 ]*len; - } - - /* find best score */ - { - FT_Int idx; - - for ( idx = idx_min; idx <= idx_max; idx++ ) - { - AF_WarpScore score = scores[idx]; - AF_WarpScore distort = base_distort + (idx - idx0); - - if ( score > warper->best_score || - ( score == warper->best_score && - distort < warper->best_distort ) ) - { - warper->best_score = score; - warper->best_distort = distort; - warper->best_scale = scale; - warper->best_delta = delta + (idx-idx0); - } - } - } -} - - -FT_LOCAL_DEF( void ) -af_warper_compute( AF_Warper warper, - AF_GlyphHints hints, - AF_Dimension dim, - FT_Fixed *a_scale, - FT_Pos *a_delta ) -{ - AF_AxisHints axis; - AF_Point points; - FT_Fixed org_scale; - FT_Pos org_delta; - FT_UInt nn, num_points, num_segments; - FT_Int X1, X2; - FT_Int w; - AF_WarpScore base_distort; - AF_Segment segments; - - /* get original scaling transform */ - if ( dim == AF_DIMENSION_VERT ) - { - org_scale = hints->y_scale; - org_delta = hints->y_delta; - } - else - { - org_scale = hints->x_scale; - org_delta = hints->x_delta; - } - - warper->best_scale = org_scale; - warper->best_delta = org_delta; - warper->best_score = 0; - warper->best_distort = 0; - - axis = &hints->axis[dim]; - segments = axis->segments; - num_segments = axis->num_segments; - points = hints->points; - num_points = hints->num_points; - - *a_scale = org_scale; - *a_delta = org_delta; - - /* get X1 and X2, minimum and maximum in original coordinates */ - if ( axis->num_segments < 1 ) - return; #if 1 - X1 = X2 = points[0].fx; - for ( nn = 1; nn < num_points; nn++ ) - { - FT_Int X = points[nn].fx; + X1 = X2 = points[0].fx; + for ( nn = 1; nn < num_points; nn++ ) + { + FT_Int X = points[nn].fx; - if ( X < X1 ) - X1 = X; - if ( X > X2 ) - X2 = X; - } + + if ( X < X1 ) + X1 = X; + if ( X > X2 ) + X2 = X; + } #else - X1 = X2 = segments[0].pos; - for ( nn = 1; nn < num_segments; nn++ ) - { - FT_Int X = segments[nn].pos; + X1 = X2 = segments[0].pos; + for ( nn = 1; nn < num_segments; nn++ ) + { + FT_Int X = segments[nn].pos; - if ( X < X1 ) - X1 = X; - if ( X > X2 ) - X2 = X; - } + + if ( X < X1 ) + X1 = X; + if ( X > X2 ) + X2 = X; + } #endif - if ( X1 >= X2 ) - return; + if ( X1 >= X2 ) + return; - warper->x1 = FT_MulFix( X1, org_scale ) + org_delta; - warper->x2 = FT_MulFix( X2, org_scale ) + org_delta; + warper->x1 = FT_MulFix( X1, org_scale ) + org_delta; + warper->x2 = FT_MulFix( X2, org_scale ) + org_delta; - warper->t1 = AF_WARPER_FLOOR(warper->x1); - warper->t2 = AF_WARPER_CEIL(warper->x2); + warper->t1 = AF_WARPER_FLOOR( warper->x1 ); + warper->t2 = AF_WARPER_CEIL( warper->x2 ); - warper->x1min = warper->x1 & ~31; - warper->x1max = warper->x1min + 32; - warper->x2min = warper->x2 & ~31; - warper->x2max = warper->x2min + 32; + warper->x1min = warper->x1 & ~31; + warper->x1max = warper->x1min + 32; + warper->x2min = warper->x2 & ~31; + warper->x2max = warper->x2min + 32; - if ( warper->x1max > warper->x2 ) - warper->x1max = warper->x2; + if ( warper->x1max > warper->x2 ) + warper->x1max = warper->x2; - if ( warper->x2min < warper->x1 ) - warper->x2min = warper->x1; + if ( warper->x2min < warper->x1 ) + warper->x2min = warper->x1; - warper->w0 = warper->x2 - warper->x1; + warper->w0 = warper->x2 - warper->x1; - if ( warper->w0 <= 64 ) - { - warper->x1max = warper->x1; - warper->x2min = warper->x2; - } - - warper->wmin = warper->x2min - warper->x1max; - warper->wmax = warper->x2max - warper->x1min; - - if ( warper->wmin < warper->w0 - 32 ) - warper->wmin = warper->w0 - 32; - - if ( warper->wmax > warper->w0 + 32 ) - warper->wmax = warper->w0 + 32; - - if ( warper->wmin < warper->w0*3/4 ) - warper->wmin = warper->w0*3/4; - - if ( warper->wmax > warper->w0*5/4 ) - warper->wmax = warper->w0*5/4; - - - /* warper->wmin = warper->wmax = warper->w0; */ - - for ( w = warper->wmin; w <= warper->wmax; w++ ) - { - FT_Int line = w - warper->wmin; - FT_Fixed new_scale; - FT_Pos new_delta; - FT_Pos xx1, xx2; - - xx1 = warper->x1; - xx2 = warper->x2; - if ( w >= warper->w0 ) + if ( warper->w0 <= 64 ) { - xx1 -= (w-warper->w0); - if ( xx1 < warper->x1min ) - { - xx2 += warper->x1min - xx1; - xx1 = warper->x1min; - } - } - else - { - xx1 -= (w-warper->w0); - if ( xx1 > warper->x1max ) - { - xx2 -= (xx1-warper->x1max); - xx1 = warper->x1max; - } + warper->x1max = warper->x1; + warper->x2min = warper->x2; } - if ( xx1 < warper->x1 ) - base_distort = warper->x1 - xx1; - else - base_distort = xx1 - warper->x1; + warper->wmin = warper->x2min - warper->x1max; + warper->wmax = warper->x2max - warper->x1min; - if ( xx2 < warper->x2 ) - base_distort += warper->x2 - xx2; - else - base_distort += xx2 - warper->x2; + if ( warper->wmin < warper->w0 - 32 ) + warper->wmin = warper->w0 - 32; - base_distort *= 10; + if ( warper->wmax > warper->w0 + 32 ) + warper->wmax = warper->w0 + 32; - new_scale = org_scale + FT_DivFix( w - warper->w0, X2-X1 ); - new_delta = xx1 - FT_MulFix( X1, new_scale ); + if ( warper->wmin < warper->w0 * 3 / 4 ) + warper->wmin = warper->w0 * 3 / 4; - af_warper_compute_line_best( warper, new_scale, new_delta, xx1, xx2, - base_distort, - segments, num_segments ); + if ( warper->wmax > warper->w0 * 5 / 4 ) + warper->wmax = warper->w0 * 5 / 4; + + /* warper->wmin = warper->wmax = warper->w0; */ + + for ( w = warper->wmin; w <= warper->wmax; w++ ) + { + FT_Int line = w - warper->wmin; + FT_Fixed new_scale; + FT_Pos new_delta; + FT_Pos xx1, xx2; + + + xx1 = warper->x1; + xx2 = warper->x2; + if ( w >= warper->w0 ) + { + xx1 -= w - warper->w0; + if ( xx1 < warper->x1min ) + { + xx2 += warper->x1min - xx1; + xx1 = warper->x1min; + } + } + else + { + xx1 -= w - warper->w0; + if ( xx1 > warper->x1max ) + { + xx2 -= xx1 - warper->x1max; + xx1 = warper->x1max; + } + } + + if ( xx1 < warper->x1 ) + base_distort = warper->x1 - xx1; + else + base_distort = xx1 - warper->x1; + + if ( xx2 < warper->x2 ) + base_distort += warper->x2 - xx2; + else + base_distort += xx2 - warper->x2; + + base_distort *= 10; + + new_scale = org_scale + FT_DivFix( w - warper->w0, X2 - X1 ); + new_delta = xx1 - FT_MulFix( X1, new_scale ); + + af_warper_compute_line_best( warper, new_scale, new_delta, xx1, xx2, + base_distort, + segments, num_segments ); + } + + *a_scale = warper->best_scale; + *a_delta = warper->best_delta; } - *a_scale = warper->best_scale; - *a_delta = warper->best_delta; -} +/* END */ diff --git a/src/autofit/afwarp.h b/src/autofit/afwarp.h index 86af0b8ee..6ca1ce7ba 100644 --- a/src/autofit/afwarp.h +++ b/src/autofit/afwarp.h @@ -1,3 +1,21 @@ +/***************************************************************************/ +/* */ +/* afwarp.h */ +/* */ +/* Auto-fitter warping algorithm (specification). */ +/* */ +/* Copyright 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + #ifndef __AFWARP_H__ #define __AFWARP_H__ @@ -5,36 +23,43 @@ FT_BEGIN_HEADER -#define AF_WARPER_SCALE +#define AF_WARPER_SCALE -#define AF_WARPER_FLOOR(x) ((x) & ~63) -#define AF_WARPER_CEIL(x) AF_WARPER_FLOOR((x)+63) +#define AF_WARPER_FLOOR( x ) ( (x) & ~63 ) +#define AF_WARPER_CEIL( x ) AF_WARPER_FLOOR( (x) + 63 ) -typedef FT_Int32 AF_WarpScore; -typedef struct -{ - FT_Int X1, X2; - FT_Pos x1, x2; - FT_Pos t1, t2; - FT_Pos x1min, x1max; - FT_Pos x2min, x2max; - FT_Pos w0, wmin, wmax; + typedef FT_Int32 AF_WarpScore; - FT_Fixed best_scale; - FT_Pos best_delta; - AF_WarpScore best_score; - AF_WarpScore best_distort; + typedef struct AF_WarperRec_ + { + FT_Int X1, X2; + FT_Pos x1, x2; + FT_Pos t1, t2; + FT_Pos x1min, x1max; + FT_Pos x2min, x2max; + FT_Pos w0, wmin, wmax; -} AF_WarperRec, *AF_Warper; + FT_Fixed best_scale; + FT_Pos best_delta; + AF_WarpScore best_score; + AF_WarpScore best_distort; + + } AF_WarperRec, *AF_Warper; + + + FT_LOCAL( void ) + af_warper_compute( AF_Warper warper, + AF_GlyphHints hints, + AF_Dimension dim, + FT_Fixed *a_scale, + FT_Fixed *a_delta ); -FT_LOCAL( void ) -af_warper_compute( AF_Warper warper, - AF_GlyphHints hints, - AF_Dimension dim, - FT_Fixed *a_scale, - FT_Fixed *a_delta ); FT_END_HEADER + #endif /* __AFWARP_H__ */ + + +/* END */ diff --git a/src/autofit/autofit.c b/src/autofit/autofit.c index 2526179c9..d7e88645d 100644 --- a/src/autofit/autofit.c +++ b/src/autofit/autofit.c @@ -4,7 +4,7 @@ /* */ /* Auto-fitter module (body). */ /* */ -/* Copyright 2003, 2004, 2005 by */ +/* Copyright 2003, 2004, 2005, 2006 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/src/autofit/rules.mk b/src/autofit/rules.mk index 7f7ff9975..e1bb9e32a 100644 --- a/src/autofit/rules.mk +++ b/src/autofit/rules.mk @@ -3,7 +3,7 @@ # -# Copyright 2003, 2004, 2005 by +# Copyright 2003, 2004, 2005, 2006 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, @@ -31,7 +31,8 @@ AUTOF_DRV_SRC := $(AUTOF_DIR)/afangles.c \ $(AUTOF_DIR)/afhints.c \ $(AUTOF_DIR)/aflatin.c \ $(AUTOF_DIR)/afloader.c \ - $(AUTOF_DIR)/afmodule.c + $(AUTOF_DIR)/afmodule.c \ + $(AUTOF_DIR)/afwarp.c # AUTOF driver headers #