David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 1 | /***************************************************************************/ |
| 2 | /* */ |
| 3 | /* ahangles.h */ |
| 4 | /* */ |
Werner Lemberg | d060a75 | 2000-07-20 06:57:41 +0000 | [diff] [blame] | 5 | /* A routine used to compute vector angles with limited accuracy */ |
Werner Lemberg | db578ae | 2000-07-23 21:27:52 +0000 | [diff] [blame] | 6 | /* and very high speed (body). */ |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 7 | /* */ |
Werner Lemberg | d060a75 | 2000-07-20 06:57:41 +0000 | [diff] [blame] | 8 | /* Copyright 2000 Catharon Productions Inc. */ |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 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 */ |
Werner Lemberg | d060a75 | 2000-07-20 06:57:41 +0000 | [diff] [blame] | 14 | /* `CatharonLicense.txt'. By continuing to use, modify, or distribute */ |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 15 | /* this file you indicate that you have read the license and */ |
| 16 | /* understand and accept it fully. */ |
| 17 | /* */ |
Werner Lemberg | d060a75 | 2000-07-20 06:57:41 +0000 | [diff] [blame] | 18 | /* Note that this license is compatible with the FreeType license. */ |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 19 | /* */ |
| 20 | /***************************************************************************/ |
Werner Lemberg | d060a75 | 2000-07-20 06:57:41 +0000 | [diff] [blame] | 21 | |
Werner Lemberg | 90d9964 | 2000-12-09 00:45:38 +0000 | [diff] [blame^] | 22 | |
David Turner | 940d306 | 2000-12-05 23:07:16 +0000 | [diff] [blame] | 23 | #include <ft2build.h> |
| 24 | #include FT_SOURCE_FILE(autohint,ahangles.h) |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 25 | |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 26 | |
Werner Lemberg | d060a75 | 2000-07-20 06:57:41 +0000 | [diff] [blame] | 27 | /* the following table has been automatically generated with */ |
| 28 | /* the `mather.py' Python script */ |
| 29 | |
| 30 | const AH_Angle ah_arctan[1L << AH_ATAN_BITS] = |
| 31 | { |
| 32 | 0, 0, 1, 1, 1, 2, 2, 2, |
| 33 | 3, 3, 3, 3, 4, 4, 4, 5, |
| 34 | 5, 5, 6, 6, 6, 7, 7, 7, |
| 35 | 8, 8, 8, 9, 9, 9, 10, 10, |
| 36 | 10, 10, 11, 11, 11, 12, 12, 12, |
| 37 | 13, 13, 13, 14, 14, 14, 14, 15, |
| 38 | 15, 15, 16, 16, 16, 17, 17, 17, |
| 39 | 18, 18, 18, 18, 19, 19, 19, 20, |
| 40 | 20, 20, 21, 21, 21, 21, 22, 22, |
| 41 | 22, 23, 23, 23, 24, 24, 24, 24, |
| 42 | 25, 25, 25, 26, 26, 26, 26, 27, |
| 43 | 27, 27, 28, 28, 28, 28, 29, 29, |
| 44 | 29, 30, 30, 30, 30, 31, 31, 31, |
| 45 | 31, 32, 32, 32, 33, 33, 33, 33, |
| 46 | 34, 34, 34, 34, 35, 35, 35, 35, |
| 47 | 36, 36, 36, 36, 37, 37, 37, 38, |
| 48 | 38, 38, 38, 39, 39, 39, 39, 40, |
| 49 | 40, 40, 40, 41, 41, 41, 41, 42, |
| 50 | 42, 42, 42, 42, 43, 43, 43, 43, |
| 51 | 44, 44, 44, 44, 45, 45, 45, 45, |
| 52 | 46, 46, 46, 46, 46, 47, 47, 47, |
| 53 | 47, 48, 48, 48, 48, 48, 49, 49, |
| 54 | 49, 49, 50, 50, 50, 50, 50, 51, |
| 55 | 51, 51, 51, 51, 52, 52, 52, 52, |
| 56 | 52, 53, 53, 53, 53, 53, 54, 54, |
| 57 | 54, 54, 54, 55, 55, 55, 55, 55, |
| 58 | 56, 56, 56, 56, 56, 57, 57, 57, |
| 59 | 57, 57, 57, 58, 58, 58, 58, 58, |
| 60 | 59, 59, 59, 59, 59, 59, 60, 60, |
| 61 | 60, 60, 60, 61, 61, 61, 61, 61, |
| 62 | 61, 62, 62, 62, 62, 62, 62, 63, |
| 63 | 63, 63, 63, 63, 63, 64, 64, 64 |
| 64 | }; |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 65 | |
| 66 | |
David Turner | 76a5f62 | 2000-11-04 01:55:49 +0000 | [diff] [blame] | 67 | FT_LOCAL_DEF |
Werner Lemberg | d060a75 | 2000-07-20 06:57:41 +0000 | [diff] [blame] | 68 | AH_Angle ah_angle( FT_Vector* v ) |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 69 | { |
| 70 | FT_Pos dx, dy; |
| 71 | AH_Angle angle; |
| 72 | |
Werner Lemberg | d060a75 | 2000-07-20 06:57:41 +0000 | [diff] [blame] | 73 | |
| 74 | dx = v->x; |
| 75 | dy = v->y; |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 76 | |
| 77 | /* check trivial cases */ |
Werner Lemberg | d060a75 | 2000-07-20 06:57:41 +0000 | [diff] [blame] | 78 | if ( dy == 0 ) |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 79 | { |
| 80 | angle = 0; |
Werner Lemberg | d060a75 | 2000-07-20 06:57:41 +0000 | [diff] [blame] | 81 | if ( dx < 0 ) |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 82 | angle = AH_PI; |
| 83 | return angle; |
| 84 | } |
Werner Lemberg | d060a75 | 2000-07-20 06:57:41 +0000 | [diff] [blame] | 85 | else if ( dx == 0 ) |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 86 | { |
| 87 | angle = AH_HALF_PI; |
Werner Lemberg | d060a75 | 2000-07-20 06:57:41 +0000 | [diff] [blame] | 88 | if ( dy < 0 ) |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 89 | angle = -AH_HALF_PI; |
| 90 | return angle; |
| 91 | } |
| 92 | |
| 93 | angle = 0; |
| 94 | if ( dx < 0 ) |
| 95 | { |
| 96 | dx = -v->x; |
| 97 | dy = -v->y; |
| 98 | angle = AH_PI; |
| 99 | } |
| 100 | |
| 101 | if ( dy < 0 ) |
| 102 | { |
| 103 | FT_Pos tmp; |
Werner Lemberg | d060a75 | 2000-07-20 06:57:41 +0000 | [diff] [blame] | 104 | |
| 105 | |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 106 | tmp = dx; |
| 107 | dx = -dy; |
| 108 | dy = tmp; |
| 109 | angle -= AH_HALF_PI; |
| 110 | } |
| 111 | |
Werner Lemberg | d060a75 | 2000-07-20 06:57:41 +0000 | [diff] [blame] | 112 | if ( dx == 0 && dy == 0 ) |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 113 | return 0; |
| 114 | |
Werner Lemberg | d060a75 | 2000-07-20 06:57:41 +0000 | [diff] [blame] | 115 | if ( dx == dy ) |
| 116 | angle += AH_PI / 4; |
| 117 | else if ( dx > dy ) |
| 118 | angle += ah_arctan[FT_DivFix( dy, dx ) >> ( 16 - AH_ATAN_BITS )]; |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 119 | else |
Werner Lemberg | d060a75 | 2000-07-20 06:57:41 +0000 | [diff] [blame] | 120 | angle += AH_HALF_PI - |
| 121 | ah_arctan[FT_DivFix( dx, dy ) >> ( 16 - AH_ATAN_BITS )]; |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 122 | |
Werner Lemberg | d060a75 | 2000-07-20 06:57:41 +0000 | [diff] [blame] | 123 | if ( angle > AH_PI ) |
David Turner | 3469d0d | 2000-07-19 20:02:14 +0000 | [diff] [blame] | 124 | angle -= AH_2PI; |
| 125 | |
| 126 | return angle; |
| 127 | } |
| 128 | |
| 129 | |
Werner Lemberg | d060a75 | 2000-07-20 06:57:41 +0000 | [diff] [blame] | 130 | /* END */ |