From 60fd4a262c5a3ce1c3951e305bcade3a88019f8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Fri, 15 Mar 2024 15:19:43 +0100 Subject: [PATCH] sixel: initialize the color table to colors used by the VT340 --- CHANGELOG.md | 4 ++++ sixel.c | 39 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a67ff8fa..04571604 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -143,6 +143,10 @@ * Crash when failing to load an xcursor image ([#1624][1624]). * Crash when resizing a dynamically sized sixel (no raster attributes), with a non-1:1 aspect ratio. +* The default sixel color table is now initialized to the colors used + by the VT340, instead of not being initialized at all (thus + requiring the sixel escape sequence to explicitly set all colors it + used). [1531]: https://codeberg.org/dnkl/foot/issues/1531 [1573]: https://codeberg.org/dnkl/foot/issues/1573 diff --git a/sixel.c b/sixel.c index 7684e657..f485e4c1 100644 --- a/sixel.c +++ b/sixel.c @@ -4,7 +4,7 @@ #include #define LOG_MODULE "sixel" -#define LOG_ENABLE_DBG 0 +#define LOG_ENABLE_DBG 1 #include "log.h" #include "debug.h" #include "grid.h" @@ -19,6 +19,29 @@ static size_t count; static void sixel_put_generic(struct terminal *term, uint8_t c); static void sixel_put_ar_11(struct terminal *term, uint8_t c); +/* VT330/VT340 Programmer Reference Manual - Table 2-3 VT340 Default Color Map */ +static const uint32_t vt340_default_colors[16] = { + 0xff000000, + 0xff3333cc, + 0xffcc2121, + 0xff33cc33, + 0xffcc33cc, + 0xff33cccc, + 0xffcccc33, + 0xff878787, + 0xff424242, + 0xff545499, + 0xff994242, + 0xff549954, + 0xff995499, + 0xff549999, + 0xff999954, + 0xffcccccc, +}; + +_Static_assert(sizeof(vt340_default_colors) / sizeof(vt340_default_colors[0]) == 16, + "wrong number of elements"); + void sixel_fini(struct terminal *term) { @@ -68,17 +91,27 @@ sixel_init(struct terminal *term, int p1, int p2, int p3) term->sixel.image.width = 0; term->sixel.image.height = 0; - /* TODO: default palette */ - if (term->sixel.use_private_palette) { xassert(term->sixel.private_palette == NULL); term->sixel.private_palette = xcalloc( term->sixel.palette_size, sizeof(term->sixel.private_palette[0])); + + memcpy( + term->sixel.private_palette, vt340_default_colors, + min(sizeof(vt340_default_colors), + term->sixel.palette_size * sizeof(term->sixel.private_palette[0]))); + term->sixel.palette = term->sixel.private_palette; + } else { if (term->sixel.shared_palette == NULL) { term->sixel.shared_palette = xcalloc( term->sixel.palette_size, sizeof(term->sixel.shared_palette[0])); + + memcpy( + term->sixel.shared_palette, vt340_default_colors, + min(sizeof(vt340_default_colors), + term->sixel.palette_size * sizeof(term->sixel.shared_palette[0]))); } else { /* Shared palette - do *not* reset palette for new sixels */ }