Commit a8194a97db5963393baf216fd8e2006942c5d3e1

David Turner 2000-09-02T00:20:42

- added a new function called FT_SqrtFixed to compute the 16.16 square root of a 16.16 number (this could come handy in a later version of the auto-hinter) - small fixes to the smooth renderer. It used to use way too much line segments when drawing beziers !!

diff --git a/include/freetype/internal/ftcalc.h b/include/freetype/internal/ftcalc.h
index 27b8415..45313f3 100644
--- a/include/freetype/internal/ftcalc.h
+++ b/include/freetype/internal/ftcalc.h
@@ -34,9 +34,7 @@
 
 #define ADD_64( x, y, z )  z = (x) + (y)
 #define MUL_64( x, y, z )  z = (FT_Int64)(x) * (y)
-
-#define DIV_64( x, y )     ( (x) / (y) )
-
+#define DIV_64( x, y )     ((x)/(y))
 
 #ifdef FT_CONFIG_OPTION_OLD_CALCS
 
@@ -62,7 +60,6 @@
 #define MUL_64( x, y, z )  FT_MulTo64( x, y, &z )
 #define DIV_64( x, y )     FT_Div64by32( &x, y )
 
-
   FT_EXPORT_DEF( void )  FT_Add64( FT_Int64*  x,
                                    FT_Int64*  y,
                                    FT_Int64*  z );
@@ -77,6 +74,8 @@
 
 #ifdef FT_CONFIG_OPTION_OLD_CALCS
 
+  FT_EXPORT_DEF(FT_Int32)   FT_SqrtFixed( FT_Int32  x );
+
 #define SQRT_64( z )  FT_Sqrt64( &z )
 
   FT_EXPORT_DEF( FT_Int32 )  FT_Sqrt64( FT_Int64*  x );
diff --git a/include/freetype/internal/ftmemory.h b/include/freetype/internal/ftmemory.h
index 48403ec..bb4dabc 100644
--- a/include/freetype/internal/ftmemory.h
+++ b/include/freetype/internal/ftmemory.h
@@ -65,8 +65,8 @@
                                     FT_Long    size,
                                     void**     P );
 
-  BASE_DEF( void )  FT_Free( FT_Memory  memory,
-                             void**     P );
+  BASE_DEF( void )      FT_Free( FT_Memory  memory,
+                                 void**     P );
 
 
 
diff --git a/src/base/ftcalc.c b/src/base/ftcalc.c
index d27de26..7c4fc2e 100644
--- a/src/base/ftcalc.c
+++ b/src/base/ftcalc.c
@@ -295,6 +295,15 @@
     return r;
   }
 
+
+  FT_EXPORT_DEF(FT_Int32)   FT_SqrtFixed( FT_Int32  x )
+  {
+    FT_Int64  z;
+    
+    z = (FT_Int64)(x) << 16;
+    return FT_Sqrt64( z );
+  }
+
 #endif /* FT_CONFIG_OPTION_OLD_CALCS */
 
 
@@ -488,21 +497,14 @@
     else
     {
       /* we need more bits; we have to do it by hand */
-      FT_UInt32  c;
-
-
-      q  = ( a / b ) << 16;
-      c  = a % b;
-
-      /* we must compute C*0x10000/B: we simply shift C and B so */
-      /* C becomes smaller than 16 bits                          */
-      while ( c >> 16 )
-      {
-        c >>= 1;
-        b <<= 1;
-      }
+      FT_Int64  temp, temp2;
 
-      q += ( c << 16 ) / b;
+      temp.hi  = (FT_Int32) (a >> 16);
+      temp.lo  = (FT_UInt32)(a << 16);
+      temp2.hi = (FT_Int32)( b >> 31 );
+      temp2.lo = (FT_UInt32)( b / 2 );
+      FT_Add64( &temp, &temp2, &temp );
+      q = FT_Div64by32( &temp, b );
     }
 
     return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );
@@ -765,6 +767,16 @@
     return r;
   }
 
+
+  FT_EXPORT_DEF(FT_Int32)   FT_SqrtFixed( FT_Int32  x )
+  {
+    FT_Int64  z;
+    
+    z.hi = (FT_UInt32)((FT_Int32)(x) >> 16);
+    z.lo = (FT_UInt32)( x << 16 );
+    return FT_Sqrt64( &z );
+  }
+
 #endif /* FT_CONFIG_OPTION_OLD_CALCS */
 
 #endif /* FT_LONG64 */
diff --git a/src/smooth/ftgrays.c b/src/smooth/ftgrays.c
index 7ed0838..17b9ffe 100644
--- a/src/smooth/ftgrays.c
+++ b/src/smooth/ftgrays.c
@@ -726,7 +726,7 @@
     dx = dx / ras.conic_level;
     while ( dx > 0 )
     {
-      dx >>= 1;
+      dx >>= 2;
       level++;
     }
 
@@ -874,8 +874,8 @@
     db    = db / ras.conic_level;
     while ( da > 0 || db > 0 )
     {
-      da >>= 1;
-      db >>= 2;
+      da >>= 2;
+      db >>= 3;
       level++;
     }
 
@@ -1740,7 +1740,7 @@
       if ( ras.max_ex > 24 || ras.max_ey > 24 )
         level++;
       if ( ras.max_ex > 120 || ras.max_ey > 120 )
-        level += 2;
+        level ++;
 
       ras.conic_level <<= level;
       ras.cubic_level <<= level;