hpjansson/chafa

Errors when decoding white/grayscale

macton opened this issue · 3 comments

macton commented
Chafa version 1.13.0

Loaders:  GIF JPEG PNG SVG TIFF WebP XWD
Features: mmx sse4.1 popcnt avx2
Applying: mmx sse4.1 popcnt avx2

Copyright (C) 2018-2022 Hans Petter Jansson et al.
Incl. libnsgif copyright (C) 2004 Richard Wilson, copyright (C) 2008 Sean Fox
Incl. LodePNG copyright (C) 2005-2018 Lode Vandevenne

This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Inner ring is cyan:

chafa_bug_cyan.mp4

Inner ring is white:

chafa_bug_white.mp4

repro using ncurses:

https://github.com/macton/ncurses_game_loop_chafa

Thanks for reporting this! Very odd - it looks like there could be an overflow somewhere. Will debug it in the evening.

Looks like the 256-color palette you're using doesn't correspond to Chafa's. It uses the default xterm palette for raw colors. There's currently no way to tell Chafa to use a different palette, but I'd like to add it in a future milestone, possibly 1.16. In the meantime, I'll update the documentation to mention the palette used.

Terminal emulator support for palette modification didn't use to be universal, but I think the situation has improved. See Thomas Dickey's SX response here: https://unix.stackexchange.com/a/328780

Setting the appropriate palette (or using the default) should fix your issue; diff below. If you want to use your own palette anyway, you could use chafa_canvas_get_colors_at() (it works in indexed mode too), and remap the 24-bit colors you get to it.

Let me know if this helps.

