77 lines
1.5 KiB
C
77 lines
1.5 KiB
C
#include <stdio.h>
|
|
#include <stdint.h>
|
|
|
|
#include "../userspace/gui/terminal/terminal-palette.h"
|
|
|
|
static int abs(int a) {
|
|
return a > 0 ? a : -a;
|
|
}
|
|
|
|
static int color_distance(uint32_t a, uint32_t b) {
|
|
int a_r = (a & 0xFF0000) >> 16;
|
|
int a_g = (a & 0xFF00) >> 8;
|
|
int a_b = (a & 0xFF);
|
|
|
|
int b_r = (b & 0xFF0000) >> 16;
|
|
int b_g = (b & 0xFF00) >> 8;
|
|
int b_b = (b & 0xFF);
|
|
|
|
int distance = 0;
|
|
distance += abs(a_r - b_r) * 3;
|
|
distance += abs(a_g - b_g) * 6;
|
|
distance += abs(a_b - b_b) * 10;
|
|
|
|
return distance;
|
|
}
|
|
|
|
static uint32_t vga_base_colors[] = {
|
|
0x000000,
|
|
0xAA0000,
|
|
0x00AA00,
|
|
0xAA5500,
|
|
0x0000AA,
|
|
0xAA00AA,
|
|
0x00AAAA,
|
|
0xAAAAAA,
|
|
0x555555,
|
|
0xFF5555,
|
|
0x55AA55,
|
|
0xFFFF55,
|
|
0x5555FF,
|
|
0xFF55FF,
|
|
0x55FFFF,
|
|
0xFFFFFF,
|
|
};
|
|
|
|
static int is_gray(uint32_t a) {
|
|
int a_r = (a & 0xFF0000) >> 16;
|
|
int a_g = (a & 0xFF00) >> 8;
|
|
int a_b = (a & 0xFF);
|
|
|
|
return (a_r == a_g && a_g == a_b);
|
|
}
|
|
|
|
int main(int argc, char * argv[]) {
|
|
printf("#define PALETTE_COLORS 256\n");
|
|
printf("uint32_t vga_colors[PALETTE_COLORS] = {\n");
|
|
for (int i = 0; i < 16; ++i) {
|
|
printf("\t0x%x,\n", i);
|
|
}
|
|
for (int i = 16; i < 256; ++i) {
|
|
int best_distance = INT32_MAX;
|
|
int best_index = 0;
|
|
for (int j = 0; j < 16; ++j) {
|
|
if (is_gray(term_colors[i]) && !is_gray(vga_base_colors[j]));
|
|
int distance = color_distance(term_colors[i], vga_base_colors[j]);
|
|
if (distance < best_distance) {
|
|
best_index = j;
|
|
best_distance = distance;
|
|
}
|
|
}
|
|
printf("\t0x%x, /* #%06x -> #%06x */\n", best_index, term_colors[i], vga_base_colors[best_index]);
|
|
}
|
|
printf("};\n");
|
|
return 0;
|
|
}
|
|
|