[base] Small optimization of `FT_MulFix'. * src/base/ftcalc.c (FT_MulFix): Loosen up the condition for direct 32-bit calculations.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
diff --git a/ChangeLog b/ChangeLog
index cff13e3..f98c4b2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2014-08-20 Alexei Podtelezhnikov <apodtele@gmail.com>
+
+ [base] Small optimization of `FT_MulFix'.
+
+ * src/base/ftcalc.c (FT_MulFix): Loosen up the condition for direct
+ 32-bit calculations.
+
2014-08-19 Alexei Podtelezhnikov <apodtele@gmail.com>
[base] Use unsigned calculation in `FT_MulDiv'.
diff --git a/src/base/ftcalc.c b/src/base/ftcalc.c
index 9c72a76..5b17232 100644
--- a/src/base/ftcalc.c
+++ b/src/base/ftcalc.c
@@ -385,6 +385,15 @@
/* */
/* a + b <= 129895 - (c >> 17) */
/* */
+ /* FT_MulFix, on the other hand, is optimized for a small value of */
+ /* the first argument, when the second argument can be much larger. */
+ /* This can be achieved by scaling the second argument and the limit */
+ /* in the above inequalities. For example, */
+ /* */
+ /* a + (b >> 8) <= (131071 >> 4) */
+ /* */
+ /* should work well to avoid the overflow. */
+ /* */
/* documentation is in freetype.h */
@@ -513,7 +522,7 @@
ua = (FT_ULong)a;
ub = (FT_ULong)b;
- if ( ua <= 2048 && ub <= 1048576L )
+ if ( ua + ( ub >> 8 ) <= 8191UL )
ua = ( ua * ub + 0x8000U ) >> 16;
else
{
@@ -544,7 +553,7 @@
ua = (FT_ULong)a;
ub = (FT_ULong)b;
- if ( ua <= 2048 && ub <= 1048576L )
+ if ( ua + ( ub >> 8 ) <= 8191UL )
ua = ( ua * ub + 0x8000UL ) >> 16;
else
{