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