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