1 #include <ft2build.h> 2 #include FT_FREETYPE_H 3 #include FT_TRIGONOMETRY_H 4 5 #include <math.h> 6 #include <stdio.h> 7 8 #define PI 3.14159265358979323846 9 #define SPI (PI/FT_ANGLE_PI) 10 11 /* the precision in 16.16 fixed float points of the checks. Expect */ 12 /* between 2 and 5 noise LSB bits during operations, due to */ 13 /* rounding errors.. */ 14 #define THRESHOLD 64 15 16 static error = 0; 17 18 static void test_cos(void)19 test_cos( void ) 20 { 21 FT_Fixed f1, f2; 22 double d1, d2; 23 int i; 24 25 for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 ) 26 { 27 f1 = FT_Cos(i); 28 d1 = f1/65536.0; 29 d2 = cos( i*SPI ); 30 f2 = (FT_Fixed)(d2*65536.0); 31 32 if ( abs( f2-f1 ) > THRESHOLD ) 33 { 34 error = 1; 35 printf( "FT_Cos[%3d] = %.7f cos[%3d] = %.7f\n", 36 (i >> 16), f1/65536.0, (i >> 16), d2 ); 37 } 38 } 39 } 40 41 42 43 static void test_sin(void)44 test_sin( void ) 45 { 46 FT_Fixed f1, f2; 47 double d1, d2; 48 int i; 49 50 for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 ) 51 { 52 f1 = FT_Sin(i); 53 d1 = f1/65536.0; 54 d2 = sin( i*SPI ); 55 f2 = (FT_Fixed)(d2*65536.0); 56 57 if ( abs( f2-f1 ) > THRESHOLD ) 58 { 59 error = 1; 60 printf( "FT_Sin[%3d] = %.7f sin[%3d] = %.7f\n", 61 (i >> 16), f1/65536.0, (i >> 16), d2 ); 62 } 63 } 64 } 65 66 67 static void test_tan(void)68 test_tan( void ) 69 { 70 FT_Fixed f1, f2; 71 double d1, d2; 72 int i; 73 74 for ( i = 0; i < FT_ANGLE_PI2-0x2000000; i += 0x10000 ) 75 { 76 f1 = FT_Tan(i); 77 d1 = f1/65536.0; 78 d2 = tan( i*SPI ); 79 f2 = (FT_Fixed)(d2*65536.0); 80 81 if ( abs( f2-f1 ) > THRESHOLD ) 82 { 83 error = 1; 84 printf( "FT_Tan[%3d] = %.7f tan[%3d] = %.7f\n", 85 (i >> 16), f1/65536.0, (i >> 16), d2 ); 86 } 87 } 88 } 89 90 91 static void test_atan2(void)92 test_atan2( void ) 93 { 94 FT_Fixed c2, s2; 95 double l, a, c1, s1; 96 int i, j; 97 98 for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 ) 99 { 100 l = 5.0; 101 a = i*SPI; 102 103 c1 = l * cos(a); 104 s1 = l * sin(a); 105 106 c2 = (FT_Fixed)(c1*65536.0); 107 s2 = (FT_Fixed)(s1*65536.0); 108 109 j = FT_Atan2( c2, s2 ); 110 if ( j < 0 ) 111 j += FT_ANGLE_2PI; 112 113 if ( abs( i - j ) > 1 ) 114 { 115 printf( "FT_Atan2( %.7f, %.7f ) = %.5f, atan = %.5f\n", 116 c2/65536.0, s2/65536.0, j/65536.0, i/65536.0 ); 117 } 118 } 119 } 120 121 static void test_unit(void)122 test_unit( void ) 123 { 124 FT_Vector v; 125 double a, c1, s1; 126 FT_Fixed c2, s2; 127 int i; 128 129 for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 ) 130 { 131 FT_Vector_Unit( &v, i ); 132 a = ( i*SPI ); 133 c1 = cos(a); 134 s1 = sin(a); 135 c2 = (FT_Fixed)(c1*65536.0); 136 s2 = (FT_Fixed)(s1*65536.0); 137 138 if ( abs( v.x-c2 ) > THRESHOLD || 139 abs( v.y-s2 ) > THRESHOLD ) 140 { 141 error = 1; 142 printf( "FT_Vector_Unit[%3d] = ( %.7f, %.7f ) vec = ( %.7f, %.7f )\n", 143 (i >> 16), 144 v.x/65536.0, v.y/65536.0, 145 c1, s1 ); 146 } 147 } 148 } 149 150 151 static void test_length(void)152 test_length( void ) 153 { 154 FT_Vector v; 155 FT_Fixed l, l2; 156 int i; 157 158 for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 ) 159 { 160 l = (FT_Fixed)(500.0*65536.0); 161 v.x = (FT_Fixed)( l * cos( i*SPI ) ); 162 v.y = (FT_Fixed)( l * sin( i*SPI ) ); 163 l2 = FT_Vector_Length( &v ); 164 165 if ( abs( l2-l ) > THRESHOLD ) 166 { 167 error = 1; 168 printf( "FT_Length( %.7f, %.7f ) = %.5f, length = %.5f\n", 169 v.x/65536.0, v.y/65536.0, l2/65536.0, l/65536.0 ); 170 } 171 } 172 } 173 174 175 static void test_rotate(void)176 test_rotate( void ) 177 { 178 FT_Fixed c2, s2, c4, s4; 179 FT_Vector v; 180 double l, ra, a, c1, s1, cra, sra, c3, s3; 181 int i, j, rotate; 182 183 for ( rotate = 0; rotate < FT_ANGLE_2PI; rotate += 0x10000 ) 184 { 185 ra = rotate*SPI; 186 cra = cos( ra ); 187 sra = sin( ra ); 188 189 for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 ) 190 { 191 l = 500.0; 192 a = i*SPI; 193 194 c1 = l * cos(a); 195 s1 = l * sin(a); 196 197 v.x = c2 = (FT_Fixed)(c1*65536.0); 198 v.y = s2 = (FT_Fixed)(s1*65536.0); 199 200 FT_Vector_Rotate( &v, rotate ); 201 202 c3 = c1 * cra - s1 * sra; 203 s3 = c1 * sra + s1 * cra; 204 205 c4 = (FT_Fixed)(c3*65536.0); 206 s4 = (FT_Fixed)(s3*65536.0); 207 208 if ( abs( c4 - v.x ) > THRESHOLD || 209 abs( s4 - v.y ) > THRESHOLD ) 210 { 211 error = 1; 212 printf( "FT_Rotate( (%.7f,%.7f), %.5f ) = ( %.7f, %.7f ), rot = ( %.7f, %.7f )\n", 213 c1, s1, ra, 214 c2/65536.0, s2/65536.0, 215 c4/65536.0, s4/65536.0 ); 216 } 217 } 218 } 219 } 220 221 main(void)222 int main( void ) 223 { 224 test_cos(); 225 test_sin(); 226 test_tan(); 227 test_atan2(); 228 test_unit(); 229 test_length(); 230 test_rotate(); 231 232 if (!error) 233 printf( "trigonometry test ok !\n" ); 234 235 return !error; 236 } 237