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: Tatsuyuki Ishi
Subject: Re: [PATCH] [autofit] Fix double division in stem darkening.
Date: Sat, 19 Dec 2020 18:10:13 +0900

Hi Alexei,

Thanks for merging the patch.

Your linked proposal about stem darkening in auto-hinter looks
interesting. As I'm short on time, I'm afraid I can't dig into that
right now, but I look forward to spending some more time with stem
darkening maybe in one or two months from now.

Tatsuyuki

2020年12月18日(金) 23:27 Alexei Podtelezhnikov <apodtele@gmail.com>:
>
> 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]