OLD | NEW |
1 /***************************************************************************/ | 1 /***************************************************************************/ |
2 /* */ | 2 /* */ |
3 /* ftcalc.h */ | 3 /* ftcalc.h */ |
4 /* */ | 4 /* */ |
5 /* Arithmetic computations (specification). */ | 5 /* Arithmetic computations (specification). */ |
6 /* */ | 6 /* */ |
7 /* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009 by */ | 7 /* Copyright 1996-2006, 2008, 2009, 2012-2013 by */ |
8 /* David Turner, Robert Wilhelm, and Werner Lemberg. */ | 8 /* David Turner, Robert Wilhelm, and Werner Lemberg. */ |
9 /* */ | 9 /* */ |
10 /* This file is part of the FreeType project, and may only be used, */ | 10 /* This file is part of the FreeType project, and may only be used, */ |
11 /* modified, and distributed under the terms of the FreeType project */ | 11 /* modified, and distributed under the terms of the FreeType project */ |
12 /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ | 12 /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
13 /* this file you indicate that you have read the license and */ | 13 /* this file you indicate that you have read the license and */ |
14 /* understand and accept it fully. */ | 14 /* understand and accept it fully. */ |
15 /* */ | 15 /* */ |
16 /***************************************************************************/ | 16 /***************************************************************************/ |
17 | 17 |
18 | 18 |
19 #ifndef __FTCALC_H__ | 19 #ifndef __FTCALC_H__ |
20 #define __FTCALC_H__ | 20 #define __FTCALC_H__ |
21 | 21 |
22 | 22 |
23 #include <ft2build.h> | 23 #include <ft2build.h> |
24 #include FT_FREETYPE_H | 24 #include FT_FREETYPE_H |
25 | 25 |
26 | 26 |
27 FT_BEGIN_HEADER | 27 FT_BEGIN_HEADER |
28 | 28 |
29 | 29 |
30 /*************************************************************************/ | 30 /*************************************************************************/ |
31 /* */ | 31 /* */ |
32 /* <Function> */ | 32 /* <Function> */ |
33 /* FT_FixedSqrt */ | 33 /* FT_FixedSqrt */ |
34 /* */ | 34 /* */ |
35 /* <Description> */ | 35 /* <Description> */ |
36 /* Computes the square root of a 16.16 fixed point value. */ | 36 /* Computes the square root of a 16.16 fixed-point value. */ |
37 /* */ | 37 /* */ |
38 /* <Input> */ | 38 /* <Input> */ |
39 /* x :: The value to compute the root for. */ | 39 /* x :: The value to compute the root for. */ |
40 /* */ | 40 /* */ |
41 /* <Return> */ | 41 /* <Return> */ |
42 /* The result of `sqrt(x)'. */ | 42 /* The result of `sqrt(x)'. */ |
43 /* */ | 43 /* */ |
44 /* <Note> */ | 44 /* <Note> */ |
45 /* This function is not very fast. */ | 45 /* This function is not very fast. */ |
46 /* */ | 46 /* */ |
47 FT_BASE( FT_Int32 ) | 47 FT_BASE( FT_Int32 ) |
48 FT_SqrtFixed( FT_Int32 x ); | 48 FT_SqrtFixed( FT_Int32 x ); |
49 | 49 |
50 | 50 |
51 #ifdef FT_CONFIG_OPTION_OLD_INTERNALS | |
52 | |
53 /*************************************************************************/ | |
54 /* */ | |
55 /* <Function> */ | |
56 /* FT_Sqrt32 */ | |
57 /* */ | |
58 /* <Description> */ | |
59 /* Computes the square root of an Int32 integer (which will be */ | |
60 /* handled as an unsigned long value). */ | |
61 /* */ | |
62 /* <Input> */ | |
63 /* x :: The value to compute the root for. */ | |
64 /* */ | |
65 /* <Return> */ | |
66 /* The result of `sqrt(x)'. */ | |
67 /* */ | |
68 FT_EXPORT( FT_Int32 ) | |
69 FT_Sqrt32( FT_Int32 x ); | |
70 | |
71 #endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ | |
72 | |
73 | |
74 /*************************************************************************/ | 51 /*************************************************************************/ |
75 /* */ | 52 /* */ |
76 /* FT_MulDiv() and FT_MulFix() are declared in freetype.h. */ | 53 /* FT_MulDiv() and FT_MulFix() are declared in freetype.h. */ |
77 /* */ | 54 /* */ |
78 /*************************************************************************/ | 55 /*************************************************************************/ |
79 | 56 |
80 | 57 |
81 #ifdef TT_USE_BYTECODE_INTERPRETER | |
82 | |
83 /*************************************************************************/ | 58 /*************************************************************************/ |
84 /* */ | 59 /* */ |
85 /* <Function> */ | 60 /* <Function> */ |
86 /* FT_MulDiv_No_Round */ | 61 /* FT_MulDiv_No_Round */ |
87 /* */ | 62 /* */ |
88 /* <Description> */ | 63 /* <Description> */ |
89 /* A very simple function used to perform the computation `(a*b)/c' */ | 64 /* A very simple function used to perform the computation `(a*b)/c' */ |
90 /* (without rounding) with maximal accuracy (it uses a 64-bit */ | 65 /* (without rounding) with maximum accuracy (it uses a 64-bit */ |
91 /* intermediate integer whenever necessary). */ | 66 /* intermediate integer whenever necessary). */ |
92 /* */ | 67 /* */ |
93 /* This function isn't necessarily as fast as some processor specific */ | 68 /* This function isn't necessarily as fast as some processor specific */ |
94 /* operations, but is at least completely portable. */ | 69 /* operations, but is at least completely portable. */ |
95 /* */ | 70 /* */ |
96 /* <Input> */ | 71 /* <Input> */ |
97 /* a :: The first multiplier. */ | 72 /* a :: The first multiplier. */ |
98 /* b :: The second multiplier. */ | 73 /* b :: The second multiplier. */ |
99 /* c :: The divisor. */ | 74 /* c :: The divisor. */ |
100 /* */ | 75 /* */ |
101 /* <Return> */ | 76 /* <Return> */ |
102 /* The result of `(a*b)/c'. This function never traps when trying to */ | 77 /* The result of `(a*b)/c'. This function never traps when trying to */ |
103 /* divide by zero; it simply returns `MaxInt' or `MinInt' depending */ | 78 /* divide by zero; it simply returns `MaxInt' or `MinInt' depending */ |
104 /* on the signs of `a' and `b'. */ | 79 /* on the signs of `a' and `b'. */ |
105 /* */ | 80 /* */ |
106 FT_BASE( FT_Long ) | 81 FT_BASE( FT_Long ) |
107 FT_MulDiv_No_Round( FT_Long a, | 82 FT_MulDiv_No_Round( FT_Long a, |
108 FT_Long b, | 83 FT_Long b, |
109 FT_Long c ); | 84 FT_Long c ); |
110 | 85 |
111 #endif /* TT_USE_BYTECODE_INTERPRETER */ | |
112 | |
113 | 86 |
114 /* | 87 /* |
115 * A variant of FT_Matrix_Multiply which scales its result afterwards. | 88 * A variant of FT_Matrix_Multiply which scales its result afterwards. |
116 * The idea is that both `a' and `b' are scaled by factors of 10 so that | 89 * The idea is that both `a' and `b' are scaled by factors of 10 so that |
117 * the values are as precise as possible to get a correct result during | 90 * the values are as precise as possible to get a correct result during |
118 * the 64bit multiplication. Let `sa' and `sb' be the scaling factors of | 91 * the 64bit multiplication. Let `sa' and `sb' be the scaling factors of |
119 * `a' and `b', respectively, then the scaling factor of the result is | 92 * `a' and `b', respectively, then the scaling factor of the result is |
120 * `sa*sb'. | 93 * `sa*sb'. |
121 */ | 94 */ |
122 FT_BASE( void ) | 95 FT_BASE( void ) |
123 FT_Matrix_Multiply_Scaled( const FT_Matrix* a, | 96 FT_Matrix_Multiply_Scaled( const FT_Matrix* a, |
124 FT_Matrix *b, | 97 FT_Matrix *b, |
125 FT_Long scaling ); | 98 FT_Long scaling ); |
126 | 99 |
127 | 100 |
128 /* | 101 /* |
129 * A variant of FT_Vector_Transform. See comments for | 102 * A variant of FT_Vector_Transform. See comments for |
130 * FT_Matrix_Multiply_Scaled. | 103 * FT_Matrix_Multiply_Scaled. |
131 */ | 104 */ |
132 | |
133 FT_BASE( void ) | 105 FT_BASE( void ) |
134 FT_Vector_Transform_Scaled( FT_Vector* vector, | 106 FT_Vector_Transform_Scaled( FT_Vector* vector, |
135 const FT_Matrix* matrix, | 107 const FT_Matrix* matrix, |
136 FT_Long scaling ); | 108 FT_Long scaling ); |
137 | 109 |
138 | 110 |
139 /* | 111 /* |
140 * Return -1, 0, or +1, depending on the orientation of a given corner. | 112 * Return -1, 0, or +1, depending on the orientation of a given corner. |
141 * We use the Cartesian coordinate system, with positive vertical values | 113 * We use the Cartesian coordinate system, with positive vertical values |
142 * going upwards. The function returns +1 if the corner turns to the | 114 * going upwards. The function returns +1 if the corner turns to the |
(...skipping 10 matching lines...) Expand all Loading... |
153 * saying that the angle difference between the `in' and `out' vectors is | 125 * saying that the angle difference between the `in' and `out' vectors is |
154 * very small. | 126 * very small. |
155 */ | 127 */ |
156 FT_BASE( FT_Int ) | 128 FT_BASE( FT_Int ) |
157 ft_corner_is_flat( FT_Pos in_x, | 129 ft_corner_is_flat( FT_Pos in_x, |
158 FT_Pos in_y, | 130 FT_Pos in_y, |
159 FT_Pos out_x, | 131 FT_Pos out_x, |
160 FT_Pos out_y ); | 132 FT_Pos out_y ); |
161 | 133 |
162 | 134 |
| 135 /* |
| 136 * Return the most significant bit index. |
| 137 */ |
| 138 FT_BASE( FT_Int ) |
| 139 FT_MSB( FT_UInt32 z ); |
| 140 |
| 141 |
| 142 /* |
| 143 * Return sqrt(x*x+y*y), which is the same as `FT_Vector_Length' but uses |
| 144 * two fixed-point arguments instead. |
| 145 */ |
| 146 FT_BASE( FT_Fixed ) |
| 147 FT_Hypot( FT_Fixed x, |
| 148 FT_Fixed y ); |
| 149 |
| 150 |
163 #define INT_TO_F26DOT6( x ) ( (FT_Long)(x) << 6 ) | 151 #define INT_TO_F26DOT6( x ) ( (FT_Long)(x) << 6 ) |
164 #define INT_TO_F2DOT14( x ) ( (FT_Long)(x) << 14 ) | 152 #define INT_TO_F2DOT14( x ) ( (FT_Long)(x) << 14 ) |
165 #define INT_TO_FIXED( x ) ( (FT_Long)(x) << 16 ) | 153 #define INT_TO_FIXED( x ) ( (FT_Long)(x) << 16 ) |
166 #define F2DOT14_TO_FIXED( x ) ( (FT_Long)(x) << 2 ) | 154 #define F2DOT14_TO_FIXED( x ) ( (FT_Long)(x) << 2 ) |
167 #define FLOAT_TO_FIXED( x ) ( (FT_Long)( x * 65536.0 ) ) | 155 #define FLOAT_TO_FIXED( x ) ( (FT_Long)( x * 65536.0 ) ) |
168 #define FIXED_TO_INT( x ) ( FT_RoundFix( x ) >> 16 ) | 156 #define FIXED_TO_INT( x ) ( FT_RoundFix( x ) >> 16 ) |
169 | 157 |
170 #define ROUND_F26DOT6( x ) ( x >= 0 ? ( ( (x) + 32 ) & -64 ) \ | 158 #define ROUND_F26DOT6( x ) ( x >= 0 ? ( ( (x) + 32 ) & -64 ) \ |
171 : ( -( ( 32 - (x) ) & -64 ) ) ) | 159 : ( -( ( 32 - (x) ) & -64 ) ) ) |
172 | 160 |
173 | 161 |
174 FT_END_HEADER | 162 FT_END_HEADER |
175 | 163 |
176 #endif /* __FTCALC_H__ */ | 164 #endif /* __FTCALC_H__ */ |
177 | 165 |
178 | 166 |
179 /* END */ | 167 /* END */ |
OLD | NEW |