1
0
mirror of https://github.com/rkd77/elinks.git synced 2024-09-27 02:56:18 -04:00

[line] union in place of struct (sixel)

Chars are accessible via ch.chars not chars as before.
This commit is contained in:
Witold Filipczyk 2023-05-18 11:12:05 +02:00
parent c1d954ab0a
commit ee29a8877b
10 changed files with 73 additions and 65 deletions

View File

@ -279,7 +279,7 @@ reset_document(struct document *document)
int pos; int pos;
for (pos = 0; pos < document->height; pos++) for (pos = 0; pos < document->height; pos++)
mem_free_if(document->data[pos].chars); mem_free_if(document->data[pos].ch.chars);
mem_free_set(&document->data, NULL); mem_free_set(&document->data, NULL);
document->height = 0; document->height = 0;
@ -351,7 +351,7 @@ done_document(struct document *document)
int pos; int pos;
for (pos = 0; pos < document->height; pos++) for (pos = 0; pos < document->height; pos++)
mem_free_if(document->data[pos].chars); mem_free_if(document->data[pos].ch.chars);
mem_free(document->data); mem_free(document->data);
} }

View File

@ -32,11 +32,19 @@ struct node {
struct el_box box; struct el_box box;
}; };
struct sixel {
char *pixels;
unsigned int width;
unsigned int height;
};
/** The document line consisting of the chars ready to be copied to /** The document line consisting of the chars ready to be copied to
* the terminal screen. */ * the terminal screen. */
struct line { struct line {
struct screen_char *chars; union {
struct screen_char *chars;
struct sixel *sixel;
} ch;
unsigned int length:30; unsigned int length:30;
unsigned int kind:1; unsigned int kind:1;
}; };

View File

@ -84,17 +84,17 @@ realloc_line(struct document *document, int x, int y)
if (!line) return NULL; if (!line) return NULL;
if (x > line->length) { if (x > line->length) {
if (!ALIGN_LINE(&line->chars, line->length, x)) if (!ALIGN_LINE(&line->ch.chars, line->length, x))
return NULL; return NULL;
for (; line->length < x; line->length++) { for (; line->length < x; line->length++) {
line->chars[line->length].data = ' '; line->ch.chars[line->length].data = ' ';
} }
if (x > document->width) document->width = x; if (x > document->width) document->width = x;
} }
return line->chars; return line->ch.chars;
} }
static struct node * static struct node *
@ -111,7 +111,7 @@ add_search_node(struct dom_renderer *renderer, int width)
return node; return node;
} }
#define POS(renderer) (&(renderer)->document->data[Y(renderer)].chars[X(renderer)]) #define POS(renderer) (&(renderer)->document->data[Y(renderer)].ch.chars[X(renderer)])
#define WIDTH(renderer, add) ((renderer)->canvas_x + (add)) #define WIDTH(renderer, add) ((renderer)->canvas_x + (add))
static void static void

View File

