version 1.109, 2020/05/16 16:22:01 |
version 1.110, 2020/05/25 09:32:10 |
|
|
} |
} |
|
|
/* Set cell as extended. */ |
/* Set cell as extended. */ |
static struct grid_cell * |
static struct grid_extd_entry * |
grid_extended_cell(struct grid_line *gl, struct grid_cell_entry *gce, |
grid_extended_cell(struct grid_line *gl, struct grid_cell_entry *gce, |
const struct grid_cell *gc) |
const struct grid_cell *gc) |
{ |
{ |
struct grid_cell *gcp; |
struct grid_extd_entry *gee; |
int flags = (gc->flags & ~GRID_FLAG_CLEARED); |
int flags = (gc->flags & ~GRID_FLAG_CLEARED); |
|
|
if (~gce->flags & GRID_FLAG_EXTENDED) |
if (~gce->flags & GRID_FLAG_EXTENDED) |
|
|
fatalx("offset too big"); |
fatalx("offset too big"); |
gl->flags |= GRID_LINE_EXTENDED; |
gl->flags |= GRID_LINE_EXTENDED; |
|
|
gcp = &gl->extddata[gce->offset]; |
gee = &gl->extddata[gce->offset]; |
memcpy(gcp, gc, sizeof *gcp); |
gee->data = utf8_map_big(&gc->data); |
gcp->flags = flags; |
gee->attr = gc->attr; |
return (gcp); |
gee->flags = flags; |
|
gee->fg = gc->fg; |
|
gee->bg = gc->bg; |
|
gee->us = gc->us; |
|
return (gee); |
} |
} |
|
|
/* Free up unused extended cells. */ |
/* Free up unused extended cells. */ |
|
|
grid_compact_line(struct grid_line *gl) |
grid_compact_line(struct grid_line *gl) |
{ |
{ |
int new_extdsize = 0; |
int new_extdsize = 0; |
struct grid_cell *new_extddata; |
struct grid_extd_entry *new_extddata; |
struct grid_cell_entry *gce; |
struct grid_cell_entry *gce; |
struct grid_cell *gc; |
struct grid_extd_entry *gee; |
u_int px, idx; |
u_int px, idx; |
|
|
if (gl->extdsize == 0) |
if (gl->extdsize == 0) |
|
|
for (px = 0; px < gl->cellsize; px++) { |
for (px = 0; px < gl->cellsize; px++) { |
gce = &gl->celldata[px]; |
gce = &gl->celldata[px]; |
if (gce->flags & GRID_FLAG_EXTENDED) { |
if (gce->flags & GRID_FLAG_EXTENDED) { |
gc = &gl->extddata[gce->offset]; |
gee = &gl->extddata[gce->offset]; |
memcpy(&new_extddata[idx], gc, sizeof *gc); |
memcpy(&new_extddata[idx], gee, sizeof *gee); |
gce->offset = idx++; |
gce->offset = idx++; |
} |
} |
} |
} |
|
|
{ |
{ |
struct grid_line *gl = &gd->linedata[py]; |
struct grid_line *gl = &gd->linedata[py]; |
struct grid_cell_entry *gce = &gl->celldata[px]; |
struct grid_cell_entry *gce = &gl->celldata[px]; |
struct grid_cell *gc; |
struct grid_extd_entry *gee; |
|
|
memcpy(gce, &grid_cleared_entry, sizeof *gce); |
memcpy(gce, &grid_cleared_entry, sizeof *gce); |
if (bg != 8) { |
if (bg != 8) { |
if (bg & COLOUR_FLAG_RGB) { |
if (bg & COLOUR_FLAG_RGB) { |
grid_get_extended_cell(gl, gce, gce->flags); |
grid_get_extended_cell(gl, gce, gce->flags); |
gl->flags |= GRID_LINE_EXTENDED; |
gee = grid_extended_cell(gl, gce, &grid_cleared_cell); |
|
gee->bg = bg; |
gc = &gl->extddata[gce->offset]; |
|
memcpy(gc, &grid_cleared_cell, sizeof *gc); |
|
gc->bg = bg; |
|
} else { |
} else { |
if (bg & COLOUR_FLAG_256) |
if (bg & COLOUR_FLAG_256) |
gce->flags |= GRID_FLAG_BG256; |
gce->flags |= GRID_FLAG_BG256; |
|
|
grid_get_cell1(struct grid_line *gl, u_int px, struct grid_cell *gc) |
grid_get_cell1(struct grid_line *gl, u_int px, struct grid_cell *gc) |
{ |
{ |
struct grid_cell_entry *gce = &gl->celldata[px]; |
struct grid_cell_entry *gce = &gl->celldata[px]; |
|
struct grid_extd_entry *gee; |
|
|
if (gce->flags & GRID_FLAG_EXTENDED) { |
if (gce->flags & GRID_FLAG_EXTENDED) { |
if (gce->offset >= gl->extdsize) |
if (gce->offset >= gl->extdsize) |
memcpy(gc, &grid_default_cell, sizeof *gc); |
memcpy(gc, &grid_default_cell, sizeof *gc); |
else |
else { |
memcpy(gc, &gl->extddata[gce->offset], sizeof *gc); |
gee = &gl->extddata[gce->offset]; |
|
gc->flags = gee->flags; |
|
gc->attr = gee->attr; |
|
gc->fg = gee->fg; |
|
gc->bg = gee->bg; |
|
gc->us = gee->us; |
|
utf8_get_big(gee->data, &gc->data); |
|
} |
return; |
return; |
} |
} |
|
|
|
|
{ |
{ |
struct grid_line *gl; |
struct grid_line *gl; |
struct grid_cell_entry *gce; |
struct grid_cell_entry *gce; |
struct grid_cell *gcp; |
struct grid_extd_entry *gee; |
u_int i; |
u_int i; |
|
|
if (grid_check_y(gd, __func__, py) != 0) |
if (grid_check_y(gd, __func__, py) != 0) |
|
|
for (i = 0; i < slen; i++) { |
for (i = 0; i < slen; i++) { |
gce = &gl->celldata[px + i]; |
gce = &gl->celldata[px + i]; |
if (grid_need_extended_cell(gce, gc)) { |
if (grid_need_extended_cell(gce, gc)) { |
gcp = grid_extended_cell(gl, gce, gc); |
gee = grid_extended_cell(gl, gce, gc); |
utf8_set(&gcp->data, s[i]); |
gee->data = utf8_set_big(s[i], 1); |
} else |
} else |
grid_store_cell(gce, gc, s[i]); |
grid_store_cell(gce, gc, s[i]); |
} |
} |