diff options
author | Paul Gilbert | 2014-10-13 20:28:34 -0400 |
---|---|---|
committer | Paul Gilbert | 2014-10-13 20:28:34 -0400 |
commit | b58f6f397da29454e359384f6908b403f48d990e (patch) | |
tree | 7388d103edecb42ec3617601799458611caec49d /engines/mads/palette.cpp | |
parent | 2e87ace09d9898d092ad9f99a12dc075d16deacb (diff) | |
download | scummvm-rg350-b58f6f397da29454e359384f6908b403f48d990e.tar.gz scummvm-rg350-b58f6f397da29454e359384f6908b403f48d990e.tar.bz2 scummvm-rg350-b58f6f397da29454e359384f6908b403f48d990e.zip |
MADS: New conversation message logic for cutscene animations
Diffstat (limited to 'engines/mads/palette.cpp')
-rw-r--r-- | engines/mads/palette.cpp | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/engines/mads/palette.cpp b/engines/mads/palette.cpp index c098e23bf9..1787b3c298 100644 --- a/engines/mads/palette.cpp +++ b/engines/mads/palette.cpp @@ -317,6 +317,62 @@ int PaletteUsage::rgbFactor(byte *palEntry, RGB6 &pal6) { return total; } +int PaletteUsage::checkRGB(const byte *rgb, int palStart, bool flag, int *palIndex) { + Palette &palette = *_vm->_palette; + bool match = false; + int result; + if (palStart >= 0) { + result = palStart; + } else { + result = -1; + for (int i = 0; i < palette._highRange; ++i) { + if (!palette._rgbList[i]) { + result = i; + break; + } + } + } + + if (result >= 0) { + int mask = 1 << result; + byte *palP = &palette._mainPalette[0]; + uint32 *flagsP = &palette._palFlags[0]; + + for (; flagsP < &palette._palFlags[PALETTE_COUNT]; ++flagsP, ++result) { + if ((!(*flagsP & 1) || flag) && !(*flagsP & 2)) { + if (!memcmp(palP, rgb, 3)) { + *flagsP |= mask; + + if (palIndex) + *palIndex = result; + match = true; + break; + } + } + } + + if (!match) { + palP = &palette._mainPalette[0]; + flagsP = &palette._palFlags[0]; + + for (int i = 0; i < PALETTE_COUNT; ++i, palP += 3, ++flagsP) { + if (!*flagsP) { + Common::copy(rgb, rgb + 3, palP); + *flagsP |= mask; + + if (palIndex) + *palIndex = i; + match = true; + break; + } + } + } + } + + assert(match); + return result; +} + /*------------------------------------------------------------------------*/ void RGBList::clear() { |