diff --git a/ChangeLog b/ChangeLog index 8c37e9bfb..7efbb143d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,29 @@ +2015-04-21 Werner Lemberg + + [autofit] Introduce `warping' property. + + This code replaces the debugging hook from the previous commit with + a better, more generic solution. + + * include/ftautoh.h: Document it. + + * src/autofit/afmodule.h (AF_ModuleRec) + [AF_CONFIG_OPTION_USE_WARPER]: Add `warping' field. + + * src/autofit/afmodule.c (_af_debug_disable_warper): Remove. + (af_property_set, af_property_get, af_autofitter_init) + [AF_CONFIG_OPTION_USE_WARPER]: Handle `warping' option. + + * src/autofit/afhints.h (AF_HINTS_DO_WARP): Remove use of the no + longer existing `_af_debug_disable_warper'. + + * src/autofit/afcjk.c (af_cjk_hints_init), src/autofit/aflatin.c + (af_latin_hints_init), src/autofit/aflatin2.c (af_latin2_hints_init) + [AF_CONFIG_OPTION_USE_WARPER]: Add `AF_SCALER_FLAG_NO_WARPER' to the + scaler flags if warping is off. + + * src/autofit/aftypes.h: Updated. + 2015-04-16 Werner Lemberg [autofit] Add debugging hook to disable warper. diff --git a/devel/ftoption.h b/devel/ftoption.h index 2065142c8..805fe3de4 100644 --- a/devel/ftoption.h +++ b/devel/ftoption.h @@ -820,8 +820,10 @@ FT_BEGIN_HEADER /* grid. To find out the optimal scaling and shifting value, various */ /* parameter combinations are tried and scored. */ /* */ - /* This experimental option is only active if the render mode is */ - /* FT_RENDER_MODE_LIGHT. */ + /* This experimental option is active only if the rendering mode is */ + /* FT_RENDER_MODE_LIGHT; you can switch warping on and off with the */ + /* `warping' property of the auto-hinter (see file `ftautoh.h' for more */ + /* information). */ /* */ #define AF_CONFIG_OPTION_USE_WARPER diff --git a/include/config/ftoption.h b/include/config/ftoption.h index a8ca4c847..2243fcc82 100644 --- a/include/config/ftoption.h +++ b/include/config/ftoption.h @@ -820,8 +820,10 @@ FT_BEGIN_HEADER /* grid. To find out the optimal scaling and shifting value, various */ /* parameter combinations are tried and scored. */ /* */ - /* This experimental option is only active if the render mode is */ - /* FT_RENDER_MODE_LIGHT. */ + /* This experimental option is active only if the rendering mode is */ + /* FT_RENDER_MODE_LIGHT; you can switch warping on and off with the */ + /* `warping' property of the auto-hinter (see file `ftautoh.h' for more */ + /* information). */ /* */ /* #define AF_CONFIG_OPTION_USE_WARPER */ diff --git a/include/ftautoh.h b/include/ftautoh.h index 06941daa3..3f0ff9dec 100644 --- a/include/ftautoh.h +++ b/include/ftautoh.h @@ -300,7 +300,7 @@ FT_BEGIN_HEADER * @description: * *Experimental* *only* * - * If Freetype gets compiled with FT_CONFIG_OPTION_USE_HARFBUZZ to make + * If FreeType gets compiled with FT_CONFIG_OPTION_USE_HARFBUZZ to make * the HarfBuzz library access OpenType features for getting better * glyph coverages, this property sets the (auto-fitter) script to be * used for the default (OpenType) script data of a font's GSUB table. @@ -391,6 +391,54 @@ FT_BEGIN_HEADER } FT_Prop_IncreaseXHeight; + + /************************************************************************** + * + * @property: + * warping + * + * @description: + * *Experimental* *only* + * + * If FreeType gets compiled with option AF_CONFIG_OPTION_USE_WARPER to + * activate the warp hinting code in the auto-hinter, this property + * switches warping on and off. + * + * Warping only works in `light' auto-hinting mode. The idea of the + * code is to slightly scale and shift a glyph along the non-hinted + * dimension (which is usually the horizontal axis) so that as much of + * its segments are aligned (more or less) to the grid. To find out a + * glyph's optimal scaling and shifting value, various parameter + * combinations are tried and scored. + * + * By default, warping is on. The example below shows how to switch off + * warping (omitting the error handling). + * + * { + * FT_Library library; + * FT_Bool warping = 0; + * + * + * FT_Init_FreeType( &library ); + * + * FT_Property_Set( library, "autofitter", + * "warping", &warping ); + * } + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * The warping code can also change advance widths. Have a look at the + * `lsb_delta' and `rsb_delta' fields in the @FT_GlyphSlotRec structure + * for details on improving inter-glyph distances while rendering. + * + * Since warping is a global property of the auto-hinter it is best to + * change its value before rendering any face. Otherwise, you should + * reload all faces that get auto-hinted in `light' hinting mode. + * + */ + + /* */ diff --git a/src/autofit/afcjk.c b/src/autofit/afcjk.c index 31fe2cc9f..905408bb2 100644 --- a/src/autofit/afcjk.c +++ b/src/autofit/afcjk.c @@ -1334,6 +1334,12 @@ scaler_flags |= AF_SCALER_FLAG_NO_ADVANCE; +#ifdef AF_CONFIG_OPTION_USE_WARPER + /* get (global) warper flag */ + if ( !metrics->root.globals->module->warping ) + scaler_flags |= AF_SCALER_FLAG_NO_WARPER; +#endif + hints->scaler_flags = scaler_flags; hints->other_flags = other_flags; diff --git a/src/autofit/afhints.h b/src/autofit/afhints.h index 3a6dc6c15..a64c7a4b1 100644 --- a/src/autofit/afhints.h +++ b/src/autofit/afhints.h @@ -382,15 +382,8 @@ FT_BEGIN_HEADER ( !_af_debug_disable_vert_hints && \ !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_VERTICAL ) ) -#define AF_HINTS_DO_ADVANCE( h ) \ - !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_ADVANCE ) - #define AF_HINTS_DO_BLUES( h ) ( !_af_debug_disable_blue_hints ) -#define AF_HINTS_DO_WARP( h ) \ - ( !_af_debug_disable_warper && \ - !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_WARPER ) ) - #else /* !FT_DEBUG_AUTOFIT */ #define AF_HINTS_DO_HORIZONTAL( h ) \ @@ -399,15 +392,17 @@ FT_BEGIN_HEADER #define AF_HINTS_DO_VERTICAL( h ) \ !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_VERTICAL ) +#define AF_HINTS_DO_BLUES( h ) 1 + +#endif /* !FT_DEBUG_AUTOFIT */ + + #define AF_HINTS_DO_ADVANCE( h ) \ !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_ADVANCE ) -#define AF_HINTS_DO_BLUES( h ) 1 - #define AF_HINTS_DO_WARP( h ) \ !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_WARPER ) -#endif /* !FT_DEBUG_AUTOFIT */ FT_LOCAL( AF_Direction ) diff --git a/src/autofit/aflatin.c b/src/autofit/aflatin.c index 61d8724e9..893e98673 100644 --- a/src/autofit/aflatin.c +++ b/src/autofit/aflatin.c @@ -2004,6 +2004,12 @@ ( face->style_flags & FT_STYLE_FLAG_ITALIC ) != 0 ) scaler_flags |= AF_SCALER_FLAG_NO_HORIZONTAL; +#ifdef AF_CONFIG_OPTION_USE_WARPER + /* get (global) warper flag */ + if ( !metrics->root.globals->module->warping ) + scaler_flags |= AF_SCALER_FLAG_NO_WARPER; +#endif + hints->scaler_flags = scaler_flags; hints->other_flags = other_flags; diff --git a/src/autofit/aflatin2.c b/src/autofit/aflatin2.c index d23c65a73..ac9f93325 100644 --- a/src/autofit/aflatin2.c +++ b/src/autofit/aflatin2.c @@ -1550,6 +1550,12 @@ ( face->style_flags & FT_STYLE_FLAG_ITALIC ) != 0 ) scaler_flags |= AF_SCALER_FLAG_NO_HORIZONTAL; +#ifdef AF_CONFIG_OPTION_USE_WARPER + /* get (global) warper flag */ + if ( !metrics->root.globals->module->warping ) + scaler_flags |= AF_SCALER_FLAG_NO_WARPER; +#endif + hints->scaler_flags = scaler_flags; hints->other_flags = other_flags; diff --git a/src/autofit/afmodule.c b/src/autofit/afmodule.c index 06b05ce1f..57f97e921 100644 --- a/src/autofit/afmodule.c +++ b/src/autofit/afmodule.c @@ -26,7 +26,6 @@ int _af_debug_disable_horz_hints; int _af_debug_disable_vert_hints; int _af_debug_disable_blue_hints; - int _af_debug_disable_warper; /* we use a global object instead of a local one for debugging */ AF_GlyphHintsRec _af_debug_hints_rec[1]; @@ -146,6 +145,17 @@ return error; } +#ifdef AF_CONFIG_OPTION_USE_WARPER + else if ( !ft_strcmp( property_name, "warping" ) ) + { + FT_Bool* warping = (FT_Bool*)value; + + + module->warping = *warping; + + return error; + } +#endif /* AF_CONFIG_OPTION_USE_WARPER */ FT_TRACE0(( "af_property_set: missing property `%s'\n", property_name )); @@ -162,6 +172,9 @@ AF_Module module = (AF_Module)ft_module; FT_UInt fallback_style = module->fallback_style; FT_UInt default_script = module->default_script; +#ifdef AF_CONFIG_OPTION_USE_WARPER + FT_Bool warping = module->warping; +#endif if ( !ft_strcmp( property_name, "glyph-to-script-map" ) ) @@ -208,8 +221,18 @@ return error; } +#ifdef AF_CONFIG_OPTION_USE_WARPER + else if ( !ft_strcmp( property_name, "warping" ) ) + { + FT_Bool* val = (FT_Bool*)value; + *val = warping; + + return error; + } +#endif /* AF_CONFIG_OPTION_USE_WARPER */ + FT_TRACE0(( "af_property_get: missing property `%s'\n", property_name )); return FT_THROW( Missing_Property ); @@ -257,6 +280,9 @@ module->fallback_style = AF_STYLE_FALLBACK; module->default_script = AF_SCRIPT_DEFAULT; +#ifdef AF_CONFIG_OPTION_USE_WARPER + module->warping = 1; +#endif return FT_Err_Ok; } diff --git a/src/autofit/afmodule.h b/src/autofit/afmodule.h index b3c5979ec..b9c2fd8a2 100644 --- a/src/autofit/afmodule.h +++ b/src/autofit/afmodule.h @@ -28,7 +28,7 @@ FT_BEGIN_HEADER /* - * This is the `extended' FT_Module structure which holds the + * This is the `extended' FT_Module structure that holds the * autofitter's global data. */ @@ -38,11 +38,14 @@ FT_BEGIN_HEADER FT_UInt fallback_style; FT_UInt default_script; +#ifdef AF_CONFIG_OPTION_USE_WARPER + FT_Bool warping; +#endif } AF_ModuleRec, *AF_Module; -FT_DECLARE_MODULE(autofit_module_class) +FT_DECLARE_MODULE( autofit_module_class ) FT_END_HEADER diff --git a/src/autofit/aftypes.h b/src/autofit/aftypes.h index 0a4086076..78e3fd7ec 100644 --- a/src/autofit/aftypes.h +++ b/src/autofit/aftypes.h @@ -59,7 +59,6 @@ FT_BEGIN_HEADER extern int _af_debug_disable_horz_hints; extern int _af_debug_disable_vert_hints; extern int _af_debug_disable_blue_hints; -extern int _af_debug_disable_warper; extern void* _af_debug_hints; #endif /* FT_DEBUG_AUTOFIT */