110 lines
2.5 KiB
C
110 lines
2.5 KiB
C
#include "dglpal.h"
|
|
#include "dglgfx.h"
|
|
#include <stdlib.h>
|
|
#include <dos.h>
|
|
|
|
void pal_set_color(byte color, byte r, byte g, byte b) {
|
|
outp(0x3c6, 0xff);
|
|
outp(0x3c8, color);
|
|
outp(0x3c9, r);
|
|
outp(0x3c9, g);
|
|
outp(0x3c9, b);
|
|
}
|
|
|
|
void pal_get_color(byte color, byte *r, byte *g, byte *b) {
|
|
outp(0x3c6, 0xff);
|
|
outp(0x3c7, color);
|
|
*r = inp(0x3c9);
|
|
*g = inp(0x3c9);
|
|
*b = inp(0x3c9);
|
|
}
|
|
|
|
void pal_set(const byte *palette) {
|
|
int i = 0;
|
|
for (i = 0; i < 256; ++i) {
|
|
pal_set_color(i, palette[0], palette[1], palette[2]);
|
|
palette += 3;
|
|
}
|
|
}
|
|
|
|
void pal_get(byte *palette) {
|
|
int i = 0;
|
|
for (i = 0; i < 256; ++i) {
|
|
pal_get_color(i, palette, palette + 1, palette + 2);
|
|
palette += 3;
|
|
}
|
|
}
|
|
|
|
static boolean fade_color(int color, byte r, byte g, byte b, int step) {
|
|
byte red, green, blue;
|
|
byte diff_r, diff_g, diff_b;
|
|
boolean color_diff = FALSE;
|
|
|
|
pal_get_color(color, &red, &green, &blue);
|
|
|
|
if (red != r) {
|
|
color_diff = TRUE;
|
|
diff_r = abs(red - r);
|
|
if (red > r)
|
|
red -= min(step, diff_r);
|
|
else
|
|
red += min(step, diff_r);
|
|
}
|
|
|
|
if (green != g) {
|
|
color_diff = TRUE;
|
|
diff_g = abs(green - g);
|
|
if (green > g)
|
|
green -= min(step, diff_g);
|
|
else
|
|
green += min(step, diff_g);
|
|
}
|
|
|
|
if (blue != b) {
|
|
color_diff = TRUE;
|
|
diff_b = abs(blue - b);
|
|
if (blue > b)
|
|
blue -= min(step, diff_b);
|
|
else
|
|
blue += min(step, diff_b);
|
|
}
|
|
|
|
if (color_diff)
|
|
pal_set_color(color, red, green, blue);
|
|
|
|
return (red == r && green == g && blue == b);
|
|
}
|
|
|
|
void pal_fade_range_to_color(int start, int end, byte r, byte g, byte b, int step) {
|
|
int i;
|
|
boolean done = FALSE;
|
|
|
|
step = abs(step);
|
|
|
|
while (!done) {
|
|
done = TRUE;
|
|
video_wait_vsync();
|
|
for (i = start; i <= end; ++i) {
|
|
if (!fade_color(i, r, g, b, step))
|
|
done = FALSE;
|
|
}
|
|
}
|
|
}
|
|
|
|
void pal_fade_range_to_palette(int start, int end, const byte *palette, int step) {
|
|
int color, i;
|
|
boolean done = FALSE;
|
|
|
|
step = abs(step);
|
|
|
|
while (!done) {
|
|
done = TRUE;
|
|
video_wait_vsync();
|
|
for (i = (start * 3), color = start; color <= end; ++color, i += 3) {
|
|
if (!fade_color(color, palette[i], palette[i + 1], palette[i + 2], step))
|
|
done = FALSE;
|
|
}
|
|
}
|
|
}
|
|
|