Index: third_party/freetype/src/base/fttrigon.c |
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fttrigon.c b/third_party/freetype/src/base/fttrigon.c |
similarity index 85% |
rename from core/src/fxge/fx_freetype/fxft2.5.01/src/base/fttrigon.c |
rename to third_party/freetype/src/base/fttrigon.c |
index aae71f7087d656ffcc8444d2e3fc88b43c88e3f8..9b2ccd5d61a85a9646fcc4d7ae491aca3863cbfa 100644 |
--- a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fttrigon.c |
+++ b/third_party/freetype/src/base/fttrigon.c |
@@ -4,7 +4,7 @@ |
/* */ |
/* FreeType trigonometric functions (body). */ |
/* */ |
-/* Copyright 2001-2005, 2012-2013 by */ |
+/* Copyright 2001-2005, 2012-2014 by */ |
/* David Turner, Robert Wilhelm, and Werner Lemberg. */ |
/* */ |
/* This file is part of the FreeType project, and may only be used, */ |
@@ -29,10 +29,10 @@ |
/* */ |
/*************************************************************************/ |
-#include "../../include/ft2build.h" |
-#include "../../include/freetype/internal/ftobjs.h" |
-#include "../../include/freetype/internal/ftcalc.h" |
-#include "../../include/freetype/fttrigon.h" |
+#include <ft2build.h> |
+#include FT_INTERNAL_OBJECTS_H |
+#include FT_INTERNAL_CALC_H |
+#include FT_TRIGONOMETRY_H |
/* the Cordic shrink factor 0.858785336480436 * 2^32 */ |
@@ -45,7 +45,7 @@ |
/* this table was generated for FT_PI = 180L << 16, i.e. degrees */ |
#define FT_TRIG_MAX_ITERS 23 |
- static const FT_Fixed |
+ static const FT_Angle |
ft_trig_arctan_table[] = |
{ |
1740967L, 919879L, 466945L, 234379L, 117304L, 58666L, 29335L, |
@@ -60,15 +60,18 @@ |
static FT_Fixed |
ft_trig_downscale( FT_Fixed val ) |
{ |
- FT_Fixed s; |
- FT_Int64 v; |
+ FT_Int s = 1; |
- s = val; |
- val = FT_ABS( val ); |
+ if ( val < 0 ) |
+ { |
+ val = -val; |
+ s = -1; |
+ } |
- v = ( val * (FT_Int64)FT_TRIG_SCALE ) + 0x100000000UL; |
- val = (FT_Fixed)( v >> 32 ); |
+ /* 0x40000000 comes from regression analysis between true */ |
+ /* and CORDIC hypotenuse, so it minimizes the error */ |
+ val = (FT_Fixed)( ( (FT_Int64)val * FT_TRIG_SCALE + 0x40000000UL ) >> 32 ); |
return ( s >= 0 ) ? val : -val; |
} |
@@ -79,29 +82,43 @@ |
static FT_Fixed |
ft_trig_downscale( FT_Fixed val ) |
{ |
- FT_Fixed s; |
- FT_UInt32 v1, v2, k1, k2, hi, lo1, lo2, lo3; |
+ FT_Int s = 1; |
+ FT_UInt32 lo1, hi1, lo2, hi2, lo, hi, i1, i2; |
+ |
+ |
+ if ( val < 0 ) |
+ { |
+ val = -val; |
+ s = -1; |
+ } |
+ lo1 = val & 0x0000FFFFU; |
+ hi1 = val >> 16; |
+ lo2 = FT_TRIG_SCALE & 0x0000FFFFU; |
+ hi2 = FT_TRIG_SCALE >> 16; |
- s = val; |
- val = FT_ABS( val ); |
+ lo = lo1 * lo2; |
+ i1 = lo1 * hi2; |
+ i2 = lo2 * hi1; |
+ hi = hi1 * hi2; |
- v1 = (FT_UInt32)val >> 16; |
- v2 = (FT_UInt32)( val & 0xFFFFL ); |
+ /* Check carry overflow of i1 + i2 */ |
+ i1 += i2; |
+ hi += (FT_UInt32)( i1 < i2 ) << 16; |
- k1 = (FT_UInt32)FT_TRIG_SCALE >> 16; /* constant */ |
- k2 = (FT_UInt32)( FT_TRIG_SCALE & 0xFFFFL ); /* constant */ |
+ hi += i1 >> 16; |
+ i1 = i1 << 16; |
- hi = k1 * v1; |
- lo1 = k1 * v2 + k2 * v1; /* can't overflow */ |
+ /* Check carry overflow of i1 + lo */ |
+ lo += i1; |
+ hi += ( lo < i1 ); |
- lo2 = ( k2 * v2 ) >> 16; |
- lo3 = FT_MAX( lo1, lo2 ); |
- lo1 += lo2; |
+ /* 0x40000000 comes from regression analysis between true */ |
+ /* and CORDIC hypotenuse, so it minimizes the error */ |
- hi += lo1 >> 16; |
- if ( lo1 < lo3 ) |
- hi += (FT_UInt32)0x10000UL; |
+ /* Check carry overflow of lo + 0x40000000 */ |
+ lo += 0x40000000U; |
+ hi += ( lo < 0x40000000U ); |
val = (FT_Fixed)hi; |
@@ -111,6 +128,7 @@ |
#endif /* !FT_LONG64 */ |
+ /* undefined and never called for zero vector */ |
static FT_Int |
ft_trig_prenorm( FT_Vector* vec ) |
{ |
@@ -147,7 +165,7 @@ |
{ |
FT_Int i; |
FT_Fixed x, y, xtemp, b; |
- const FT_Fixed *arctanptr; |
+ const FT_Angle *arctanptr; |
x = vec->x; |
@@ -202,7 +220,7 @@ |
FT_Angle theta; |
FT_Int i; |
FT_Fixed x, y, xtemp, b; |
- const FT_Fixed *arctanptr; |
+ const FT_Angle *arctanptr; |
x = vec->x; |
@@ -261,11 +279,12 @@ |
} |
} |
- /* round theta */ |
+ /* round theta to acknowledge its error that mostly comes */ |
+ /* from accumulated rounding errors in the arctan table */ |
if ( theta >= 0 ) |
- theta = FT_PAD_ROUND( theta, 32 ); |
+ theta = FT_PAD_ROUND( theta, 16 ); |
else |
- theta = -FT_PAD_ROUND( -theta, 32 ); |
+ theta = -FT_PAD_ROUND( -theta, 16 ); |
vec->x = x; |
vec->y = theta; |
@@ -340,6 +359,9 @@ |
FT_Vector_Unit( FT_Vector* vec, |
FT_Angle angle ) |
{ |
+ if ( !vec ) |
+ return; |
+ |
vec->x = FT_TRIG_SCALE >> 8; |
vec->y = 0; |
ft_trig_pseudo_rotate( vec, angle ); |
@@ -366,6 +388,9 @@ |
FT_Vector v; |
+ if ( !vec ) |
+ return; |
+ |
v.x = vec->x; |
v.y = vec->y; |
@@ -403,6 +428,9 @@ |
FT_Vector v; |
+ if ( !vec ) |
+ return 0; |
+ |
v = *vec; |
/* handle trivial cases */ |
@@ -439,6 +467,9 @@ |
FT_Vector v; |
+ if ( !vec || !length || !angle ) |
+ return; |
+ |
v = *vec; |
if ( v.x == 0 && v.y == 0 ) |
@@ -462,6 +493,9 @@ |
FT_Fixed length, |
FT_Angle angle ) |
{ |
+ if ( !vec ) |
+ return; |
+ |
vec->x = length; |
vec->y = 0; |