Map 256-color palette to VGA colors
This commit is contained in:
parent
b114700751
commit
eccbd5d41e
@ -25,6 +25,7 @@
|
||||
#include "lib/kbd.h"
|
||||
#include "lib/graphics.h"
|
||||
|
||||
#include "gui/terminal/vga-palette.h"
|
||||
#include "gui/terminal/lib/termemu.h"
|
||||
|
||||
#define USE_BELL 0
|
||||
@ -122,11 +123,15 @@ term_write_char(
|
||||
uint32_t bg,
|
||||
uint8_t flags
|
||||
) {
|
||||
if (fg > 16) fg = TERM_DEFAULT_FG;
|
||||
if (bg > 16) bg = TERM_DEFAULT_BG;
|
||||
if (val > 128) val = ununicode(val);
|
||||
if (fg > 16) {
|
||||
fg = vga_colors[fg];
|
||||
}
|
||||
if (bg > 16) {
|
||||
bg = vga_colors[bg];
|
||||
}
|
||||
if (fg == 16) fg = 0;
|
||||
if (bg == 16) bg = 0;
|
||||
if (val > 128) val = ununicode(val);
|
||||
placech(val, x, y, (vga_to_ansi[fg] & 0xF) | (vga_to_ansi[bg] << 4));
|
||||
}
|
||||
|
||||
|
259
userspace/gui/terminal/vga-palette.h
Normal file
259
userspace/gui/terminal/vga-palette.h
Normal file
@ -0,0 +1,259 @@
|
||||
#define PALETTE_COLORS 256
|
||||
uint32_t vga_colors[PALETTE_COLORS] = {
|
||||
0x0,
|
||||
0x1,
|
||||
0x2,
|
||||
0x3,
|
||||
0x4,
|
||||
0x5,
|
||||
0x6,
|
||||
0x7,
|
||||
0x8,
|
||||
0x9,
|
||||
0xa,
|
||||
0xb,
|
||||
0xc,
|
||||
0xd,
|
||||
0xe,
|
||||
0xf,
|
||||
0x0, /* #000000 -> #000000 */
|
||||
0x4, /* #00005f -> #0000aa */
|
||||
0x4, /* #000087 -> #0000aa */
|
||||
0x4, /* #0000af -> #0000aa */
|
||||
0x4, /* #0000d7 -> #0000aa */
|
||||
0xc, /* #0000ff -> #5555ff */
|
||||
0x2, /* #005f00 -> #00aa00 */
|
||||
0x8, /* #005f5f -> #555555 */
|
||||
0x6, /* #005f87 -> #00aaaa */
|
||||
0x6, /* #005faf -> #00aaaa */
|
||||
0xc, /* #005fd7 -> #5555ff */
|
||||
0xc, /* #005fff -> #5555ff */
|
||||
0x2, /* #008700 -> #00aa00 */
|
||||
0xa, /* #00875f -> #55aa55 */
|
||||
0x6, /* #008787 -> #00aaaa */
|
||||
0x6, /* #0087af -> #00aaaa */
|
||||
0x6, /* #0087d7 -> #00aaaa */
|
||||
0xc, /* #0087ff -> #5555ff */
|
||||
0x2, /* #00af00 -> #00aa00 */
|
||||
0xa, /* #00af5f -> #55aa55 */
|
||||
0x6, /* #00af87 -> #00aaaa */
|
||||
0x6, /* #00afaf -> #00aaaa */
|
||||
0x6, /* #00afd7 -> #00aaaa */
|
||||
0xe, /* #00afff -> #55ffff */
|
||||
0x2, /* #00d700 -> #00aa00 */
|
||||
0xa, /* #00d75f -> #55aa55 */
|
||||
0x6, /* #00d787 -> #00aaaa */
|
||||
0x6, /* #00d7af -> #00aaaa */
|
||||
0x6, /* #00d7d7 -> #00aaaa */
|
||||
0xe, /* #00d7ff -> #55ffff */
|
||||
0x2, /* #00ff00 -> #00aa00 */
|
||||
0xa, /* #00ff5f -> #55aa55 */
|
||||
0x6, /* #00ff87 -> #00aaaa */
|
||||
0x6, /* #00ffaf -> #00aaaa */
|
||||
0xe, /* #00ffd7 -> #55ffff */
|
||||
0xe, /* #00ffff -> #55ffff */
|
||||
0x1, /* #5f0000 -> #aa0000 */
|
||||
0x8, /* #5f005f -> #555555 */
|
||||
0x5, /* #5f0087 -> #aa00aa */
|
||||
0x5, /* #5f00af -> #aa00aa */
|
||||
0x5, /* #5f00d7 -> #aa00aa */
|
||||
0xc, /* #5f00ff -> #5555ff */
|
||||
0x3, /* #5f5f00 -> #aa5500 */
|
||||
0x8, /* #5f5f5f -> #555555 */
|
||||
0x8, /* #5f5f87 -> #555555 */
|
||||
0x7, /* #5f5faf -> #aaaaaa */
|
||||
0xc, /* #5f5fd7 -> #5555ff */
|
||||
0xc, /* #5f5fff -> #5555ff */
|
||||
0x2, /* #5f8700 -> #00aa00 */
|
||||
0xa, /* #5f875f -> #55aa55 */
|
||||
0xa, /* #5f8787 -> #55aa55 */
|
||||
0x7, /* #5f87af -> #aaaaaa */
|
||||
0xc, /* #5f87d7 -> #5555ff */
|
||||
0xc, /* #5f87ff -> #5555ff */
|
||||
0x2, /* #5faf00 -> #00aa00 */
|
||||
0xa, /* #5faf5f -> #55aa55 */
|
||||
0xa, /* #5faf87 -> #55aa55 */
|
||||
0x7, /* #5fafaf -> #aaaaaa */
|
||||
0x7, /* #5fafd7 -> #aaaaaa */
|
||||
0xe, /* #5fafff -> #55ffff */
|
||||
0x2, /* #5fd700 -> #00aa00 */
|
||||
0xa, /* #5fd75f -> #55aa55 */
|
||||
0xa, /* #5fd787 -> #55aa55 */
|
||||
0x7, /* #5fd7af -> #aaaaaa */
|
||||
0xe, /* #5fd7d7 -> #55ffff */
|
||||
0xe, /* #5fd7ff -> #55ffff */
|
||||
0x2, /* #5fff00 -> #00aa00 */
|
||||
0xb, /* #5fff5f -> #ffff55 */
|
||||
0xb, /* #5fff87 -> #ffff55 */
|
||||
0x7, /* #5fffaf -> #aaaaaa */
|
||||
0xe, /* #5fffd7 -> #55ffff */
|
||||
0xe, /* #5fffff -> #55ffff */
|
||||
0x1, /* #870000 -> #aa0000 */
|
||||
0x8, /* #87005f -> #555555 */
|
||||
0x5, /* #870087 -> #aa00aa */
|
||||
0x5, /* #8700af -> #aa00aa */
|
||||
0x5, /* #8700d7 -> #aa00aa */
|
||||
0xc, /* #8700ff -> #5555ff */
|
||||
0x3, /* #875f00 -> #aa5500 */
|
||||
0x8, /* #875f5f -> #555555 */
|
||||
0x8, /* #875f87 -> #555555 */
|
||||
0x7, /* #875faf -> #aaaaaa */
|
||||
0xc, /* #875fd7 -> #5555ff */
|
||||
0xc, /* #875fff -> #5555ff */
|
||||
0x3, /* #878700 -> #aa5500 */
|
||||
0xa, /* #87875f -> #55aa55 */
|
||||
0x7, /* #878787 -> #aaaaaa */
|
||||
0x7, /* #8787af -> #aaaaaa */
|
||||
0x7, /* #8787d7 -> #aaaaaa */
|
||||
0xc, /* #8787ff -> #5555ff */
|
||||
0x2, /* #87af00 -> #00aa00 */
|
||||
0xa, /* #87af5f -> #55aa55 */
|
||||
0x7, /* #87af87 -> #aaaaaa */
|
||||
0x7, /* #87afaf -> #aaaaaa */
|
||||
0x7, /* #87afd7 -> #aaaaaa */
|
||||
0xe, /* #87afff -> #55ffff */
|
||||
0x2, /* #87d700 -> #00aa00 */
|
||||
0xa, /* #87d75f -> #55aa55 */
|
||||
0x7, /* #87d787 -> #aaaaaa */
|
||||
0x7, /* #87d7af -> #aaaaaa */
|
||||
0xe, /* #87d7d7 -> #55ffff */
|
||||
0xe, /* #87d7ff -> #55ffff */
|
||||
0x2, /* #87ff00 -> #00aa00 */
|
||||
0xb, /* #87ff5f -> #ffff55 */
|
||||
0xb, /* #87ff87 -> #ffff55 */
|
||||
0x7, /* #87ffaf -> #aaaaaa */
|
||||
0xe, /* #87ffd7 -> #55ffff */
|
||||
0xe, /* #87ffff -> #55ffff */
|
||||
0x1, /* #af0000 -> #aa0000 */
|
||||
0x5, /* #af005f -> #aa00aa */
|
||||
0x5, /* #af0087 -> #aa00aa */
|
||||
0x5, /* #af00af -> #aa00aa */
|
||||
0x5, /* #af00d7 -> #aa00aa */
|
||||
0xd, /* #af00ff -> #ff55ff */
|
||||
0x3, /* #af5f00 -> #aa5500 */
|
||||
0x9, /* #af5f5f -> #ff5555 */
|
||||
0x9, /* #af5f87 -> #ff5555 */
|
||||
0x7, /* #af5faf -> #aaaaaa */
|
||||
0xd, /* #af5fd7 -> #ff55ff */
|
||||
0xd, /* #af5fff -> #ff55ff */
|
||||
0x3, /* #af8700 -> #aa5500 */
|
||||
0xa, /* #af875f -> #55aa55 */
|
||||
0x7, /* #af8787 -> #aaaaaa */
|
||||
0x7, /* #af87af -> #aaaaaa */
|
||||
0x7, /* #af87d7 -> #aaaaaa */
|
||||
0xd, /* #af87ff -> #ff55ff */
|
||||
0x2, /* #afaf00 -> #00aa00 */
|
||||
0xa, /* #afaf5f -> #55aa55 */
|
||||
0x7, /* #afaf87 -> #aaaaaa */
|
||||
0x7, /* #afafaf -> #aaaaaa */
|
||||
0x7, /* #afafd7 -> #aaaaaa */
|
||||
0xf, /* #afafff -> #ffffff */
|
||||
0x2, /* #afd700 -> #00aa00 */
|
||||
0xb, /* #afd75f -> #ffff55 */
|
||||
0x7, /* #afd787 -> #aaaaaa */
|
||||
0x7, /* #afd7af -> #aaaaaa */
|
||||
0x7, /* #afd7d7 -> #aaaaaa */
|
||||
0xf, /* #afd7ff -> #ffffff */
|
||||
0x2, /* #afff00 -> #00aa00 */
|
||||
0xb, /* #afff5f -> #ffff55 */
|
||||
0xb, /* #afff87 -> #ffff55 */
|
||||
0x7, /* #afffaf -> #aaaaaa */
|
||||
0xf, /* #afffd7 -> #ffffff */
|
||||
0xf, /* #afffff -> #ffffff */
|
||||
0x1, /* #d70000 -> #aa0000 */
|
||||
0x9, /* #d7005f -> #ff5555 */
|
||||
0x5, /* #d70087 -> #aa00aa */
|
||||
0x5, /* #d700af -> #aa00aa */
|
||||
0x5, /* #d700d7 -> #aa00aa */
|
||||
0xd, /* #d700ff -> #ff55ff */
|
||||
0x3, /* #d75f00 -> #aa5500 */
|
||||
0x9, /* #d75f5f -> #ff5555 */
|
||||
0x9, /* #d75f87 -> #ff5555 */
|
||||
0x7, /* #d75faf -> #aaaaaa */
|
||||
0xd, /* #d75fd7 -> #ff55ff */
|
||||
0xd, /* #d75fff -> #ff55ff */
|
||||
0x3, /* #d78700 -> #aa5500 */
|
||||
0x9, /* #d7875f -> #ff5555 */
|
||||
0x7, /* #d78787 -> #aaaaaa */
|
||||
0x7, /* #d787af -> #aaaaaa */
|
||||
0x7, /* #d787d7 -> #aaaaaa */
|
||||
0xd, /* #d787ff -> #ff55ff */
|
||||
0x2, /* #d7af00 -> #00aa00 */
|
||||
0xa, /* #d7af5f -> #55aa55 */
|
||||
0x7, /* #d7af87 -> #aaaaaa */
|
||||
0x7, /* #d7afaf -> #aaaaaa */
|
||||
0x7, /* #d7afd7 -> #aaaaaa */
|
||||
0xf, /* #d7afff -> #ffffff */
|
||||
0x2, /* #d7d700 -> #00aa00 */
|
||||
0xb, /* #d7d75f -> #ffff55 */
|
||||
0x7, /* #d7d787 -> #aaaaaa */
|
||||
0x7, /* #d7d7af -> #aaaaaa */
|
||||
0xf, /* #d7d7d7 -> #ffffff */
|
||||
0xf, /* #d7d7ff -> #ffffff */
|
||||
0xb, /* #d7ff00 -> #ffff55 */
|
||||
0xb, /* #d7ff5f -> #ffff55 */
|
||||
0xb, /* #d7ff87 -> #ffff55 */
|
||||
0x7, /* #d7ffaf -> #aaaaaa */
|
||||
0xf, /* #d7ffd7 -> #ffffff */
|
||||
0xf, /* #d7ffff -> #ffffff */
|
||||
0x1, /* #ff0000 -> #aa0000 */
|
||||
0x9, /* #ff005f -> #ff5555 */
|
||||
0x5, /* #ff0087 -> #aa00aa */
|
||||
0x5, /* #ff00af -> #aa00aa */
|
||||
0x5, /* #ff00d7 -> #aa00aa */
|
||||
0xd, /* #ff00ff -> #ff55ff */
|
||||
0x3, /* #ff5f00 -> #aa5500 */
|
||||
0x9, /* #ff5f5f -> #ff5555 */
|
||||
0x9, /* #ff5f87 -> #ff5555 */
|
||||
0x7, /* #ff5faf -> #aaaaaa */
|
||||
0xd, /* #ff5fd7 -> #ff55ff */
|
||||
0xd, /* #ff5fff -> #ff55ff */
|
||||
0x3, /* #ff8700 -> #aa5500 */
|
||||
0x9, /* #ff875f -> #ff5555 */
|
||||
0x9, /* #ff8787 -> #ff5555 */
|
||||
0x7, /* #ff87af -> #aaaaaa */
|
||||
0xd, /* #ff87d7 -> #ff55ff */
|
||||
0xd, /* #ff87ff -> #ff55ff */
|
||||
0x2, /* #ffaf00 -> #00aa00 */
|
||||
0xb, /* #ffaf5f -> #ffff55 */
|
||||
0x7, /* #ffaf87 -> #aaaaaa */
|
||||
0x7, /* #ffafaf -> #aaaaaa */
|
||||
0x7, /* #ffafd7 -> #aaaaaa */
|
||||
0xf, /* #ffafff -> #ffffff */
|
||||
0x2, /* #ffd700 -> #00aa00 */
|
||||
0xb, /* #ffd75f -> #ffff55 */
|
||||
0xb, /* #ffd787 -> #ffff55 */
|
||||
0x7, /* #ffd7af -> #aaaaaa */
|
||||
0xf, /* #ffd7d7 -> #ffffff */
|
||||
0xf, /* #ffd7ff -> #ffffff */
|
||||
0xb, /* #ffff00 -> #ffff55 */
|
||||
0xb, /* #ffff5f -> #ffff55 */
|
||||
0xb, /* #ffff87 -> #ffff55 */
|
||||
0xf, /* #ffffaf -> #ffffff */
|
||||
0xf, /* #ffffd7 -> #ffffff */
|
||||
0xf, /* #ffffff -> #ffffff */
|
||||
0x0, /* #080808 -> #000000 */
|
||||
0x0, /* #121212 -> #000000 */
|
||||
0x0, /* #1c1c1c -> #000000 */
|
||||
0x0, /* #262626 -> #000000 */
|
||||
0x8, /* #303030 -> #555555 */
|
||||
0x8, /* #3a3a3a -> #555555 */
|
||||
0x8, /* #444444 -> #555555 */
|
||||
0x8, /* #4e4e4e -> #555555 */
|
||||
0x8, /* #585858 -> #555555 */
|
||||
0x8, /* #626262 -> #555555 */
|
||||
0x8, /* #6c6c6c -> #555555 */
|
||||
0x8, /* #767676 -> #555555 */
|
||||
0x7, /* #808080 -> #aaaaaa */
|
||||
0x7, /* #8a8a8a -> #aaaaaa */
|
||||
0x7, /* #949494 -> #aaaaaa */
|
||||
0x7, /* #9e9e9e -> #aaaaaa */
|
||||
0x7, /* #a8a8a8 -> #aaaaaa */
|
||||
0x7, /* #b2b2b2 -> #aaaaaa */
|
||||
0x7, /* #bcbcbc -> #aaaaaa */
|
||||
0x7, /* #c6c6c6 -> #aaaaaa */
|
||||
0x7, /* #d0d0d0 -> #aaaaaa */
|
||||
0xf, /* #dadada -> #ffffff */
|
||||
0xf, /* #e4e4e4 -> #ffffff */
|
||||
0xf, /* #eeeeee -> #ffffff */
|
||||
};
|
76
util/generate-vga-palette.c
Normal file
76
util/generate-vga-palette.c
Normal file
@ -0,0 +1,76 @@
|
||||
#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_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_colors[j]));
|
||||
int distance = color_distance(term_colors[i], vga_colors[j]);
|
||||
if (distance < best_distance) {
|
||||
best_index = j;
|
||||
best_distance = distance;
|
||||
}
|
||||
}
|
||||
printf("\t0x%x, /* #%06x -> #%06x */\n", best_index, term_colors[i], vga_colors[best_index]);
|
||||
}
|
||||
printf("};\n");
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user