diff --git a/game.c b/game.c
index 8e2c9cc..f8671b8 100644
--- a/game.c
+++ b/game.c
@@ -145,69 +145,58 @@ extern inline void printw_timespec(const char* title, timespec time )
 #define COLOR_PALETTE_COUNT 256
 uint32_t g_color_palette[COLOR_PALETTE_COUNT] = 
 {
-  // xterm default colors.
-  0x000000, // COLOR_BLACK
-  0xcd0000, // COLOR_BLUE
-  0x00cd00, // COLOR_GREEN
-  0xcdcd00, // COLOR_CYAN
-  0x0000cd, // COLOR_RED
-  0xcd00cd, // COLOR_MAGENTA
-  0x00cdcd, // COLOR_YELLOW
-  0xe5e5e5, // COLOR_WHITE
-  0x4d4d4d, // HI COLOR_BLACK
-  0xff0000, // HI COLOR_BLUE
-  0x00ff00, // HI COLOR_GREEN
-  0xffff00, // HI COLOR_CYAN
-  0x0000ff, // HI COLOR_RED
-  0xff00ff, // HI COLOR_MAGENTA
-  0x00ffff, // HI COLOR_YELLOW
-  0xffffff, // HI COLOR_WHITE
-
-  // Netscape palette
-  0x000000, 0x000033, 0x000066, 0x000099, 0x0000CC, 0x0000FF, 
-  0x003300, 0x003333, 0x003366, 0x003399, 0x0033CC, 0x0033FF, 
-  0x006600, 0x006633, 0x006666, 0x006699, 0x0066CC, 0x0066FF, 
-  0x009900, 0x009933, 0x009966, 0x009999, 0x0099CC, 0x0099FF, 
-  0x00CC00, 0x00CC33, 0x00CC66, 0x00CC99, 0x00CCCC, 0x00CCFF, 
-  0x00FF00, 0x00FF33, 0x00FF66, 0x00FF99, 0x00FFCC, 0x00FFFF, 
-  0x330000, 0x330033, 0x330066, 0x330099, 0x3300CC, 0x3300FF, 
-  0x333300, 0x333333, 0x333366, 0x333399, 0x3333CC, 0x3333FF, 
-  0x336600, 0x336633, 0x336666, 0x336699, 0x3366CC, 0x3366FF, 
-  0x339900, 0x339933, 0x339966, 0x339999, 0x3399CC, 0x3399FF, 
-  0x33CC00, 0x33CC33, 0x33CC66, 0x33CC99, 0x33CCCC, 0x33CCFF, 
-  0x33FF00, 0x33FF33, 0x33FF66, 0x33FF99, 0x33FFCC, 0x33FFFF, 
-  0x660000, 0x660033, 0x660066, 0x660099, 0x6600CC, 0x6600FF, 
-  0x663300, 0x663333, 0x663366, 0x663399, 0x6633CC, 0x6633FF, 
-  0x666600, 0x666633, 0x666666, 0x666699, 0x6666CC, 0x6666FF, 
-  0x669900, 0x669933, 0x669966, 0x669999, 0x6699CC, 0x6699FF, 
-  0x66CC00, 0x66CC33, 0x66CC66, 0x66CC99, 0x66CCCC, 0x66CCFF, 
-  0x66FF00, 0x66FF33, 0x66FF66, 0x66FF99, 0x66FFCC, 0x66FFFF, 
-  0x990000, 0x990033, 0x990066, 0x990099, 0x9900CC, 0x9900FF, 
-  0x993300, 0x993333, 0x993366, 0x993399, 0x9933CC, 0x9933FF, 
-  0x996600, 0x996633, 0x996666, 0x996699, 0x9966CC, 0x9966FF, 
-  0x999900, 0x999933, 0x999966, 0x999999, 0x9999CC, 0x9999FF, 
-  0x99CC00, 0x99CC33, 0x99CC66, 0x99CC99, 0x99CCCC, 0x99CCFF, 
-  0x99FF00, 0x99FF33, 0x99FF66, 0x99FF99, 0x99FFCC, 0x99FFFF, 
-  0xCC0000, 0xCC0033, 0xCC0066, 0xCC0099, 0xCC00CC, 0xCC00FF, 
-  0xCC3300, 0xCC3333, 0xCC3366, 0xCC3399, 0xCC33CC, 0xCC33FF, 
-  0xCC6600, 0xCC6633, 0xCC6666, 0xCC6699, 0xCC66CC, 0xCC66FF, 
-  0xCC9900, 0xCC9933, 0xCC9966, 0xCC9999, 0xCC99CC, 0xCC99FF, 
-  0xCCCC00, 0xCCCC33, 0xCCCC66, 0xCCCC99, 0xCCCCCC, 0xCCCCFF, 
-  0xCCFF00, 0xCCFF33, 0xCCFF66, 0xCCFF99, 0xCCFFCC, 0xCCFFFF, 
-  0xFF0000, 0xFF0033, 0xFF0066, 0xFF0099, 0xFF00CC, 0xFF00FF, 
-  0xFF3300, 0xFF3333, 0xFF3366, 0xFF3399, 0xFF33CC, 0xFF33FF, 
-  0xFF6600, 0xFF6633, 0xFF6666, 0xFF6699, 0xFF66CC, 0xFF66FF, 
-  0xFF9900, 0xFF9933, 0xFF9966, 0xFF9999, 0xFF99CC, 0xFF99FF, 
-  0xFFCC00, 0xFFCC33, 0xFFCC66, 0xFFCC99, 0xFFCCCC, 0xFFCCFF, 
-  0xFFFF00, 0xFFFF33, 0xFFFF66, 0xFFFF99, 0xFFFFCC, 0xFFFFFF, 
-
-  // Unused
-  0x000000, 0x000000, 0x000000, 0x000000,
-  0x000000, 0x000000, 0x000000, 0x000000,
-  0x000000, 0x000000, 0x000000, 0x000000,
-  0x000000, 0x000000, 0x000000, 0x000000,
-  0x000000, 0x000000, 0x000000, 0x000000,
-  0x000000, 0x000000, 0x000000, 0x000000,
+    /* First 16 colors; these are usually set by the terminal and can vary quite a
+     * bit. We try to strike a balance. */
+
+    0x000000, 0x800000, 0x007000, 0x707000, 0x000070, 0x700070, 0x007070, 0xc0c0c0,
+    0x404040, 0xff0000, 0x00ff00, 0xffff00, 0x0000ff, 0xff00ff, 0x00ffff, 0xffffff,
+
+    /* 240 universal colors; a 216-entry color cube followed by 24 grays */
+
+    0x000000, 0x00005f, 0x000087, 0x0000af, 0x0000d7, 0x0000ff, 0x005f00, 0x005f5f,
+    0x005f87, 0x005faf, 0x005fd7, 0x005fff, 0x008700, 0x00875f, 0x008787, 0x0087af,
+
+    0x0087d7, 0x0087ff, 0x00af00, 0x00af5f, 0x00af87, 0x00afaf, 0x00afd7, 0x00afff,
+    0x00d700, 0x00d75f, 0x00d787, 0x00d7af, 0x00d7d7, 0x00d7ff, 0x00ff00, 0x00ff5f,
+
+    0x00ff87, 0x00ffaf, 0x00ffd7, 0x00ffff, 0x5f0000, 0x5f005f, 0x5f0087, 0x5f00af,
+    0x5f00d7, 0x5f00ff, 0x5f5f00, 0x5f5f5f, 0x5f5f87, 0x5f5faf, 0x5f5fd7, 0x5f5fff,
+
+    0x5f8700, 0x5f875f, 0x5f8787, 0x5f87af, 0x5f87d7, 0x5f87ff, 0x5faf00, 0x5faf5f,
+    0x5faf87, 0x5fafaf, 0x5fafd7, 0x5fafff, 0x5fd700, 0x5fd75f, 0x5fd787, 0x5fd7af,
+
+    0x5fd7d7, 0x5fd7ff, 0x5fff00, 0x5fff5f, 0x5fff87, 0x5fffaf, 0x5fffd7, 0x5fffff,
+    0x870000, 0x87005f, 0x870087, 0x8700af, 0x8700d7, 0x8700ff, 0x875f00, 0x875f5f,
+
+    0x875f87, 0x875faf, 0x875fd7, 0x875fff, 0x878700, 0x87875f, 0x878787, 0x8787af,
+    0x8787d7, 0x8787ff, 0x87af00, 0x87af5f, 0x87af87, 0x87afaf, 0x87afd7, 0x87afff,
+
+    0x87d700, 0x87d75f, 0x87d787, 0x87d7af, 0x87d7d7, 0x87d7ff, 0x87ff00, 0x87ff5f,
+    0x87ff87, 0x87ffaf, 0x87ffd7, 0x87ffff, 0xaf0000, 0xaf005f, 0xaf0087, 0xaf00af,
+
+    0xaf00d7, 0xaf00ff, 0xaf5f00, 0xaf5f5f, 0xaf5f87, 0xaf5faf, 0xaf5fd7, 0xaf5fff,
+    0xaf8700, 0xaf875f, 0xaf8787, 0xaf87af, 0xaf87d7, 0xaf87ff, 0xafaf00, 0xafaf5f,
+
+    0xafaf87, 0xafafaf, 0xafafd7, 0xafafff, 0xafd700, 0xafd75f, 0xafd787, 0xafd7af,
+    0xafd7d7, 0xafd7ff, 0xafff00, 0xafff5f, 0xafff87, 0xafffaf, 0xafffd7, 0xafffff,
+
+    0xd70000, 0xd7005f, 0xd70087, 0xd700af, 0xd700d7, 0xd700ff, 0xd75f00, 0xd75f5f,
+    0xd75f87, 0xd75faf, 0xd75fd7, 0xd75fff, 0xd78700, 0xd7875f, 0xd78787, 0xd787af,
+
+    0xd787d7, 0xd787ff, 0xd7af00, 0xd7af5f, 0xd7af87, 0xd7afaf, 0xd7afd7, 0xd7afff,
+    0xd7d700, 0xd7d75f, 0xd7d787, 0xd7d7af, 0xd7d7d7, 0xd7d7ff, 0xd7ff00, 0xd7ff5f,
+
+    0xd7ff87, 0xd7ffaf, 0xd7ffd7, 0xd7ffff, 0xff0000, 0xff005f, 0xff0087, 0xff00af,
+    0xff00d7, 0xff00ff, 0xff5f00, 0xff5f5f, 0xff5f87, 0xff5faf, 0xff5fd7, 0xff5fff,
+
+    0xff8700, 0xff875f, 0xff8787, 0xff87af, 0xff87d7, 0xff87ff, 0xffaf00, 0xffaf5f,
+    0xffaf87, 0xffafaf, 0xffafd7, 0xffafff, 0xffd700, 0xffd75f, 0xffd787, 0xffd7af,
+
+    0xffd7d7, 0xffd7ff, 0xffff00, 0xffff5f, 0xffff87, 0xffffaf, 0xffffd7, 0xffffff,
+    0x080808, 0x121212, 0x1c1c1c, 0x262626, 0x303030, 0x3a3a3a, 0x444444, 0x4e4e4e,
+
+    0x585858, 0x626262, 0x6c6c6c, 0x767676, 0x808080, 0x8a8a8a, 0x949494, 0x9e9e9e,
+    0xa8a8a8, 0xb2b2b2, 0xbcbcbc, 0xc6c6c6, 0xd0d0d0, 0xdadada, 0xe4e4e4, 0xeeeeee
 };
 
 void
macton commented

Ah, I see. That was it. Thanks.