[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] [autofit] Fix double division in stem darkening.
From: |
Tatsuyuki Ishi |
Subject: |
[PATCH] [autofit] Fix double division in stem darkening. |
Date: |
Fri, 18 Dec 2020 16:29:55 +0900 |
User-agent: |
Evolution 3.38.2 |
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