diff options
Diffstat (limited to 'source/luametatex/source/tex/texdirections.h')
-rw-r--r-- | source/luametatex/source/tex/texdirections.h | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/source/luametatex/source/tex/texdirections.h b/source/luametatex/source/tex/texdirections.h new file mode 100644 index 000000000..cb85c2485 --- /dev/null +++ b/source/luametatex/source/tex/texdirections.h @@ -0,0 +1,123 @@ +/* + See license.txt in the root of this project. +*/ + +# ifndef LMT_DIRECTIONS_H +# define LMT_DIRECTIONS_H + +/*tex + + Originally we had quarterwords but some compiler versions then keep complaining about + comparisons always being true (something enumeration not being integer or so). Interesting it + all worked well and suddenly gcc on openbsd complained. So, in the end I decided to just make + these fields halfwords too. It leaves room for growth ... who knows what is needed some day. + + Actually, as we have only two subtypes now, I have considered: + + \starttyping + 0 = begin l2r 2 = end l2r + 1 = begin r2l 3 = end r2l + \stoptyping + + in which case a regular direction node becomes smaller (no dir_dir any more). But, it come with + a change at the \LUA\ end too, so it's a no-go in the end. + + For the moment we keep some geometry values here but these might move to their own file when + there is more to it. + +*/ + +# include "luametatex.h" + +typedef struct dir_state_info { + halfword text_dir_ptr; + /* alignment */ + int padding; +} dir_state_info; + +extern dir_state_info lmt_dir_state; + +typedef enum direction_codes { + direction_unknown = 0xFF, + direction_l2r = 0, + direction_r2l = 1 +} direction_codes; + +# define direction_def_value direction_l2r +# define direction_min_value direction_l2r +# define direction_max_value direction_r2l + +# define geometry_def_value 0 +# define geometry_min_value 0 +# define geometry_max_value 0xFF + +# define orientation_def_value 0 +# define orientation_min_value 0 +# define orientation_max_value 0x0FFF + +# define anchor_def_value 0 +# define anchor_min_value 0 +# define anchor_max_value 0x0FFF + +# define orientationonly(t) (t & 0x000F) + +# define valid_direction(d) ((d >= direction_min_value) && (d <= direction_max_value)) +# define valid_geometry(g) ((g >= geometry_min_value) && (g <= geometry_max_value)) +# define valid_orientation(o) ((o >= orientation_min_value) && (o <= orientation_max_value)) +# define valid_anchor(a) ((a >= anchor_min_value) && (a <= anchor_max_value)) + +# define checked_direction_value(d) (valid_direction(d) ? d : direction_def_value) +# define checked_geometry_value(g) (valid_geometry(g) ? g : geometry_def_value) +# define checked_orientation_value(o) (valid_orientation(o) ? o : orientation_def_value) +# define checked_anchor_value(a) (valid_anchor(a) ? a : anchor_def_value) + +# define check_direction_value(d) \ + if (! valid_direction(d)) { \ + d = direction_def_value; \ + } + +/* will become texgeometry.h|c and dir also in geometry */ + +inline static void tex_check_box_geometry(halfword n) +{ + if (box_x_offset(n) || box_y_offset(n)) { + tex_set_box_geometry(n, offset_geometry); + } else { + tex_unset_box_geometry(n, offset_geometry); + } + if (box_w_offset(n) || box_h_offset(n) || box_d_offset(n) || box_orientation(n)) { + tex_set_box_geometry(n, orientation_geometry); + } else { + tex_unset_box_geometry(n, orientation_geometry); + } + if (box_anchor(n) || box_source_anchor(n) || box_target_anchor(n)) { + tex_set_box_geometry(n, anchor_geometry); + } else { + tex_unset_box_geometry(n, anchor_geometry); + } +} + +inline static void tex_set_box_direction(halfword b, halfword v) +{ + box_dir(b) = (singleword) checked_direction_value(v); +} + +extern void tex_initialize_directions (void); +extern void tex_cleanup_directions (void); +extern halfword tex_new_dir (quarterword subtype, halfword direction); +extern void tex_push_text_dir_ptr (halfword val); +extern void tex_pop_text_dir_ptr (void); +extern void tex_set_text_dir (halfword d); +extern void tex_set_math_dir (halfword d); +extern void tex_set_line_dir (halfword d); +extern void tex_set_par_dir (halfword d); +extern void tex_set_box_dir (halfword b, singleword d); + +# define swap_hang_indent(dir,indentation) (dir == dir_righttoleft && normalize_line_mode_permitted(normalize_line_mode_par, swap_hangindent_mode) ? ( - indentation) : indentation) +# define swap_parshape_indent(dir,indentation,width) (dir == dir_righttoleft && normalize_line_mode_permitted(normalize_line_mode_par, swap_parshape_mode) ? (hsize_par - width - indentation) : indentation) + +extern halfword tex_update_dir_state (halfword p, halfword initial); +extern halfword tex_sanitize_dir_state (halfword first, halfword last, halfword initial); +extern halfword tex_complement_dir_state (halfword tail); + +# endif |