1 /* -*- c-basic-offset:2; tab-width:2; indent-tabs-mode:nil -*- */ 2 3 #ifndef __VT_LINE_H__ 4 #define __VT_LINE_H__ 5 6 #include "vt_str.h" 7 #include "vt_bidi.h" /* vt_bidi_state_t */ 8 #include "vt_iscii.h" /* vt_iscii_state_t */ 9 #include "vt_ot_layout.h" /* vt_ot_layout_state_t */ 10 11 enum { WRAPAROUND = 0x01, BREAK_BOUNDARY = 0x02, SCROLL = 0x04 }; 12 13 enum { 14 VINFO_BIDI = 0x01, 15 VINFO_ISCII = 0x02, 16 VINFO_OT_LAYOUT = 0x03, 17 }; 18 19 typedef union ctl_info { 20 vt_bidi_state_t bidi; 21 vt_iscii_state_t iscii; 22 vt_ot_layout_state_t ot_layout; 23 24 } ctl_info_t; 25 26 /* 27 * This object size should be kept as small as possible. 28 * (160bit ILP32) (224bit ILP64) 29 */ 30 typedef struct vt_line { 31 /* public(readonly) -- If you access &chars[at], use vt_char_at(). */ 32 vt_char_t *chars; 33 34 /* public(readonly) */ 35 u_int16_t num_chars; /* 0 - 65535 */ 36 u_int16_t num_filled_chars; /* 0 - 65535 */ 37 38 /* private */ 39 /* 40 * Type of col should be int, but u_int16_t is used here to shrink memory 41 * because it is appropriate to assume that change_{beg|end}_col never 42 * becomes minus value. 43 */ 44 u_int16_t change_beg_col; /* 0 - 65535 */ 45 u_int16_t change_end_col; /* 0 - 65535 */ 46 47 #if !defined(NO_DYNAMIC_LOAD_CTL) || defined(USE_IND) || defined(USE_FRIBIDI) || \ 48 defined(USE_OT_LAYOUT) 49 /* Don't touch from vt_line.c. ctl_info is used by vt_line_bidi.c and 50 * vt_line_iscii.c. */ 51 ctl_info_t ctl_info; 52 #endif 53 u_int8_t ctl_info_type; 54 55 int is_modified : 4; /* 1: need to redraw. 2: was really changed. */ 56 int is_continued_to_next : 4; 57 58 /* public */ 59 int8_t size_attr; 60 int8_t mark; 61 62 } vt_line_t; 63 64 int vt_line_init(vt_line_t *line, u_int num_chars); 65 66 int vt_line_clone(vt_line_t *clone, vt_line_t *orig, u_int num_chars); 67 68 void vt_line_final(vt_line_t *line); 69 70 u_int vt_line_break_boundary(vt_line_t *line, u_int size); 71 72 int vt_line_assure_boundary(vt_line_t *line, int char_index); 73 74 void vt_line_reset(vt_line_t *line); 75 76 void vt_line_clear(vt_line_t *line, int char_index); 77 78 int vt_line_clear_with(vt_line_t *line, int char_index, vt_char_t *ch); 79 80 int vt_line_overwrite(vt_line_t *line, int beg_char_index, vt_char_t *chars, u_int len, u_int cols); 81 82 #if 0 83 int vt_line_overwrite_all(vt_line_t *line, vt_char_t *chars, int len); 84 #endif 85 86 int vt_line_fill(vt_line_t *line, vt_char_t *ch, int beg, u_int num); 87 88 vt_char_t *vt_char_at(vt_line_t *line, int at); 89 90 int vt_line_set_modified(vt_line_t *line, int beg_char_index, int end_char_index); 91 92 int vt_line_set_modified_all(vt_line_t *line); 93 94 int vt_line_is_cleared_to_end(vt_line_t *line); 95 96 int vt_line_is_modified(vt_line_t *line); 97 98 /* XXX Private api for vt_line.c and vt_line_{iscii|bidi}.c */ 99 #define vt_line_is_real_modified(line) (vt_line_is_modified(line) == 2) 100 101 int vt_line_get_beg_of_modified(vt_line_t *line); 102 103 int vt_line_get_end_of_modified(vt_line_t *line); 104 105 u_int vt_line_get_num_redrawn_chars(vt_line_t *line, int to_end); 106 107 void vt_line_set_updated(vt_line_t *line); 108 109 int vt_line_is_continued_to_next(vt_line_t *line); 110 111 void vt_line_set_continued_to_next(vt_line_t *line, int flag); 112 113 int vt_convert_char_index_to_col(vt_line_t *line, int char_index, int flag); 114 115 int vt_convert_col_to_char_index(vt_line_t *line, u_int *cols_rest, int col, int flag); 116 117 int vt_line_reverse_color(vt_line_t *line, int char_index); 118 119 int vt_line_restore_color(vt_line_t *line, int char_index); 120 121 int vt_line_copy(vt_line_t *dst, vt_line_t *src); 122 123 int vt_line_swap(vt_line_t *line1, vt_line_t *line2); 124 125 int vt_line_share(vt_line_t *dst, vt_line_t *src); 126 127 int vt_line_is_empty(vt_line_t *line); 128 129 u_int vt_line_get_num_filled_cols(vt_line_t *line); 130 131 int vt_line_end_char_index(vt_line_t *line); 132 133 int vt_line_beg_char_index_regarding_rtl(vt_line_t *line); 134 135 u_int vt_line_get_num_filled_chars_except_sp_with_func(vt_line_t *line, 136 int (*func)(vt_char_t *, vt_char_t *)); 137 138 #define vt_line_get_num_filled_chars_except_sp(line) \ 139 vt_line_get_num_filled_chars_except_sp_with_func((line), vt_char_code_equal) 140 141 void vt_line_set_size_attr(vt_line_t *line, int size_attr); 142 143 #define vt_line_is_using_ctl(line) ((line)->ctl_info_type) 144 145 #if !defined(NO_DYNAMIC_LOAD_CTL) || defined(USE_OT_LAYOUT) 146 #define vt_line_has_ot_substitute_glyphs(line) \ 147 ((line)->ctl_info_type == VINFO_OT_LAYOUT && (line)->ctl_info.ot_layout->substituted) 148 #else 149 #define vt_line_has_ot_substitute_glyphs(line) (0) 150 #endif 151 152 int vt_line_convert_visual_char_index_to_logical(vt_line_t *line, int char_index); 153 154 int vt_line_is_rtl(vt_line_t *line); 155 156 int vt_line_copy_logical_str(vt_line_t *line, vt_char_t *dst, int beg, u_int len); 157 158 int vt_line_convert_logical_char_index_to_visual(vt_line_t *line, int logical_char_index, 159 u_int32_t *meet_pos_info); 160 161 vt_line_t *vt_line_shape(vt_line_t *line); 162 163 int vt_line_unshape(vt_line_t *line, vt_line_t *orig); 164 165 int vt_line_unuse_ctl(vt_line_t *line); 166 167 int vt_line_ctl_render(vt_line_t *line, vt_bidi_mode_t bidi_mode, const char *separators, 168 void *term); 169 170 int vt_line_ctl_visual(vt_line_t *line); 171 172 int vt_line_ctl_logical(vt_line_t *line); 173 174 int vt_line_clear_picture(vt_line_t *line); 175 176 #ifdef DEBUG 177 178 void vt_line_dump(vt_line_t *line); 179 180 #endif 181 182 #endif 183