modified the TrueType interpreter to let it
use the new trigonometric functions provided in "fttrigon.h". This
gets rid of some old 64-bit computation routines, as well as many
warnings when compiling the library with the "long long" 64-bit
integer type.
diff --git a/ChangeLog b/ChangeLog
index b1cb853..cde12da 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2001-06-14 David Turner <david@freetype.org>
+
+ * src/base/ftcalc.c, include/internal/ftcalc.h, src/truetype/ttinterp.c,
+ include/config/ftoption.h: modified the TrueType interpreter to let it
+ use the new trigonometric functions provided in "fttrigon.h". This
+ gets rid of some old 64-bit computation routines, as well as many
+ warnings when compiling the library with the "long long" 64-bit
+ integer type.
+
+
2001-06-11 Mike Owens <MOwens@amtdatasouth.com>
* src/base/ftcalc.c (FT_MulDiv, FT_DivFix, FT_Sqrt64): Remove
diff --git a/include/freetype/config/ftoption.h b/include/freetype/config/ftoption.h
index 567c865..dafcd3a 100644
--- a/include/freetype/config/ftoption.h
+++ b/include/freetype/config/ftoption.h
@@ -237,7 +237,7 @@
/* Used for debugging, this configuration macro should disappear */
/* soon. */
/* */
-#define FT_CONFIG_OPTION_OLD_CALCS
+#undef FT_CONFIG_OPTION_OLD_CALCS
/*************************************************************************/
diff --git a/include/freetype/internal/ftcalc.h b/include/freetype/internal/ftcalc.h
index 477083f..e47f402 100644
--- a/include/freetype/internal/ftcalc.h
+++ b/include/freetype/internal/ftcalc.h
@@ -27,18 +27,19 @@
FT_BEGIN_HEADER
-#ifdef FT_LONG64
-
-
- typedef FT_INT64 FT_Int64;
-
-#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) )
+/* OLD 64-bits internal API */
#ifdef FT_CONFIG_OPTION_OLD_CALCS
-#define SQRT_64( z ) FT_Sqrt64( z )
+# ifdef FT_LONG64
+
+ typedef FT_INT64 FT_Int64;
+
+# 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 SQRT_64( z ) FT_Sqrt64( z )
/*************************************************************************/
/* */
@@ -58,10 +59,8 @@
/* */
FT_EXPORT( FT_Int32 ) FT_Sqrt64( FT_Int64 l );
-#endif /* FT_CONFIG_OPTION_OLD_CALCS */
-
-#else /* FT_LONG64 */
+# else /* !FT_LONG64 */
typedef struct FT_Int64_
@@ -72,9 +71,9 @@
} FT_Int64;
-#define ADD_64( x, y, z ) FT_Add64( &x, &y, &z )
-#define MUL_64( x, y, z ) FT_MulTo64( x, y, &z )
-#define DIV_64( x, y ) FT_Div64by32( &x, y )
+# define ADD_64( x, y, z ) FT_Add64( &x, &y, &z )
+# define MUL_64( x, y, z ) FT_MulTo64( x, y, &z )
+# define DIV_64( x, y ) FT_Div64by32( &x, y )
/*************************************************************************/
@@ -146,9 +145,7 @@
FT_Int32 y );
-#ifdef FT_CONFIG_OPTION_OLD_CALCS
-
-#define SQRT_64( z ) FT_Sqrt64( &z )
+# define SQRT_64( z ) FT_Sqrt64( &z )
/*************************************************************************/
/* */
@@ -168,11 +165,11 @@
/* */
FT_EXPORT( FT_Int32 ) FT_Sqrt64( FT_Int64* x );
+# endif /* !FT_LONG64 */
+
#endif /* FT_CONFIG_OPTION_OLD_CALCS */
-#endif /* FT_LONG64 */
-
FT_EXPORT( FT_Int32 ) FT_SqrtFixed( FT_Int32 x );
diff --git a/src/base/ftcalc.c b/src/base/ftcalc.c
index c4a60b1..ab2ced3 100644
--- a/src/base/ftcalc.c
+++ b/src/base/ftcalc.c
@@ -38,6 +38,27 @@
#include FT_INTERNAL_OBJECTS_H
+/* we need to define a 64-bits data type here */
+#ifndef FT_CONFIG_OPTION_OLD_CALCS
+
+# ifdef FT_LONG64
+
+ typedef FT_INT64 FT_Int64;
+
+# else
+
+ typedef struct FT_Int64_
+ {
+ FT_UInt32 lo;
+ FT_UInt32 hi;
+
+ } FT_Int64;
+
+# endif
+
+#endif
+
+
/*************************************************************************/
/* */
/* The macro FT_COMPONENT is used in trace mode. It is an implicit */
diff --git a/src/truetype/ttinterp.c b/src/truetype/ttinterp.c
index 1f5b6c7..43f5767 100644
--- a/src/truetype/ttinterp.c
+++ b/src/truetype/ttinterp.c
@@ -19,6 +19,7 @@
#include <ft2build.h>
#include FT_INTERNAL_DEBUG_H
#include FT_INTERNAL_CALC_H
+#include FT_TRIGONOMETRY_H
#include FT_SYSTEM_H
#include "ttinterp.h"
@@ -31,10 +32,8 @@
#define TT_MULFIX FT_MulFix
#define TT_MULDIV FT_MulDiv
-
#define TT_INT64 FT_Int64
-
/*************************************************************************/
/* */
/* The macro FT_COMPONENT is used in trace mode. It is an implicit */
@@ -825,6 +824,7 @@
}
+ /* return length of given vector */
#ifdef FT_CONFIG_OPTION_OLD_CALCS
static FT_F26Dot6 Norm( FT_F26Dot6 X,
@@ -841,6 +841,18 @@
return (FT_F26Dot6)SQRT_64( T1 );
}
+#else /* !FT_CONFIG_OPTION_OLD_CALCS */
+
+ static FT_F26Dot6 Norm( FT_F26Dot6 X,
+ FT_F26Dot6 Y )
+ {
+ FT_Vector v;
+
+ v.x = X;
+ v.y = Y;
+ return FT_Vector_Length( &v );
+ }
+
#endif /* FT_CONFIG_OPTION_OLD_CALCS */
@@ -1214,21 +1226,9 @@
{
FT_Long x, y;
-
-#ifdef FT_CONFIG_OPTION_OLD_CALCS
-
x = TT_MULDIV( CUR.GS.projVector.x, CUR.tt_metrics.x_ratio, 0x4000 );
y = TT_MULDIV( CUR.GS.projVector.y, CUR.tt_metrics.y_ratio, 0x4000 );
CUR.tt_metrics.ratio = Norm( x, y );
-
-#else
-
- x = TT_MULDIV( CUR.GS.projVector.x, CUR.tt_metrics.x_ratio, 0x8000 );
- y = TT_MULDIV( CUR.GS.projVector.y, CUR.tt_metrics.y_ratio, 0x8000 );
- CUR.tt_metrics.ratio = FT_Sqrt32( x * x + y * y ) << 1;
-
-#endif /* FT_CONFIG_OPTION_OLD_CALCS */
-
}
return CUR.tt_metrics.ratio;
@@ -2287,123 +2287,16 @@
FT_F26Dot6 Vy,
FT_UnitVector* R )
{
- FT_F26Dot6 u, v, d;
- FT_Int shift;
- FT_ULong H, L, L2, hi, lo, med;
+ FT_Vector v;
+ FT_Angle angle;
+
+ angle = FT_Atan2( Vx, Vy );
-
- u = ABS( Vx );
- v = ABS( Vy );
-
- if ( u < v )
- {
- d = u;
- u = v;
- v = d;
- }
-
- R->x = 0;
- R->y = 0;
-
- /* check that we are not trying to normalise zero! */
- if ( u == 0 )
- return SUCCESS;
-
- /* compute (u*u + v*v) on 64 bits with two 32-bit registers [H:L] */
- hi = (FT_ULong)u >> 16;
- lo = (FT_ULong)u & 0xFFFF;
- med = hi * lo;
-
- H = hi * hi + ( med >> 15 );
- med <<= 17;
- L = lo * lo + med;
- if ( L < med )
- H++;
-
- hi = (FT_ULong)v >> 16;
- lo = (FT_ULong)v & 0xFFFF;
- med = hi * lo;
-
- H += hi * hi + ( med >> 15 );
- med <<= 17;
- L2 = lo * lo + med;
- if ( L2 < med )
- H++;
-
- L += L2;
- if ( L < L2 )
- H++;
-
- /* if the value is smaller than 32-bits */
- if ( H == 0 )
- {
- shift = 0;
- while ( ( L & 0xC0000000L ) == 0 )
- {
- L <<= 2;
- shift++;
- }
-
- d = FT_Sqrt32( L );
- R->x = (FT_F2Dot14)TT_MULDIV( Vx << shift, 0x4000, d );
- R->y = (FT_F2Dot14)TT_MULDIV( Vy << shift, 0x4000, d );
- }
- /* if the value is greater than 64-bits */
- else
- {
- shift = 0;
- while ( H )
- {
- L = ( L >> 2 ) | ( H << 30 );
- H >>= 2;
- shift++;
- }
-
- d = FT_Sqrt32( L );
- R->x = (FT_F2Dot14)TT_MULDIV( Vx >> shift, 0x4000, d );
- R->y = (FT_F2Dot14)TT_MULDIV( Vy >> shift, 0x4000, d );
- }
-
- {
- FT_ULong x, y, w;
- FT_Int sx, sy;
-
-
- sx = R->x >= 0 ? 1 : -1;
- sy = R->y >= 0 ? 1 : -1;
- x = (FT_ULong)sx * R->x;
- y = (FT_ULong)sy * R->y;
-
- w = x * x + y * y;
-
- /* we now want to adjust (x,y) in order to have sqrt(w) == 0x4000 */
- /* which means 0x1000000 <= w < 0x1004000 */
- while ( w <= 0x10000000L )
- {
- /* increment the smallest coordinate */
- if ( x < y )
- x++;
- else
- y++;
-
- w = x * x + y * y;
- }
-
- while ( w >= 0x10040000L )
- {
- /* decrement the smallest coordinate */
- if ( x < y )
- x--;
- else
- y--;
-
- w = x * x + y * y;
- }
-
- R->x = sx * x;
- R->y = sy * y;
- }
-
+ FT_Vector_Unit( &v, angle );
+
+ R->x = v.x >> 2;
+ R->y = v.y >> 2;
+
return SUCCESS;
}