Selaa lähdekoodia

* 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.
tags/v0.99.beta14
Sam Hocevar sam 21 vuotta sitten
vanhempi
commit
bf4ff1e254
3 muutettua tiedostoa jossa 317 lisäystä ja 155 poistoa
  1. +60
    -154
      src/graphics.c
  2. +5
    -1
      test/Makefile.am
  3. +252
    -0
      test/optipal.c

+ 60
- 154
src/graphics.c Näytä tiedosto

@@ -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 */


+ 5
- 1
test/Makefile.am Näytä tiedosto

@@ -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


+ 252
- 0
test/optipal.c Näytä tiedosto

@@ -0,0 +1,252 @@
/*
* optipal S-Lang optimised palette generator for libcaca
* Copyright (c) 2003 Sam Hocevar <sam@zoy.org>
* 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 <stdio.h>

#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++;
}
}
}


Ladataan…
Peruuta
Tallenna