mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-03-12 05:34:01 -04:00
sixel: split: make pixman instantiation generic
This commit is contained in:
parent
cc65002539
commit
8cdfd03c4b
1 changed files with 27 additions and 34 deletions
61
sixel.c
61
sixel.c
|
|
@ -202,25 +202,22 @@ sixel_split(struct terminal *term, struct sixel *six,
|
||||||
row, col, height, width,
|
row, col, height, width,
|
||||||
rel_above, rel_below, rel_left, rel_right);
|
rel_above, rel_below, rel_left, rel_right);
|
||||||
|
|
||||||
|
struct sixel imgs[4] = {};
|
||||||
|
|
||||||
if (rel_above > 0) {
|
if (rel_above > 0) {
|
||||||
struct sixel above = {
|
imgs[0] = (struct sixel){
|
||||||
.width = six->width,
|
.width = six->width,
|
||||||
.height = rel_above * term->cell_height,
|
.height = rel_above * term->cell_height,
|
||||||
.rows = rel_above,
|
.rows = rel_above,
|
||||||
.cols = six->cols,
|
.cols = six->cols,
|
||||||
.pos = six->pos,
|
.pos = six->pos,
|
||||||
};
|
};
|
||||||
above.data = malloc(above.width * above.height * sizeof(uint32_t));
|
imgs[0].data = malloc(imgs[0].width * imgs[0].height * sizeof(uint32_t));
|
||||||
memcpy(above.data, six->data, above.width * above.height * sizeof(uint32_t));
|
memcpy(imgs[0].data, six->data, imgs[0].width * imgs[0].height * sizeof(uint32_t));
|
||||||
above.pix = pixman_image_create_bits_no_clear(
|
|
||||||
PIXMAN_a8r8g8b8,
|
|
||||||
above.width, above.height,
|
|
||||||
above.data, above.width * sizeof(uint32_t));
|
|
||||||
tll_push_front(term->grid->sixel_images, above);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rel_below < six->rows) {
|
if (rel_below < six->rows) {
|
||||||
struct sixel below = {
|
imgs[1] = (struct sixel){
|
||||||
.width = six->width,
|
.width = six->width,
|
||||||
.height = six->height - rel_below * term->cell_height,
|
.height = six->height - rel_below * term->cell_height,
|
||||||
.rows = six->rows - rel_below,
|
.rows = six->rows - rel_below,
|
||||||
|
|
@ -229,20 +226,15 @@ sixel_split(struct terminal *term, struct sixel *six,
|
||||||
six->pos.col,
|
six->pos.col,
|
||||||
(six->pos.row + rel_below) & (term->grid->num_rows - 1)},
|
(six->pos.row + rel_below) & (term->grid->num_rows - 1)},
|
||||||
};
|
};
|
||||||
below.data = malloc(below.width * below.height * sizeof(uint32_t));
|
imgs[1].data = malloc(imgs[1].width * imgs[1].height * sizeof(uint32_t));
|
||||||
memcpy(
|
memcpy(
|
||||||
below.data,
|
imgs[1].data,
|
||||||
&((const uint32_t *)six->data)[rel_below * term->cell_height * six->width],
|
&((const uint32_t *)six->data)[rel_below * term->cell_height * six->width],
|
||||||
below.width * below.height * sizeof(uint32_t));
|
imgs[1].width * imgs[1].height * sizeof(uint32_t));
|
||||||
below.pix = pixman_image_create_bits_no_clear(
|
|
||||||
PIXMAN_a8r8g8b8,
|
|
||||||
below.width, below.height,
|
|
||||||
below.data, below.width * sizeof(uint32_t));
|
|
||||||
tll_push_front(term->grid->sixel_images, below);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rel_left > 0) {
|
if (rel_left > 0) {
|
||||||
struct sixel left = {
|
imgs[2] = (struct sixel){
|
||||||
.width = rel_left * term->cell_width,
|
.width = rel_left * term->cell_width,
|
||||||
.height = min(term->cell_height, six->height - rel_above * term->cell_height),
|
.height = min(term->cell_height, six->height - rel_above * term->cell_height),
|
||||||
.rows = 1,
|
.rows = 1,
|
||||||
|
|
@ -251,21 +243,16 @@ sixel_split(struct terminal *term, struct sixel *six,
|
||||||
six->pos.col,
|
six->pos.col,
|
||||||
(six->pos.row + rel_above) & (term->grid->num_rows - 1)},
|
(six->pos.row + rel_above) & (term->grid->num_rows - 1)},
|
||||||
};
|
};
|
||||||
left.data = malloc(left.width * left.height * sizeof(uint32_t));
|
imgs[2].data = malloc(imgs[2].width * imgs[2].height * sizeof(uint32_t));
|
||||||
for (size_t i = 0; i < term->cell_height; i++)
|
for (size_t i = 0; i < term->cell_height; i++)
|
||||||
memcpy(
|
memcpy(
|
||||||
&((uint32_t *)left.data)[i * left.width],
|
&((uint32_t *)imgs[2].data)[i * imgs[2].width],
|
||||||
&((const uint32_t *)six->data)[(rel_above * term->cell_height + i) * six->width],
|
&((const uint32_t *)six->data)[(rel_above * term->cell_height + i) * six->width],
|
||||||
left.width * sizeof(uint32_t));
|
imgs[2].width * sizeof(uint32_t));
|
||||||
left.pix = pixman_image_create_bits_no_clear(
|
|
||||||
PIXMAN_a8r8g8b8,
|
|
||||||
left.width, left.height,
|
|
||||||
left.data, left.width * sizeof(uint32_t));
|
|
||||||
tll_push_front(term->grid->sixel_images, left);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rel_right < six->cols) {
|
if (rel_right < six->cols) {
|
||||||
struct sixel right = {
|
imgs[3] = (struct sixel){
|
||||||
.width = six->width - rel_right * term->cell_width,
|
.width = six->width - rel_right * term->cell_width,
|
||||||
.height = min(term->cell_height, six->height - rel_above * term->cell_height),
|
.height = min(term->cell_height, six->height - rel_above * term->cell_height),
|
||||||
.rows = 1,
|
.rows = 1,
|
||||||
|
|
@ -274,17 +261,23 @@ sixel_split(struct terminal *term, struct sixel *six,
|
||||||
six->pos.col + rel_right,
|
six->pos.col + rel_right,
|
||||||
(six->pos.row + rel_above) & (term->grid->num_rows - 1)},
|
(six->pos.row + rel_above) & (term->grid->num_rows - 1)},
|
||||||
};
|
};
|
||||||
right.data = malloc(right.width * right.height * sizeof(uint32_t));
|
imgs[3].data = malloc(imgs[3].width * imgs[3].height * sizeof(uint32_t));
|
||||||
for (size_t i = 0; i < term->cell_height; i++)
|
for (size_t i = 0; i < term->cell_height; i++)
|
||||||
memcpy(
|
memcpy(
|
||||||
&((uint32_t *)right.data)[i * right.width],
|
&((uint32_t *)imgs[3].data)[i * imgs[3].width],
|
||||||
&((const uint32_t *)six->data)[(rel_above * term->cell_height + i) * six->width + rel_right * term->cell_width],
|
&((const uint32_t *)six->data)[(rel_above * term->cell_height + i) * six->width + rel_right * term->cell_width],
|
||||||
right.width * sizeof(uint32_t));
|
imgs[3].width * sizeof(uint32_t));
|
||||||
right.pix = pixman_image_create_bits_no_clear(
|
}
|
||||||
|
|
||||||
|
for (size_t i = 0; i < sizeof(imgs) / sizeof(imgs[0]); i++) {
|
||||||
|
if (imgs[i].data == NULL)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
imgs[i].pix = pixman_image_create_bits_no_clear(
|
||||||
PIXMAN_a8r8g8b8,
|
PIXMAN_a8r8g8b8,
|
||||||
right.width, right.height,
|
imgs[i].width, imgs[i].height,
|
||||||
right.data, right.width * sizeof(uint32_t));
|
imgs[i].data, imgs[i].width * sizeof(uint32_t));
|
||||||
tll_push_front(term->grid->sixel_images, right);
|
tll_push_front(term->grid->sixel_images, imgs[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue