1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/ 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ftconfig.h */ 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ANSI-specific configuration file (specification only). */ 6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Copyright 1996-2004, 2006-2008, 2010-2011, 2013 by */ 8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* David Turner, Robert Wilhelm, and Werner Lemberg. */ 9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* This file is part of the FreeType project, and may only be used, */ 11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* modified, and distributed under the terms of the FreeType project */ 12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* this file you indicate that you have read the license and */ 14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* understand and accept it fully. */ 15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/ 17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* This header file contains a number of macro definitions that are used */ 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* by the rest of the engine. Most of the macros here are automatically */ 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* determined at compile time, and you should not need to change it to */ 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* port FreeType, except to compile the library with a non-ANSI */ 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* compiler. */ 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Note however that if some specific modifications are needed, we */ 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* advise you to place a modified copy in your build directory. */ 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* The build directory is usually `freetype/builds/<system>', and */ 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* contains system-specific files that are always included first when */ 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* building the library. */ 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* This ANSI version should stay in `include/freetype/config'. */ 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef __FTCONFIG_H__ 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define __FTCONFIG_H__ 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../ft2build.h" 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ftoption.h" 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ftstdlib.h" 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFT_BEGIN_HEADER 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* PLATFORM-SPECIFIC CONFIGURATION MACROS */ 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* These macros can be toggled to suit a specific system. The current */ 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* ones are defaults used to compile FreeType in an ANSI C environment */ 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* (16bit compilers are also supported). Copy this file to your own */ 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* `freetype/builds/<system>' directory, and edit it to port the engine. */ 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* There are systems (like the Texas Instruments 'C54x) where a `char' */ 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* has 16 bits. ANSI C says that sizeof(char) is always 1. Since an */ 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* `int' has 16 bits also for this system, sizeof(int) gives 1 which */ 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* is probably unexpected. */ 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* `CHAR_BIT' (defined in limits.h) gives the number of bits in a */ 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* `char' type. */ 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef FT_CHAR_BIT 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_CHAR_BIT CHAR_BIT 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* The size of an `int' type. */ 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if FT_UINT_MAX == 0xFFFFUL 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_SIZEOF_INT (16 / FT_CHAR_BIT) 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#elif FT_UINT_MAX == 0xFFFFFFFFUL 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_SIZEOF_INT (32 / FT_CHAR_BIT) 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#elif FT_UINT_MAX > 0xFFFFFFFFUL && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFUL 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_SIZEOF_INT (64 / FT_CHAR_BIT) 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#error "Unsupported size of `int' type!" 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* The size of a `long' type. A five-byte `long' (as used e.g. on the */ 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* DM642) is recognized but avoided. */ 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if FT_ULONG_MAX == 0xFFFFFFFFUL 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_SIZEOF_LONG (32 / FT_CHAR_BIT) 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFUL 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_SIZEOF_LONG (32 / FT_CHAR_BIT) 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFUL 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_SIZEOF_LONG (64 / FT_CHAR_BIT) 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#error "Unsupported size of `long' type!" 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* FT_UNUSED is a macro used to indicate that a given parameter is not */ 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* used -- this is only used to get rid of unpleasant compiler warnings */ 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef FT_UNUSED 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_UNUSED( arg ) ( (arg) = (arg) ) 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* AUTOMATIC CONFIGURATION MACROS */ 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* These macros are computed from the ones defined above. Don't touch */ 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* their definition, unless you know precisely what you are doing. No */ 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* porter should need to mess with them. */ 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Mac support */ 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* This is the only necessary change, so it is defined here instead */ 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* providing a new configuration file. */ 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if defined( __APPLE__ ) || ( defined( __MWERKS__ ) && defined( macintosh ) ) 124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* no Carbon frameworks for 64bit 10.4.x */ 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* AvailabilityMacros.h is available since Mac OS X 10.2, */ 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* so guess the system version by maximum errno before inclusion */ 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include <errno.h> 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef ECANCELED /* defined since 10.2 */ 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "AvailabilityMacros.h" 130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if defined( __LP64__ ) && \ 132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 ) 133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#undef FT_MACINTOSH 134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#elif defined( __SC__ ) || defined( __MRC__ ) 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Classic MacOS compilers */ 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ConditionalMacros.h" 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if TARGET_OS_MAC 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_MACINTOSH 1 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Section> */ 149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* basic_types */ 150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Type> */ 157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* FT_Int16 */ 158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Description> */ 160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* A typedef for a 16bit signed integer type. */ 161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov typedef signed short FT_Int16; 163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Type> */ 168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* FT_UInt16 */ 169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Description> */ 171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* A typedef for a 16bit unsigned integer type. */ 172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov typedef unsigned short FT_UInt16; 174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* this #if 0 ... #endif clause is for documentation purposes */ 179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if 0 180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Type> */ 184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* FT_Int32 */ 185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Description> */ 187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* A typedef for a 32bit signed integer type. The size depends on */ 188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* the configuration. */ 189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov typedef signed XXX FT_Int32; 191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Type> */ 196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* FT_UInt32 */ 197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* A typedef for a 32bit unsigned integer type. The size depends on */ 199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* the configuration. */ 200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov typedef unsigned XXX FT_UInt32; 202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Type> */ 207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* FT_Int64 */ 208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* A typedef for a 64bit signed integer type. The size depends on */ 210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* the configuration. Only defined if there is real 64bit support; */ 211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* otherwise, it gets emulated with a structure (if necessary). */ 212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov typedef signed XXX FT_Int64; 214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Type> */ 219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* FT_UInt64 */ 220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* A typedef for a 64bit unsigned integer type. The size depends on */ 222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* the configuration. Only defined if there is real 64bit support; */ 223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* otherwise, it gets emulated with a structure (if necessary). */ 224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov typedef unsigned XXX FT_UInt64; 226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if FT_SIZEOF_INT == (32 / FT_CHAR_BIT) 232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov typedef signed int FT_Int32; 234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov typedef unsigned int FT_UInt32; 235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#elif FT_SIZEOF_LONG == (32 / FT_CHAR_BIT) 237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov typedef signed long FT_Int32; 239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov typedef unsigned long FT_UInt32; 240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#error "no 32bit type found -- please check your configuration files" 243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* look up an integer type that is at least 32 bits */ 247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if FT_SIZEOF_INT >= (32 / FT_CHAR_BIT) 248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov typedef int FT_Fast; 250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov typedef unsigned int FT_UFast; 251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#elif FT_SIZEOF_LONG >= (32 / FT_CHAR_BIT) 253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov typedef long FT_Fast; 255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov typedef unsigned long FT_UFast; 256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* determine whether we have a 64-bit int type for platforms without */ 261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Autoconf */ 262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) 263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* FT_LONG64 must be defined if a 64-bit type is available */ 265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_LONG64 266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_INT64 long 267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_UINT64 unsigned long 268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#elif defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */ 270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* this compiler provides the __int64 type */ 272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_LONG64 273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_INT64 __int64 274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_UINT64 unsigned __int64 275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#elif defined( __BORLANDC__ ) /* Borland C++ */ 277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* XXXX: We should probably check the value of __BORLANDC__ in order */ 279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* to test the compiler version. */ 280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* this compiler provides the __int64 type */ 282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_LONG64 283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_INT64 __int64 284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_UINT64 unsigned __int64 285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#elif defined( __WATCOMC__ ) /* Watcom C++ */ 287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Watcom doesn't provide 64-bit data types */ 289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#elif defined( __MWERKS__ ) /* Metrowerks CodeWarrior */ 291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_LONG64 293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_INT64 long long int 294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_UINT64 unsigned long long int 295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#elif defined( __GNUC__ ) 297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* GCC provides the `long long' type */ 299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_LONG64 300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_INT64 long long int 301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_UINT64 unsigned long long int 302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) */ 304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* A 64-bit data type will create compilation problems if you compile */ 309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* in strict ANSI mode. To avoid them, we disable its use if __STDC__ */ 310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* is defined. You can however ignore this rule by defining the */ 311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* FT_CONFIG_OPTION_FORCE_INT64 configuration macro. */ 312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if defined( FT_LONG64 ) && !defined( FT_CONFIG_OPTION_FORCE_INT64 ) 314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef __STDC__ 316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* undefine the 64-bit macros in strict ANSI compilation mode */ 318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#undef FT_LONG64 319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#undef FT_INT64 320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* __STDC__ */ 322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* FT_LONG64 && !FT_CONFIG_OPTION_FORCE_INT64 */ 324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef FT_LONG64 326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov typedef FT_INT64 FT_Int64; 327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov typedef FT_UINT64 FT_UInt64; 328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_BEGIN_STMNT do { 332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_END_STMNT } while ( 0 ) 333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT 334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef FT_CONFIG_OPTION_NO_ASSEMBLER 337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Provide assembler fragments for performance-critical functions. */ 338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* These must be defined `static __inline__' with GCC. */ 339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**Johnson add !defined( __thumb__ )*/ 341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if (defined( __CC_ARM ) || defined( __ARMCC__ ))&& !defined( __thumb__ ) /* RVCT */ 342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_MULFIX_ASSEMBLER FT_MulFix_arm 343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* documentation is in freetype.h */ 345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static __inline FT_Int32 347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MulFix_arm( FT_Int32 a, 348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int32 b ) 349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov register FT_Int32 t, t2; 351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov __asm 354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov smull t2, t, b, a /* (lo=t2,hi=t) = a*b */ 356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov mov a, t, asr #31 /* a = (hi >> 31) */ 357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov add a, a, #0x8000 /* a += 0x8000 */ 358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov adds t2, t2, a /* t2 += a */ 359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov adc t, t, #0 /* t += carry */ 360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov mov a, t2, lsr #16 /* a = t2 >> 16 */ 361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov orr a, a, t, lsl #16 /* a |= t << 16 */ 362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return a; 364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* __CC_ARM || __ARMCC__ */ 367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef __GNUC__ 370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if defined( __arm__ ) && !defined( __thumb__ ) && \ 372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov !( defined( __CC_ARM ) || defined( __ARMCC__ ) ) 373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_MULFIX_ASSEMBLER FT_MulFix_arm 374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* documentation is in freetype.h */ 376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static __inline__ FT_Int32 378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MulFix_arm( FT_Int32 a, 379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int32 b ) 380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov register FT_Int32 t, t2; 382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov __asm__ __volatile__ ( 385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "smull %1, %2, %4, %3\n\t" /* (lo=%1,hi=%2) = a*b */ 386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "mov %0, %2, asr #31\n\t" /* %0 = (hi >> 31) */ 387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "add %0, %0, #0x8000\n\t" /* %0 += 0x8000 */ 388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "adds %1, %1, %0\n\t" /* %1 += %0 */ 389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "adc %2, %2, #0\n\t" /* %2 += carry */ 390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "mov %0, %1, lsr #16\n\t" /* %0 = %1 >> 16 */ 391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "orr %0, %0, %2, lsl #16\n\t" /* %0 |= %2 << 16 */ 392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov : "=r"(a), "=&r"(t2), "=&r"(t) 393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov : "r"(a), "r"(b) 394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov : "cc" ); 395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return a; 396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* __arm__ && !__thumb__ && !( __CC_ARM || __ARMCC__ ) */ 399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if defined( __i386__ ) 401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_MULFIX_ASSEMBLER FT_MulFix_i386 402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* documentation is in freetype.h */ 404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static __inline__ FT_Int32 406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MulFix_i386( FT_Int32 a, 407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int32 b ) 408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov register FT_Int32 result; 410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov __asm__ __volatile__ ( 413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "imul %%edx\n" 414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "movl %%edx, %%ecx\n" 415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "sarl $31, %%ecx\n" 416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "addl $0x8000, %%ecx\n" 417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "addl %%ecx, %%eax\n" 418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "adcl $0, %%edx\n" 419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "shrl $16, %%eax\n" 420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "shll $16, %%edx\n" 421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "addl %%edx, %%eax\n" 422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov : "=a"(result), "=d"(b) 423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov : "a"(a), "d"(b) 424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov : "%ecx", "cc" ); 425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return result; 426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* i386 */ 429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* __GNUC__ */ 431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef _MSC_VER /* Visual C++ */ 434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef _M_IX86 436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_MULFIX_ASSEMBLER FT_MulFix_i386 438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* documentation is in freetype.h */ 440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static __inline FT_Int32 442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MulFix_i386( FT_Int32 a, 443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int32 b ) 444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov register FT_Int32 result; 446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov __asm 448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov mov eax, a 450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov mov edx, b 451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov imul edx 452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov mov ecx, edx 453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sar ecx, 31 454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov add ecx, 8000h 455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov add eax, ecx 456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov adc edx, 0 457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov shr eax, 16 458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov shl edx, 16 459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov add eax, edx 460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov mov result, eax 461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return result; 463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* _M_IX86 */ 466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* _MSC_VER */ 468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */ 470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef FT_CONFIG_OPTION_INLINE_MULFIX 473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef FT_MULFIX_ASSEMBLER 474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_MULFIX_INLINED FT_MULFIX_ASSEMBLER 475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef FT_MAKE_OPTION_SINGLE_OBJECT 480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_LOCAL( x ) static x 482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_LOCAL_DEF( x ) static x 483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef __cplusplus 487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_LOCAL( x ) extern "C" x 488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_LOCAL_DEF( x ) extern "C" x 489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_LOCAL( x ) extern x 491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_LOCAL_DEF( x ) x 492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */ 495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef FT_BASE 498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef __cplusplus 500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_BASE( x ) extern "C" x 501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_BASE( x ) extern x 503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* !FT_BASE */ 506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef FT_BASE_DEF 509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef __cplusplus 511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_BASE_DEF( x ) x 512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_BASE_DEF( x ) x 514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* !FT_BASE_DEF */ 517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef FT_EXPORT 520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef __cplusplus 522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_EXPORT( x ) extern "C" x 523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_EXPORT( x ) extern x 525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* !FT_EXPORT */ 528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef FT_EXPORT_DEF 531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef __cplusplus 533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_EXPORT_DEF( x ) extern "C" x 534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_EXPORT_DEF( x ) extern x 536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* !FT_EXPORT_DEF */ 539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef FT_EXPORT_VAR 542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef __cplusplus 544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_EXPORT_VAR( x ) extern "C" x 545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_EXPORT_VAR( x ) extern x 547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* !FT_EXPORT_VAR */ 550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* The following macros are needed to compile the library with a */ 552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* C++ compiler and with 16bit compilers. */ 553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* This is special. Within C++, you must specify `extern "C"' for */ 556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* functions which are used via function pointers, and you also */ 557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* must do that for structures which contain function pointers to */ 558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* assure C linkage -- it's not possible to have (local) anonymous */ 559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* functions which are accessed by (global) function pointers. */ 560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* FT_CALLBACK_DEF is used to _define_ a callback function. */ 563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */ 565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* contains pointers to callback functions. */ 566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable */ 568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* that contains pointers to callback functions. */ 569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Some 16bit compilers have to redefine these macros to insert */ 572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* the infamous `_cdecl' or `__fastcall' declarations. */ 573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef FT_CALLBACK_DEF 575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef __cplusplus 576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_CALLBACK_DEF( x ) extern "C" x 577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_CALLBACK_DEF( x ) static x 579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* FT_CALLBACK_DEF */ 581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef FT_CALLBACK_TABLE 583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef __cplusplus 584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_CALLBACK_TABLE extern "C" 585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_CALLBACK_TABLE_DEF extern "C" 586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_CALLBACK_TABLE extern 588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_CALLBACK_TABLE_DEF /* nothing */ 589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* FT_CALLBACK_TABLE */ 591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 593ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFT_END_HEADER 594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* __FTCONFIG_H__ */ 597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* END */ 600