Quick try at issue #185 (XOR highlight optimal color repartition).
Untested, need to plug it at the right places and debug it. git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@2046 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
parent
28c4677021
commit
8f76bce566
@ -3009,3 +3009,67 @@ const T_Components * Favorite_GUI_color(byte color_index)
|
||||
// Should be Config.Fav_menu_colors[index] if using user colors
|
||||
return &(Gfx->Default_palette[Gfx->Color[color_index]]);
|
||||
}
|
||||
|
||||
byte xor_lut[256];
|
||||
int Diff(int i, int j) {
|
||||
// TODO try out different difference operators to see if the results get
|
||||
// better (weight the components, use ² instead of abs, use HSL or XYZ or )
|
||||
int diff = 0;
|
||||
diff += abs(Main_palette[i].R - Main_palette[j].R);
|
||||
diff += abs(Main_palette[i].G - Main_palette[j].G);
|
||||
diff += abs(Main_palette[i].B - Main_palette[j].B);
|
||||
|
||||
return diff;
|
||||
}
|
||||
|
||||
void compute_xor_table()
|
||||
{
|
||||
int i;
|
||||
byte found;
|
||||
|
||||
// Initialize the table with some "random" values
|
||||
for(i = 0; i < 256; i++)
|
||||
{
|
||||
xor_lut[i] = 255 - i;
|
||||
}
|
||||
|
||||
do {
|
||||
// Find the smallest difference in the table
|
||||
int mindiff = INT_MAX;
|
||||
int idx;
|
||||
for(i = 0; i < 256; i++)
|
||||
{
|
||||
int diff = Diff(i, xor_lut[i]);
|
||||
if (diff < mindiff) {
|
||||
idx = i;
|
||||
mindiff = diff;
|
||||
}
|
||||
}
|
||||
|
||||
// Try to pair these two colors better
|
||||
found = 0;
|
||||
for(i = 0; i < 256; i++)
|
||||
{
|
||||
// diffs before the swap
|
||||
int before = Diff(idx, xor_lut[idx]) + Diff(i, xor_lut[i]);
|
||||
|
||||
// diffs after the swap
|
||||
int after = Diff(idx, xor_lut[i]) + Diff(i, xor_lut[idx]);
|
||||
|
||||
if (after > before)
|
||||
{
|
||||
// Swapping these colors get us something "more different". Do it !
|
||||
byte idx2 = xor_lut[i];
|
||||
byte i2 = xor_lut[idx];
|
||||
|
||||
xor_lut[i] = i2;
|
||||
xor_lut[i2] = i;
|
||||
xor_lut[idx] = idx2;
|
||||
xor_lut[idx2] = idx;
|
||||
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} while(found);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user