freetype-commit
[Top][All Lists]
Advanced

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

[freetype2] master 0d5f1dd: [autofit] Fix double division in stem darken


From: Alexei Podtelezhnikov
Subject: [freetype2] master 0d5f1dd: [autofit] Fix double division in stem darkening.
Date: Fri, 18 Dec 2020 22:11:38 -0500 (EST)

branch: master
commit 0d5f1dd37c056b4460a460d16fd1fbb06740e891
Author: Tatsuyuki Ishi <ishitatsuyuki@gmail.com>
Commit: Alexei Podtelezhnikov <apodtele@gmail.com>

    [autofit] Fix double division in stem darkening.
    
    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.[ch]
    (af_loader_compute_darkening): Return FT_Fixed.
    (af_loader_embolden_glyph_in_slot): Revise calculations.
---
 ChangeLog              | 17 +++++++++++++++++
 src/autofit/afloader.c | 27 ++++++++++++---------------
 src/autofit/afloader.h |  2 +-
 3 files changed, 30 insertions(+), 16 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 4fe9b34..d3dca8c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2020-12-18  Tatsuyuki Ishi  <ishitatsuyuki@gmail.com>
+
+       [autofit] Fix double division in stem darkening.
+
+       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.[ch]
+       (af_loader_compute_darkening): Return FT_Fixed.
+       (af_loader_embolden_glyph_in_slot): Revise calculations.
+
 2020-12-17  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
        * include/freetype/ftmodapi.h (FT_FACE_DRIVER_NAME): New public macro.
diff --git a/src/autofit/afloader.c b/src/autofit/afloader.c
index c35d85c..bdcecb3 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 9728237..0223a1e 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 );



reply via email to

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