sixel: prevent images from piling up (#149)

Old images are automatically deleted if a new image is spawned over
them. This prevents them from piling up and choking the terminal when
viewing animated gifs.

Now if you use the latest version of Chafa to view the gifs, it
will set the transparency attribute (P2=1) to all sixel images
regardless of whether they are transparent or not. This prevents the
auto-delete from working because if the image is transparent, we can't
delete any images behind it.

The solution is that since Chafa fills the animation frames with an
opaque black background color, we treat the images as non-transparent if
they don't have any transparent pixels. This keeps the auto-delete
running with the new Chafa.

Although the solution works now, it may not be a long-term solution.
This commit is contained in:
veltza 2024-09-20 10:17:15 +03:00 committed by GitHub
parent 8a024a15b0
commit 5d2d1d818c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

15
sixel.c
View File

@ -261,10 +261,10 @@ sixel_parser_finalize(sixel_state_t *st, ImageList **newimages, int cx, int cy,
sixel_image_t *image = &st->image; sixel_image_t *image = &st->image;
int x, y; int x, y;
sixel_color_no_t *src; sixel_color_no_t *src;
sixel_color_t *dst; sixel_color_t *dst, color;
int color;
int w, h; int w, h;
int i, j, cols, numimages; int i, j, cols, numimages;
char trans;
ImageList *im, *next, *tail; ImageList *im, *next, *tail;
if (!image->data) if (!image->data)
@ -311,7 +311,6 @@ sixel_parser_finalize(sixel_state_t *st, ImageList **newimages, int cx, int cy,
im->clipmask = NULL; im->clipmask = NULL;
im->cw = cw; im->cw = cw;
im->ch = ch; im->ch = ch;
im->transparent = st->transparent;
} }
if (!im || !im->pixels) { if (!im || !im->pixels) {
for (im = *newimages; im; im = next) { for (im = *newimages; im; im = next) {
@ -324,12 +323,16 @@ sixel_parser_finalize(sixel_state_t *st, ImageList **newimages, int cx, int cy,
return -1; return -1;
} }
dst = (sixel_color_t *)im->pixels; dst = (sixel_color_t *)im->pixels;
for (j = 0; j < im->height && y < h; j++, y++) { for (trans = 0, j = 0; j < im->height && y < h; j++, y++) {
src = st->image.data + image->width * y; src = st->image.data + image->width * y;
for (x = 0; x < w; x++) for (x = 0; x < w; x++) {
*dst++ = st->image.palette[*src++]; color = st->image.palette[*src++];
trans |= (color == 0);
*dst++ = color;
} }
} }
im->transparent = (st->transparent && trans);
}
return numimages; return numimages;
} }