Files
picovga-RGsB/_picovga/vga_pal.cpp
2021-06-10 19:07:49 +02:00

127 lines
4.0 KiB
C++

// ****************************************************************************
//
// VGA colors and palettes
//
// ****************************************************************************
#include "include.h"
// default 16-color palettes (EGA colors)
// - do not set "const", to stay in faster RAM
u8 DefPal16[16] = {
CGACOL_0, // 0 // 0x000000 black
CGACOL_1, // 2 // 0x0000AA dark blue
CGACOL_2, // 20 // 0x00B600 dark green
CGACOL_3, // 22 // 0x00B6AA dark cyan
CGACOL_4, // 160 // 0xB60000 dark red
CGACOL_5, // 162 // 0xB600AA dark magenta
CGACOL_6, // 168 // 0xB64900 brown
CGACOL_7, // 182 // 0xB6B6AA light gray
CGACOL_8, // 73 // 0x494955 dark gray
CGACOL_9, // 75 // 0x4949FF light blue
CGACOL_10, // 93 // 0x49FF55 light green
CGACOL_11, // 95 // 0x49FFFF light cyan
CGACOL_12, // 233 // 0xFF4955 light red
CGACOL_13, // 235 // 0xFF49FF light magenta
CGACOL_14, // 253 // 0xFFFF55 yellow
CGACOL_15, // 255 // 0xFFFFFF white
};
// ZX Spectrum color palettes
// - do not set "const", to stay in faster RAM
u8 ZXPal16[16] = {
ZXCOL_0, // 0 // 0x000000 black
ZXCOL_1, // 2 // 0x0000AA dark blue
ZXCOL_2, // 160 // 0xB60000 dark red
ZXCOL_3, // 162 // 0xB600AA dark magenta
ZXCOL_4, // 20 // 0x00B600 dark green
ZXCOL_5, // 22 // 0x00B6AA dark cyan
ZXCOL_6, // 180 // 0xB6B600 dark yellow
ZXCOL_7, // 182 // 0xB6B6AA light gray
ZXCOL_8, // 73 // 0x494955 dark gray
ZXCOL_9, // 3 // 0x0000FF light blue
ZXCOL_10, // 224 // 0xFF0000 light red
ZXCOL_11, // 227 // 0xFF00FF light magenta
ZXCOL_12, // 28 // 0x00FF00 light green
ZXCOL_13, // 31 // 0x00FFFF light cyan
ZXCOL_14, // 252 // 0xFFFF00 yellow
ZXCOL_15, // 255 // 0xFFFFFF white
};
// 4-color palettes (CGA colors)
u8 PalCGA1[4] = { CGACOL_0, CGACOL_2, CGACOL_4, CGACOL_6 }; // palette 0, low intensity (black, dark green, brown)
u8 PalCGA2[4] = { CGACOL_0, CGACOL_10, CGACOL_12, CGACOL_14 }; // palette 0, high intensity (black, light green, light red, yellow)
u8 PalCGA3[4] = { CGACOL_0, CGACOL_3, CGACOL_5, CGACOL_7 }; // palette 1, low intensity (black, dark cyan, dark magenta, light gray)
u8 PalCGA4[4] = { CGACOL_0, CGACOL_11, CGACOL_13, CGACOL_15 }; // palette 1, high intensity (black, light cyan, light magenta, white)
u8 PalCGA5[4] = { CGACOL_0, CGACOL_3, CGACOL_4, CGACOL_7 }; // palette 1, low intensity (black, dark cyan, dark red, light gray)
u8 PalCGA6[4] = { CGACOL_0, CGACOL_11, CGACOL_12, CGACOL_15 }; // palette 1, high intensity (black, light cyan, light red, white)
// 4-color palette translation table
//u32 Pal4Trans[256];
//u32 Pal4Plane[256];
// 16-color palette translation table
//u16 Pal16Trans[256];
//u16 ZX16Trans[256];
// values of color components
u8 RGVal[8] = { 0, 41, 84, 117, 166, 195, 230, 255 }; // values of Red and Green components
u8 BVal[4] = { 0, 84, 195, 255 }; // values of Blue components
// distance of 2 colors in 332 format (R3G3B2)
// - returns value 0..195075
int ColDist(u8 col1, u8 col2)
{
int d = RGVal[col1 >> 5] - RGVal[col2 >> 5];
int dist = d*d;
d = RGVal[(col1 >> 2) & 7] - RGVal[(col2 >> 2) & 7];
dist += d*d;
d = BVal[col1 & 3] - BVal[col2 & 3];
dist += d*d;
return dist;
}
// rainbow gradient table
// GP0 ... B0 ... VGA B0 blue
// GP1 ... B1 ... VGA B1
// GP2 ... B2 ... VGA G0 green
// GP3 ... B3 ... VGA G1
// GP4 ... B4 ... VGA G2
// GP5 ... B5 ... VGA R0 red
// GP6 ... B6 ... VGA R1
// GP7 ... B7 ... VGA R2
u8 RainbowGrad[] = {
B7, // dark red
B5+B6+B7, // red
B4+B6+B7, // orange
B2+B3+B4+B5+B6+B7, // yellow
B2+B3+B4+B7, // yellow-green
B2+B3+B4, // green
B0+B3+B4, // green-cyan
B0+B1+B2+B3+B4, // cyan
B0+B1+B4, // cyan-blue
B0+B1, // blue
B0+B1+B6, // blue-magenta
B0+B1+B5+B6+B7, // magenta
B1+B7, // dark magenta
};
#define RANBOW_NUM count_of(RainbowGrad)
// generate gradient
void GenGrad(u8* dst, int w)
{
// sample - rainbow pattern
int i;
for (i = 0; i < w; i++)
{
*dst++ = RainbowGrad[i*RANBOW_NUM/w];
}
}