| 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 )
|
|
|