1/***************************************************************************/
2/*                                                                         */
3/*  ftmisc.h                                                               */
4/*                                                                         */
5/*    Miscellaneous macros for stand-alone rasterizer (specification       */
6/*    only).                                                               */
7/*                                                                         */
8/*  Copyright 2005-2015 by                                                 */
9/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
10/*                                                                         */
11/*  This file is part of the FreeType project, and may only be used        */
12/*  modified and distributed under the terms of the FreeType project       */
13/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
14/*  this file you indicate that you have read the license and              */
15/*  understand and accept it fully.                                        */
16/*                                                                         */
17/***************************************************************************/
18
19
20  /***************************************************/
21  /*                                                 */
22  /* This file is *not* portable!  You have to adapt */
23  /* its definitions to your platform.               */
24  /*                                                 */
25  /***************************************************/
26
27#ifndef __FTMISC_H__
28#define __FTMISC_H__
29
30
31  /* memset */
32#include FT_CONFIG_STANDARD_LIBRARY_H
33
34#define FT_BEGIN_HEADER
35#define FT_END_HEADER
36
37#define FT_LOCAL_DEF( x )   static x
38
39
40  /* from include/freetype2/fttypes.h */
41
42  typedef unsigned char  FT_Byte;
43  typedef signed int     FT_Int;
44  typedef unsigned int   FT_UInt;
45  typedef signed long    FT_Long;
46  typedef unsigned long  FT_ULong;
47  typedef signed long    FT_F26Dot6;
48  typedef int            FT_Error;
49
50#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \
51          ( ( (FT_ULong)_x1 << 24 ) |     \
52            ( (FT_ULong)_x2 << 16 ) |     \
53            ( (FT_ULong)_x3 <<  8 ) |     \
54              (FT_ULong)_x4         )
55
56
57  /* from include/freetype2/ftsystem.h */
58
59  typedef struct FT_MemoryRec_*  FT_Memory;
60
61  typedef void* (*FT_Alloc_Func)( FT_Memory  memory,
62                                  long       size );
63
64  typedef void (*FT_Free_Func)( FT_Memory  memory,
65                                void*      block );
66
67  typedef void* (*FT_Realloc_Func)( FT_Memory  memory,
68                                    long       cur_size,
69                                    long       new_size,
70                                    void*      block );
71
72  typedef struct FT_MemoryRec_
73  {
74    void*            user;
75
76    FT_Alloc_Func    alloc;
77    FT_Free_Func     free;
78    FT_Realloc_Func  realloc;
79
80  } FT_MemoryRec;
81
82
83  /* from src/ftcalc.c */
84
85#if ( defined _WIN32 || defined _WIN64 )
86
87  typedef __int64  FT_Int64;
88
89#else
90
91#include "inttypes.h"
92
93  typedef int64_t  FT_Int64;
94
95#endif
96
97
98  static FT_Long
99  FT_MulDiv( FT_Long  a,
100             FT_Long  b,
101             FT_Long  c )
102  {
103    FT_Int   s;
104    FT_Long  d;
105
106
107    s = 1;
108    if ( a < 0 ) { a = -a; s = -1; }
109    if ( b < 0 ) { b = -b; s = -s; }
110    if ( c < 0 ) { c = -c; s = -s; }
111
112    d = (FT_Long)( c > 0 ? ( (FT_Int64)a * b + ( c >> 1 ) ) / c
113                         : 0x7FFFFFFFL );
114
115    return ( s > 0 ) ? d : -d;
116  }
117
118
119  static FT_Long
120  FT_MulDiv_No_Round( FT_Long  a,
121                      FT_Long  b,
122                      FT_Long  c )
123  {
124    FT_Int   s;
125    FT_Long  d;
126
127
128    s = 1;
129    if ( a < 0 ) { a = -a; s = -1; }
130    if ( b < 0 ) { b = -b; s = -s; }
131    if ( c < 0 ) { c = -c; s = -s; }
132
133    d = (FT_Long)( c > 0 ? (FT_Int64)a * b / c
134                         : 0x7FFFFFFFL );
135
136    return ( s > 0 ) ? d : -d;
137  }
138
139#endif /* __FTMISC_H__ */
140
141
142/* END */
143