From 055afba8dc8427d90b65cf374e06ab720ba31823 Mon Sep 17 00:00:00 2001 From: Nikolaus Waxweiler Date: Sun, 20 Nov 2016 18:08:08 +0100 Subject: [PATCH 2/2] Implement FT_Face_Option() [2/2] Next up is the stem darkening option. * 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 | 8 ++++---- src/base/ftobjs.c | 18 ++++++++++++++++-- src/cff/cf2ft.c | 7 ++++++- src/cff/cffdrivr.c | 8 ++++---- 5 files changed, 39 insertions(+), 12 deletions(-) diff --git a/src/autofit/afloader.c b/src/autofit/afloader.c index 26bba06..b214514 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->no_stem_darkening == FALSE || + ( face->internal->no_stem_darkening < 0 && + !module->no_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->no_stem_darkening == FALSE || + ( face->internal->no_stem_darkening < 0 && + !module->no_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..caaf594 100644 --- a/src/autofit/afmodule.c +++ b/src/autofit/afmodule.c @@ -291,10 +291,10 @@ long nsd = ft_strtol( s, NULL, 10 ); - if ( nsd == 0 ) - module->no_stem_darkening = 0; - else if ( nsd == 1 ) - module->no_stem_darkening = 1; + if ( nsd == FALSE ) + module->no_stem_darkening = FALSE; + else if ( nsd == TRUE ) + module->no_stem_darkening = TRUE; else return FT_THROW( Invalid_Argument ); } diff --git a/src/base/ftobjs.c b/src/base/ftobjs.c index cd78424..1ec1b0f 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 = FALSE; + FT_Bool stem_darkening = FALSE; + FT_Bool no_stem_darkening_driver = TRUE; if ( !face || !face->size || !face->glyph ) return FT_THROW( Invalid_Face_Handle ); @@ -627,8 +629,19 @@ 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", &no_stem_darkening_driver ); + if ( !error ) + driver_can_darken_stems = TRUE; + error = FT_Err_Ok; /* Reset error variable. */ + + stem_darkening = ( face->internal->no_stem_darkening == FALSE || + ( face->internal->no_stem_darkening < 0 && + !no_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 +704,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 && diff --git a/src/cff/cf2ft.c b/src/cff/cf2ft.c index edbe6a7..1b349d3 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 no_stem_darkening_driver = driver->no_stem_darkening; + FT_Char no_stem_darkening_font = builder->face->root.internal->no_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 && ( no_stem_darkening_font == FALSE || + ( no_stem_darkening_font < 0 && + !no_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..d1b35cf 100644 --- a/src/cff/cffdrivr.c +++ b/src/cff/cffdrivr.c @@ -779,10 +779,10 @@ long nsd = ft_strtol( s, NULL, 10 ); - if ( nsd == 0 ) - driver->no_stem_darkening = 0; - else if ( nsd == 1 ) - driver->no_stem_darkening = 1; + if ( nsd == FALSE ) + driver->no_stem_darkening = FALSE; + else if ( nsd == TRUE ) + driver->no_stem_darkening = TRUE; else return FT_THROW( Invalid_Argument ); } -- 2.9.3