@ -135,20 +135,20 @@ realloc_line(struct html_context *html_context, struct document *document,
if (length < orig_length) if (length < orig_length)
return orig_length; return orig_length;
if (!ALIGN_LINE(&line->chars, line->length, length + 1)) if (!ALIGN_LINE(&line->ch.chars, line->length, length + 1))
return -1; return -1;
/* We cannot rely on the aligned allocation to clear the members for us /* We cannot rely on the aligned allocation to clear the members for us
* since for line splitting we simply trim the length. Question is if * since for line splitting we simply trim the length. Question is if
* it is better to to clear the line after the splitting or here. */ * it is better to to clear the line after the splitting or here. */
end = &line->chars[length]; end = &line->ch.chars[length];
end->data = ' '; end->data = ' ';
end->attr = 0; end->attr = 0;
set_screen_char_color(end, par_elformat.color.background, 0x0, set_screen_char_color(end, par_elformat.color.background, 0x0,
COLOR_ENSURE_CONTRAST, /* for bug 461 */ COLOR_ENSURE_CONTRAST, /* for bug 461 */
document->options.color_mode); document->options.color_mode);
for (pos = &line->chars[line->length]; pos < end; pos++) { for (pos = &line->ch.chars[line->length]; pos < end; pos++) {
copy_screen_chars(pos, end, 1); copy_screen_chars(pos, end, 1);
} }
@ -177,7 +177,7 @@ realloc_spaces(struct part *part, int length)
#define LINE(y_) part->document->data[Y(y_)] #define LINE(y_) part->document->data[Y(y_)]
#define POS(x_, y_) LINE(y_).chars[X(x_)] #define POS(x_, y_) LINE(y_).ch.chars[X(x_)]
#define LEN(y_) int_max(LINE(y_).length - part->box.x, 0) #define LEN(y_) int_max(LINE(y_).length - part->box.x, 0)
@ -470,7 +470,7 @@ put_combined(struct part *part, int x)
if (prev != UCS_NO_CHAR) if (prev != UCS_NO_CHAR)
document->data[document->comb_y] document->data[document->comb_y]
.chars[document->comb_x].data = prev; .ch.chars[document->comb_x].data = prev;
} }
document->combi_length = 0; document->combi_length = 0;
} }
@ -2250,7 +2250,7 @@ color_link_lines(struct html_context *html_context)
int x; int x;
for (x = 0; x < document->data[y].length; x++) { for (x = 0; x < document->data[y].length; x++) {
struct screen_char *schar = &document->data[y].chars[x]; struct screen_char *schar = &document->data[y].ch.chars[x];
set_term_color(schar, &colors, color_flags, color_mode); set_term_color(schar, &colors, color_flags, color_mode);
@ -2641,7 +2641,7 @@ render_html_document(struct cache_entry *cached, struct document *document,
/* Drop empty allocated lines at end of document if any /* Drop empty allocated lines at end of document if any
* and adjust document height. */ * and adjust document height. */
while (document->height && !document->data[document->height - 1].length) while (document->height && !document->data[document->height - 1].length)
mem_free_if(document->data[--document->height].chars); mem_free_if(document->data[--document->height].ch.chars);
/* Calculate document width. */ /* Calculate document width. */
{ {

View File

@ -67,13 +67,13 @@ realloc_line(struct document *document, int x, int y)
if (!line) return NULL; if (!line) return NULL;
if (x != line->length) { if (x != line->length) {
if (!ALIGN_LINE(&line->chars, line->length, x)) if (!ALIGN_LINE(&line->ch.chars, line->length, x))
return NULL; return NULL;
line->length = x; line->length = x;
} }
return line->chars; return line->ch.chars;
} }
static inline struct link * static inline struct link *
@ -859,20 +859,20 @@ fixup_tables(struct plain_renderer *renderer)
for (x = 0; x < line->length; x++) { for (x = 0; x < line->length; x++) {
int dir; int dir;
#ifdef CONFIG_UTF8 #ifdef CONFIG_UTF8
unicode_val_T ch = line->chars[x].data; unicode_val_T ch = line->ch.chars[x].data;
unicode_val_T prev_char, next_char, up_char, down_char; unicode_val_T prev_char, next_char, up_char, down_char;
#else #else
unsigned char ch = line->chars[x].data; unsigned char ch = line->ch.chars[x].data;
unsigned char prev_char, next_char, up_char, down_char; unsigned char prev_char, next_char, up_char, down_char;
#endif #endif
if (ch != '+' && ch != '-' && ch != '|') { if (ch != '+' && ch != '-' && ch != '|') {
continue; continue;
} }
prev_char = x > 0 ? line->chars[x - 1].data : ' '; prev_char = x > 0 ? line->ch.chars[x - 1].data : ' ';
next_char = x < line->length - 1 ? line->chars[x + 1].data : ' '; next_char = x < line->length - 1 ? line->ch.chars[x + 1].data : ' ';
up_char = (prev_line && x < prev_line->length) ? prev_line->chars[x].data : ' '; up_char = (prev_line && x < prev_line->length) ? prev_line->ch.chars[x].data : ' ';
down_char = (next_line && x < next_line->length) ? next_line->chars[x].data : ' '; down_char = (next_line && x < next_line->length) ? next_line->ch.chars[x].data : ' ';
switch (ch) { switch (ch) {
case '+': case '+':
@ -884,40 +884,40 @@ fixup_tables(struct plain_renderer *renderer)
switch (dir) { switch (dir) {
case 15: case 15:
line->chars[x].data = BORDER_SCROSS; line->ch.chars[x].data = BORDER_SCROSS;
line->chars[x].attr = SCREEN_ATTR_FRAME; line->ch.chars[x].attr = SCREEN_ATTR_FRAME;
break; break;
case 13: case 13:
line->chars[x].data = BORDER_SLTEE; line->ch.chars[x].data = BORDER_SLTEE;
line->chars[x].attr = SCREEN_ATTR_FRAME; line->ch.chars[x].attr = SCREEN_ATTR_FRAME;
break; break;
case 7: case 7:
line->chars[x].data = BORDER_SRTEE; line->ch.chars[x].data = BORDER_SRTEE;
line->chars[x].attr = SCREEN_ATTR_FRAME; line->ch.chars[x].attr = SCREEN_ATTR_FRAME;
break; break;
case 6: case 6:
line->chars[x].data = BORDER_SULCORNER; line->ch.chars[x].data = BORDER_SULCORNER;
line->chars[x].attr = SCREEN_ATTR_FRAME; line->ch.chars[x].attr = SCREEN_ATTR_FRAME;
break; break;
case 12: case 12:
line->chars[x].data = BORDER_SURCORNER; line->ch.chars[x].data = BORDER_SURCORNER;
line->chars[x].attr = SCREEN_ATTR_FRAME; line->ch.chars[x].attr = SCREEN_ATTR_FRAME;
break; break;
case 3: case 3:
line->chars[x].data = BORDER_SDLCORNER; line->ch.chars[x].data = BORDER_SDLCORNER;
line->chars[x].attr = SCREEN_ATTR_FRAME; line->ch.chars[x].attr = SCREEN_ATTR_FRAME;
break; break;
case 9: case 9:
line->chars[x].data = BORDER_SDRCORNER; line->ch.chars[x].data = BORDER_SDRCORNER;
line->chars[x].attr = SCREEN_ATTR_FRAME; line->ch.chars[x].attr = SCREEN_ATTR_FRAME;
break; break;
case 11: case 11:
line->chars[x].data = BORDER_SUTEE; line->ch.chars[x].data = BORDER_SUTEE;
line->chars[x].attr = SCREEN_ATTR_FRAME; line->ch.chars[x].attr = SCREEN_ATTR_FRAME;
break; break;
case 14: case 14:
line->chars[x].data = BORDER_SDTEE; line->ch.chars[x].data = BORDER_SDTEE;
line->chars[x].attr = SCREEN_ATTR_FRAME; line->ch.chars[x].attr = SCREEN_ATTR_FRAME;
break; break;
default: default:
break; break;
@ -927,8 +927,8 @@ fixup_tables(struct plain_renderer *renderer)
if (prev_char == BORDER_SHLINE || prev_char == BORDER_SCROSS || prev_char == '+' || prev_char == '|' if (prev_char == BORDER_SHLINE || prev_char == BORDER_SCROSS || prev_char == '+' || prev_char == '|'
|| prev_char == BORDER_SULCORNER || prev_char == BORDER_SDLCORNER || prev_char == BORDER_SRTEE || prev_char == BORDER_SULCORNER || prev_char == BORDER_SDLCORNER || prev_char == BORDER_SRTEE
|| prev_char == BORDER_SUTEE || prev_char == BORDER_SDTEE) { || prev_char == BORDER_SUTEE || prev_char == BORDER_SDTEE) {
line->chars[x].data = BORDER_SHLINE; line->ch.chars[x].data = BORDER_SHLINE;
line->chars[x].attr = SCREEN_ATTR_FRAME; line->ch.chars[x].attr = SCREEN_ATTR_FRAME;
} }
break; break;
case '|': case '|':
@ -936,13 +936,13 @@ fixup_tables(struct plain_renderer *renderer)
|| up_char == BORDER_SURCORNER || up_char == BORDER_SCROSS || up_char == BORDER_SRTEE || up_char == BORDER_SLTEE || up_char == BORDER_SURCORNER || up_char == BORDER_SCROSS || up_char == BORDER_SRTEE || up_char == BORDER_SLTEE
|| up_char == BORDER_SDTEE) { || up_char == BORDER_SDTEE) {
if (next_char == '-') { if (next_char == '-') {
line->chars[x].data = BORDER_SRTEE; line->ch.chars[x].data = BORDER_SRTEE;
} else if (prev_char == BORDER_SHLINE || prev_char == '-') { } else if (prev_char == BORDER_SHLINE || prev_char == '-') {
line->chars[x].data = BORDER_SLTEE; line->ch.chars[x].data = BORDER_SLTEE;
} else { } else {
line->chars[x].data = BORDER_SVLINE; line->ch.chars[x].data = BORDER_SVLINE;
} }
line->chars[x].attr = SCREEN_ATTR_FRAME; line->ch.chars[x].attr = SCREEN_ATTR_FRAME;
} }
break; break;
default: default:

View File

@ -78,23 +78,23 @@ DUMP_FUNCTION_SPECIALIZED(struct document *document, struct dump_output *out)
unsigned char c; unsigned char c;
#endif /* !DUMP_CHARSET_UTF8 */ #endif /* !DUMP_CHARSET_UTF8 */
const unsigned char attr const unsigned char attr
= document->data[y].chars[x].attr; = document->data[y].ch.chars[x].attr;
#ifdef DUMP_COLOR_MODE_16 #ifdef DUMP_COLOR_MODE_16
const unsigned char color1 const unsigned char color1
= document->data[y].chars[x].c.color[0]; = document->data[y].ch.chars[x].c.color[0];
#elif defined(DUMP_COLOR_MODE_256) #elif defined(DUMP_COLOR_MODE_256)
const unsigned char color1 const unsigned char color1
= document->data[y].chars[x].c.color[0]; = document->data[y].ch.chars[x].c.color[0];
const unsigned char color2 const unsigned char color2
= document->data[y].chars[x].c.color[1]; = document->data[y].ch.chars[x].c.color[1];
#elif defined(DUMP_COLOR_MODE_TRUE) #elif defined(DUMP_COLOR_MODE_TRUE)
const unsigned char *const new_foreground const unsigned char *const new_foreground
= &document->data[y].chars[x].c.color[0]; = &document->data[y].ch.chars[x].c.color[0];
const unsigned char *const new_background const unsigned char *const new_background
= &document->data[y].chars[x].c.color[3]; = &document->data[y].ch.chars[x].c.color[3];
#endif /* DUMP_COLOR_MODE_TRUE */ #endif /* DUMP_COLOR_MODE_TRUE */
c = document->data[y].chars[x].data; c = document->data[y].ch.chars[x].data;
#ifdef DUMP_CHARSET_UTF8 #ifdef DUMP_CHARSET_UTF8
if (c == UCS_NO_CHAR) { if (c == UCS_NO_CHAR) {

View File

@ -422,19 +422,19 @@ draw_doc(struct session *ses, struct document_view *doc_view, int active)
if (en - st > 0) { if (en - st > 0) {
draw_line(term, box->x + st - vx, box->y + y - vy, draw_line(term, box->x + st - vx, box->y + y - vy,
en - st, en - st,
&doc_view->document->data[y].chars[st]); &doc_view->document->data[y].ch.chars[st]);
for (i = en - 1; i >= 0; --i) { for (i = en - 1; i >= 0; --i) {
if (doc_view->document->data[y].chars[i].data != ' ') { if (doc_view->document->data[y].ch.chars[i].data != ' ') {
last = &doc_view->document->data[y].chars[i]; last = &doc_view->document->data[y].ch.chars[i];
last_index = i + 1; last_index = i + 1;
break; break;
} }
} }
} }
for (i = st; i < max; i++) { for (i = st; i < max; i++) {
if (doc_view->document->data[y].chars[i].data != ' ') { if (doc_view->document->data[y].ch.chars[i].data != ' ') {
first = &doc_view->document->data[y].chars[i]; first = &doc_view->document->data[y].ch.chars[i];
break; break;
} }
} }

View File

@ -346,7 +346,7 @@ draw_link(struct terminal *term, struct document_view *doc_view,
struct screen_char *ch; struct screen_char *ch;
ch = get_char(term, x + xpos, y + ypos); ch = get_char(term, x + xpos, y + ypos);
copy_struct(ch, &doc_view->document->data[y].chars[x]); copy_struct(ch, &doc_view->document->data[y].ch.chars[x]);
set_screen_dirty(term->screen, y + ypos, y + ypos); set_screen_dirty(term->screen, y + ypos, y + ypos);
} }
} }

View File

@ -160,15 +160,15 @@ get_srch(struct document *document)
document->data[y].length); document->data[y].length);
for (x = node->box.x; for (x = node->box.x;
x < width && document->data[y].chars[x].data <= ' '; x < width && document->data[y].ch.chars[x].data <= ' ';
x++); x++);
for (; x < width; x++) { for (; x < width; x++) {
UCHAR c = document->data[y].chars[x].data; UCHAR c = document->data[y].ch.chars[x].data;
int count = 0; int count = 0;
int xx; int xx;
if (document->data[y].chars[x].attr & SCREEN_ATTR_UNSEARCHABLE) if (document->data[y].ch.chars[x].attr & SCREEN_ATTR_UNSEARCHABLE)
continue; continue;
#ifdef CONFIG_UTF8 #ifdef CONFIG_UTF8
@ -187,7 +187,7 @@ get_srch(struct document *document)
} }
for (xx = x + 1; xx < width; xx++) { for (xx = x + 1; xx < width; xx++) {
if ((unsigned char)document->data[y].chars[xx].data < ' ') if ((unsigned char)document->data[y].ch.chars[xx].data < ' ')
continue; continue;
count = xx - x; count = xx - x;
break; break;
@ -1536,7 +1536,7 @@ static inline UCHAR
get_document_char(struct document *document, int x, int y) get_document_char(struct document *document, int x, int y)
{ {
return (document->height > y && document->data[y].length > x) return (document->height > y && document->data[y].length > x)
? document->data[y].chars[x].data : 0; ? document->data[y].ch.chars[x].data : 0;
} }
static void static void

View File

@ -1049,7 +1049,7 @@ copy_to_clipboard2(struct document_view *doc_view)
#else #else
unsigned char c; unsigned char c;
#endif #endif
c = document->data[y].chars[x].data; c = document->data[y].ch.chars[x].data;
#ifdef CONFIG_UTF8 #ifdef CONFIG_UTF8
if (utf8 && c == UCS_NO_CHAR) { if (utf8 && c == UCS_NO_CHAR) {