]> git.saurik.com Git - wxWidgets.git/blob - src/freetype/autohint/ahangles.c
changed version number
[wxWidgets.git] / src / freetype / autohint / ahangles.c
1 /***************************************************************************/
2 /* */
3 /* ahangles.h */
4 /* */
5 /* A routine used to compute vector angles with limited accuracy */
6 /* and very high speed (body). */
7 /* */
8 /* Copyright 2000 Catharon Productions Inc. */
9 /* Author: David Turner */
10 /* */
11 /* This file is part of the Catharon Typography Project and shall only */
12 /* be used, modified, and distributed under the terms of the Catharon */
13 /* Open Source License that should come with this file under the name */
14 /* `CatharonLicense.txt'. By continuing to use, modify, or distribute */
15 /* this file you indicate that you have read the license and */
16 /* understand and accept it fully. */
17 /* */
18 /* Note that this license is compatible with the FreeType license. */
19 /* */
20 /***************************************************************************/
21
22
23 #ifdef FT_FLAT_COMPILE
24
25 #include "ahangles.h"
26
27 #else
28
29 #include <autohint/ahangles.h>
30
31 #endif
32
33
34 /* the following table has been automatically generated with */
35 /* the `mather.py' Python script */
36
37 const AH_Angle ah_arctan[1L << AH_ATAN_BITS] =
38 {
39 0, 0, 1, 1, 1, 2, 2, 2,
40 3, 3, 3, 3, 4, 4, 4, 5,
41 5, 5, 6, 6, 6, 7, 7, 7,
42 8, 8, 8, 9, 9, 9, 10, 10,
43 10, 10, 11, 11, 11, 12, 12, 12,
44 13, 13, 13, 14, 14, 14, 14, 15,
45 15, 15, 16, 16, 16, 17, 17, 17,
46 18, 18, 18, 18, 19, 19, 19, 20,
47 20, 20, 21, 21, 21, 21, 22, 22,
48 22, 23, 23, 23, 24, 24, 24, 24,
49 25, 25, 25, 26, 26, 26, 26, 27,
50 27, 27, 28, 28, 28, 28, 29, 29,
51 29, 30, 30, 30, 30, 31, 31, 31,
52 31, 32, 32, 32, 33, 33, 33, 33,
53 34, 34, 34, 34, 35, 35, 35, 35,
54 36, 36, 36, 36, 37, 37, 37, 38,
55 38, 38, 38, 39, 39, 39, 39, 40,
56 40, 40, 40, 41, 41, 41, 41, 42,
57 42, 42, 42, 42, 43, 43, 43, 43,
58 44, 44, 44, 44, 45, 45, 45, 45,
59 46, 46, 46, 46, 46, 47, 47, 47,
60 47, 48, 48, 48, 48, 48, 49, 49,
61 49, 49, 50, 50, 50, 50, 50, 51,
62 51, 51, 51, 51, 52, 52, 52, 52,
63 52, 53, 53, 53, 53, 53, 54, 54,
64 54, 54, 54, 55, 55, 55, 55, 55,
65 56, 56, 56, 56, 56, 57, 57, 57,
66 57, 57, 57, 58, 58, 58, 58, 58,
67 59, 59, 59, 59, 59, 59, 60, 60,
68 60, 60, 60, 61, 61, 61, 61, 61,
69 61, 62, 62, 62, 62, 62, 62, 63,
70 63, 63, 63, 63, 63, 64, 64, 64
71 };
72
73
74 LOCAL_FUNC
75 AH_Angle ah_angle( FT_Vector* v )
76 {
77 FT_Pos dx, dy;
78 AH_Angle angle;
79
80
81 dx = v->x;
82 dy = v->y;
83
84 /* check trivial cases */
85 if ( dy == 0 )
86 {
87 angle = 0;
88 if ( dx < 0 )
89 angle = AH_PI;
90 return angle;
91 }
92 else if ( dx == 0 )
93 {
94 angle = AH_HALF_PI;
95 if ( dy < 0 )
96 angle = -AH_HALF_PI;
97 return angle;
98 }
99
100 angle = 0;
101 if ( dx < 0 )
102 {
103 dx = -v->x;
104 dy = -v->y;
105 angle = AH_PI;
106 }
107
108 if ( dy < 0 )
109 {
110 FT_Pos tmp;
111
112
113 tmp = dx;
114 dx = -dy;
115 dy = tmp;
116 angle -= AH_HALF_PI;
117 }
118
119 if ( dx == 0 && dy == 0 )
120 return 0;
121
122 if ( dx == dy )
123 angle += AH_PI / 4;
124 else if ( dx > dy )
125 angle += ah_arctan[FT_DivFix( dy, dx ) >> ( 16 - AH_ATAN_BITS )];
126 else
127 angle += AH_HALF_PI -
128 ah_arctan[FT_DivFix( dx, dy ) >> ( 16 - AH_ATAN_BITS )];
129
130 if ( angle > AH_PI )
131 angle -= AH_2PI;
132
133 return angle;
134 }
135
136
137 /* END */