beta-0.89.2
[luatex.git] / source / texk / web2c / luatexdir / tex / directions.h
blobe4cea9014dd69e27f4ee4875b48553abe5ff289d
1 /* directions.h
3 Copyright 2009 Taco Hoekwater <taco@luatex.org>
5 This file is part of LuaTeX.
7 LuaTeX is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2 of the License, or (at your
10 option) any later version.
12 LuaTeX is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
15 License for more details.
17 You should have received a copy of the GNU General Public License along
18 with LuaTeX; if not, see <http://www.gnu.org/licenses/>. */
21 #ifndef DIRECTIONS_H
22 # define DIRECTIONS_H
25 # define dir_TLT 0
26 # define dir_TRT 4
27 # define dir_LTL 9
28 # define dir_RTT 24
30 extern const char *dir_strings[128];
33 # define dir_TLT 0 /* maybe use this one as unset value */
34 # define dir_TRT 1 /* or should we avoid that one because it's a signal too */
35 # define dir_LTL 2
36 # define dir_RTT 3
38 extern const char *dir_strings[8];
40 extern int dir_swap;
42 # define RETURN_DIR_VALUES(a) \
43 if (s==luaS_##a##_ptr) { \
44 return (dir_##a); \
45 } else if (!absolute_only) { \
46 if (s==luaS_p##a##_ptr) \
47 return (dir_##a); \
48 else if (s==luaS_m##a##_ptr) \
49 return ((dir_##a)-4); \
52 # define BOX_DIR_VALUE(a) \
53 ((s==luaS_p##a##_ptr) : (dir_##a) ? ((s==luaS_m##a##_ptr) : ((dir_##a)-4) ? luaS_pTLT))
55 # define is_mirrored(a) 0
57 # define is_rotated(a) (a == dir_RTT)
61 # define textdir_parallel(a,b) ( \
62 ((a == dir_TLT || a == dir_TRT) && (b == dir_TLT || b == dir_TRT)) || \
63 ((a == dir_LTL || a == dir_RTT) && (b == dir_LTL || b == dir_RTT)) \
66 # define pardir_parallel(a,b) ( \
67 ((a == dir_TLT || a == dir_TRT) && (b == dir_TLT || b == dir_TRT)) || \
68 ((a == dir_LTL || a == dir_RTT) && (b == dir_LTL || b == dir_RTT)) \
71 # define pardir_eq(a,b) ( \
72 ((a == dir_TLT || a == dir_TRT) && (b == dir_TLT || b == dir_TRT)) || \
73 (a == dir_LTL && b == dir_LTL) || \
74 (a == dir_RTT && b == dir_RTT) \
77 # define textdir_eq(a,b) ( \
78 (a == dir_TLT && b == dir_TLT) || \
79 (a == dir_TRT && b == dir_TRT) || \
80 (a == dir_LTL && (b == dir_LTL || b == dir_RTT)) || \
81 (a == dir_RTT && (b == dir_LTL || b == dir_RTT))
83 # define partextdir_eq(a,b) ( \
84 ((a == dir_TLT || a == dir_TRT) && (b == dir_LTL || b == dir_RTT)) || \
85 (a == dir_LTL && b == dir_TLT) || \
86 (a == dir_RTT && b == dir_TRT) \
91 /* # define dir_TLT_or_TRT(a) (a == dir_TLT || a == dir_TRT) */
92 /* # define dir_LTL_or_RTT(a) (a == dir_LTL || a == dir_RTT) */
94 # define dir_TLT_or_TRT(a) (a < 2)
95 # define dir_LTL_or_RTT(a) (a > 1)
97 # define textdir_parallel(a,b) ( \
98 (dir_TLT_or_TRT(a) && dir_TLT_or_TRT(b)) || \
99 (dir_LTL_or_RTT(a) && dir_LTL_or_RTT(b)) \
102 # define pardir_parallel(a,b) ( \
103 (dir_TLT_or_TRT(a) && dir_TLT_or_TRT(b)) || \
104 (dir_LTL_or_RTT(a) && dir_LTL_or_RTT(b)) \
107 # define pardir_opposite(a,b) ( \
108 (a == dir_LTL && b == dir_RTT) || \
109 (a == dir_RTT && b == dir_LTL) \
112 # define textdir_opposite(a,b) ( \
113 (a == dir_TLT && b == dir_TRT) || \
114 (a == dir_TRT && b == dir_TLT) \
117 # define glyphdir_opposite(a,b) 0
119 # define pardir_eq(a,b) ( \
120 (dir_TLT_or_TRT(a) && dir_TLT_or_TRT(b)) || \
121 (a == dir_LTL && b == dir_LTL) || \
122 (a == dir_RTT && b == dir_RTT) \
125 # define textdir_eq(a,b) ( \
126 (a == dir_TLT && b == dir_TLT) || \
127 (a == dir_TRT && b == dir_TRT) || \
128 (a == dir_LTL && dir_LTL_or_RTT(b)) || \
129 (a == dir_RTT && dir_LTL_or_RTT(b)) \
132 # define glyphdir_eq(a,b) ( \
133 (a != dir_LTL && b != dir_LTL) || \
134 (a == dir_LTL && b == dir_LTL) \
137 # define partextdir_eq(a,b) ( \
138 (dir_TLT_or_TRT(a) && dir_LTL_or_RTT(b)) || \
139 (a == dir_LTL && b == dir_TLT) || \
140 (a == dir_RTT && b == dir_TRT) \
143 # define textglyphdir_orthogonal(a) (a != dir_RTT)
145 # define textdir_is_L(a) (a == dir_TLT)
147 # define push_dir(p,a) { \
148 halfword dir_tmp=new_dir((a)); \
149 vlink(dir_tmp)=p; \
150 p=dir_tmp; \
153 # define push_dir_node(p,a) { \
154 halfword dir_tmp=copy_node((a)); \
155 vlink(dir_tmp)=p; \
156 p=dir_tmp; \
159 # define pop_dir_node(p) { \
160 halfword dir_tmp=p; \
161 p=vlink(dir_tmp); \
162 flush_node(dir_tmp); \
165 extern halfword dir_ptr;
167 extern halfword text_dir_ptr;
169 extern void initialize_directions(void);
170 extern halfword new_dir(int s);
172 extern const char *string_dir(int d);
173 extern void print_dir(int d);
175 extern void scan_direction(void);
177 extern halfword do_push_dir_node(halfword p, halfword a);
178 extern halfword do_pop_dir_node(halfword p);
180 scaled pack_width(int curdir, int pdir, halfword p, boolean isglyph);
181 scaled_whd pack_width_height_depth(int curdir, int pdir, halfword p, boolean isglyph);
183 void update_text_dir_ptr(int val);
185 #endif