From cfdc86fe2e8ca69a24972ee25e2cd9dd59358c30 Mon Sep 17 00:00:00 2001 From: Witold Filipczyk Date: Mon, 9 Jun 2025 19:37:34 +0200 Subject: [PATCH] [kitty] Try to compress images --- src/cache/cache.h | 1 + src/document/html/parser/link.c | 6 +++++- src/terminal/kitty.c | 29 ++++++++++++++++++++++++++--- src/terminal/kitty.h | 3 ++- 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/cache/cache.h b/src/cache/cache.h index 646aafecc..56300ddb4 100644 --- a/src/cache/cache.h +++ b/src/cache/cache.h @@ -82,6 +82,7 @@ struct cache_entry { unsigned int sixel:1; /* Is in sixel format? */ unsigned int kitty:1; /* Is in kitty base64? */ + unsigned int compressed:1; /* Is kitty zlib? */ cache_mode_T cache_mode; /* Reload condition */ }; diff --git a/src/document/html/parser/link.c b/src/document/html/parser/link.c index 6afc6c4fa..c227a92cc 100644 --- a/src/document/html/parser/link.c +++ b/src/document/html/parser/link.c @@ -254,6 +254,7 @@ html_img_kitty(struct html_context *html_context, char *a, int width = 0; int height = 0; int im_number = 0; + int compressed = 0; char *url = get_attr_val(a, "src", html_context->doc_cp); if (!url) { @@ -277,8 +278,9 @@ html_img_kitty(struct html_context *html_context, char *a, width = cached->width; height = cached->height; im_number = cached->number; + compressed = cached->compressed; } else { - data = el_kitty_get_image(fragment->data, fragment->length, &datalen, &width, &height); + data = el_kitty_get_image(fragment->data, fragment->length, &datalen, &width, &height, &compressed); if (data) { (void)add_fragment(cached, 0, (const char *)data, datalen); @@ -287,6 +289,7 @@ html_img_kitty(struct html_context *html_context, char *a, cached->width = width; cached->height = height; cached->number = im_number = ++kitty_image_number; + cached->compressed = compressed; } } } @@ -322,6 +325,7 @@ html_img_kitty(struct html_context *html_context, char *a, int y; im->number = html_top->name - document->text.source; im->ID = im_number; + im->compressed = compressed; for (y = 0; y < how_many; y++) { int x; diff --git a/src/terminal/kitty.c b/src/terminal/kitty.c index ee625e420..2b28bccdb 100644 --- a/src/terminal/kitty.c +++ b/src/terminal/kitty.c @@ -10,6 +10,10 @@ #include #include +#ifdef CONFIG_GZIP +#include +#endif + #include "elinks.h" #include "document/document.h" @@ -20,13 +24,13 @@ #include "terminal/screen.h" #include "terminal/terminal.h" #include "util/base64.h" -#include "util/memcount.h" +#include "util/memory.h" #define STB_IMAGE_IMPLEMENTATION #include "terminal/stb_image.h" unsigned char * -el_kitty_get_image(char *data, int length, int *outlen, int *width, int *height) +el_kitty_get_image(char *data, int length, int *outlen, int *width, int *height, int *compressed) { ELOG int comp; @@ -37,7 +41,25 @@ el_kitty_get_image(char *data, int length, int *outlen, int *width, int *height) return NULL; } int size = *width * *height * 4; + *compressed = 0; +#ifdef CONFIG_GZIP + unsigned char *complace = (unsigned char *)mem_alloc(size); + + if (complace) { + unsigned long compsize = size; + int res = compress(complace, &compsize, pixels, size); + + if (res == Z_OK) { + *compressed = 1; + b64 = base64_encode_bin(complace, compsize, outlen); + stbi_image_free(pixels); + mem_free(complace); + return b64; + } + mem_free(complace); + } +#endif b64 = base64_encode_bin(pixels, size, outlen); stbi_image_free(pixels); @@ -127,7 +149,7 @@ try_to_draw_k_images(struct terminal *term) int sent = 0; while (1) { m = left >= 4000; - add_format_to_string(&text, "\033_Gf=32,I=%d,s=%d,v=%d,m=%d,t=d,a=T;", im->ID, im->width, im->height, m); + add_format_to_string(&text, "\033_Gf=32,I=%d,s=%d,v=%d,m=%d,t=d,a=T%s;", im->ID, im->width, im->height, m, (im->compressed ? ",o=z": "")); add_bytes_to_string(&text, im->pixels.source + sent, m ? 4000 : left); add_to_string(&text, "\033\\"); if (!m) { @@ -200,6 +222,7 @@ copy_k_frame(struct k_image *src, struct el_box *box, int cell_width, int cell_h dest->ID = src->ID; dest->number = src->number; dest->sent = src->sent; + dest->compressed = src->compressed; return dest; } diff --git a/src/terminal/kitty.h b/src/terminal/kitty.h index f199c057a..2f24d8843 100644 --- a/src/terminal/kitty.h +++ b/src/terminal/kitty.h @@ -28,6 +28,7 @@ struct k_image { int w; int h; unsigned int sent:1; + unsigned int compressed:1; }; void delete_k_image(struct k_image *im); @@ -39,7 +40,7 @@ int add_kitty_image_to_document(struct document *doc, const char *data, int data struct k_image *copy_k_frame(struct k_image *src, struct el_box *box, int cell_width, int cell_height, int dx, int dy); -unsigned char *el_kitty_get_image(char *data, int len, int *outlen, int *width, int *height); +unsigned char *el_kitty_get_image(char *data, int len, int *outlen, int *width, int *height, int *compressed); #endif