Created
June 13, 2023 17:22
-
-
Save harieamjari/509f665081f52b3dbdfc892b39cc3eab to your computer and use it in GitHub Desktop.
Converts RGB values to VGA 256
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* rgb2vga.c - converts rgb values to vga 256. */ | |
/* Copyright (c) 2023 Al-buharie Amjari */ | |
/* Released under MIT License */ | |
#include <math.h> | |
#include <stdint.h> | |
#include <stdio.h> | |
#define F(x) ((float)x) | |
float ndx_vgapal[256][3] = { | |
/* colors 0-15 */ | |
{F(0x00), F(0x00), F(0x00)}, | |
{F(0x00), F(0x00), F(0xAA)}, | |
{F(0x00), F(0xAA), F(0x00)}, | |
{F(0x00), F(0xAA), F(0xAA)}, | |
{F(0xAA), F(0x00), F(0x00)}, | |
{F(0xAA), F(0x00), F(0xAA)}, | |
{F(0xAA), F(0x55), F(0x00)}, | |
{F(0xAA), F(0xAA), F(0xAA)}, | |
{F(0x55), F(0x55), F(0x55)}, | |
{F(0x55), F(0x55), F(0xFF)}, | |
{F(0x55), F(0xFF), F(0x55)}, | |
{F(0x55), F(0xFF), F(0xFF)}, | |
{F(0xFF), F(0x55), F(0x55)}, | |
{F(0xFF), F(0x55), F(0xFF)}, | |
{F(0xFF), F(0xFF), F(0x55)}, | |
{F(0xFF), F(0xFF), F(0xFF)}, | |
/* grayscale 16-31 (non gamma corrected) */ | |
{F(0x00), F(0x00), F(0x00)}, | |
{F(0x14), F(0x14), F(0x14)}, | |
{F(0x20), F(0x20), F(0x20)}, | |
{F(0x2C), F(0x2C), F(0x2C)}, | |
{F(0x38), F(0x38), F(0x38)}, | |
{F(0x45), F(0x45), F(0x45)}, | |
{F(0x51), F(0x51), F(0x51)}, | |
{F(0x61), F(0x61), F(0x61)}, | |
{F(0x71), F(0x71), F(0x71)}, | |
{F(0x82), F(0x82), F(0x82)}, | |
{F(0x92), F(0x92), F(0x92)}, | |
{F(0xA2), F(0xA2), F(0xA2)}, | |
{F(0xB6), F(0xB6), F(0xB6)}, | |
{F(0xCB), F(0xCB), F(0xCB)}, | |
{F(0xE3), F(0xE3), F(0xE3)}, | |
{F(0xFF), F(0xFF), F(0xFF)}, | |
// HERE ------> 1 | |
/* hue mix 32-55 (1) */ | |
{F(0x00), F(0x00), F(0xFF)}, | |
{F(0x41), F(0x00), F(0xFF)}, | |
{F(0x7D), F(0x00), F(0xFF)}, | |
{F(0xBE), F(0x00), F(0xFF)}, | |
{F(0xFF), F(0x00), F(0xFF)}, | |
{F(0xFF), F(0x00), F(0xBE)}, | |
{F(0xFF), F(0x00), F(0x7D)}, | |
{F(0xFF), F(0x00), F(0x41)}, | |
{F(0xFF), F(0x00), F(0x00)}, | |
{F(0xFF), F(0x41), F(0x00)}, | |
{F(0xFF), F(0x7D), F(0x00)}, | |
{F(0xFF), F(0xBE), F(0x00)}, | |
{F(0xFF), F(0xFF), F(0x00)}, | |
{F(0xBE), F(0xFF), F(0x00)}, | |
{F(0x7D), F(0xFF), F(0x00)}, | |
{F(0x41), F(0xFF), F(0x00)}, | |
{F(0x00), F(0xFF), F(0x00)}, | |
{F(0x00), F(0xFF), F(0x41)}, | |
{F(0x00), F(0xFF), F(0x7D)}, | |
{F(0x00), F(0xFF), F(0xBE)}, | |
{F(0x00), F(0xFF), F(0xFF)}, | |
{F(0x00), F(0xBE), F(0xFF)}, | |
{F(0x00), F(0x7D), F(0xFF)}, | |
{F(0x00), F(0x41), F(0xFF)}, | |
/* hue mix 56-79 (2) */ | |
{F(0x7D), F(0x7D), F(0xFF)}, | |
{F(0x9E), F(0x7D), F(0xFF)}, | |
{F(0xBE), F(0x7D), F(0xFF)}, | |
{F(0xDF), F(0x7D), F(0xFF)}, | |
{F(0xFF), F(0x7D), F(0xFF)}, | |
{F(0xFF), F(0x7D), F(0xDF)}, | |
{F(0xFF), F(0x7D), F(0xBE)}, | |
{F(0xFF), F(0x7D), F(0x9E)}, | |
{F(0xFF), F(0x7D), F(0x7D)}, | |
{F(0xFF), F(0x9E), F(0x7D)}, | |
{F(0xFF), F(0xBE), F(0x7D)}, | |
{F(0xFF), F(0xDF), F(0x7D)}, | |
{F(0xFF), F(0xFF), F(0x7D)}, | |
{F(0xDF), F(0xFF), F(0x7D)}, | |
{F(0xBE), F(0xFF), F(0x7D)}, | |
{F(0x9E), F(0xFF), F(0x7D)}, | |
{F(0x7D), F(0xFF), F(0x7D)}, | |
{F(0x7D), F(0xFF), F(0x9E)}, | |
{F(0x7D), F(0xFF), F(0xBE)}, | |
{F(0x7D), F(0xFF), F(0xDF)}, | |
{F(0x7D), F(0xFF), F(0xFF)}, | |
{F(0x7D), F(0xDF), F(0xFF)}, | |
{F(0x7D), F(0xBE), F(0xFF)}, | |
{F(0x7D), F(0x9E), F(0xFF)}, | |
/* hue mix 80-103 (3) */ | |
{F(0xB6), F(0xB6), F(0xFF)}, | |
{F(0xC7), F(0xB6), F(0xFF)}, | |
{F(0xDB), F(0xB6), F(0xFF)}, | |
{F(0xEB), F(0xB6), F(0xFF)}, | |
{F(0xFF), F(0xB6), F(0xFF)}, | |
{F(0xFF), F(0xB6), F(0xEB)}, | |
{F(0xFF), F(0xB6), F(0xDB)}, | |
{F(0xFF), F(0xB6), F(0xC7)}, | |
{F(0xFF), F(0xB6), F(0xB6)}, | |
{F(0xFF), F(0xC7), F(0xB6)}, | |
{F(0xFF), F(0xDB), F(0xB6)}, | |
{F(0xFF), F(0xEB), F(0xB6)}, | |
{F(0xFF), F(0xFF), F(0xB6)}, | |
{F(0xEB), F(0xFF), F(0xB6)}, | |
{F(0xDB), F(0xFF), F(0xB6)}, | |
{F(0xC7), F(0xFF), F(0xB6)}, | |
{F(0xB6), F(0xFF), F(0xB6)}, | |
{F(0xB6), F(0xFF), F(0xC7)}, | |
{F(0xB6), F(0xFF), F(0xDB)}, | |
{F(0xB6), F(0xFF), F(0xEB)}, | |
{F(0xB6), F(0xFF), F(0xFF)}, | |
{F(0xB6), F(0xEB), F(0xFF)}, | |
{F(0xB6), F(0xDB), F(0xFF)}, | |
{F(0xB6), F(0xC7), F(0xFF)}, | |
// HERE ------> 2 | |
/* hue mix 104-127 (4) dark 1 */ | |
{F(0x00), F(0x00), F(0x71)}, | |
{F(0x1C), F(0x00), F(0x71)}, | |
{F(0x38), F(0x00), F(0x71)}, | |
{F(0x55), F(0x00), F(0x71)}, | |
{F(0x71), F(0x00), F(0x71)}, | |
{F(0x71), F(0x00), F(0x55)}, | |
{F(0x71), F(0x00), F(0x38)}, | |
{F(0x71), F(0x00), F(0x1C)}, | |
{F(0x71), F(0x00), F(0x00)}, | |
{F(0x71), F(0x1C), F(0x00)}, | |
{F(0x71), F(0x38), F(0x00)}, | |
{F(0x71), F(0x55), F(0x00)}, | |
{F(0x71), F(0x71), F(0x00)}, | |
{F(0x55), F(0x71), F(0x00)}, | |
{F(0x38), F(0x71), F(0x00)}, | |
{F(0x1C), F(0x71), F(0x00)}, | |
{F(0x00), F(0x71), F(0x00)}, | |
{F(0x00), F(0x71), F(0x1C)}, | |
{F(0x00), F(0x71), F(0x38)}, | |
{F(0x00), F(0x71), F(0x55)}, | |
{F(0x00), F(0x71), F(0x71)}, | |
{F(0x00), F(0x55), F(0x71)}, | |
{F(0x00), F(0x38), F(0x71)}, | |
{F(0x00), F(0x1C), F(0x71)}, | |
/* hue mix 56-79 (2) */ | |
{F(0x38), F(0x38), F(0x71)}, | |
{F(0x45), F(0x38), F(0x71)}, | |
{F(0x55), F(0x38), F(0x71)}, | |
{F(0x61), F(0x38), F(0x71)}, | |
{F(0x71), F(0x38), F(0x71)}, | |
{F(0x71), F(0x38), F(0x61)}, | |
{F(0x71), F(0x38), F(0x55)}, | |
{F(0x71), F(0x38), F(0x45)}, | |
{F(0x71), F(0x38), F(0x38)}, | |
{F(0x71), F(0x45), F(0x38)}, | |
{F(0x71), F(0x55), F(0x38)}, | |
{F(0x71), F(0x61), F(0x38)}, | |
{F(0x71), F(0x71), F(0x38)}, | |
{F(0x61), F(0x71), F(0x38)}, | |
{F(0x55), F(0x71), F(0x38)}, | |
{F(0x45), F(0x71), F(0x38)}, | |
{F(0x38), F(0x71), F(0x38)}, | |
{F(0x38), F(0x71), F(0x45)}, | |
{F(0x38), F(0x71), F(0x55)}, | |
{F(0x38), F(0x71), F(0x61)}, | |
{F(0x38), F(0x71), F(0x71)}, | |
{F(0x38), F(0x61), F(0x71)}, | |
{F(0x38), F(0x55), F(0x71)}, | |
{F(0x38), F(0x45), F(0x71)}, | |
/* hue mix 80-103 (3) */ | |
{F(0x51), F(0x51), F(0x71)}, | |
{F(0x59), F(0x51), F(0x71)}, | |
{F(0x61), F(0x51), F(0x71)}, | |
{F(0x69), F(0x51), F(0x71)}, | |
{F(0x71), F(0x51), F(0x71)}, | |
{F(0x71), F(0x51), F(0x69)}, | |
{F(0x71), F(0x51), F(0x61)}, | |
{F(0x71), F(0x51), F(0x59)}, | |
{F(0x71), F(0x51), F(0x51)}, | |
{F(0x71), F(0x59), F(0x51)}, | |
{F(0x71), F(0x61), F(0x51)}, | |
{F(0x71), F(0x69), F(0x51)}, | |
{F(0x71), F(0x71), F(0x51)}, | |
{F(0x69), F(0x71), F(0x51)}, | |
{F(0x61), F(0x71), F(0x51)}, | |
{F(0x59), F(0x71), F(0x51)}, | |
{F(0x51), F(0x71), F(0x51)}, | |
{F(0x51), F(0x71), F(0x59)}, | |
{F(0x51), F(0x71), F(0x61)}, | |
{F(0x51), F(0x71), F(0x69)}, | |
{F(0x51), F(0x71), F(0x71)}, | |
{F(0x51), F(0x69), F(0x71)}, | |
{F(0x51), F(0x61), F(0x71)}, | |
{F(0x51), F(0x59), F(0x71)}, | |
// HERE ------> 3 | |
/* hue mix 104-127 (4) dark 1 */ | |
{F(0x00), F(0x00), F(0x41)}, | |
{F(0x10), F(0x00), F(0x41)}, | |
{F(0x20), F(0x00), F(0x41)}, | |
{F(0x30), F(0x00), F(0x41)}, | |
{F(0x41), F(0x00), F(0x41)}, | |
{F(0x41), F(0x00), F(0x30)}, | |
{F(0x41), F(0x00), F(0x20)}, | |
{F(0x41), F(0x00), F(0x10)}, | |
{F(0x41), F(0x00), F(0x00)}, | |
{F(0x41), F(0x10), F(0x00)}, | |
{F(0x41), F(0x20), F(0x00)}, | |
{F(0x41), F(0x30), F(0x00)}, | |
{F(0x41), F(0x41), F(0x00)}, | |
{F(0x30), F(0x41), F(0x00)}, | |
{F(0x20), F(0x41), F(0x00)}, | |
{F(0x10), F(0x41), F(0x00)}, | |
{F(0x00), F(0x41), F(0x00)}, | |
{F(0x00), F(0x41), F(0x10)}, | |
{F(0x00), F(0x41), F(0x20)}, | |
{F(0x00), F(0x41), F(0x30)}, | |
{F(0x00), F(0x41), F(0x41)}, | |
{F(0x00), F(0x30), F(0x41)}, | |
{F(0x00), F(0x20), F(0x41)}, | |
{F(0x00), F(0x10), F(0x41)}, | |
/* hue mix 56-79 (2) */ | |
{F(0x20), F(0x20), F(0x41)}, | |
{F(0x28), F(0x20), F(0x41)}, | |
{F(0x30), F(0x20), F(0x41)}, | |
{F(0x3C), F(0x20), F(0x41)}, | |
{F(0x41), F(0x20), F(0x41)}, | |
{F(0x41), F(0x20), F(0x3C)}, | |
{F(0x41), F(0x20), F(0x30)}, | |
{F(0x41), F(0x20), F(0x28)}, | |
{F(0x41), F(0x20), F(0x20)}, | |
{F(0x41), F(0x28), F(0x20)}, | |
{F(0x41), F(0x30), F(0x20)}, | |
{F(0x41), F(0x3C), F(0x20)}, | |
{F(0x41), F(0x41), F(0x20)}, | |
{F(0x3C), F(0x41), F(0x20)}, | |
{F(0x30), F(0x41), F(0x20)}, | |
{F(0x28), F(0x41), F(0x20)}, | |
{F(0x20), F(0x41), F(0x20)}, | |
{F(0x20), F(0x41), F(0x28)}, | |
{F(0x20), F(0x41), F(0x30)}, | |
{F(0x20), F(0x41), F(0x3C)}, | |
{F(0x20), F(0x41), F(0x41)}, | |
{F(0x20), F(0x3C), F(0x41)}, | |
{F(0x20), F(0x30), F(0x41)}, | |
{F(0x20), F(0x28), F(0x41)}, | |
/* hue mix 80-103 (3) */ | |
{F(0x2C), F(0x2C), F(0x41)}, | |
{F(0x30), F(0x2C), F(0x41)}, | |
{F(0x34), F(0x2C), F(0x41)}, | |
{F(0x3C), F(0x2C), F(0x41)}, | |
{F(0x41), F(0x2C), F(0x41)}, | |
{F(0x41), F(0x2C), F(0x3C)}, | |
{F(0x41), F(0x2C), F(0x34)}, | |
{F(0x41), F(0x2C), F(0x30)}, | |
{F(0x41), F(0x2C), F(0x2C)}, | |
{F(0x41), F(0x30), F(0x2C)}, | |
{F(0x41), F(0x34), F(0x2C)}, | |
{F(0x41), F(0x3C), F(0x2C)}, | |
{F(0x41), F(0x41), F(0x2C)}, | |
{F(0x3C), F(0x41), F(0x2C)}, | |
{F(0x34), F(0x41), F(0x2C)}, | |
{F(0x30), F(0x41), F(0x2C)}, | |
{F(0x2C), F(0x41), F(0x2C)}, | |
{F(0x2C), F(0x41), F(0x30)}, | |
{F(0x2C), F(0x41), F(0x34)}, | |
{F(0x2C), F(0x41), F(0x3C)}, | |
{F(0x2C), F(0x41), F(0x41)}, | |
{F(0x2C), F(0x3C), F(0x41)}, | |
{F(0x2C), F(0x34), F(0x41)}, | |
{F(0x2C), F(0x30), F(0x41)}, | |
/* all black */ | |
{F(0), F(0), F(0)}, | |
{F(0), F(0), F(0)}, | |
{F(0), F(0), F(0)}, | |
{F(0), F(0), F(0)}, | |
{F(0), F(0), F(0)}, | |
{F(0), F(0), F(0)}, | |
{F(0), F(0), F(0)}, | |
{F(0), F(0), F(0)}, | |
}; | |
uint8_t rgb2vga(int r, int g, int b) { | |
float rf = (float)r, gf = (float)g, bf = (float)b; | |
float closest = +INFINITY; | |
int ndx = 0, done = 0; | |
// This is slow. For some reasons, those pragmas made it extra slow. | |
// #pragma omp parallel for | |
for (int i = 0; i < 248; i++) { | |
// if (done) continue; | |
float *sample = ndx_vgapal[i]; | |
float rs = sample[0]; | |
float gs = sample[1]; | |
float bs = sample[2]; | |
float dst = | |
sqrt(powf(rs - rf, 2.0) + powf(gs - gf, 2.0) + powf(bs - bf, 2.0)); | |
// #pragma omp critical | |
{ | |
if (closest > dst) { | |
closest = dst; | |
ndx = i; | |
} else if (dst < 0.05) { | |
done = 1; | |
ndx = i; | |
break; | |
} | |
} | |
} | |
return (uint8_t)ndx; | |
} | |
int main() { | |
FILE *fp = stdin; | |
while (!feof(fp)) { | |
int r = getc(fp); | |
int g = getc(fp); | |
int b = getc(fp); | |
putchar(rgb2vga(r, g, b)); | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment