freetype-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] [autofit] Fix double division in stem darkening.


From: Alexei Podtelezhnikov
Subject: Re: [PATCH] [autofit] Fix double division in stem darkening.
Date: Fri, 18 Dec 2020 09:27:36 -0500

Hi Ishi-san

I will apply your patch later today. Since you must have analyzed the
code and understand the bottleneck in the emboldening function, I
would  like to invite you to explore an alternative approach.
https://lists.nongnu.org/archive/html/freetype-devel/2017-09/msg00020.html
is my proff of concept.

The autohinter has a good grasp of stem widths internally and adjusts
them ever so slightly for thin stems. It seems to me that all we need
to do is to increase that adjustment instead of the emboldening
business.

Alexei

On Fri, Dec 18, 2020 at 2:30 AM Tatsuyuki Ishi <ishitatsuyuki@gmail.com> wrote:
>
> The old code used to divide the darkening amount by em_ratio twice,
> leading to unnecessarily bold stems on certain fonts with higher units
> per em (e.g. Inter). This patch fixes it.
>
> The return value of af_loader_compute_darkening was also changed to use
> 16/16 fixed point to get rid of a redundant truncation operation. This
> should slightly improve the precision, although it's still bottlenecked
> by the emboldening function, which uses 26/6 fixed point.
> ---
>  src/autofit/afloader.c | 27 ++++++++++++---------------
>  src/autofit/afloader.h |  2 +-
>  2 files changed, 13 insertions(+), 16 deletions(-)
>
> diff --git a/src/autofit/afloader.c b/src/autofit/afloader.c
> index c35d85c4c..bdcecb3b1 100644
> --- a/src/autofit/afloader.c
> +++ b/src/autofit/afloader.c
> @@ -105,7 +105,6 @@
>                                globals->stem_darkening_for_ppem;
>
>      FT_Fixed  em_size  = af_intToFixed( face->units_per_EM );
> -    FT_Fixed  em_ratio = FT_DivFix( af_intToFixed( 1000 ), em_size );
>
>      FT_Matrix  scale_down_matrix = { 0x10000L, 0, 0, 0x10000L };
>
> @@ -142,12 +141,11 @@
>
>
>        darken_by_font_units_x =
> -        af_intToFixed( af_loader_compute_darkening( loader,
> -                                                    face,
> -                                                    stdVW ) );
> -      darken_x = FT_DivFix( FT_MulFix( darken_by_font_units_x,
> -                                       size_metrics->x_scale ),
> -                            em_ratio );
> +         af_loader_compute_darkening( loader,
> +                                      face,
> +                                      stdVW ) ;
> +      darken_x = FT_MulFix( darken_by_font_units_x,
> +                            size_metrics->x_scale );
>
>        globals->standard_vertical_width = stdVW;
>        globals->stem_darkening_for_ppem = size_metrics->x_ppem;
> @@ -161,12 +159,11 @@
>
>
>        darken_by_font_units_y =
> -        af_intToFixed( af_loader_compute_darkening( loader,
> -                                                    face,
> -                                                    stdHW ) );
> -      darken_y = FT_DivFix( FT_MulFix( darken_by_font_units_y,
> -                                       size_metrics->y_scale ),
> -                            em_ratio );
> +         af_loader_compute_darkening( loader,
> +                                      face,
> +                                      stdHW ) ;
> +      darken_y = FT_MulFix( darken_by_font_units_y,
> +                            size_metrics->y_scale );
>
>        globals->standard_horizontal_width = stdHW;
>        globals->stem_darkening_for_ppem   = size_metrics->x_ppem;
> @@ -594,7 +591,7 @@
>     *
>     * XXX: Currently a crude adaption of the original algorithm.  Do
> better?
>     */
> -  FT_LOCAL_DEF( FT_Int32 )
> +  FT_LOCAL_DEF( FT_Fixed )
>    af_loader_compute_darkening( AF_Loader  loader,
>                                 FT_Face    face,
>                                 FT_Pos     standard_width )
> @@ -713,7 +710,7 @@
>      }
>
>      /* Convert darken_amount from per 1000 em to true character space.
> */
> -    return af_fixedToInt( FT_DivFix( darken_amount, em_ratio ) );
> +    return FT_DivFix( darken_amount, em_ratio );
>    }
>
>
> diff --git a/src/autofit/afloader.h b/src/autofit/afloader.h
> index 97282371c..0223a1ea9 100644
> --- a/src/autofit/afloader.h
> +++ b/src/autofit/afloader.h
> @@ -75,7 +75,7 @@ FT_BEGIN_HEADER
>                          FT_UInt    gindex,
>                          FT_Int32   load_flags );
>
> -  FT_LOCAL_DEF( FT_Int32 )
> +  FT_LOCAL_DEF( FT_Fixed )
>    af_loader_compute_darkening( AF_Loader  loader,
>                                 FT_Face    face,
>                                 FT_Pos     standard_width );
> --
> 2.29.2
>
>
>
>


-- 
Alexei A. Podtelezhnikov, PhD



reply via email to

[Prev in Thread] Current Thread [Next in Thread]