From bf4ff1e2541fc4210df89c91d4486d11b00df250 Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Wed, 31 Dec 2003 13:20:18 +0000 Subject: [PATCH] * test/optipal.c: + Optimised S-Lang palette generator. * src/graphics: + Removed the S-Lang palette generator and replaced it with the tables generated by optipal. --- src/graphics.c | 214 +++++++++++----------------------------- test/Makefile.am | 6 +- test/optipal.c | 252 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 317 insertions(+), 155 deletions(-) create mode 100644 test/optipal.c diff --git a/src/graphics.c b/src/graphics.c index 1c59f7d..d2e59b3 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -74,7 +74,62 @@ static int ncurses_attr[16*16]; #endif #if defined(USE_SLANG) -static int slang_assoc[16*16]; +/* Tables generated by test/optipal.c */ +const static int slang_palette[2*16*16] = +{ + 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, + 9, 0, 10, 0, 11, 0, 12, 0, 13, 0, 14, 0, 15, 0, 0, 8, + 8, 7, 7, 8, 15, 7, 7, 15, 15, 9, 9, 15, 1, 9, 9, 1, + 7, 9, 9, 7, 8, 1, 1, 8, 0, 1, 15, 10, 10, 15, 2, 10, + 10, 2, 7, 10, 10, 7, 8, 2, 2, 8, 0, 2, 15, 11, 11, 15, + 3, 11, 11, 3, 7, 11, 11, 7, 8, 3, 3, 8, 0, 3, 15, 12, + 12, 15, 4, 12, 12, 4, 7, 12, 12, 7, 8, 4, 4, 8, 0, 4, + 15, 13, 13, 15, 5, 13, 13, 5, 7, 13, 13, 7, 8, 5, 5, 8, + 0, 5, 15, 14, 14, 15, 6, 14, 14, 6, 7, 14, 14, 7, 8, 6, + 6, 8, 0, 6, 4, 6, 6, 4, 12, 14, 14, 12, 6, 2, 2, 6, + 14, 10, 10, 14, 2, 3, 3, 2, 10, 11, 11, 10, 3, 1, 1, 3, + 11, 9, 9, 11, 1, 5, 5, 1, 9, 13, 13, 9, 5, 4, 4, 5, + 13, 12, 12, 13, 4, 14, 6, 12, 12, 6, 14, 4, 6, 10, 2, 14, + 14, 2, 10, 6, 2, 11, 3, 10, 10, 3, 11, 2, 3, 9, 1, 11, + 11, 1, 9, 3, 1, 13, 5, 9, 9, 5, 13, 1, 5, 12, 4, 13, + 13, 4, 12, 5, 0, 7, 0, 15, 15, 8, 8, 15, 15, 1, 7, 1, + 1, 6, 2, 5, 3, 4, 4, 3, 5, 2, 6, 1, 0, 0, 1, 1, + 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 2, 2, 3, 3, + 4, 4, 5, 5, 6, 6, 7, 7, 14, 9, 1, 15, 8, 9, 8, 8, + 9, 9, 1, 7, 0, 9, 9, 8, 6, 9, 13, 10, 2, 15, 8, 10, + 7, 2, 15, 2, 2, 7, 0, 10, 10, 8, 5, 10, 12, 11, 3, 15, + 8, 11, 7, 3, 15, 3, 3, 7, 0, 11, 11, 8, 4, 11, 11, 12, + 4, 15, 8, 12, 7, 4, 15, 4, 4, 7, 0, 12, 12, 8, 3, 12, + 10, 13, 5, 15, 8, 13, 7, 5, 15, 5, 5, 7, 0, 13, 13, 8, + 2, 13, 9, 14, 6, 15, 8, 14, 7, 6, 15, 6, 6, 7, 0, 14, + 14, 8, 1, 14, 5, 6, 2, 4, 13, 14, 10, 12, 4, 2, 3, 6, + 12, 10, 11, 14, 6, 3, 1, 2, 14, 11, 9, 10, 2, 1, 5, 3, + 10, 9, 13, 11, 3, 5, 4, 1, 11, 13, 12, 9, 1, 4, 6, 5, + 9, 12, 14, 13, 5, 14, 2, 12, 13, 6, 10, 4, 4, 10, 3, 14, + 12, 2, 11, 6, 6, 11, 1, 10, 14, 3, 9, 2, 2, 9, 5, 11, + 10, 1, 13, 3, 3, 13, 4, 9, 11, 5, 12, 1, 1, 12, 6, 13, + 9, 4, 14, 5, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, +}; + +const static int slang_assoc[16*16] = +{ + 134, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 28, 135, 214, 86, 219, 91, 133, 127, 26, 23, 240, 112, 245, 117, 141, 126, + 37, 211, 142, 83, 206, 132, 78, 160, 35, 237, 32, 109, 232, 140, 104, 161, + 46, 87, 82, 143, 131, 215, 210, 169, 44, 113, 108, 41, 139, 241, 236, 170, + 55, 222, 203, 130, 144, 94, 75, 178, 53, 248, 229, 138, 50, 120, 101, 179, + 64, 90, 129, 218, 95, 145, 223, 187, 62, 116, 137, 244, 121, 59, 249, 188, + 73, 128, 79, 207, 74, 202, 146, 196, 71, 136, 105, 233, 100, 228, 68, 197, + 122, 153, 162, 171, 180, 189, 198, 147, 16, 25, 34, 43, 52, 61, 70, 18, + 15, 27, 36, 45, 54, 63, 72, 17, 151, 155, 164, 173, 182, 191, 200, 124, + 154, 22, 238, 110, 243, 115, 156, 24, 150, 152, 216, 88, 221, 93, 148, 20, + 163, 235, 31, 107, 230, 165, 102, 33, 159, 213, 250, 85, 208, 157, 80, 29, + 172, 111, 106, 40, 174, 239, 234, 42, 168, 89, 84, 251, 166, 217, 212, 38, + 181, 246, 227, 183, 49, 118, 99, 51, 177, 224, 205, 175, 252, 96, 77, 47, + 190, 114, 192, 242, 119, 58, 247, 60, 186, 92, 184, 220, 97, 253, 225, 56, + 199, 201, 103, 231, 98, 226, 67, 69, 195, 193, 81, 209, 76, 204, 254, 65, + 123, 149, 158, 167, 176, 185, 194, 19, 125, 21, 30, 39, 48, 57, 66, 255, +}; #endif #if defined(USE_CONIO) @@ -873,160 +928,11 @@ static void slang_init_palette(void) SLtt_set_color(i, NULL, slang_colors[fg], slang_colors[bg]); } #else - int i, cur = 0; - - /* 6 colours in hue order */ - static const enum caca_color hue_list[] = - { - CACA_COLOR_RED, - CACA_COLOR_BROWN, - CACA_COLOR_GREEN, - CACA_COLOR_CYAN, - CACA_COLOR_BLUE, - CACA_COLOR_MAGENTA - }; - -#define SETPAIR(_fg, _bg, _n) \ - do \ - { \ - int fg = _fg, bg = _bg, n = _n; \ - SLtt_set_color(n, NULL, slang_colors[fg], slang_colors[bg]); \ - slang_assoc[fg + 16 * bg] = n; \ - } \ - while(0); - - /* - * XXX: See the NOTES file for what follows - */ - - /* black background colour pairs that are needed for the old renderer */ - for(i = 1; i < 16; i++) - SETPAIR(i, CACA_COLOR_BLACK, cur++); - - /* gray combinations used for grayscale dithering */ - SETPAIR(CACA_COLOR_BLACK, CACA_COLOR_DARKGRAY, cur++); - SETPAIR(CACA_COLOR_DARKGRAY, CACA_COLOR_LIGHTGRAY, cur++); - SETPAIR(CACA_COLOR_LIGHTGRAY, CACA_COLOR_DARKGRAY, cur++); - SETPAIR(CACA_COLOR_WHITE, CACA_COLOR_LIGHTGRAY, cur++); - SETPAIR(CACA_COLOR_LIGHTGRAY, CACA_COLOR_WHITE, cur++); - - /* white/light, light/dark, lightgray/light, darkgray/dark, dark/black - * combinations often used for saturation/value dithering (the two - * other possible combinations, lightgray/dark and darkgray/light, are - * not considered here) */ - for(i = 1; i < 7; i++) - { - SETPAIR(CACA_COLOR_WHITE, i + 8, cur++); - SETPAIR(i + 8, CACA_COLOR_WHITE, cur++); - SETPAIR(i, i + 8, cur++); - SETPAIR(i + 8, i, cur++); - SETPAIR(CACA_COLOR_LIGHTGRAY, i + 8, cur++); - SETPAIR(i + 8, CACA_COLOR_LIGHTGRAY, cur++); - SETPAIR(CACA_COLOR_DARKGRAY, i, cur++); - SETPAIR(i, CACA_COLOR_DARKGRAY, cur++); - SETPAIR(CACA_COLOR_BLACK, i, cur++); - } - - /* next colour combinations for hue dithering (magenta/blue, blue/green - * and so on) */ - for(i = 0; i < 6; i++) - { - SETPAIR(hue_list[i], hue_list[(i + 1) % 6], cur++); - SETPAIR(hue_list[(i + 1) % 6], hue_list[i], cur++); - SETPAIR(hue_list[i] + 8, hue_list[(i + 1) % 6] + 8, cur++); - SETPAIR(hue_list[(i + 1) % 6] + 8, hue_list[i] + 8, cur++); - } - - /* next colour combinations for hue/value dithering (blue/lightgreen, - * green/lightblue and so on) */ - for(i = 0; i < 6; i++) - { - SETPAIR(hue_list[i], hue_list[(i + 1) % 6] + 8, cur++); - SETPAIR(hue_list[(i + 1) % 6], hue_list[i] + 8, cur++); - SETPAIR(hue_list[i] + 8, hue_list[(i + 1) % 6], cur++); - SETPAIR(hue_list[(i + 1) % 6] + 8, hue_list[i], cur++); - } - - /* black on light gray, black on white, white on dark gray, dark gray - * on white, white on blue, light gray on blue (chosen arbitrarily) */ - SETPAIR(CACA_COLOR_BLACK, CACA_COLOR_LIGHTGRAY, cur++); - SETPAIR(CACA_COLOR_BLACK, CACA_COLOR_WHITE, cur++); - SETPAIR(CACA_COLOR_WHITE, CACA_COLOR_DARKGRAY, cur++); - SETPAIR(CACA_COLOR_DARKGRAY, CACA_COLOR_WHITE, cur++); - SETPAIR(CACA_COLOR_WHITE, CACA_COLOR_BLUE, cur++); - SETPAIR(CACA_COLOR_LIGHTGRAY, CACA_COLOR_BLUE, cur++); - - /* - * Now the possibly emulated pairs - */ - - /* light gray on dark colour: emulate with light colour on dark colour - * white on dark colour: emulate with light gray on light colour - * black on light colour: emulate with dark gray on dark colour - * dark gray on light colour: emulate with dark colour on light colour - * light colour on dark gray: emulate with dark colour on dark gray - * dark colour on light gray: emulate with light colour on light gray - * dark colour on white: emulate with light colour on white */ - for(i = 1; i < 7; i++) - { - if(i != CACA_COLOR_BLUE) - { - SETPAIR(CACA_COLOR_LIGHTGRAY, i, 128 + - slang_assoc[i + 8 + 16 * i]); - SETPAIR(CACA_COLOR_WHITE, i, 128 + - slang_assoc[CACA_COLOR_LIGHTGRAY + 16 * (i + 8)]); - } - SETPAIR(CACA_COLOR_BLACK, i + 8, - 128 + slang_assoc[CACA_COLOR_DARKGRAY + 16 * i]); - SETPAIR(CACA_COLOR_DARKGRAY, i + 8, - 128 + slang_assoc[i + 16 * (i + 8)]); - SETPAIR(i + 8, CACA_COLOR_DARKGRAY, - 128 + slang_assoc[i + 16 * CACA_COLOR_DARKGRAY]); - SETPAIR(i, CACA_COLOR_LIGHTGRAY, - 128 + slang_assoc[i + 8 + 16 * CACA_COLOR_LIGHTGRAY]); - SETPAIR(i, CACA_COLOR_WHITE, - 128 + slang_assoc[i + 8 + 16 * CACA_COLOR_WHITE]); - } - - /* 120 degree hue pairs can be emulated as well; for instance blue on - * red can be emulated using magenta on red, and blue on green using - * cyan on green */ - for(i = 0; i < 6; i++) - { - SETPAIR(hue_list[(i + 2) % 6], hue_list[i], - 128 + slang_assoc[hue_list[(i + 1) % 6] + 16 * hue_list[i]]); - SETPAIR(hue_list[(i + 2) % 6] + 8, hue_list[i] + 8, - 128 + slang_assoc[hue_list[(i + 1) % 6] + 16 * hue_list[i] + 136]); - SETPAIR(hue_list[(i + 2) % 6] + 8, hue_list[i], - 128 + slang_assoc[hue_list[(i + 1) % 6] + 16 * hue_list[i] + 8]); - SETPAIR(hue_list[(i + 2) % 6], hue_list[i] + 8, - 128 + slang_assoc[hue_list[(i + 1) % 6] + 16 * hue_list[i] + 128]); - - SETPAIR(hue_list[(i + 4) % 6], hue_list[i], - 128 + slang_assoc[hue_list[(i + 5) % 6] + 16 * hue_list[i]]); - SETPAIR(hue_list[(i + 4) % 6] + 8, hue_list[i] + 8, - 128 + slang_assoc[hue_list[(i + 5) % 6] + 16 * hue_list[i] + 136]); - SETPAIR(hue_list[(i + 4) % 6] + 8, hue_list[i], - 128 + slang_assoc[hue_list[(i + 5) % 6] + 16 * hue_list[i] + 8]); - SETPAIR(hue_list[(i + 4) % 6], hue_list[i] + 8, - 128 + slang_assoc[hue_list[(i + 5) % 6] + 16 * hue_list[i] + 128]); - } + int i; - /* dark opposite on dark: emulate with dark opposite on black - * light opposite on dark: emulate with light opposite on black - * dark opposite on light: emulate with black on dark - * light opposite on light: emulate with white on light */ - for(i = 0; i < 6; i++) - { - SETPAIR(hue_list[i], hue_list[(i + 3) % 6], - 128 + slang_assoc[hue_list[i] + 16 * CACA_COLOR_BLACK]); - SETPAIR(hue_list[i] + 8, hue_list[(i + 3) % 6], - 128 + slang_assoc[hue_list[i] + 8 + 16 * CACA_COLOR_BLACK]); - SETPAIR(hue_list[(i + 3) % 6], hue_list[i] + 8, - 128 + slang_assoc[CACA_COLOR_BLACK + 16 * hue_list[i]]); - SETPAIR(hue_list[(i + 3) % 6] + 8, hue_list[i] + 8, - 128 + slang_assoc[CACA_COLOR_WHITE + 16 * (hue_list[i] + 8)]); - } + for(i = 0; i < 16 * 16; i++) + SLtt_set_color(i, NULL, slang_colors[slang_palette[i * 2]], + slang_colors[slang_palette[i * 2 + 1]]); #endif } #endif /* USE_SLANG */ diff --git a/test/Makefile.am b/test/Makefile.am index 079c807..2014162 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -2,9 +2,13 @@ # Automake targets and declarations for libcaca test programs ############################################################################### -noinst_PROGRAMS = dithering +noinst_PROGRAMS = dithering optipal dithering_SOURCES = dithering.c dithering_LDADD = ../src/libcaca.a @CACA_LIBS@ dithering_CPPFLAGS = -I$(top_srcdir)/src +optipal_SOURCES = optipal.c +optipal_LDADD = ../src/libcaca.a @CACA_LIBS@ +optipal_CPPFLAGS = -I$(top_srcdir)/src + diff --git a/test/optipal.c b/test/optipal.c new file mode 100644 index 0000000..b8c5e4b --- /dev/null +++ b/test/optipal.c @@ -0,0 +1,252 @@ +/* + * optipal S-Lang optimised palette generator for libcaca + * Copyright (c) 2003 Sam Hocevar + * All Rights Reserved + * + * $Id$ + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + */ + +#include "config.h" + +#include + +#include "caca.h" + +static void base_colors(void); +static void emulated_colors(void); +static void unused_colors(void); + +static int slang_assoc[16*16], palette[16*16]; + +/* 6 colours in hue order */ +static const enum caca_color hue_list[] = +{ + CACA_COLOR_RED, + CACA_COLOR_BROWN, + CACA_COLOR_GREEN, + CACA_COLOR_CYAN, + CACA_COLOR_BLUE, + CACA_COLOR_MAGENTA +}; + +#define SETPAIR(_fg, _bg, _n) \ + do \ + { \ + int fg = _fg, bg = _bg, n = _n; \ + slang_assoc[fg + 16 * bg] = n; \ + palette[n] = fg + 16 * bg; \ + } \ + while(0); + +int main(void) +{ + int i; + + for(i = 0; i < 16 * 16; i++) + { + slang_assoc[i] = -1; + palette[i] = -1; + } + + /* The base colour pairs (0-127) */ + base_colors(); + + /* Now the less important pairs that we can afford to emulate using + * previously defined colour pairs. */ + emulated_colors(); + + /* Fill the rest of the palette with equal colour pairs such as black + * on black. They will never be used, but nevermind. */ + unused_colors(); + + /* Output the palette */ + printf("const static int slang_palette[2*16*16] =\n{\n"); + for(i = 0; i < 16 * 16; i++) + { + if((i % 8) == 0) printf(" "); + printf("%2i, %2i, ", palette[i] % 16, palette[i] / 16); + if((i % 8) == 7) printf("\n"); + } + printf("};\n\n"); + + /* Output the association table */ + printf("const static int slang_assoc[16*16] =\n{\n"); + for(i = 0; i < 16 * 16; i++) + { + if((i % 16) == 0) printf(" "); + printf("%i, ", slang_assoc[i]); + if((i % 16) == 15) printf("\n"); + } + printf("};\n"); + + return 0; +} + +/* + * XXX: See the NOTES file for what follows + */ + +static void base_colors(void) +{ + int i, cur = 0; + + /* black background colour pairs that are needed for the old renderer */ + for(i = 1; i < 16; i++) + SETPAIR(i, CACA_COLOR_BLACK, cur++); + + /* gray combinations used for grayscale dithering */ + SETPAIR(CACA_COLOR_BLACK, CACA_COLOR_DARKGRAY, cur++); + SETPAIR(CACA_COLOR_DARKGRAY, CACA_COLOR_LIGHTGRAY, cur++); + SETPAIR(CACA_COLOR_LIGHTGRAY, CACA_COLOR_DARKGRAY, cur++); + SETPAIR(CACA_COLOR_WHITE, CACA_COLOR_LIGHTGRAY, cur++); + SETPAIR(CACA_COLOR_LIGHTGRAY, CACA_COLOR_WHITE, cur++); + + /* white/light, light/dark, lightgray/light, darkgray/dark, dark/black + * combinations often used for saturation/value dithering (the two + * other possible combinations, lightgray/dark and darkgray/light, are + * not considered here) */ + for(i = 1; i < 7; i++) + { + SETPAIR(CACA_COLOR_WHITE, i + 8, cur++); + SETPAIR(i + 8, CACA_COLOR_WHITE, cur++); + SETPAIR(i, i + 8, cur++); + SETPAIR(i + 8, i, cur++); + SETPAIR(CACA_COLOR_LIGHTGRAY, i + 8, cur++); + SETPAIR(i + 8, CACA_COLOR_LIGHTGRAY, cur++); + SETPAIR(CACA_COLOR_DARKGRAY, i, cur++); + SETPAIR(i, CACA_COLOR_DARKGRAY, cur++); + SETPAIR(CACA_COLOR_BLACK, i, cur++); + } + + /* next colour combinations for hue dithering (magenta/blue, blue/green + * and so on) */ + for(i = 0; i < 6; i++) + { + SETPAIR(hue_list[i], hue_list[(i + 1) % 6], cur++); + SETPAIR(hue_list[(i + 1) % 6], hue_list[i], cur++); + SETPAIR(hue_list[i] + 8, hue_list[(i + 1) % 6] + 8, cur++); + SETPAIR(hue_list[(i + 1) % 6] + 8, hue_list[i] + 8, cur++); + } + + /* next colour combinations for hue/value dithering (blue/lightgreen, + * green/lightblue and so on) */ + for(i = 0; i < 6; i++) + { + SETPAIR(hue_list[i], hue_list[(i + 1) % 6] + 8, cur++); + SETPAIR(hue_list[(i + 1) % 6], hue_list[i] + 8, cur++); + SETPAIR(hue_list[i] + 8, hue_list[(i + 1) % 6], cur++); + SETPAIR(hue_list[(i + 1) % 6] + 8, hue_list[i], cur++); + } + + /* black on light gray, black on white, white on dark gray, dark gray + * on white, white on blue, light gray on blue (chosen arbitrarily) */ + SETPAIR(CACA_COLOR_BLACK, CACA_COLOR_LIGHTGRAY, cur++); + SETPAIR(CACA_COLOR_BLACK, CACA_COLOR_WHITE, cur++); + SETPAIR(CACA_COLOR_WHITE, CACA_COLOR_DARKGRAY, cur++); + SETPAIR(CACA_COLOR_DARKGRAY, CACA_COLOR_WHITE, cur++); + SETPAIR(CACA_COLOR_WHITE, CACA_COLOR_BLUE, cur++); + SETPAIR(CACA_COLOR_LIGHTGRAY, CACA_COLOR_BLUE, cur++); +} + +static void emulated_colors(void) +{ + int i; + + /* light gray on dark colour: emulate with light colour on dark colour + * white on dark colour: emulate with light gray on light colour + * black on light colour: emulate with dark gray on dark colour + * dark gray on light colour: emulate with dark colour on light colour + * light colour on dark gray: emulate with dark colour on dark gray + * dark colour on light gray: emulate with light colour on light gray + * dark colour on white: emulate with light colour on white */ + for(i = 1; i < 7; i++) + { + if(i != CACA_COLOR_BLUE) + { + SETPAIR(CACA_COLOR_LIGHTGRAY, i, 128 + + slang_assoc[i + 8 + 16 * i]); + SETPAIR(CACA_COLOR_WHITE, i, 128 + + slang_assoc[CACA_COLOR_LIGHTGRAY + 16 * (i + 8)]); + } + SETPAIR(CACA_COLOR_BLACK, i + 8, + 128 + slang_assoc[CACA_COLOR_DARKGRAY + 16 * i]); + SETPAIR(CACA_COLOR_DARKGRAY, i + 8, + 128 + slang_assoc[i + 16 * (i + 8)]); + SETPAIR(i + 8, CACA_COLOR_DARKGRAY, + 128 + slang_assoc[i + 16 * CACA_COLOR_DARKGRAY]); + SETPAIR(i, CACA_COLOR_LIGHTGRAY, + 128 + slang_assoc[i + 8 + 16 * CACA_COLOR_LIGHTGRAY]); + SETPAIR(i, CACA_COLOR_WHITE, + 128 + slang_assoc[i + 8 + 16 * CACA_COLOR_WHITE]); + } + + /* 120 degree hue pairs can be emulated as well; for instance blue on + * red can be emulated using magenta on red, and blue on green using + * cyan on green */ + for(i = 0; i < 6; i++) + { + SETPAIR(hue_list[(i + 2) % 6], hue_list[i], + 128 + slang_assoc[hue_list[(i + 1) % 6] + 16 * hue_list[i]]); + SETPAIR(hue_list[(i + 2) % 6] + 8, hue_list[i] + 8, + 128 + slang_assoc[hue_list[(i + 1) % 6] + 16 * hue_list[i] + 136]); + SETPAIR(hue_list[(i + 2) % 6] + 8, hue_list[i], + 128 + slang_assoc[hue_list[(i + 1) % 6] + 16 * hue_list[i] + 8]); + SETPAIR(hue_list[(i + 2) % 6], hue_list[i] + 8, + 128 + slang_assoc[hue_list[(i + 1) % 6] + 16 * hue_list[i] + 128]); + + SETPAIR(hue_list[(i + 4) % 6], hue_list[i], + 128 + slang_assoc[hue_list[(i + 5) % 6] + 16 * hue_list[i]]); + SETPAIR(hue_list[(i + 4) % 6] + 8, hue_list[i] + 8, + 128 + slang_assoc[hue_list[(i + 5) % 6] + 16 * hue_list[i] + 136]); + SETPAIR(hue_list[(i + 4) % 6] + 8, hue_list[i], + 128 + slang_assoc[hue_list[(i + 5) % 6] + 16 * hue_list[i] + 8]); + SETPAIR(hue_list[(i + 4) % 6], hue_list[i] + 8, + 128 + slang_assoc[hue_list[(i + 5) % 6] + 16 * hue_list[i] + 128]); + } + + /* dark opposite on dark: emulate with dark opposite on black + * light opposite on dark: emulate with light opposite on black + * dark opposite on light: emulate with black on dark + * light opposite on light: emulate with white on light */ + for(i = 0; i < 6; i++) + { + SETPAIR(hue_list[i], hue_list[(i + 3) % 6], + 128 + slang_assoc[hue_list[i] + 16 * CACA_COLOR_BLACK]); + SETPAIR(hue_list[i] + 8, hue_list[(i + 3) % 6], + 128 + slang_assoc[hue_list[i] + 8 + 16 * CACA_COLOR_BLACK]); + SETPAIR(hue_list[(i + 3) % 6], hue_list[i] + 8, + 128 + slang_assoc[CACA_COLOR_BLACK + 16 * hue_list[i]]); + SETPAIR(hue_list[(i + 3) % 6] + 8, hue_list[i] + 8, + 128 + slang_assoc[CACA_COLOR_WHITE + 16 * (hue_list[i] + 8)]); + } +} + +static void unused_colors(void) +{ + int i, j; + + for(i = 0, j = 0; i < 16 * 16; i++) + { + if(palette[i] == -1) + { + SETPAIR(j, j, i); + j++; + } + } +} +