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