From c41f55c3a0994f86aca4d6add49420a25e023ba4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Thu, 5 Sep 2024 07:17:03 +0200 Subject: [PATCH] sixel: default bg color is now taken from the sixel palette, not the ANSI bg color The wording in the original VT340 documentation is vague: Pixel positions specified as 0 are set to the current background color. What does that mean? We _thought_ it meant the current ANSI background color, as set with e.g. CSI 4x m. It's still all a bit vague, but seeing that we have separate palettes for text and graphic (should we?), it doesn't make sense to use the ANSI background color as the default sixel background color. So, use entry 0 from the sixel palette instead. --- CHANGELOG.md | 3 +++ sixel.c | 37 ++++--------------------------------- 2 files changed, 7 insertions(+), 33 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 83613505..3fc84d4a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -75,6 +75,9 @@ used by foot (i.e. `desktop-notifications.command`). This has been supported for OSC-99 since 1.18.0, and now we also support it for BEL and OSC-777 ([#1822][1822]). +* Sixel background color (when `P2=0|2`) is now set to the **sixel** + color palette entry #0, instead of using the current ANSI background + color. This is what a real VT340 does. [1822]: https://codeberg.org/dnkl/foot/issues/1822 diff --git a/sixel.c b/sixel.c index 161eaad5..20385a93 100644 --- a/sixel.c +++ b/sixel.c @@ -127,40 +127,11 @@ sixel_init(struct terminal *term, int p1, int p2, int p3) term->sixel.palette = term->sixel.shared_palette; } - uint32_t bg = 0; + if (term->sixel.transparent_bg) + term->sixel.default_bg = 0x00000000u; + else + term->sixel.default_bg = term->sixel.palette[0]; - switch (term->vt.attrs.bg_src) { - case COLOR_RGB: - bg = 0xffu << 24 | term->vt.attrs.bg; - break; - - case COLOR_BASE16: - case COLOR_BASE256: - bg = 0xffu << 24 | term->colors.table[term->vt.attrs.bg]; - break; - - case COLOR_DEFAULT: - if (term->colors.alpha == 0xffff) - bg = 0xffu << 24 | term->colors.bg; - else { - /* Alpha needs to be pre-multiplied */ - uint32_t r = (term->colors.bg >> 16) & 0xff; - uint32_t g = (term->colors.bg >> 8) & 0xff; - uint32_t b = (term->colors.bg >> 0) & 0xff; - - uint32_t alpha = term->colors.alpha; - r *= alpha; r /= 0xffff; - g *= alpha; g /= 0xffff; - b *= alpha; b /= 0xffff; - - bg = (alpha >> 8) << 24 | (r & 0xff) << 16 | (g & 0xff) << 8 | (b & 0xff); - } - break; - } - - term->sixel.default_bg = term->sixel.transparent_bg - ? 0x00000000u - : bg; count = 0; return pan == 1 && pad == 1 ? &sixel_put_ar_11 : &sixel_put_generic;