[autofit] Add stem-darkening properties.
Actual code follows in a later commit. * include/freetype/ftautoh.h: Document `no-stem-darkening' and `darkening-parameters'. * src/autofit/afmodule.h: New fields `no_stem_darkening' and `darken_params'. * src/autofit/afmodule.c (af_property_set, af_property_get): Handle them. (af_autofitter_init): Initialize them.
This commit is contained in:
parent
6bda921da0
commit
d682e51062
16
ChangeLog
16
ChangeLog
|
@ -1,3 +1,19 @@
|
||||||
|
2015-11-02 Nikolaus Waxweiler <madigens@gmail.com>
|
||||||
|
|
||||||
|
[autofit] Add stem-darkening properties.
|
||||||
|
|
||||||
|
Actual code follows in a later commit.
|
||||||
|
|
||||||
|
* include/freetype/ftautoh.h: Document `no-stem-darkening' and
|
||||||
|
`darkening-parameters'.
|
||||||
|
|
||||||
|
* src/autofit/afmodule.h: New fields `no_stem_darkening' and
|
||||||
|
`darken_params'.
|
||||||
|
|
||||||
|
* src/autofit/afmodule.c (af_property_set, af_property_get):
|
||||||
|
Handle them.
|
||||||
|
(af_autofitter_init): Initialize them.
|
||||||
|
|
||||||
2015-11-02 Bungeman <bungeman@gmail.com>
|
2015-11-02 Bungeman <bungeman@gmail.com>
|
||||||
|
|
||||||
[ftfuzzer] Add support for multiple files (patch #8779).
|
[ftfuzzer] Add support for multiple files (patch #8779).
|
||||||
|
|
|
@ -439,6 +439,58 @@ FT_BEGIN_HEADER
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
*
|
||||||
|
* @property:
|
||||||
|
* no-stem-darkening
|
||||||
|
*
|
||||||
|
* @description:
|
||||||
|
* *Experimental* *only*
|
||||||
|
*
|
||||||
|
* The main purpose of emboldening glyphs or `stem darkening' is to
|
||||||
|
* enhance readability at smaller sizes. The smaller the size, the more
|
||||||
|
* emboldening is applied to keep glyphs from `thinning out'. All
|
||||||
|
* glyphs that pass through the autohinter will be emboldened unless
|
||||||
|
* this property is set to TRUE.
|
||||||
|
*
|
||||||
|
* See the description of the CFF driver for algorithmic details. Total
|
||||||
|
* consistency with the CFF driver is currently not achieved because the
|
||||||
|
* emboldening method differs and glyphs must be scaled down on the
|
||||||
|
* Y-axis to keep outline points inside their precomputed blue zones.
|
||||||
|
* The smaller the size (especially 9ppem and down), the higher the loss
|
||||||
|
* of emboldening versus the CFF driver.
|
||||||
|
*
|
||||||
|
* *ATTENTION*: This feature has been developed with linear alpha
|
||||||
|
* blending and gamma correction of glyphs in mind: A rendering library
|
||||||
|
* must apply linear alpha blending while compositing glyph bitmaps onto
|
||||||
|
* a surface and then apply gamma correction to the glyph pixels to get
|
||||||
|
* from linear space to display space (unless the display works in
|
||||||
|
* linear space). Internal testing at Adobe found that a gamma
|
||||||
|
* correction value of 1.8 gives good results across a wide range of
|
||||||
|
* displays with a sRGB gamma curve or a similar one.
|
||||||
|
*
|
||||||
|
* If this is not possible, it might be better to disable stem
|
||||||
|
* darkening. Currently, this can only be done globally.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
*
|
||||||
|
* @property:
|
||||||
|
* darkening-parameters
|
||||||
|
*
|
||||||
|
* @description:
|
||||||
|
* *Experimental* *only*
|
||||||
|
*
|
||||||
|
* See the description of the CFF driver for details. This
|
||||||
|
* implementation appropriates the
|
||||||
|
* CFF_CONFIG_OPTION_DARKENING_PARAMETER_* #defines for consistency.
|
||||||
|
* Note the differences described in @no-stem-darkening.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -177,6 +177,46 @@
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
#endif /* AF_CONFIG_OPTION_USE_WARPER */
|
#endif /* AF_CONFIG_OPTION_USE_WARPER */
|
||||||
|
else if ( !ft_strcmp( property_name, "darkening-parameters" ) )
|
||||||
|
{
|
||||||
|
FT_Int* darken_params = (FT_Int*)value;
|
||||||
|
|
||||||
|
FT_Int x1 = darken_params[0];
|
||||||
|
FT_Int y1 = darken_params[1];
|
||||||
|
FT_Int x2 = darken_params[2];
|
||||||
|
FT_Int y2 = darken_params[3];
|
||||||
|
FT_Int x3 = darken_params[4];
|
||||||
|
FT_Int y3 = darken_params[5];
|
||||||
|
FT_Int x4 = darken_params[6];
|
||||||
|
FT_Int y4 = darken_params[7];
|
||||||
|
|
||||||
|
|
||||||
|
if ( x1 < 0 || x2 < 0 || x3 < 0 || x4 < 0 ||
|
||||||
|
y1 < 0 || y2 < 0 || y3 < 0 || y4 < 0 ||
|
||||||
|
x1 > x2 || x2 > x3 || x3 > x4 ||
|
||||||
|
y1 > 500 || y2 > 500 || y3 > 500 || y4 > 500 )
|
||||||
|
return FT_THROW( Invalid_Argument );
|
||||||
|
|
||||||
|
module->darken_params[0] = x1;
|
||||||
|
module->darken_params[1] = y1;
|
||||||
|
module->darken_params[2] = x2;
|
||||||
|
module->darken_params[3] = y2;
|
||||||
|
module->darken_params[4] = x3;
|
||||||
|
module->darken_params[5] = y3;
|
||||||
|
module->darken_params[6] = x4;
|
||||||
|
module->darken_params[7] = y4;
|
||||||
|
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
else if ( !ft_strcmp( property_name, "no-stem-darkening" ) )
|
||||||
|
{
|
||||||
|
FT_Bool* no_stem_darkening = (FT_Bool*)value;
|
||||||
|
|
||||||
|
|
||||||
|
module->no_stem_darkening = *no_stem_darkening;
|
||||||
|
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
FT_TRACE0(( "af_property_set: missing property `%s'\n",
|
FT_TRACE0(( "af_property_set: missing property `%s'\n",
|
||||||
property_name ));
|
property_name ));
|
||||||
|
@ -253,6 +293,33 @@
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
#endif /* AF_CONFIG_OPTION_USE_WARPER */
|
#endif /* AF_CONFIG_OPTION_USE_WARPER */
|
||||||
|
else if ( !ft_strcmp( property_name, "darkening-parameters" ) )
|
||||||
|
{
|
||||||
|
FT_Int* darken_params = module->darken_params;
|
||||||
|
FT_Int* val = (FT_Int*)value;
|
||||||
|
|
||||||
|
|
||||||
|
val[0] = darken_params[0];
|
||||||
|
val[1] = darken_params[1];
|
||||||
|
val[2] = darken_params[2];
|
||||||
|
val[3] = darken_params[3];
|
||||||
|
val[4] = darken_params[4];
|
||||||
|
val[5] = darken_params[5];
|
||||||
|
val[6] = darken_params[6];
|
||||||
|
val[7] = darken_params[7];
|
||||||
|
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
else if ( !ft_strcmp( property_name, "no-stem-darkening" ) )
|
||||||
|
{
|
||||||
|
FT_Bool no_stem_darkening = module->no_stem_darkening;
|
||||||
|
FT_Bool* val = (FT_Bool*)value;
|
||||||
|
|
||||||
|
|
||||||
|
*val = no_stem_darkening;
|
||||||
|
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
FT_TRACE0(( "af_property_get: missing property `%s'\n",
|
FT_TRACE0(( "af_property_get: missing property `%s'\n",
|
||||||
property_name ));
|
property_name ));
|
||||||
|
@ -299,11 +366,21 @@
|
||||||
AF_Module module = (AF_Module)ft_module;
|
AF_Module module = (AF_Module)ft_module;
|
||||||
|
|
||||||
|
|
||||||
module->fallback_style = AF_STYLE_FALLBACK;
|
module->fallback_style = AF_STYLE_FALLBACK;
|
||||||
module->default_script = AF_SCRIPT_DEFAULT;
|
module->default_script = AF_SCRIPT_DEFAULT;
|
||||||
#ifdef AF_CONFIG_OPTION_USE_WARPER
|
#ifdef AF_CONFIG_OPTION_USE_WARPER
|
||||||
module->warping = 0;
|
module->warping = 0;
|
||||||
#endif
|
#endif
|
||||||
|
module->no_stem_darkening = FALSE;
|
||||||
|
|
||||||
|
module->darken_params[0] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1;
|
||||||
|
module->darken_params[1] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1;
|
||||||
|
module->darken_params[2] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2;
|
||||||
|
module->darken_params[3] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2;
|
||||||
|
module->darken_params[4] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3;
|
||||||
|
module->darken_params[5] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3;
|
||||||
|
module->darken_params[6] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4;
|
||||||
|
module->darken_params[7] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4;
|
||||||
|
|
||||||
return FT_Err_Ok;
|
return FT_Err_Ok;
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,6 +41,8 @@ FT_BEGIN_HEADER
|
||||||
#ifdef AF_CONFIG_OPTION_USE_WARPER
|
#ifdef AF_CONFIG_OPTION_USE_WARPER
|
||||||
FT_Bool warping;
|
FT_Bool warping;
|
||||||
#endif
|
#endif
|
||||||
|
FT_Bool no_stem_darkening;
|
||||||
|
FT_Int darken_params[8];
|
||||||
|
|
||||||
} AF_ModuleRec, *AF_Module;
|
} AF_ModuleRec, *AF_Module;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue