rewrote desaturatePalette using integer arithmetics only

svn-id: r8732
This commit is contained in:
Max Horn 2003-07-03 23:59:35 +00:00
parent 0e2767e354
commit ea3b77e3a6

View file

@ -3021,30 +3021,25 @@ void Scumm::darkenPalette(int redScale, int greenScale, int blueScale, int start
} }
} }
static double value(double n1, double n2, double hue) { static int value(int n1, int n2, int hue) {
if (hue > 360.0) if (hue > 360)
hue = hue - 360.0; hue = hue - 360;
else if (hue < 0.0) else if (hue < 0)
hue = hue + 360.0; hue = hue + 360;
if (hue < 60.0) if (hue < 60)
return n1 + (n2 - n1) * hue / 60.0; return n1 + (n2 - n1) * hue / 60;
if (hue < 180.0) if (hue < 180)
return n2; return n2;
if (hue < 240.0) if (hue < 240)
return n1 + (n2 - n1) * (240.0 - hue) / 60.0; return n1 + (n2 - n1) * (240 - hue) / 60;
return n1; return n1;
} }
/** /**
* This function scales the HSL (Hue, Saturation and Lightness) * This function scales the HSL (Hue, Saturation and Lightness)
* components of the palette colours. It's used in CMI when Guybrush * components of the palette colors. It's used in CMI when Guybrush
* walks from the beach towards the swamp. * walks from the beach towards the swamp.
*
* I don't know if this function is correct, but the output seems to
* match the original fairly closely.
*
* @todo Rewrite desaturatePalette using integer arithmetics only?
*/ */
void Scumm::desaturatePalette(int hueScale, int satScale, int lightScale, int startColor, int endColor) { void Scumm::desaturatePalette(int hueScale, int satScale, int lightScale, int startColor, int endColor) {
@ -3057,83 +3052,69 @@ void Scumm::desaturatePalette(int hueScale, int satScale, int lightScale, int st
cur = _currentPalette + startColor * 3; cur = _currentPalette + startColor * 3;
for (j = startColor; j <= endColor; j++) { for (j = startColor; j <= endColor; j++) {
double R, G, B; int R = *cptr++;
double H, S, L; int G = *cptr++;
double min, max; int B = *cptr++;
int red, green, blue;
R = ((double) *cptr++) / 255.0;
G = ((double) *cptr++) / 255.0;
B = ((double) *cptr++) / 255.0;
// RGB to HLS (Foley and VanDam) // RGB to HLS (Foley and VanDam)
min = MIN(R, MIN(G, B)); const int min = MIN(R, MIN(G, B));
max = MAX(R, MAX(G, B)); const int max = MAX(R, MAX(G, B));
const int diff = (max - min);
const int sum = (max + min);
L = (max + min) / 2.0; if (diff != 0) {
int H, S, L;
if (max != min) { if (sum <= 255)
if (L <= 0.5) S = 255 * diff / sum;
S = (max - min) / (max + min);
else else
S = (max - min) / (2.0 - max - min); S = 255 * diff / (255 * 2 - sum);
if (R == max) if (R == max)
H = (G - B) / (max - min); H = 60 * (G - B) / diff;
else if (G == max) else if (G == max)
H = 2.0 + (B - R) / (max - min); H = 120 + 60 * (B - R) / diff;
else else
H = 4.0 + (R - G) / (max - min); H = 240 + 60 * (R - G) / diff;
H = H * 60.0; if (H < 0)
if (H < 0.0) H = H + 360;
H = H + 360.0;
} else {
S = 0.0;
H = 0.0; // undefined
}
// Scale the result // Scale the result
H = (H * hueScale) / 255.0; H = (H * hueScale) / 255;
S = (S * satScale) / 255.0; S = (S * satScale) / 255;
L = (L * lightScale) / 255.0; L = (sum * lightScale) / 255;
// HLS to RGB (Foley and VanDam) // HLS to RGB (Foley and VanDam)
double m1, m2; int m1, m2;
if (L <= 255)
if (min != max) { m2 = L * (255 + S) / (255 * 2);
if (L <= 0.5)
m2 = L * (1 + S);
else else
m2 = L + S - L * S; m2 = L * (255 - S) / (255 * 2) + S;
m1 = 2.0 * L - m2; m1 = L - m2;
R = value(m1, m2, H + 120); R = value(m1, m2, H + 120);
G = value(m1, m2, H); G = value(m1, m2, H);
B = value(m1, m2, H - 120); B = value(m1, m2, H - 120);
} else { } else {
R = L; // Maximal color = minimal color -> R=G=B -> it's a grayscale.
G = L; R = G = B = (R * lightScale) / 255;
B = L;
} }
red = (int) (255.0 * R + 0.5); *cur++ = R;
green = (int) (255.0 * G + 0.5); *cur++ = G;
blue = (int) (255.0 * B + 0.5); *cur++ = B;
*cur++ = red;
*cur++ = green;
*cur++ = blue;
} }
setDirtyColors(startColor, endColor); setDirtyColors(startColor, endColor);
} }
} }
int Scumm::remapPaletteColor(int r, int g, int b, uint threshold) { int Scumm::remapPaletteColor(int r, int g, int b, uint threshold) {
int i; int i;
int ar, ag, ab; int ar, ag, ab;