diff options
Diffstat (limited to 'engines/mads/sprites.cpp')
-rw-r--r-- | engines/mads/sprites.cpp | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/engines/mads/sprites.cpp b/engines/mads/sprites.cpp index 4f5d50db4f..acbb22077f 100644 --- a/engines/mads/sprites.cpp +++ b/engines/mads/sprites.cpp @@ -36,8 +36,6 @@ enum { kMarker = 2 }; -#define TRANSPARENT_COLOR_INDEX 0xFF - class DepthEntry { public: int depth; @@ -61,7 +59,7 @@ MSprite::MSprite() MSprite::MSprite(Common::SeekableReadStream *source, const Common::Array<RGB6> &palette, const Common::Rect &bounds) : MSurface(bounds.width(), bounds.height()), - _offset(Common::Point(bounds.left, bounds.top)) { + _offset(Common::Point(bounds.left, bounds.top)), _transparencyIndex(0xFF) { // Load the sprite data loadSprite(source, palette); } @@ -123,16 +121,34 @@ void MSprite::loadSprite(Common::SeekableReadStream *source, } } + // Do a first post-sprite generation loop to find a pixel that the sprite + // will not use to designate as the transparency + bool colorUsed[PALETTE_COUNT]; + Common::fill(&colorUsed[0], &colorUsed[PALETTE_COUNT], false); + for (outp = getData(); spriteSize > 0; --spriteSize, ++outp) { + if (*outp != transIndex) + colorUsed[palette[*outp]._palIndex] = true; + } + + _transparencyIndex = PALETTE_COUNT - 1; + while (_transparencyIndex >= 0 && colorUsed[_transparencyIndex]) + --_transparencyIndex; + assert(_transparencyIndex >= 0); + // Do a final iteration over the sprite to convert it's pixels to // the final positions in the main palette + spriteSize = this->w * this->h; for (outp = getData(); spriteSize > 0; --spriteSize, ++outp) { - if (*outp != transIndex) + if (*outp != transIndex) { *outp = palette[*outp]._palIndex; + } else { + *outp = _transparencyIndex; + } } } byte MSprite::getTransparencyIndex() const { - return TRANSPARENT_COLOR_INDEX; + return _transparencyIndex; } /*------------------------------------------------------------------------*/ |