@ -4,7 +4,7 @@
/* */
/* VMS-specific configuration file (specification only). */
/* */
/* Copyright 1996-2004, 2006-2008, 2011 by */
/* Copyright 1996-2004, 2006-2008, 2011, 2013 by */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */
/* This file is part of the FreeType project, and may only be used, */
@ -33,12 +33,9 @@
/* */
/*************************************************************************/
# ifndef __FTCONFIG_H__
# define __FTCONFIG_H__
/* Include the header file containing all developer build options */
# include <ft2build.h>
# include FT_CONFIG_OPTIONS_H
# include FT_CONFIG_STANDARD_LIBRARY_H
@ -46,6 +43,7 @@
FT_BEGIN_HEADER
/*************************************************************************/
/* */
/* PLATFORM-SPECIFIC CONFIGURATION MACROS */
@ -120,19 +118,95 @@ FT_BEGIN_HEADER
/*************************************************************************/
/* */
/* IntN types */
/* <Section> */
/* basic_types */
/* */
/*************************************************************************/
/*************************************************************************/
/* */
/* <Type> */
/* FT_Int16 */
/* */
/* <Description> */
/* A typedef for a 16bit signed integer type. */
/* */
typedef signed short FT_Int16 ;
/*************************************************************************/
/* */
/* <Type> */
/* FT_UInt16 */
/* */
/* Used to guarantee the size of some specific integers. */
/* <Description> */
/* A typedef for a 16bit unsigned integer type. */
/* */
typedef signed short FT_Int16 ;
typedef unsigned short FT_UInt16 ;
# if FT_SIZEOF_INT == 4
/* */
/* this #if 0 ... #endif clause is for documentation purposes */
#if 0
/*************************************************************************/
/* */
/* <Type> */
/* FT_Int32 */
/* */
/* <Description> */
/* A typedef for a 32bit signed integer type. The size depends on */
/* the configuration. */
/* */
typedef signed XXX FT_Int32 ;
/*************************************************************************/
/* */
/* <Type> */
/* FT_UInt32 */
/* */
/* A typedef for a 32bit unsigned integer type. The size depends on */
/* the configuration. */
/* */
typedef unsigned XXX FT_UInt32 ;
/*************************************************************************/
/* */
/* <Type> */
/* FT_Int64 */
/* */
/* A typedef for a 64bit signed integer type. The size depends on */
/* the configuration. Only defined if there is real 64bit support; */
/* otherwise, it gets emulated with a structure (if necessary). */
/* */
typedef signed XXX FT_Int64 ;
/*************************************************************************/
/* */
/* <Type> */
/* FT_UInt64 */
/* */
/* A typedef for a 64bit unsigned integer type. The size depends on */
/* the configuration. Only defined if there is real 64bit support; */
/* otherwise, it gets emulated with a structure (if necessary). */
/* */
typedef unsigned XXX FT_UInt64 ;
/* */
# endif
# if FT_SIZEOF_INT == (32 / FT_CHAR_BIT)
typedef signed int FT_Int32 ;
typedef unsigned int FT_UInt32 ;
# elif FT_SIZEOF_LONG == 4
# elif FT_SIZEOF_LONG == (32 / FT_CHAR_BIT)
typedef signed long FT_Int32 ;
typedef unsigned long FT_UInt32 ;
@ -141,13 +215,14 @@ FT_BEGIN_HEADER
# error "no 32bit type found -- please check your configuration files"
# endif
/* look up an integer type that is at least 32 bits */
# if FT_SIZEOF_INT >= 4
# if FT_SIZEOF_INT >= (32 / FT_CHAR_BIT)
typedef int FT_Fast ;
typedef unsigned int FT_UFast ;
# elif FT_SIZEOF_LONG >= 4
# elif FT_SIZEOF_LONG >= (32 / FT_CHAR_BIT)
typedef long FT_Fast ;
typedef unsigned long FT_UFast ;
@ -157,17 +232,19 @@ FT_BEGIN_HEADER
/* determine whether we have a 64-bit int type for platforms without */
/* Autoconf */
# if FT_SIZEOF_LONG == 8
# if FT_SIZEOF_LONG == (64 / FT_CHAR_BIT)
/* FT_LONG64 must be defined if a 64-bit type is available */
# define FT_LONG64
# define FT_INT64 long
# define FT_INT64 long
# define FT_UINT64 unsigned long
# elif defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */
/* this compiler provides the __int64 type */
# define FT_LONG64
# define FT_INT64 __int64
# define FT_INT64 __int64
# define FT_UINT64 unsigned __int64
# elif defined( __BORLANDC__ ) /* Borland C++ */
@ -176,7 +253,8 @@ FT_BEGIN_HEADER
/* this compiler provides the __int64 type */
# define FT_LONG64
# define FT_INT64 __int64
# define FT_INT64 __int64
# define FT_UINT64 unsigned __int64
# elif defined( __WATCOMC__ ) /* Watcom C++ */
@ -185,28 +263,25 @@ FT_BEGIN_HEADER
# elif defined( __MWERKS__ ) /* Metrowerks CodeWarrior */
# define FT_LONG64
# define FT_INT64 long long int
# define FT_INT64 long long int
# define FT_UINT64 unsigned long long int
# elif defined( __GNUC__ )
/* GCC provides the `long long' type */
# define FT_LONG64
# define FT_INT64 long long int
# endif /* FT_SIZEOF_LONG == 8 */
# define FT_INT64 long long int
# define FT_UINT64 unsigned long long int
# define FT_BEGIN_STMNT do {
# define FT_END_STMNT } while ( 0 )
# define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT
# endif /* FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) */
/*************************************************************************/
/* */
/* A 64-bit data type will create compilation problems if you compile */
/* in strict ANSI mode. To avoid them, we disable their use if */
/* __STDC__ is defined. You can however ignore this rule by */
/* defining the FT_CONFIG_OPTION_FORCE_INT64 configuration macro. */
/* in strict ANSI mode. To avoid them, we disable its use if __STDC__ */
/* is defined. You can however ignore this rule by defining the */
/* FT_CONFIG_OPTION_FORCE_INT64 configuration macro. */
/* */
# if defined( FT_LONG64 ) && !defined( FT_CONFIG_OPTION_FORCE_INT64 )
@ -220,6 +295,221 @@ FT_BEGIN_HEADER
# endif /* FT_LONG64 && !FT_CONFIG_OPTION_FORCE_INT64 */
# ifdef FT_LONG64
typedef FT_INT64 FT_Int64 ;
typedef FT_UINT64 FT_UInt64 ;
# endif
# define FT_BEGIN_STMNT do {
# define FT_END_STMNT } while ( 0 )
# define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT
# 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) */
" add %0, %0, #0x8000 \n \t " /* %0 += 0x8000 */
" 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 , 8000 h
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'. */
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Wlong-long"
# 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
# pragma GCC diagnostic pop
}
# endif /* __GNUC__ && __x86_64__ */
# endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */
# ifdef FT_CONFIG_OPTION_INLINE_MULFIX
# ifdef FT_MULFIX_ASSEMBLER
# define FT_MULFIX_INLINED FT_MULFIX_ASSEMBLER
# endif
# endif
# ifdef FT_MAKE_OPTION_SINGLE_OBJECT
@ -238,6 +528,9 @@ FT_BEGIN_HEADER
# endif /* FT_MAKE_OPTION_SINGLE_OBJECT */
# define FT_LOCAL_ARRAY( x ) extern const x
# define FT_LOCAL_ARRAY_DEF( x ) const x
# ifndef FT_BASE
@ -253,9 +546,9 @@ FT_BEGIN_HEADER
# ifndef FT_BASE_DEF
# ifdef __cplusplus
# define FT_BASE_DEF( x ) extern "C" x
# define FT_BASE_DEF( x ) x
# else
# define FT_BASE_DEF( x ) extern x
# define FT_BASE_DEF( x ) x
# endif
# endif /* !FT_BASE_DEF */