palette8[0] = set(0, 0, 0) / 255.0; // Black
palette8[1] = set(255, 255, 255) / 255.0; // White
palette8[2] = set(136, 0, 0) / 255.0; // Red
palette8[3] = set(170, 255, 238) / 255.0; // Cyan
palette8[4] = set(204, 68, 204) / 255.0; // Purple
palette8[5] = set(0, 204, 85) / 255.0; // Green
palette8[6] = set(0, 0, 170) / 255.0; // Blue
palette8[7] = set(238, 238, 119) / 255.0; // Yellow
palette8[8] = set(221, 136, 85) / 255.0; // Orange
palette8[9] = set(102, 68, 0) / 255.0; // Brown
palette8[10] = set(255, 119, 119) / 255.0; // Light red
palette8[11] = set(51, 51, 51) / 255.0; // Dark gray
palette8[12] = set(119, 119, 119) / 255.0; // Gray
palette8[13] = set(170, 255, 102) / 255.0; // Light green
palette8[14] = set(0, 136, 255) / 255.0; // Light blue
palette8[15] = set(187, 187, 187) / 255.0; // Light gray
palette4[0] = palette8[0];
palette4[1] = palette8[5];
palette4[2] = palette8[10];
palette4[3] = palette8[15];
palette4[4] = palette8[1];
palette4[5] = palette8[4];
palette4[6] = palette8[9];
palette4[7] = palette8[14];
palette3[0] = palette8[0];
palette3[1] = palette8[5];
palette3[2] = palette8[10];
palette3[3] = palette8[15];
paletteCGA[0] = set(0, 0, 0) / 255.0; // Black
paletteCGA[1] = set(170, 255, 238) / 255.0; // Cyan
paletteCGA[2] = set(204, 68, 204) / 255.0; // Magenta
paletteCGA[3] = set(238, 238, 119) / 255.0; // White
paletteEGA[0] = set(0, 0, 0) / 255.0; // Black
paletteEGA[1] = set(0, 0, 170) / 255.0; // Blue
paletteEGA[2] = set(0, 170, 0) / 255.0; // Green
paletteEGA[3] = set(0, 170, 170) / 255.0; // Cyan
paletteEGA[4] = set(170, 0, 0) / 255.0; // Red
paletteEGA[5] = set(170, 0, 170) / 255.0; // Magenta
paletteEGA[6] = set(170, 85, 0) / 255.0; // Brown
paletteEGA[7] = set(170, 170, 170) / 255.0; // Light gray
paletteEGA[8] = set(85, 85, 85) / 255.0; // Dark gray
paletteEGA[9] = set(85, 85, 255) / 255.0; // Light blue
paletteEGA[10] = set(85, 255, 85) / 255.0; // Light green
paletteEGA[11] = set(85, 255, 255) / 255.0; // Light cyan
paletteEGA[12] = set(255, 85, 85) / 255.0; // Light red
paletteEGA[13] = set(255, 85, 255) / 255.0; // Light magenta
paletteEGA[14] = set(255, 255, 85) / 255.0; // Yellow
paletteEGA[15] = set(255, 255, 255) / 255.0; // White
// World System Teletext Level 1 palette
paletteTeletext[0] = set(0, 0, 0) / 255.0; // Black
paletteTeletext[1] = set(255, 255, 255) / 255.0; // White
paletteTeletext[2] = set(170, 0, 0) / 255.0; // Red
paletteTeletext[3] = set(0, 170, 0) / 255.0; // Green
paletteTeletext[4] = set(0, 0, 170) / 255.0; // Blue
paletteTeletext[5] = set(170, 170, 0) / 255.0; // Yellow
paletteTeletext[6] = set(0, 170, 170) / 255.0; // Cyan
paletteTeletext[7] = set(170, 0, 170) / 255.0; // Magenta
paletteBBCMicro[0] = set(0, 0, 0) / 255.0; // Black
paletteBBCMicro[1] = set(255, 255, 255) / 255.0; // White
paletteBBCMicro[2] = set(136, 0, 0) / 255.0; // Red
paletteBBCMicro[3] = set(170, 255, 238) / 255.0; // Cyan
paletteBBCMicro[4] = set(204, 68, 204) / 255.0; // Purple
paletteBBCMicro[5] = set(0, 204, 85) / 255.0; // Green
paletteBBCMicro[6] = set(0, 0, 170) / 255.0; // Blue
paletteBBCMicro[7] = set(238, 238, 119) / 255.0; // Yellow
paletteSinclairQL[0] = set(0, 0, 0) / 255.0; // Black
paletteSinclairQL[1] = set(255, 255, 255) / 255.0; // White
paletteSinclairQL[2] = set(0, 204, 85) / 255.0; // Green
paletteSinclairQL[3] = set(0, 0, 170) / 255.0; // Blue
paletteSinclairQL[4] = set(204, 68, 204) / 255.0; // Purple
paletteSinclairQL[5] = set(255, 119, 119) / 255.0; // Light red
paletteSinclairQL[6] = set(221, 136, 85) / 255.0; // Orange
paletteSinclairQL[7] = set(238, 238, 119) / 255.0; // Yellow
paletteZXSpectrum[0] = set(0, 0, 0) / 255.0; // Black
paletteZXSpectrum[1] = set(0, 0, 255) / 255.0; // Blue
paletteZXSpectrum[2] = set(255, 0, 0) / 255.0; // Red
paletteZXSpectrum[3] = set(255, 0, 255) / 255.0; // Magenta
paletteZXSpectrum[4] = set(0, 255, 0) / 255.0; // Green
paletteZXSpectrum[5] = set(0, 255, 255) / 255.0; // Cyan
paletteZXSpectrum[6] = set(255, 255, 0) / 255.0; // Yellow
paletteZXSpectrum[7] = set(255, 255, 255) / 255.0; // White
paletteZXSpectrum[8] = set(170, 170, 170) / 255.0; // Bright black
paletteZXSpectrum[9] = set(0, 0, 119) / 255.0; // Bright blue
paletteZXSpectrum[10] = set(119, 0, 0) / 255.0; // Bright red
paletteZXSpectrum[11] = set(119, 0, 119) / 255.0; // Bright magenta
paletteZXSpectrum[12] = set(0, 119, 0) / 255.0; // Bright green
paletteZXSpectrum[13] = set(0, 119, 119) / 255.0; // Bright cyan
paletteZXSpectrum[14] = set(119, 119, 0) / 255.0; // Bright yellow
paletteZXSpectrum[15] = set(119, 119, 119) / 255.0; // Bright white
// (Palette colors might vary slightly due to different interpretations of SECAM)
paletteSECAM[0] = set(0, 0, 0) / 255.0; // Black
paletteSECAM[1] = set(0, 170, 0) / 255.0; // Green
paletteSECAM[2] = set(0, 0, 170) / 255.0; // Blue
paletteSECAM[3] = set(0, 170, 170) / 255.0; // Cyan
paletteSECAM[4] = set(170, 0, 0) / 255.0; // Red
paletteSECAM[5] = set(170, 0, 170) / 255.0; // Magenta
paletteSECAM[6] = set(170, 85, 0) / 255.0; // Brown
paletteSECAM[7] = set(170, 170, 0) / 255.0; // Yellow
paletteSECAM[8] = set(85, 85, 85) / 255.0; // Dark gray
paletteSECAM[9] = set(85, 85, 255) / 255.0; // Light blue
paletteSECAM[10] = set(85, 255, 85) / 255.0; // Light green
paletteSECAM[11] = set(85, 255, 255) / 255.0; // Light cyan
paletteSECAM[12] = set(255, 85, 85) / 255.0; // Light red
paletteSECAM[13] = set(255, 85, 255) / 255.0; // Light magenta
paletteSECAM[14] = set(255, 255, 85) / 255.0; // Light yellow
paletteSECAM[15] = set(255, 255, 255) / 255.0; // White
// (Palette colors might vary slightly due to different interpretations of Atari 2600 palette)
for (int i = 0; i < 128; ++i) {
paletteAtari2600[i] = set(i / 16, (i % 16) / 8, (i % 8) / 2) / 15.0;
// Atari 8-bit line palette
for (int i = 0; i < 256; ++i) {
paletteAtari8Bit[i] = set(i / 64, (i / 8) % 8, i % 8) / 7.0;
paletteAppleII[0] = set(0, 0, 0) / 255.0; // Black
paletteAppleII[1] = set(255, 255, 255) / 255.0; // White
paletteAppleII[2] = set(194, 195, 84) / 255.0; // Light yellow
paletteAppleII[3] = set(229, 96, 93) / 255.0; // Light red
paletteAppleII[4] = set(0, 143, 0) / 255.0; // Light green
paletteAppleII[5] = set(0, 97, 175) / 255.0; // Light blue
paletteGameBoy[0] = set(15, 56, 15) / 255.0; // Dark green
paletteGameBoy[1] = set(48, 98, 48) / 255.0; // Light green
paletteGameBoy[2] = set(139, 172, 15) / 255.0; // Dark yellow
paletteGameBoy[3] = set(155, 188, 15) / 255.0; // Light yellow
// Game Boy Color palette
for (int i = 0; i < 32; ++i) {
paletteGameBoyColor[i] = set(i / 16, (i / 4) % 4, i % 4) / 3.0;
paletteCommodore64[0] = set(0, 0, 0) / 255.0; // Black
paletteCommodore64[1] = set(255, 255, 255) / 255.0; // White
paletteCommodore64[2] = set(136, 0, 0) / 255.0; // Red
paletteCommodore64[3] = set(170, 255, 238) / 255.0; // Cyan
paletteCommodore64[4] = set(204, 68, 204) / 255.0; // Purple
paletteCommodore64[5] = set(0, 204, 85) / 255.0; // Green
paletteCommodore64[6] = set(0, 0, 170) / 255.0; // Blue
paletteCommodore64[7] = set(238, 238, 119) / 255.0; // Yellow
paletteCommodore64[8] = set(221, 136, 85) / 255.0; // Orange
paletteCommodore64[9] = set(102, 68, 0) / 255.0; // Brown
paletteCommodore64[10] = set(255, 119, 119) / 255.0; // Light red
paletteCommodore64[11] = set(51, 51, 51) / 255.0; // Dark gray
paletteCommodore64[12] = set(119, 119, 119) / 255.0; // Gray
paletteCommodore64[13] = set(170, 255, 102) / 255.0; // Light green
paletteCommodore64[14] = set(0, 136, 255) / 255.0; // Light blue
paletteCommodore64[15] = set(187, 187, 187) / 255.0; // Light gray
// Choose palette based on the option
else if (paletteOption == 2)
else if (paletteOption == 3)
else if (paletteOption == 4)
else if (paletteOption == 5)
else if (paletteOption == 6)
palette = paletteTeletext;
else if (paletteOption == 7)
palette = paletteBBCMicro;
else if (paletteOption == 8)
palette = paletteSinclairQL;
else if (paletteOption == 9)
palette = paletteZXSpectrum;
else if (paletteOption == 10)
else if (paletteOption == 11)
palette = paletteAtari2600;
else if (paletteOption == 12)
palette = paletteAtari8Bit;
else if (paletteOption == 13)
palette = paletteAppleII;
else if (paletteOption == 14)
palette = paletteGameBoy;
else if (paletteOption == 15)
palette = paletteGameBoyColor;
else if (paletteOption == 16)
palette = paletteCommodore64;
error("Invalid palette option");
// Find the closest color in the chosen palette
float minDist = length(color - palette[0]);
for (int i = 1; i < len(palette); ++i) {
float dist = length(color - palette[i]);