fallout2-ce/src/grayscale.cc

43 lines
1.3 KiB
C++

#include "grayscale.h"
#include "color.h"
#include <algorithm>
// 0x596D90
static unsigned char _GreyTable[256];
// 0x44FA78
void grayscalePaletteUpdate(int a1, int a2)
{
if (a1 >= 0 && a2 <= 255) {
for (int index = a1; index <= a2; index++) {
// NOTE: The only way to explain so much calls to [_Color2RGB_] with
// the same repeated pattern is by the use of min/max macros.
int v1 = std::max((_Color2RGB_(index) & 0x7C00) >> 10, std::max((_Color2RGB_(index) & 0x3E0) >> 5, _Color2RGB_(index) & 0x1F));
int v2 = std::min((_Color2RGB_(index) & 0x7C00) >> 10, std::min((_Color2RGB_(index) & 0x3E0) >> 5, _Color2RGB_(index) & 0x1F));
int v3 = v1 + v2;
int v4 = (int)((double)v3 * 240.0 / 510.0);
int paletteIndex = ((v4 & 0xFF) << 10) | ((v4 & 0xFF) << 5) | (v4 & 0xFF);
_GreyTable[index] = _colorTable[paletteIndex];
}
}
}
// 0x44FC40
void grayscalePaletteApply(unsigned char* buffer, int width, int height, int pitch)
{
unsigned char* ptr = buffer;
int skip = pitch - width;
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
unsigned char c = *ptr;
*ptr++ = _GreyTable[c];
}
ptr += skip;
}
}