mirror of
https://github.com/rkd77/elinks.git
synced 2024-11-04 08:17:17 -05:00
Support for double-width glyphs in DOM renderer
Removed duplicate code for UTF-8 in DOM renderer. Modified DOM renderer to correctly displaying multi-width glyphs.
This commit is contained in:
parent
5561437629
commit
f4a430e480
@ -250,11 +250,11 @@ render_dom_line(struct dom_renderer *renderer, struct screen_char *template,
|
|||||||
struct document *document = renderer->document;
|
struct document *document = renderer->document;
|
||||||
struct conv_table *convert = renderer->convert_table;
|
struct conv_table *convert = renderer->convert_table;
|
||||||
enum convert_string_mode mode = renderer->convert_mode;
|
enum convert_string_mode mode = renderer->convert_mode;
|
||||||
|
int x, charlen;
|
||||||
#ifdef CONFIG_UTF_8
|
#ifdef CONFIG_UTF_8
|
||||||
int utf8 = document->options.utf8;
|
int utf8 = document->options.utf8;
|
||||||
unsigned char *end, *text;
|
unsigned char *end;
|
||||||
#endif /* CONFIG_UTF_8 */
|
#endif /* CONFIG_UTF_8 */
|
||||||
int x;
|
|
||||||
|
|
||||||
|
|
||||||
assert(renderer && template && string && length);
|
assert(renderer && template && string && length);
|
||||||
@ -271,14 +271,14 @@ render_dom_line(struct dom_renderer *renderer, struct screen_char *template,
|
|||||||
add_search_node(renderer, length);
|
add_search_node(renderer, length);
|
||||||
|
|
||||||
#ifdef CONFIG_UTF_8
|
#ifdef CONFIG_UTF_8
|
||||||
if (utf8) goto utf_8;
|
end = string + length;
|
||||||
#endif /* CONFIG_UTF_8 */
|
#endif /* CONFIG_UTF_8 */
|
||||||
for (x = 0; x < length; x++, renderer->canvas_x++) {
|
for (x = 0, charlen = 1; x < length;x += charlen, renderer->canvas_x++) {
|
||||||
unsigned char data = string[x];
|
unsigned char *text = &string[x];
|
||||||
|
|
||||||
/* This is mostly to be able to break out so the indentation
|
/* This is mostly to be able to break out so the indentation
|
||||||
* level won't get to high. */
|
* level won't get to high. */
|
||||||
switch (data) {
|
switch (*text) {
|
||||||
case ASCII_TAB:
|
case ASCII_TAB:
|
||||||
{
|
{
|
||||||
int tab_width = 7 - (X(renderer) & 7);
|
int tab_width = 7 - (X(renderer) & 7);
|
||||||
@ -293,52 +293,33 @@ render_dom_line(struct dom_renderer *renderer, struct screen_char *template,
|
|||||||
* ``main loop'' add the actual tab char. */
|
* ``main loop'' add the actual tab char. */
|
||||||
for (; tab_width-- > 0; renderer->canvas_x++)
|
for (; tab_width-- > 0; renderer->canvas_x++)
|
||||||
copy_screen_chars(POS(renderer), template, 1);
|
copy_screen_chars(POS(renderer), template, 1);
|
||||||
|
charlen = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
template->data = isscreensafe(data) ? data : '.';
|
|
||||||
}
|
|
||||||
|
|
||||||
copy_screen_chars(POS(renderer), template, 1);
|
|
||||||
}
|
|
||||||
#ifdef CONFIG_UTF_8
|
#ifdef CONFIG_UTF_8
|
||||||
goto end;
|
if (utf8) {
|
||||||
utf_8:
|
unicode_val_T data;
|
||||||
end = string + length;
|
charlen = utf8charlen(text);
|
||||||
for (text = string; text < end; renderer->canvas_x++) {
|
data = utf_8_to_unicode(&text, end);
|
||||||
unsigned char data = *text;
|
|
||||||
unicode_val_T d2;
|
|
||||||
|
|
||||||
/* This is mostly to be able to break out so the indentation
|
template->data = (uint16_t)data;
|
||||||
* level won't get to high. */
|
|
||||||
switch (data) {
|
|
||||||
case ASCII_TAB:
|
|
||||||
{
|
|
||||||
int tab_width = 7 - (X(renderer) & 7);
|
|
||||||
int width = WIDTH(renderer, end - text + tab_width);
|
|
||||||
|
|
||||||
template->data = ' ';
|
if (unicode_to_cell(data) == 2) {
|
||||||
|
copy_screen_chars(POS(renderer),
|
||||||
|
template, 1);
|
||||||
|
|
||||||
if (!realloc_line(document, width, Y(renderer)))
|
X(renderer)++;
|
||||||
break;
|
template->data = UCS_NO_CHAR;
|
||||||
|
}
|
||||||
|
|
||||||
/* Only loop over the expanded tab chars and let the
|
} else
|
||||||
* ``main loop'' add the actual tab char. */
|
#endif /* CONFIG_UTF_8 */
|
||||||
for (; tab_width-- > 0; renderer->canvas_x++)
|
template->data = isscreensafe(*text) ? *text:'.';
|
||||||
copy_screen_chars(POS(renderer), template, 1);
|
|
||||||
text++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
d2 = utf_8_to_unicode(&text, end);
|
|
||||||
if (d2 == UCS_NO_CHAR) text++;
|
|
||||||
template->data = (uint16_t)d2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
copy_screen_chars(POS(renderer), template, 1);
|
copy_screen_chars(POS(renderer), template, 1);
|
||||||
}
|
}
|
||||||
end:
|
|
||||||
#endif /* CONFIG_UTF_8 */
|
|
||||||
mem_free(string);
|
mem_free(string);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user