Index: third_party/freetype/include/internal/ftcalc.h |
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftcalc.h b/third_party/freetype/include/internal/ftcalc.h |
similarity index 54% |
rename from core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftcalc.h |
rename to third_party/freetype/include/internal/ftcalc.h |
index 1f2462dcecd2d08019ce60bed4226ba99a981f39..14ec37b9cd1b7e2cb708883a9465982228df128f 100644 |
--- a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftcalc.h |
+++ b/third_party/freetype/include/internal/ftcalc.h |
@@ -4,7 +4,7 @@ |
/* */ |
/* Arithmetic computations (specification). */ |
/* */ |
-/* Copyright 1996-2006, 2008, 2009, 2012-2013 by */ |
+/* Copyright 1996-2006, 2008, 2009, 2012-2014 by */ |
/* David Turner, Robert Wilhelm, and Werner Lemberg. */ |
/* */ |
/* This file is part of the FreeType project, and may only be used, */ |
@@ -20,8 +20,8 @@ |
#define __FTCALC_H__ |
-#include "../../ft2build.h" |
-#include "../freetype.h" |
+#include <ft2build.h> |
+#include FT_FREETYPE_H |
FT_BEGIN_HEADER |
@@ -29,31 +29,222 @@ FT_BEGIN_HEADER |
/*************************************************************************/ |
/* */ |
- /* <Function> */ |
- /* FT_FixedSqrt */ |
- /* */ |
- /* <Description> */ |
- /* Computes the square root of a 16.16 fixed-point value. */ |
- /* */ |
- /* <Input> */ |
- /* x :: The value to compute the root for. */ |
- /* */ |
- /* <Return> */ |
- /* The result of `sqrt(x)'. */ |
- /* */ |
- /* <Note> */ |
- /* This function is not very fast. */ |
- /* */ |
- FT_BASE( FT_Int32 ) |
- FT_SqrtFixed( FT_Int32 x ); |
- |
- |
- /*************************************************************************/ |
- /* */ |
/* FT_MulDiv() and FT_MulFix() are declared in freetype.h. */ |
/* */ |
/*************************************************************************/ |
+#ifndef FT_CONFIG_OPTION_NO_ASSEMBLER |
+ /* Provide assembler fragments for performance-critical functions. */ |
+ /* These must be defined `static __inline__' with GCC. */ |
+ |
+#if defined( __CC_ARM ) || defined( __ARMCC__ ) /* RVCT */ |
+ |
+#define FT_MULFIX_ASSEMBLER FT_MulFix_arm |
+ |
+ /* documentation is in freetype.h */ |
+ |
+ static __inline FT_Int32 |
+ FT_MulFix_arm( FT_Int32 a, |
+ FT_Int32 b ) |
+ { |
+ register FT_Int32 t, t2; |
+ |
+ |
+ __asm |
+ { |
+ smull t2, t, b, a /* (lo=t2,hi=t) = a*b */ |
+ mov a, t, asr #31 /* a = (hi >> 31) */ |
+ add a, a, #0x8000 /* a += 0x8000 */ |
+ adds t2, t2, a /* t2 += a */ |
+ adc t, t, #0 /* t += carry */ |
+ mov a, t2, lsr #16 /* a = t2 >> 16 */ |
+ orr a, a, t, lsl #16 /* a |= t << 16 */ |
+ } |
+ return a; |
+ } |
+ |
+#endif /* __CC_ARM || __ARMCC__ */ |
+ |
+ |
+#ifdef __GNUC__ |
+ |
+#if defined( __arm__ ) && \ |
+ ( !defined( __thumb__ ) || defined( __thumb2__ ) ) && \ |
+ !( defined( __CC_ARM ) || defined( __ARMCC__ ) ) |
+ |
+#define FT_MULFIX_ASSEMBLER FT_MulFix_arm |
+ |
+ /* documentation is in freetype.h */ |
+ |
+ static __inline__ FT_Int32 |
+ FT_MulFix_arm( FT_Int32 a, |
+ FT_Int32 b ) |
+ { |
+ register FT_Int32 t, t2; |
+ |
+ |
+ __asm__ __volatile__ ( |
+ "smull %1, %2, %4, %3\n\t" /* (lo=%1,hi=%2) = a*b */ |
+ "mov %0, %2, asr #31\n\t" /* %0 = (hi >> 31) */ |
+#if defined( __clang__ ) && defined( __thumb2__ ) |
+ "add.w %0, %0, #0x8000\n\t" /* %0 += 0x8000 */ |
+#else |
+ "add %0, %0, #0x8000\n\t" /* %0 += 0x8000 */ |
+#endif |
+ "adds %1, %1, %0\n\t" /* %1 += %0 */ |
+ "adc %2, %2, #0\n\t" /* %2 += carry */ |
+ "mov %0, %1, lsr #16\n\t" /* %0 = %1 >> 16 */ |
+ "orr %0, %0, %2, lsl #16\n\t" /* %0 |= %2 << 16 */ |
+ : "=r"(a), "=&r"(t2), "=&r"(t) |
+ : "r"(a), "r"(b) |
+ : "cc" ); |
+ return a; |
+ } |
+ |
+#endif /* __arm__ && */ |
+ /* ( __thumb2__ || !__thumb__ ) && */ |
+ /* !( __CC_ARM || __ARMCC__ ) */ |
+ |
+ |
+#if defined( __i386__ ) |
+ |
+#define FT_MULFIX_ASSEMBLER FT_MulFix_i386 |
+ |
+ /* documentation is in freetype.h */ |
+ |
+ static __inline__ FT_Int32 |
+ FT_MulFix_i386( FT_Int32 a, |
+ FT_Int32 b ) |
+ { |
+ register FT_Int32 result; |
+ |
+ |
+ __asm__ __volatile__ ( |
+ "imul %%edx\n" |
+ "movl %%edx, %%ecx\n" |
+ "sarl $31, %%ecx\n" |
+ "addl $0x8000, %%ecx\n" |
+ "addl %%ecx, %%eax\n" |
+ "adcl $0, %%edx\n" |
+ "shrl $16, %%eax\n" |
+ "shll $16, %%edx\n" |
+ "addl %%edx, %%eax\n" |
+ : "=a"(result), "=d"(b) |
+ : "a"(a), "d"(b) |
+ : "%ecx", "cc" ); |
+ return result; |
+ } |
+ |
+#endif /* i386 */ |
+ |
+#endif /* __GNUC__ */ |
+ |
+ |
+#ifdef _MSC_VER /* Visual C++ */ |
+ |
+#ifdef _M_IX86 |
+ |
+#define FT_MULFIX_ASSEMBLER FT_MulFix_i386 |
+ |
+ /* documentation is in freetype.h */ |
+ |
+ static __inline FT_Int32 |
+ FT_MulFix_i386( FT_Int32 a, |
+ FT_Int32 b ) |
+ { |
+ register FT_Int32 result; |
+ |
+ __asm |
+ { |
+ mov eax, a |
+ mov edx, b |
+ imul edx |
+ mov ecx, edx |
+ sar ecx, 31 |
+ add ecx, 8000h |
+ add eax, ecx |
+ adc edx, 0 |
+ shr eax, 16 |
+ shl edx, 16 |
+ add eax, edx |
+ mov result, eax |
+ } |
+ return result; |
+ } |
+ |
+#endif /* _M_IX86 */ |
+ |
+#endif /* _MSC_VER */ |
+ |
+ |
+#if defined( __GNUC__ ) && defined( __x86_64__ ) |
+ |
+#define FT_MULFIX_ASSEMBLER FT_MulFix_x86_64 |
+ |
+ static __inline__ FT_Int32 |
+ FT_MulFix_x86_64( FT_Int32 a, |
+ FT_Int32 b ) |
+ { |
+ /* Temporarily disable the warning that C90 doesn't support */ |
+ /* `long long'. */ |
+#if __GNUC__ > 4 || ( __GNUC__ == 4 && __GNUC_MINOR__ >= 6 ) |
+#pragma GCC diagnostic push |
+#pragma GCC diagnostic ignored "-Wlong-long" |
+#endif |
+ |
+#if 1 |
+ /* Technically not an assembly fragment, but GCC does a really good */ |
+ /* job at inlining it and generating good machine code for it. */ |
+ long long ret, tmp; |
+ |
+ |
+ ret = (long long)a * b; |
+ tmp = ret >> 63; |
+ ret += 0x8000 + tmp; |
+ |
+ return (FT_Int32)( ret >> 16 ); |
+#else |
+ |
+ /* For some reason, GCC 4.6 on Ubuntu 12.04 generates invalid machine */ |
+ /* code from the lines below. The main issue is that `wide_a' is not */ |
+ /* properly initialized by sign-extending `a'. Instead, the generated */ |
+ /* machine code assumes that the register that contains `a' on input */ |
+ /* can be used directly as a 64-bit value, which is wrong most of the */ |
+ /* time. */ |
+ long long wide_a = (long long)a; |
+ long long wide_b = (long long)b; |
+ long long result; |
+ |
+ |
+ __asm__ __volatile__ ( |
+ "imul %2, %1\n" |
+ "mov %1, %0\n" |
+ "sar $63, %0\n" |
+ "lea 0x8000(%1, %0), %0\n" |
+ "sar $16, %0\n" |
+ : "=&r"(result), "=&r"(wide_a) |
+ : "r"(wide_b) |
+ : "cc" ); |
+ |
+ return (FT_Int32)result; |
+#endif |
+ |
+#if __GNUC__ > 4 || ( __GNUC__ == 4 && __GNUC_MINOR__ >= 6 ) |
+#pragma GCC diagnostic pop |
+#endif |
+ } |
+ |
+#endif /* __GNUC__ && __x86_64__ */ |
+ |
+#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */ |
+ |
+ |
+#ifdef FT_CONFIG_OPTION_INLINE_MULFIX |
+#ifdef FT_MULFIX_ASSEMBLER |
+#define FT_MulFix( a, b ) FT_MULFIX_ASSEMBLER( (FT_Int32)(a), (FT_Int32)(b) ) |
+#endif |
+#endif |
+ |
/*************************************************************************/ |
/* */ |
@@ -120,10 +311,11 @@ FT_BEGIN_HEADER |
FT_Pos out_x, |
FT_Pos out_y ); |
+ |
/* |
* Return TRUE if a corner is flat or nearly flat. This is equivalent to |
- * saying that the angle difference between the `in' and `out' vectors is |
- * very small. |
+ * saying that the corner point is close to its neighbors, or inside an |
+ * ellipse defined by the neighbor focal points to be more precise. |
*/ |
FT_BASE( FT_Int ) |
ft_corner_is_flat( FT_Pos in_x, |
@@ -135,9 +327,31 @@ FT_BEGIN_HEADER |
/* |
* Return the most significant bit index. |
*/ |
+ |
+#ifndef FT_CONFIG_OPTION_NO_ASSEMBLER |
+#if defined( __GNUC__ ) && \ |
+ ( __GNUC__ > 3 || ( __GNUC__ == 3 && __GNUC_MINOR__ >= 4 ) ) |
+ |
+#if FT_SIZEOF_INT == 4 |
+ |
+#define FT_MSB( x ) ( 31 - __builtin_clz( x ) ) |
+ |
+#elif FT_SIZEOF_LONG == 4 |
+ |
+#define FT_MSB( x ) ( 31 - __builtin_clzl( x ) ) |
+ |
+#endif |
+ |
+#endif /* __GNUC__ */ |
+#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */ |
+ |
+#ifndef FT_MSB |
+ |
FT_BASE( FT_Int ) |
FT_MSB( FT_UInt32 z ); |
+#endif |
+ |
/* |
* Return sqrt(x*x+y*y), which is the same as `FT_Vector_Length' but uses |
@@ -148,6 +362,31 @@ FT_BEGIN_HEADER |
FT_Fixed y ); |
+#if 0 |
+ |
+ /*************************************************************************/ |
+ /* */ |
+ /* <Function> */ |
+ /* FT_SqrtFixed */ |
+ /* */ |
+ /* <Description> */ |
+ /* Computes the square root of a 16.16 fixed-point value. */ |
+ /* */ |
+ /* <Input> */ |
+ /* x :: The value to compute the root for. */ |
+ /* */ |
+ /* <Return> */ |
+ /* The result of `sqrt(x)'. */ |
+ /* */ |
+ /* <Note> */ |
+ /* This function is not very fast. */ |
+ /* */ |
+ FT_BASE( FT_Int32 ) |
+ FT_SqrtFixed( FT_Int32 x ); |
+ |
+#endif /* 0 */ |
+ |
+ |
#define INT_TO_F26DOT6( x ) ( (FT_Long)(x) << 6 ) |
#define INT_TO_F2DOT14( x ) ( (FT_Long)(x) << 14 ) |
#define INT_TO_FIXED( x ) ( (FT_Long)(x) << 16 ) |