1 #ifndef EL__TERMINAL_DRAW_H
2 #define EL__TERMINAL_DRAW_H
4 #include "intl/charsets.h" /* unicode_val_T */
11 /** How many bytes we need for the colors of one character cell. */
12 #if defined(CONFIG_TRUE_COLOR)
13 /* 0, 1, 2 - rgb foreground; 3, 4, 5 - rgb background */
14 #define SCREEN_COLOR_SIZE 6
15 #elif defined(CONFIG_88_COLORS) || defined(CONFIG_256_COLORS)
16 /* 0 is foreground; 1 is background */
17 #define SCREEN_COLOR_SIZE 2
19 #define SCREEN_COLOR_SIZE 1
22 /** Attributes of a character on the screen.
23 * All attributes should fit inside an unsigned char.
25 * XXX: The bold mask is used as part of the color encoding. */
26 enum screen_char_attr
{
27 SCREEN_ATTR_UNSEARCHABLE
= 0x01,
28 SCREEN_ATTR_BOLD
= 0x08,
29 SCREEN_ATTR_ITALIC
= 0x10,
30 SCREEN_ATTR_UNDERLINE
= 0x20,
31 SCREEN_ATTR_STANDOUT
= 0x40,
32 SCREEN_ATTR_FRAME
= 0x80,
35 /** One position in the terminal screen's image. */
37 /** Contains either character value or frame data.
38 * - If #attr includes ::SCREEN_ATTR_FRAME, then @c data is
40 * - Otherwise, if the charset of the terminal is UTF-8, then
41 * @c data is a character value in UCS-4. This is possible
42 * only if CONFIG_UTF8 is defined.
43 * - Otherwise, the charset of the terminal is assumed to be
44 * unibyte, and @c data is a byte in that charset. */
49 #endif /* CONFIG_UTF8 */
51 /** Attributes are ::screen_char_attr bits. */
54 /** The fore- and background color. */
55 unsigned char color
[SCREEN_COLOR_SIZE
];
58 /** @relates screen_char */
59 #define copy_screen_chars(to, from, amount) \
60 do { memcpy(to, from, (amount) * sizeof(struct screen_char)); } while (0)
62 /** @name Linux frame symbols table.
63 * It is magically converted to other terminals when needed.
64 * In the screen image, they have attribute SCREEN_ATTR_FRAME;
65 * you should drop them to the image using draw_border_char().
67 * @todo TODO: When we'll support internal Unicode, this should be
68 * changed to some Unicode sequences. --pasky
70 * Codes extracted from twin-0.4.6 GPL project, a Textmode WINdow environment,
71 * by Massimiliano Ghilardi http://linuz.sns.it/~max/
75 #define T_UTF_16_BOX_DRAWINGS_LIGHT_VERTICAL 0x2502
76 #define T_UTF_16_BOX_DRAWINGS_LIGHT_VERTICAL_AND_LEFT 0x2524
77 #define T_UTF_16_BOX_DRAWINGS_VERTICAL_SINGLE_AND_LEFT_DOUBLE 0x2561
78 #define T_UTF_16_BOX_DRAWINGS_VERTICAL_DOUBLE_AND_LEFT_SINGLE 0x2562
79 #define T_UTF_16_BOX_DRAWINGS_DOWN_DOUBLE_AND_LEFT_SINGLE 0x2556
80 #define T_UTF_16_BOX_DRAWINGS_DOWN_SINGLE_AND_LEFT_DOUBLE 0x2555
81 #define T_UTF_16_BOX_DRAWINGS_DOUBLE_VERTICAL_AND_LEFT 0x2563
82 #define T_UTF_16_BOX_DRAWINGS_DOUBLE_VERTICAL 0x2551
83 #define T_UTF_16_BOX_DRAWINGS_DOUBLE_DOWN_AND_LEFT 0x2557
84 #define T_UTF_16_BOX_DRAWINGS_DOUBLE_UP_AND_LEFT 0x255D
85 #define T_UTF_16_BOX_DRAWINGS_UP_DOUBLE_AND_LEFT_SINGLE 0x255C
86 #define T_UTF_16_BOX_DRAWINGS_UP_SINGLE_AND_LEFT_DOUBLE 0x255B
87 #define T_UTF_16_BOX_DRAWINGS_LIGHT_DOWN_AND_LEFT 0x2510
88 #define T_UTF_16_BOX_DRAWINGS_LIGHT_UP_AND_RIGHT 0x2514
89 #define T_UTF_16_BOX_DRAWINGS_LIGHT_UP_AND_HORIZONTAL 0x2534
90 #define T_UTF_16_BOX_DRAWINGS_LIGHT_DOWN_AND_HORIZONTAL 0x252C
91 #define T_UTF_16_BOX_DRAWINGS_LIGHT_VERTICAL_AND_RIGHT 0x251C
92 #define T_UTF_16_BOX_DRAWINGS_LIGHT_HORIZONTAL 0x2500
93 #define T_UTF_16_BOX_DRAWINGS_LIGHT_VERTICAL_AND_HORIZONTAL 0x253C
94 #define T_UTF_16_BOX_DRAWINGS_VERTICAL_SINGLE_AND_RIGHT_DOUBLE 0x255E
95 #define T_UTF_16_BOX_DRAWINGS_VERTICAL_DOUBLE_AND_RIGHT_SINGLE 0x255F
96 #define T_UTF_16_BOX_DRAWINGS_DOUBLE_UP_AND_RIGHT 0x255A
97 #define T_UTF_16_BOX_DRAWINGS_DOUBLE_DOWN_AND_RIGHT 0x2554
98 #define T_UTF_16_BOX_DRAWINGS_DOUBLE_UP_AND_HORIZONTAL 0x2569
99 #define T_UTF_16_BOX_DRAWINGS_DOUBLE_DOWN_AND_HORIZONTAL 0x2566
100 #define T_UTF_16_BOX_DRAWINGS_DOUBLE_VERTICAL_AND_RIGHT 0x2560
101 #define T_UTF_16_BOX_DRAWINGS_DOUBLE_HORIZONTAL 0x2550
102 #define T_UTF_16_BOX_DRAWINGS_DOUBLE_VERTICAL_AND_HORIZONTAL 0x256C
103 #define T_UTF_16_BOX_DRAWINGS_UP_SINGLE_AND_HORIZONTAL_DOUBLE 0x2567
104 #define T_UTF_16_BOX_DRAWINGS_UP_DOUBLE_AND_HORIZONTAL_SINGLE 0x2568
105 #define T_UTF_16_BOX_DRAWINGS_DOWN_SINGLE_AND_HORIZONTAL_DOUBLE 0x2564
106 #define T_UTF_16_BOX_DRAWINGS_DOWN_DOUBLE_AND_HORIZONTAL_SINGLE 0x2565
107 #define T_UTF_16_BOX_DRAWINGS_UP_DOUBLE_AND_RIGHT_SINGLE 0x2559
108 #define T_UTF_16_BOX_DRAWINGS_UP_SINGLE_AND_RIGHT_DOUBLE 0x2558
109 #define T_UTF_16_BOX_DRAWINGS_DOWN_SINGLE_AND_RIGHT_DOUBLE 0x2552
110 #define T_UTF_16_BOX_DRAWINGS_DOWN_DOUBLE_AND_RIGHT_SINGLE 0x2553
111 #define T_UTF_16_BOX_DRAWINGS_VERTICAL_DOUBLE_AND_HORIZONTAL_SINGLE 0x256B
112 #define T_UTF_16_BOX_DRAWINGS_VERTICAL_SINGLE_AND_HORIZONTAL_DOUBLE 0x256A
113 #define T_UTF_16_BOX_DRAWINGS_LIGHT_UP_AND_LEFT 0x2518
114 #define T_UTF_16_BOX_DRAWINGS_LIGHT_DOWN_AND_RIGHT 0x250C
117 /* CP437 is used by default */
118 #define T_CP437_BOX_DRAWINGS_LIGHT_VERTICAL 0x00B3
119 #define T_CP437_BOX_DRAWINGS_LIGHT_VERTICAL_AND_LEFT 0x00B4
120 #define T_CP437_BOX_DRAWINGS_VERTICAL_SINGLE_AND_LEFT_DOUBLE 0x00B5
121 #define T_CP437_BOX_DRAWINGS_VERTICAL_DOUBLE_AND_LEFT_SINGLE 0x00B6
122 #define T_CP437_BOX_DRAWINGS_DOWN_DOUBLE_AND_LEFT_SINGLE 0x00B7
123 #define T_CP437_BOX_DRAWINGS_DOWN_SINGLE_AND_LEFT_DOUBLE 0x00B8
124 #define T_CP437_BOX_DRAWINGS_DOUBLE_VERTICAL_AND_LEFT 0x00B9
125 #define T_CP437_BOX_DRAWINGS_DOUBLE_VERTICAL 0x00BA
126 #define T_CP437_BOX_DRAWINGS_DOUBLE_DOWN_AND_LEFT 0x00BB
127 #define T_CP437_BOX_DRAWINGS_DOUBLE_UP_AND_LEFT 0x00BC
128 #define T_CP437_BOX_DRAWINGS_UP_DOUBLE_AND_LEFT_SINGLE 0x00BD
129 #define T_CP437_BOX_DRAWINGS_UP_SINGLE_AND_LEFT_DOUBLE 0x00BE
130 #define T_CP437_BOX_DRAWINGS_LIGHT_DOWN_AND_LEFT 0x00BF
131 #define T_CP437_BOX_DRAWINGS_LIGHT_UP_AND_RIGHT 0x00C0
132 #define T_CP437_BOX_DRAWINGS_LIGHT_UP_AND_HORIZONTAL 0x00C1
133 #define T_CP437_BOX_DRAWINGS_LIGHT_DOWN_AND_HORIZONTAL 0x00C2
134 #define T_CP437_BOX_DRAWINGS_LIGHT_VERTICAL_AND_RIGHT 0x00C3
135 #define T_CP437_BOX_DRAWINGS_LIGHT_HORIZONTAL 0x00C4
136 #define T_CP437_BOX_DRAWINGS_LIGHT_VERTICAL_AND_HORIZONTAL 0x00C5
137 #define T_CP437_BOX_DRAWINGS_VERTICAL_SINGLE_AND_RIGHT_DOUBLE 0x00C6
138 #define T_CP437_BOX_DRAWINGS_VERTICAL_DOUBLE_AND_RIGHT_SINGLE 0x00C7
139 #define T_CP437_BOX_DRAWINGS_DOUBLE_UP_AND_RIGHT 0x00C8
140 #define T_CP437_BOX_DRAWINGS_DOUBLE_DOWN_AND_RIGHT 0x00C9
141 #define T_CP437_BOX_DRAWINGS_DOUBLE_UP_AND_HORIZONTAL 0x00CA
142 #define T_CP437_BOX_DRAWINGS_DOUBLE_DOWN_AND_HORIZONTAL 0x00CB
143 #define T_CP437_BOX_DRAWINGS_DOUBLE_VERTICAL_AND_RIGHT 0x00CC
144 #define T_CP437_BOX_DRAWINGS_DOUBLE_HORIZONTAL 0x00CD
145 #define T_CP437_BOX_DRAWINGS_DOUBLE_VERTICAL_AND_HORIZONTAL 0x00CE
146 #define T_CP437_BOX_DRAWINGS_UP_SINGLE_AND_HORIZONTAL_DOUBLE 0x00CF
147 #define T_CP437_BOX_DRAWINGS_UP_DOUBLE_AND_HORIZONTAL_SINGLE 0x00D0
148 #define T_CP437_BOX_DRAWINGS_DOWN_SINGLE_AND_HORIZONTAL_DOUBLE 0x00D1
149 #define T_CP437_BOX_DRAWINGS_DOWN_DOUBLE_AND_HORIZONTAL_SINGLE 0x00D2
150 #define T_CP437_BOX_DRAWINGS_UP_DOUBLE_AND_RIGHT_SINGLE 0x00D3
151 #define T_CP437_BOX_DRAWINGS_UP_SINGLE_AND_RIGHT_DOUBLE 0x00D4
152 #define T_CP437_BOX_DRAWINGS_DOWN_SINGLE_AND_RIGHT_DOUBLE 0x00D5
153 #define T_CP437_BOX_DRAWINGS_DOWN_DOUBLE_AND_RIGHT_SINGLE 0x00D6
154 #define T_CP437_BOX_DRAWINGS_VERTICAL_DOUBLE_AND_HORIZONTAL_SINGLE 0x00D7
155 #define T_CP437_BOX_DRAWINGS_VERTICAL_SINGLE_AND_HORIZONTAL_DOUBLE 0x00D8
156 #define T_CP437_BOX_DRAWINGS_LIGHT_UP_AND_LEFT 0x00D9
157 #define T_CP437_BOX_DRAWINGS_LIGHT_DOWN_AND_RIGHT 0x00DA
162 #define BD_LIGHT(XXX) T_CP437_BOX_DRAWINGS_LIGHT_##XXX
163 #define BD_DOUBLE(XXX) T_CP437_BOX_DRAWINGS_DOUBLE_##XXX
164 #define BD_MIXED(XXX) T_CP437_BOX_DRAWINGS_##XXX
167 BORDER_NONE
= 0x0000,
170 BORDER_SULCORNER
= BD_LIGHT(DOWN_AND_RIGHT
),
171 BORDER_SURCORNER
= BD_LIGHT(DOWN_AND_LEFT
),
172 BORDER_SDLCORNER
= BD_LIGHT(UP_AND_RIGHT
),
173 BORDER_SDRCORNER
= BD_LIGHT(UP_AND_LEFT
),
174 BORDER_SLTEE
= BD_LIGHT(VERTICAL_AND_LEFT
), /* => the tee points to the left => -| */
175 BORDER_SRTEE
= BD_LIGHT(VERTICAL_AND_RIGHT
),
176 BORDER_SDTEE
= BD_LIGHT(DOWN_AND_HORIZONTAL
),
177 BORDER_SUTEE
= BD_LIGHT(UP_AND_HORIZONTAL
),
178 BORDER_SVLINE
= BD_LIGHT(VERTICAL
),
179 BORDER_SHLINE
= BD_LIGHT(HORIZONTAL
),
180 BORDER_SCROSS
= BD_LIGHT(VERTICAL_AND_HORIZONTAL
), /* + */
183 BORDER_DULCORNER
= BD_DOUBLE(DOWN_AND_RIGHT
),
184 BORDER_DURCORNER
= BD_DOUBLE(DOWN_AND_LEFT
),
185 BORDER_DDLCORNER
= BD_DOUBLE(UP_AND_RIGHT
),
186 BORDER_DDRCORNER
= BD_DOUBLE(UP_AND_LEFT
),
187 BORDER_DLTEE
= BD_DOUBLE(VERTICAL_AND_LEFT
),
188 BORDER_DRTEE
= BD_DOUBLE(VERTICAL_AND_RIGHT
),
189 BORDER_DDTEE
= BD_DOUBLE(DOWN_AND_HORIZONTAL
),
190 BORDER_DUTEE
= BD_DOUBLE(UP_AND_HORIZONTAL
),
191 BORDER_DVLINE
= BD_DOUBLE(VERTICAL
),
192 BORDER_DHLINE
= BD_DOUBLE(HORIZONTAL
),
193 BORDER_DCROSS
= BD_DOUBLE(VERTICAL_AND_HORIZONTAL
),
195 /* Mixed single then double */
196 BORDER_SDULCORNER
= BD_MIXED(DOWN_SINGLE_AND_RIGHT_DOUBLE
),
197 BORDER_SDURCORNER
= BD_MIXED(DOWN_SINGLE_AND_LEFT_DOUBLE
),
198 BORDER_SDDLCORNER
= BD_MIXED(UP_SINGLE_AND_RIGHT_DOUBLE
),
199 BORDER_SDDRCORNER
= BD_MIXED(UP_SINGLE_AND_LEFT_DOUBLE
),
200 BORDER_SDLTEE
= BD_MIXED(VERTICAL_SINGLE_AND_LEFT_DOUBLE
),
201 BORDER_SDRTEE
= BD_MIXED(VERTICAL_SINGLE_AND_RIGHT_DOUBLE
),
202 BORDER_SDDTEE
= BD_MIXED(DOWN_SINGLE_AND_HORIZONTAL_DOUBLE
),
203 BORDER_SDUTEE
= BD_MIXED(UP_SINGLE_AND_HORIZONTAL_DOUBLE
),
204 BORDER_SDCROSS
= BD_MIXED(VERTICAL_SINGLE_AND_HORIZONTAL_DOUBLE
),
206 /* Mixed double then single */
207 BORDER_DSULCORNER
= BD_MIXED(DOWN_DOUBLE_AND_RIGHT_SINGLE
),
208 BORDER_DSURCORNER
= BD_MIXED(DOWN_DOUBLE_AND_LEFT_SINGLE
),
209 BORDER_DSDLCORNER
= BD_MIXED(UP_DOUBLE_AND_RIGHT_SINGLE
),
210 BORDER_DSDRCORNER
= BD_MIXED(UP_DOUBLE_AND_LEFT_SINGLE
),
211 BORDER_DSLTEE
= BD_MIXED(VERTICAL_DOUBLE_AND_LEFT_SINGLE
),
212 BORDER_DSRTEE
= BD_MIXED(VERTICAL_DOUBLE_AND_RIGHT_SINGLE
),
213 BORDER_DSDTEE
= BD_MIXED(DOWN_DOUBLE_AND_HORIZONTAL_SINGLE
),
214 BORDER_DSUTEE
= BD_MIXED(UP_DOUBLE_AND_HORIZONTAL_SINGLE
),
215 BORDER_DSCROSS
= BD_MIXED(VERTICAL_DOUBLE_AND_HORIZONTAL_SINGLE
),
218 /* 0 -> 1 <- 2 v 3 ^ */
219 enum border_cross_direction
{
226 /** Extracts a char from the screen. */
227 struct screen_char
*get_char(struct terminal
*, int x
, int y
);
229 /** Sets the color of a screen position. */
230 void draw_char_color(struct terminal
*term
, int x
, int y
,
231 struct color_pair
*color
);
233 /** Sets the data of a screen position. */
235 void draw_char_data(struct terminal
*term
, int x
, int y
, unicode_val_T data
);
237 void draw_char_data(struct terminal
*term
, int x
, int y
, unsigned char data
);
238 #endif /* CONFIG_UTF8 */
240 /** Sets the data to @a border and of a screen position. */
241 void draw_border_char(struct terminal
*term
, int x
, int y
,
242 enum border_char border
, struct color_pair
*color
);
244 /** Sets the cross position of two borders. */
245 void draw_border_cross(struct terminal
*, int x
, int y
,
246 enum border_cross_direction
, struct color_pair
*color
);
250 void draw_char(struct terminal
*term
, int x
, int y
,
251 unicode_val_T data
, enum screen_char_attr attr
,
252 struct color_pair
*color
);
254 void draw_char(struct terminal
*term
, int x
, int y
,
255 unsigned char data
, enum screen_char_attr attr
,
256 struct color_pair
*color
);
257 #endif /* CONFIG_UTF8 */
259 /** Draws area defined by @a box using the same colors and attributes. */
260 void draw_box(struct terminal
*term
, struct box
*box
,
261 unsigned char data
, enum screen_char_attr attr
,
262 struct color_pair
*color
);
264 /** Draws a shadow of @a width and @a height with color @a color
266 void draw_shadow(struct terminal
*term
, struct box
*box
,
267 struct color_pair
*color
, int width
, int height
);
270 void draw_border(struct terminal
*term
, struct box
*box
,
271 struct color_pair
*color
, int width
);
274 void fix_dwchar_around_box(struct terminal
*term
, struct box
*box
, int border
,
275 int shadow_width
, int shadow_height
);
276 #endif /* CONFIG_UTF8 */
278 /** Draws @a length chars from @a text. */
279 void draw_text(struct terminal
*term
, int x
, int y
,
280 unsigned char *text
, int length
,
281 enum screen_char_attr attr
,
282 struct color_pair
*color
);
284 /** Draws text for dialogs. */
285 void draw_dlg_text(struct dialog_data
*dlg_data
, int x
, int y
,
286 unsigned char *text
, int length
,
287 enum screen_char_attr attr
, struct color_pair
*color
);
290 /** Draws @a length chars from @a line on the screen. */
291 void draw_line(struct terminal
*term
, int x
, int y
, int length
,
292 struct screen_char
*line
);
294 /** Updates the terminals cursor position. When @a blockable is set the
295 * block_cursor terminal option decides whether the cursor should be put at the
296 * bottom right corner of the screen. */
297 void set_cursor(struct terminal
*term
, int x
, int y
, int blockable
);
299 /* set cursor for dialogs */
300 void set_dlg_cursor(struct terminal
*term
, struct dialog_data
*dlg_data
, int x
, int y
, int blockable
);
302 /** Blanks the screen. */
303 void clear_terminal(struct terminal
*);