freetype-devel
[Top][All Lists]
Advanced

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

[ft-devel] FT_MulDiv optimization


From: Alexei Podtelezhnikov
Subject: [ft-devel] FT_MulDiv optimization
Date: Thu, 3 Jul 2014 22:35:30 -0400

Hi all,

The following will roughly double the space of optimal calculations. Comments?

Alexei

diff --git a/src/base/ftcalc.c b/src/base/ftcalc.c
index 6e65583..baeb810 100644
--- a/src/base/ftcalc.c
+++ b/src/base/ftcalc.c
@@ -363,15 +363,15 @@
   /*                                                                     */
   /*  we compute 'a*b+c/2', then divide it by 'c'. (positive values)     */
   /*                                                                     */
-  /*  46340 is FLOOR(SQRT(2^31-1)).                                      */
+  /*  46340 * 46341 approaches but does not exceed 2^31-1.               */
   /*                                                                     */
-  /*  if ( a <= 46340 && b <= 46340 ) then ( a*b <= 0x7FFEA810 )         */
+  /*  if ( a + b <= 92681 ) then ( a*b <= 0x7FFF5D14 )                   */
   /*                                                                     */
-  /*  0x7FFFFFFF - 0x7FFEA810 = 0x157F0                                  */
+  /*  0x7FFFFFFF - 0x7FFF5D14 = 0xA2EB                                   */
   /*                                                                     */
-  /*  if ( c < 0x157F0*2 ) then ( a*b+c/2 <= 0x7FFFFFFF )                */
+  /*  if ( c < 0xA2EB * 2 + 1 ) then ( a*b+c/2 <= 0x7FFFFFFF )           */
   /*                                                                     */
-  /*  and 2*0x157F0 = 176096                                             */
+  /*  and 2*0xA2EB + 1 = 83415                                           */
   /*                                                                     */
 
   FT_EXPORT_DEF( FT_Long )
@@ -390,7 +390,7 @@
     s ^= b; b = FT_ABS( b );
     s ^= c; c = FT_ABS( c );
 
-    if ( a <= 46340L && b <= 46340L && c <= 176095L && c > 0 )
+    if ( a + b <= 92681L && c <= 83415L && c > 0 )
       a = ( a * b + ( c >> 1 ) ) / c;
 
     else if ( (FT_Int32)c > 0 )
@@ -427,7 +427,7 @@
     s ^= b; b = FT_ABS( b );
     s ^= c; c = FT_ABS( c );
 
-    if ( a <= 46340L && b <= 46340L && c > 0 )
+    if ( a + b <= 92681L && c > 0 )
       a = a * b / c;
 
     else if ( (FT_Int32)c > 0 )


reply via email to

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