23 void Print(
const char* fmt, ...);
44 bool Color::standard_format =
false;
45 int Color::texture_alpha_level = 0;
48 PALETTEENTRY Color::palette[256];
49 BYTE Color::table[32768];
50 double Color::fade = 1.0;
51 Color Color::fade_color;
52 Video* Color::video = 0;
53 DWORD ColorIndex::texture_palettes[4][256];
54 DWORD ColorIndex::unfaded_palette[256];
55 DWORD ColorIndex::formatted_palette[256];
56 DWORD ColorIndex::shade_table[256*256];
57 BYTE ColorIndex::blend_table[256*256];
58 DWORD* ColorIndex::texture_palette = ColorIndex::texture_palettes[0];
64 PALETTEENTRY* p = &palette[index];
66 Set(p->peRed, p->peGreen, p->peBlue);
74 int r =
Red() + c.
Red();
if (r > 255) r = 255;
75 int g =
Green() + c.
Green();
if (g > 255) g = 255;
76 int b =
Blue() + c.
Blue();
if (b > 255) b = 255;
78 Set((BYTE) r, (BYTE) g, (BYTE) b);
89 return Color((BYTE) r,(BYTE) g,(BYTE) b);
97 float src_alpha = c.
fAlpha();
98 float dst_alpha = 1.0f - src_alpha;
100 BYTE r = (BYTE)((
fRed() *dst_alpha + c.
fRed() *src_alpha)*255.0f);
101 BYTE g = (BYTE)((
fGreen()*dst_alpha + c.
fGreen()*src_alpha)*255.0f);
102 BYTE b = (BYTE)((
fBlue() *dst_alpha + c.
fBlue() *src_alpha)*255.0f);
104 return Color(r, g, b);
112 BYTE r = (BYTE) ((
fRed() * c.
fRed()) *255.0f);
114 BYTE b = (BYTE) ((
fBlue() * c.
fBlue()) *255.0f);
116 return Color(r, g, b);
124 int r =
fast_f2i(
Red() * scale);
if (r > 255) r = 255;
129 return Color((BYTE) r, (BYTE) g, (BYTE) b, (BYTE) a);
139 return Color((BYTE) r, (BYTE) g, (BYTE) b, (BYTE)
Alpha());
153 double step = (1.0 - fade);
155 DWORD r = ((int) ((
fRed() - (
fRed() - fade_color.
fRed()) * step)*255.0)) >> format.
rdown;
164 else if (standard_format) {
185 double step = (1.0 - fade);
187 DWORD r = ((int) ((
fRed() - (
fRed() - fade_color.
fRed()) * step)*255.0));
189 DWORD b = ((int) ((
fBlue() - (
fBlue() - fade_color.
fBlue()) * step)*255.0));
192 return Color((BYTE) r, (BYTE) g, (BYTE) b, (BYTE) a);
206 if (standard_format) {
228 if (texture_format[texture_alpha_level].pal) {
231 else if (rgba == 0) {
235 ColorFormat& tf = texture_format[texture_alpha_level];
246 else if (texture_alpha_level == 1) {
251 else if (texture_alpha_level == 2) {
254 a = ((r+g+b+255)>>2)>>tf.
adown;
270 double fr =
fRed(), sr = fr;
271 double fg =
fGreen(), sg = fg;
272 double fb =
fBlue(), sb = fb;
277 sr = fr * (shade/range);
278 sg = fg * (shade/range);
279 sb = fb * (shade/range);
282 double step = (shade - range)/range;
284 sr = fr - (fr - 1.0) * step;
285 sg = fg - (fg - 1.0) * step;
286 sb = fb - (fb - 1.0) * step;
289 return Color((BYTE) (sr*255.0), (BYTE) (sg*255.0), (BYTE) (sb*255.0), (BYTE)
Alpha());
306 return Color((BYTE) formatted_color);
308 else if (standard_format) {
310 c.
Set(formatted_color);
314 BYTE r = (BYTE) ((formatted_color & format.
rmask)>>format.
rshift) << format.
rdown;
315 BYTE g = (BYTE) ((formatted_color & format.
gmask)>>format.
gshift) << format.
gdown;
316 BYTE b = (BYTE) ((formatted_color & format.
bmask)>>format.
bshift) << format.
bdown;
317 BYTE a = (BYTE) ((formatted_color & format.
amask)>>format.
ashift) << format.
adown;
319 return Color(r,g,b,a);
328 BYTE r = (BYTE) ((c1.
fRed() + (c2.
fRed() - c1.
fRed() )*scale) * 255);
330 BYTE b = (BYTE) ((c1.
fBlue() + (c2.
fBlue() - c1.
fBlue() )*scale) * 255);
333 return Color(r,g,b,a);
342 return ColorIndex::blend_table[(BYTE) c1 * 256 + (BYTE) c2];
355 return (DWORD) (r|g|b);
375 standard_format =
true;
377 standard_format =
false;
380 for (
int i = 0; i < 256; i++) {
381 ColorIndex::formatted_palette[i] = i;
382 ColorIndex::unfaded_palette[i] = i;
386 double old_fade = fade;
388 for (
int i = 0; i < 256; i++) {
389 ColorIndex::formatted_palette[i] =
Color(i).Formatted();
392 ColorIndex::unfaded_palette[i] =
Color(i).Formatted();
403 texture_format[alpha_level] = cf;
406 for (
int i = 0; i < 256; i++) {
407 ColorIndex::texture_palettes[alpha_level][i] = i;
411 double old_fade = fade;
413 for (
int i = 0; i < 256; i++) {
414 int old_texture_alpha_level = texture_alpha_level;
415 texture_alpha_level = alpha_level;
416 ColorIndex::texture_palettes[alpha_level][i] =
Color(i).TextureFormat();
417 texture_alpha_level = old_texture_alpha_level;
427 texture_alpha_level = alpha_level;
428 ColorIndex::texture_palette = ColorIndex::texture_palettes[alpha_level];
433 static BYTE MatchRGB(PALETTEENTRY* pal, BYTE r, BYTE g, BYTE b)
435 double mindist = 100000000.0;
438 for (
int i = 0; i < 256; i++) {
439 PALETTEENTRY* p = pal++;
441 double dr = p->peRed - r;
442 double dg = p->peGreen - g;
443 double db = p->peBlue - b;
445 double d = (dr*dr) + (dg*dg) + (db*db);
464 for (
int i = 0; i < palsize; i++)
468 for (
int i = 0; i < 32768; i++)
469 table[i] = invpal[i];
472 for (
int i = 0; i < 32768; i++) {
473 BYTE r = (i >> 10) & 0x1f;
474 BYTE g = (i >> 5) & 0x1f;
475 BYTE b = (i ) & 0x1f;
477 Color c(r<<3, g<<3, b<<3);
479 table[i] = MatchRGB(palette, r<<3, g<<3, b<<3);
486 for (
int i = 0; i < 4; i++)
490 double old_fade = fade;
506 sprintf_s(filename,
"%s.ipl", basename);
508 fopen_s(&f, filename,
"wb");
510 fwrite(table,
sizeof(table), 1, f);
520 static int shade_built = 0;
522 if (fade == f && fade_color == c && (build_shade ? shade_built : 1))
533 if (format.
pal && video) {
534 PALETTEENTRY fade_palette[256];
536 double step = (1.0 - fade);
537 for (
int i = 0; i < 256; i++) {
538 PALETTEENTRY& entry = fade_palette[i];
541 entry.peRed = ((int) ((c.
fRed() - (c.
fRed() - fade_color.
fRed()) * step)*255.0));
542 entry.peGreen = ((int) ((c.
fGreen() - (c.
fGreen() - fade_color.
fGreen())* step)*255.0));
543 entry.peBlue = ((int) ((c.
fBlue() - (c.
fBlue() - fade_color.
fBlue()) * step)*255.0));
567 for (
int index = 0; index < 256; index++)
568 ColorIndex::shade_table[shade*256+index] =
Color(index).Shaded(shade);
576 for (
int src = 0; src < 256; src++) {
577 for (
int dst = 0; dst < 256; dst++) {
581 int r = src_clr.
Red() + dst_clr.
Red();
583 int b = src_clr.
Blue() + dst_clr.
Blue();
589 ColorIndex::blend_table[src*256+dst] =
Color((BYTE)r,(BYTE)g,(BYTE)b).Index();
603 sprintf_s(filename,
"%s_clut.pcx", basename);
609 for (
int j = 0; j < 256; j++)
610 *pc++ = (BYTE) ColorIndex::shade_table[i*256+j];
613 for (
int j = 0; j < 256; j++)
616 PcxImage pcx(256, 256, clut, (BYTE*) palette);
639 float src_alpha = c.a;
640 float dst_alpha = 1.0f - a;
642 float fr = (r * dst_alpha) + (c.r * src_alpha);
643 float fg = (g * dst_alpha) + (c.g * src_alpha);
644 float fb = (b * dst_alpha) + (c.b * src_alpha);
674 inline BYTE
bclamp(
float x) {
return (BYTE) ((x<0) ? 0 : (x>255) ? 255 : x); }