diff options
-rw-r--r-- | engines/sword1/animation.cpp | 161 |
1 files changed, 82 insertions, 79 deletions
diff --git a/engines/sword1/animation.cpp b/engines/sword1/animation.cpp index be9e02f64f..a8c313f2f8 100644 --- a/engines/sword1/animation.cpp +++ b/engines/sword1/animation.cpp @@ -267,85 +267,88 @@ bool MoviePlayer::playVideo() { if (_decoder->hasDirtyPalette()) { _decoder->setSystemPalette(); - uint32 minWeight = 0xFFFFFFFF; - uint32 weight; - float c1Weight = 1e+30; - float c2Weight = 1e+30; - float c3Weight = 1e+30; - float c4Weight = 1e+30; - byte r, g, b; - float h, s, v, hd, hsvWeight; - - const byte *palette = _decoder->getPalette(); - - // Color comparaison for the subtitles colors is done in HSL - // C1 color is used for George and is almost white (R = 248, G = 252, B = 248) - const float h1 = 0.333333f, s1 = 0.02f, v1 = 0.99f; - - // C2 color is used for George as a narrator and is grey (R = 184, G = 188, B = 184) - const float h2 = 0.333333f, s2 = 0.02f, v2 = 0.74f; - - // C3 color is used for Nicole and is rose (R = 200, G = 120, B = 184) - const float h3 = 0.866667f, s3 = 0.4f, v3 = 0.78f; - - // C4 color is used for Maguire and is blue (R = 80, G = 152, B = 184) - const float h4 = 0.55f, s4 = 0.57f, v4 = 0.72f; - - for (int i = 0; i < 256; i++) { - r = *palette++; - g = *palette++; - b = *palette++; - - weight = 3 * r * r + 6 * g * g + 2 * b * b; - - if (weight <= minWeight) { - minWeight = weight; - _black = i; - } - - convertColor(r, g, b, h, s, v); - - // C1 color - // It is almost achromatic (very low saturation) so the hue as litle impact on the color. - // Therefore use a low weight on hue and high weight on saturation. - hd = h - h1; - hd += hd < -0.5f ? 1.0f : hd > 0.5f ? -1.0f : 0.0f; - hsvWeight = 1.0f * hd * hd + 4.0f * (s - s1) * (s - s1) + 3.0f * (v - v1) * (v - v1); - if (hsvWeight <= c1Weight) { - c1Weight = hsvWeight; - _c1Color = i; - } - - // C2 color - // Also an almost achromatic color so use the same weights as for C1 color. - hd = h - h2; - hd += hd < -0.5f ? 1.0f : hd > 0.5f ? -1.0f : 0.0f; - hsvWeight = 1.0f * hd * hd + 4.0f * (s - s2) * (s - s2) + 3.0f * (v - v2) * (v - v2); - if (hsvWeight <= c2Weight) { - c2Weight = hsvWeight; - _c2Color = i; - } - - // C3 color - // A light rose. Use a high weight on the hue to get a rose. - // The color is a bit gray and the saturation has not much impact so use a low weight. - hd = h - h3; - hd += hd < -0.5f ? 1.0f : hd > 0.5f ? -1.0f : 0.0f; - hsvWeight = 4.0f * hd * hd + 1.0f * (s - s3) * (s - s3) + 2.0f * (v - v3) * (v - v3); - if (hsvWeight <= c3Weight) { - c3Weight = hsvWeight; - _c3Color = i; - } - - // C4 color - // Blue. Use a hight weight on the hue to get a blue. - // The color is darker and more saturated than C3 and the saturation has more impact. - hd = h - h4; - hd += hd < -0.5f ? 1.0f : hd > 0.5f ? -1.0f : 0.0f; - hsvWeight = 5.0f * hd * hd + 3.0f * (s - s4) * (s - s4) + 2.0f * (v - v4) * (v - v4); - if (hsvWeight <= c4Weight) { - c4Weight = hsvWeight; - _c4Color = i; + if (!_movieTexts.empty()) { + // Look for the best color indexes to use to display the subtitles + uint32 minWeight = 0xFFFFFFFF; + uint32 weight; + float c1Weight = 1e+30; + float c2Weight = 1e+30; + float c3Weight = 1e+30; + float c4Weight = 1e+30; + byte r, g, b; + float h, s, v, hd, hsvWeight; + + const byte *palette = _decoder->getPalette(); + + // Color comparaison for the subtitles colors is done in HSL + // C1 color is used for George and is almost white (R = 248, G = 252, B = 248) + const float h1 = 0.333333f, s1 = 0.02f, v1 = 0.99f; + + // C2 color is used for George as a narrator and is grey (R = 184, G = 188, B = 184) + const float h2 = 0.333333f, s2 = 0.02f, v2 = 0.74f; + + // C3 color is used for Nicole and is rose (R = 200, G = 120, B = 184) + const float h3 = 0.866667f, s3 = 0.4f, v3 = 0.78f; + + // C4 color is used for Maguire and is blue (R = 80, G = 152, B = 184) + const float h4 = 0.55f, s4 = 0.57f, v4 = 0.72f; + + for (int i = 0; i < 256; i++) { + r = *palette++; + g = *palette++; + b = *palette++; + + weight = 3 * r * r + 6 * g * g + 2 * b * b; + + if (weight <= minWeight) { + minWeight = weight; + _black = i; + } + + convertColor(r, g, b, h, s, v); + + // C1 color + // It is almost achromatic (very low saturation) so the hue as litle impact on the color. + // Therefore use a low weight on hue and high weight on saturation. + hd = h - h1; + hd += hd < -0.5f ? 1.0f : hd > 0.5f ? -1.0f : 0.0f; + hsvWeight = 1.0f * hd * hd + 4.0f * (s - s1) * (s - s1) + 3.0f * (v - v1) * (v - v1); + if (hsvWeight <= c1Weight) { + c1Weight = hsvWeight; + _c1Color = i; + } + + // C2 color + // Also an almost achromatic color so use the same weights as for C1 color. + hd = h - h2; + hd += hd < -0.5f ? 1.0f : hd > 0.5f ? -1.0f : 0.0f; + hsvWeight = 1.0f * hd * hd + 4.0f * (s - s2) * (s - s2) + 3.0f * (v - v2) * (v - v2); + if (hsvWeight <= c2Weight) { + c2Weight = hsvWeight; + _c2Color = i; + } + + // C3 color + // A light rose. Use a high weight on the hue to get a rose. + // The color is a bit gray and the saturation has not much impact so use a low weight. + hd = h - h3; + hd += hd < -0.5f ? 1.0f : hd > 0.5f ? -1.0f : 0.0f; + hsvWeight = 4.0f * hd * hd + 1.0f * (s - s3) * (s - s3) + 2.0f * (v - v3) * (v - v3); + if (hsvWeight <= c3Weight) { + c3Weight = hsvWeight; + _c3Color = i; + } + + // C4 color + // Blue. Use a hight weight on the hue to get a blue. + // The color is darker and more saturated than C3 and the saturation has more impact. + hd = h - h4; + hd += hd < -0.5f ? 1.0f : hd > 0.5f ? -1.0f : 0.0f; + hsvWeight = 5.0f * hd * hd + 3.0f * (s - s4) * (s - s4) + 2.0f * (v - v4) * (v - v4); + if (hsvWeight <= c4Weight) { + c4Weight = hsvWeight; + _c4Color = i; + } } } } |