blob: 718785232538f19d6c41fb8e1a80d44534d32c57 [file] [log] [blame]
David Turner3469d0d2000-07-19 20:02:14 +00001/***************************************************************************/
2/* */
3/* ahangles.h */
4/* */
Werner Lembergd060a752000-07-20 06:57:41 +00005/* A routine used to compute vector angles with limited accuracy */
Werner Lembergdb578ae2000-07-23 21:27:52 +00006/* and very high speed (body). */
David Turner3469d0d2000-07-19 20:02:14 +00007/* */
Werner Lembergd060a752000-07-20 06:57:41 +00008/* Copyright 2000 Catharon Productions Inc. */
David Turner3469d0d2000-07-19 20:02:14 +00009/* 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 Lembergd060a752000-07-20 06:57:41 +000014/* `CatharonLicense.txt'. By continuing to use, modify, or distribute */
David Turner3469d0d2000-07-19 20:02:14 +000015/* this file you indicate that you have read the license and */
16/* understand and accept it fully. */
17/* */
Werner Lembergd060a752000-07-20 06:57:41 +000018/* Note that this license is compatible with the FreeType license. */
David Turner3469d0d2000-07-19 20:02:14 +000019/* */
20/***************************************************************************/
Werner Lembergd060a752000-07-20 06:57:41 +000021
Werner Lemberg90d99642000-12-09 00:45:38 +000022
David Turner940d3062000-12-05 23:07:16 +000023#include <ft2build.h>
24#include FT_SOURCE_FILE(autohint,ahangles.h)
David Turner3469d0d2000-07-19 20:02:14 +000025
David Turner3469d0d2000-07-19 20:02:14 +000026
Werner Lembergd060a752000-07-20 06:57:41 +000027 /* 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 Turner3469d0d2000-07-19 20:02:14 +000065
66
David Turner76a5f622000-11-04 01:55:49 +000067 FT_LOCAL_DEF
Werner Lembergd060a752000-07-20 06:57:41 +000068 AH_Angle ah_angle( FT_Vector* v )
David Turner3469d0d2000-07-19 20:02:14 +000069 {
70 FT_Pos dx, dy;
71 AH_Angle angle;
72
Werner Lembergd060a752000-07-20 06:57:41 +000073
74 dx = v->x;
75 dy = v->y;
David Turner3469d0d2000-07-19 20:02:14 +000076
77 /* check trivial cases */
Werner Lembergd060a752000-07-20 06:57:41 +000078 if ( dy == 0 )
David Turner3469d0d2000-07-19 20:02:14 +000079 {
80 angle = 0;
Werner Lembergd060a752000-07-20 06:57:41 +000081 if ( dx < 0 )
David Turner3469d0d2000-07-19 20:02:14 +000082 angle = AH_PI;
83 return angle;
84 }
Werner Lembergd060a752000-07-20 06:57:41 +000085 else if ( dx == 0 )
David Turner3469d0d2000-07-19 20:02:14 +000086 {
87 angle = AH_HALF_PI;
Werner Lembergd060a752000-07-20 06:57:41 +000088 if ( dy < 0 )
David Turner3469d0d2000-07-19 20:02:14 +000089 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 Lembergd060a752000-07-20 06:57:41 +0000104
105
David Turner3469d0d2000-07-19 20:02:14 +0000106 tmp = dx;
107 dx = -dy;
108 dy = tmp;
109 angle -= AH_HALF_PI;
110 }
111
Werner Lembergd060a752000-07-20 06:57:41 +0000112 if ( dx == 0 && dy == 0 )
David Turner3469d0d2000-07-19 20:02:14 +0000113 return 0;
114
Werner Lembergd060a752000-07-20 06:57:41 +0000115 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 Turner3469d0d2000-07-19 20:02:14 +0000119 else
Werner Lembergd060a752000-07-20 06:57:41 +0000120 angle += AH_HALF_PI -
121 ah_arctan[FT_DivFix( dx, dy ) >> ( 16 - AH_ATAN_BITS )];
David Turner3469d0d2000-07-19 20:02:14 +0000122
Werner Lembergd060a752000-07-20 06:57:41 +0000123 if ( angle > AH_PI )
David Turner3469d0d2000-07-19 20:02:14 +0000124 angle -= AH_2PI;
125
126 return angle;
127 }
128
129
Werner Lembergd060a752000-07-20 06:57:41 +0000130/* END */