>From 21c01379e1d167bcd0e8f33521ba045cafe99de4 Mon Sep 17 00:00:00 2001 From: Nikolaus Waxweiler Date: Sun, 13 Nov 2016 21:02:58 +0100 Subject: [PATCH 2/2] Implement FT_Face_Option() [2/2] Next up is the stem darkening option. * Rename no_stem_darkening to stem_darkening internally and change the logic around it because it simplifies the code a bit. * Honor the face-level option in the CFF driver and autohinter. * Change FT_Load_Glyph() to trigger the autohinter for font drivers that can't darken stems by themselves. This currently means all of them except for the CFF driver. Within the autohinter, enforce LIGHT mode because stem darkening currently only really works there. --- src/autofit/afloader.c | 10 +++++++++- src/autofit/afmodule.c | 16 ++++++++-------- src/autofit/afmodule.h | 2 +- src/base/ftobjs.c | 28 +++++++++++++++++++++++++--- src/cff/cf2ft.c | 7 ++++++- src/cff/cffdrivr.c | 14 +++++++------- src/cff/cffobjs.c | 2 +- src/cff/cffobjs.h | 2 +- 8 files changed, 58 insertions(+), 23 deletions(-) diff --git a/src/autofit/afloader.c b/src/autofit/afloader.c index 26bba06..91fdfe0 100644 --- a/src/autofit/afloader.c +++ b/src/autofit/afloader.c @@ -135,7 +135,9 @@ * must therefore be recomputed for each size and * `standard_{vertical,horizontal}_width' change. */ - if ( !module->no_stem_darkening ) + if ( face->internal->stem_darkening == 1 || + ( face->internal->stem_darkening < 0 && + module->stem_darkening ) ) { AF_FaceGlobals globals = loader->globals; AF_WritingSystemClass writing_system_class; @@ -492,6 +494,12 @@ scaler.render_mode = FT_LOAD_TARGET_MODE( load_flags ); scaler.flags = 0; /* XXX: fix this */ + /* Stem darkening only works well in LIGHT mode. */ + if ( face->internal->stem_darkening == 1 || + ( face->internal->stem_darkening < 0 && + module->stem_darkening ) ) + scaler.render_mode = FT_RENDER_MODE_LIGHT; + error = af_loader_reset( loader, module, face ); if ( !error ) { diff --git a/src/autofit/afmodule.c b/src/autofit/afmodule.c index f325ebf..1d378fb 100644 --- a/src/autofit/afmodule.c +++ b/src/autofit/afmodule.c @@ -292,19 +292,19 @@ if ( nsd == 0 ) - module->no_stem_darkening = 0; + module->stem_darkening = 1; else if ( nsd == 1 ) - module->no_stem_darkening = 1; + module->stem_darkening = 0; else return FT_THROW( Invalid_Argument ); } else #endif { - FT_Bool* no_stem_darkening = (FT_Bool*)value; + FT_Bool* stem_darkening = (FT_Bool*)value; - module->no_stem_darkening = *no_stem_darkening; + module->stem_darkening = !*stem_darkening; } return error; @@ -404,11 +404,11 @@ } else if ( !ft_strcmp( property_name, "no-stem-darkening" ) ) { - FT_Bool no_stem_darkening = module->no_stem_darkening; - FT_Bool* val = (FT_Bool*)value; + FT_Bool stem_darkening = module->stem_darkening; + FT_Bool* val = (FT_Bool*)value; - *val = no_stem_darkening; + *val = !stem_darkening; return error; } @@ -465,7 +465,7 @@ #ifdef AF_CONFIG_OPTION_USE_WARPER module->warping = 0; #endif - module->no_stem_darkening = TRUE; + module->stem_darkening = FALSE; module->darken_params[0] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1; module->darken_params[1] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1; diff --git a/src/autofit/afmodule.h b/src/autofit/afmodule.h index e65db5f..35c3041 100644 --- a/src/autofit/afmodule.h +++ b/src/autofit/afmodule.h @@ -41,7 +41,7 @@ FT_BEGIN_HEADER #ifdef AF_CONFIG_OPTION_USE_WARPER FT_Bool warping; #endif - FT_Bool no_stem_darkening; + FT_Bool stem_darkening; FT_Int darken_params[8]; } AF_ModuleRec, *AF_Module; diff --git a/src/base/ftobjs.c b/src/base/ftobjs.c index 3d52f45..5d23210 100644 --- a/src/base/ftobjs.c +++ b/src/base/ftobjs.c @@ -612,7 +612,9 @@ FT_Bool autohint = FALSE; FT_Module hinter; TT_Face ttface = (TT_Face)face; - + FT_Bool driver_can_darken_stems = 0; + FT_Bool stem_darkening = 0; + FT_Bool stem_darkening_driver = 0; if ( !face || !face->size || !face->glyph ) return FT_THROW( Invalid_Face_Handle ); @@ -627,8 +629,27 @@ library = driver->root.library; hinter = library->auto_hinter; - /* resolve load flags dependencies */ + /* Determine if stem darkening is to be applied. */ + error = FT_Property_Get( library, driver->clazz->root.module_name, + "no-stem-darkening", &stem_darkening_driver ); + if ( error ) + { + driver_can_darken_stems = FALSE; + stem_darkening_driver = FALSE; + } + else + { + driver_can_darken_stems = TRUE; + stem_darkening_driver = !stem_darkening_driver; + } + + error = FT_Err_Ok; /* Reset error variable. */ + stem_darkening = ( face->internal->stem_darkening == 1 || + ( face->internal->stem_darkening < 0 && + stem_darkening_driver ) ); + + /* resolve load flags dependencies */ if ( load_flags & FT_LOAD_NO_RECURSE ) load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_IGNORE_TRANSFORM; @@ -691,6 +712,7 @@ /* both `fpgm' and `prep' tables are missing */ if ( ( mode == FT_RENDER_MODE_LIGHT && !FT_DRIVER_HINTS_LIGHTLY( driver ) ) || + ( stem_darkening && !driver_can_darken_stems ) || ( FT_IS_SFNT( face ) && ttface->num_locations && ttface->max_profile.maxSizeOfInstructions == 0 && @@ -4211,7 +4233,7 @@ parameters++; } - Exit: + Exit: return error; } diff --git a/src/cff/cf2ft.c b/src/cff/cf2ft.c index edbe6a7..a1b70a5 100644 --- a/src/cff/cf2ft.c +++ b/src/cff/cf2ft.c @@ -339,6 +339,9 @@ CFF_Builder* builder = &decoder->builder; CFF_Driver driver = (CFF_Driver)FT_FACE_DRIVER( builder->face ); + FT_Bool stem_darkening_driver = driver->stem_darkening; + FT_Char stem_darkening_font = builder->face->root.internal->stem_darkening; + /* local error */ FT_Error error2 = FT_Err_Ok; CF2_BufferRec buf; @@ -369,7 +372,9 @@ font->renderingFlags = 0; if ( hinted ) font->renderingFlags |= CF2_FlagsHinted; - if ( scaled && !driver->no_stem_darkening ) + if ( scaled && ( stem_darkening_font == 1 || + ( stem_darkening_font < 0 && + stem_darkening_driver ) ) ) font->renderingFlags |= CF2_FlagsDarkened; font->darkenParams[0] = driver->darken_params[0]; diff --git a/src/cff/cffdrivr.c b/src/cff/cffdrivr.c index cf02477..5034d14 100644 --- a/src/cff/cffdrivr.c +++ b/src/cff/cffdrivr.c @@ -780,19 +780,19 @@ if ( nsd == 0 ) - driver->no_stem_darkening = 0; + driver->stem_darkening = 1; else if ( nsd == 1 ) - driver->no_stem_darkening = 1; + driver->stem_darkening = 0; else return FT_THROW( Invalid_Argument ); } else #endif { - FT_Bool* no_stem_darkening = (FT_Bool*)value; + FT_Bool* stem_darkening = (FT_Bool*)value; - driver->no_stem_darkening = *no_stem_darkening; + driver->stem_darkening = !*stem_darkening; } return error; @@ -842,11 +842,11 @@ } else if ( !ft_strcmp( property_name, "no-stem-darkening" ) ) { - FT_Bool no_stem_darkening = driver->no_stem_darkening; - FT_Bool* val = (FT_Bool*)value; + FT_Bool stem_darkening = driver->stem_darkening; + FT_Bool* val = (FT_Bool*)value; - *val = no_stem_darkening; + *val = !stem_darkening; return error; } diff --git a/src/cff/cffobjs.c b/src/cff/cffobjs.c index 126bbee..268a188 100644 --- a/src/cff/cffobjs.c +++ b/src/cff/cffobjs.c @@ -1095,7 +1095,7 @@ driver->hinting_engine = FT_CFF_HINTING_ADOBE; #endif - driver->no_stem_darkening = TRUE; + driver->stem_darkening = FALSE; driver->darken_params[0] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1; driver->darken_params[1] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1; diff --git a/src/cff/cffobjs.h b/src/cff/cffobjs.h index 9dc7753..80b36b4 100644 --- a/src/cff/cffobjs.h +++ b/src/cff/cffobjs.h @@ -119,7 +119,7 @@ FT_BEGIN_HEADER FT_DriverRec root; FT_UInt hinting_engine; - FT_Bool no_stem_darkening; + FT_Bool stem_darkening; FT_Int darken_params[8]; -- 2.9.3