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