diff options
Diffstat (limited to 'engines/scumm')
-rw-r--r-- | engines/scumm/akos.cpp | 26 | ||||
-rw-r--r-- | engines/scumm/akos.h | 2 | ||||
-rw-r--r-- | engines/scumm/bomp.cpp | 16 | ||||
-rw-r--r-- | engines/scumm/bomp.h | 25 | ||||
-rw-r--r-- | engines/scumm/gfx.h | 15 | ||||
-rw-r--r-- | engines/scumm/object.cpp | 30 | ||||
-rw-r--r-- | engines/scumm/scumm.cpp | 1 | ||||
-rw-r--r-- | engines/scumm/scumm.h | 5 |
8 files changed, 70 insertions, 50 deletions
diff --git a/engines/scumm/akos.cpp b/engines/scumm/akos.cpp index f32c4467c3..994ef45b08 100644 --- a/engines/scumm/akos.cpp +++ b/engines/scumm/akos.cpp @@ -317,7 +317,7 @@ void AkosRenderer::setPalette(byte *new_palette) { if (color == 255) { palette[0] = color; } else { - _vm->_bompActorPalettePtr = palette; + useBompPalette = true; } } } @@ -1025,14 +1025,7 @@ byte AkosRenderer::codec5(int xmoveCur, int ymoveCur) { BompDrawData bdd; - bdd.srcwidth = _width; - bdd.srcheight = _height; bdd.dst = _out; - bdd.dataptr = _srcptr; - bdd.scale_x = 255; - bdd.scale_y = 255; - bdd.shadowMode = _shadow_mode; - if (!_mirror) { bdd.x = (_actorX - xmoveCur - _width) + 1; } else { @@ -1040,10 +1033,23 @@ byte AkosRenderer::codec5(int xmoveCur, int ymoveCur) { } bdd.y = _actorY + ymoveCur; + bdd.src = _srcptr; + bdd.srcwidth = _width; + bdd.srcheight = _height; + + bdd.scale_x = 255; + bdd.scale_y = 255; + bdd.maskPtr = _vm->getMaskBuffer(0, 0, _zbuf); - _vm->drawBomp(bdd, !_mirror); + bdd.numStrips = _numStrips; + + bdd.shadowMode = _shadow_mode; + bdd.shadowPalette = _vm->_shadowPalette; + + bdd.actorPalette = useBompPalette ? palette : 0; + bdd.mirror = !_mirror; - _vm->_bompActorPalettePtr = NULL; + drawBomp(bdd); return 0; } diff --git a/engines/scumm/akos.h b/engines/scumm/akos.h index c5a5fc1348..e0a56fd70e 100644 --- a/engines/scumm/akos.h +++ b/engines/scumm/akos.h @@ -59,6 +59,7 @@ protected: // actor palette byte palette[256]; + bool useBompPalette; // pointer to various parts of the costume resource const byte *akos; @@ -84,6 +85,7 @@ protected: public: AkosRenderer(ScummEngine *scumm) : BaseCostumeRenderer(scumm) { + useBompPalette = false; akos = 0; akhd = 0; akpl = 0; diff --git a/engines/scumm/bomp.cpp b/engines/scumm/bomp.cpp index bfe40add72..78808a79dc 100644 --- a/engines/scumm/bomp.cpp +++ b/engines/scumm/bomp.cpp @@ -197,7 +197,7 @@ void bompScaleFuncX(byte *line_buffer, byte *scaling_x_ptr, byte skip, int32 siz } } -void ScummEngine::drawBomp(const BompDrawData &bd, bool mirror) { +void drawBomp(const BompDrawData &bd) { const byte *src; byte *dst; byte *mask = 0; @@ -231,14 +231,14 @@ void ScummEngine::drawBomp(const BompDrawData &bd, bool mirror) { clip.bottom = bd.dst.h - bd.y; } - src = bd.dataptr; + src = bd.src; dst = (byte *)bd.dst.pixels + bd.y * bd.dst.pitch + (bd.x + clip.left); const byte maskbit = revBitMask((bd.x + clip.left) & 7); // Mask against any additionally imposed mask if (bd.maskPtr) { - mask = bd.maskPtr + (bd.y * _gdi->_numStrips) + ((bd.x + clip.left) / 8); + mask = bd.maskPtr + (bd.y * bd.numStrips) + ((bd.x + clip.left) / 8); } // Setup vertical scaling @@ -276,7 +276,7 @@ void ScummEngine::drawBomp(const BompDrawData &bd, bool mirror) { // Loop over all lines while (pos_y < clip.bottom) { // Decode a single (bomp encoded) line, reversed if we are in mirror mode - if (mirror) + if (bd.mirror) bompDecodeLineReverse(line_buffer, src + 2, bd.srcwidth); else bompDecodeLine(line_buffer, src + 2, bd.srcwidth); @@ -313,17 +313,17 @@ void ScummEngine::drawBomp(const BompDrawData &bd, bool mirror) { bompApplyMask(line_ptr, mask, maskbit, width, 255); // Apply custom color map, if available - if (_bompActorPalettePtr) - bompApplyActorPalette(_bompActorPalettePtr, line_ptr, width); + if (bd.actorPalette) + bompApplyActorPalette(bd.actorPalette, line_ptr, width); // Finally, draw the decoded, scaled, masked and recolored line onto // the target surface, using the specified shadow mode - bompApplyShadow(bd.shadowMode, _shadowPalette, line_ptr, dst, width, 255); + bompApplyShadow(bd.shadowMode, bd.shadowPalette, line_ptr, dst, width, 255); } // Advance to the next line pos_y++; - mask += _gdi->_numStrips; + mask += bd.numStrips; dst += bd.dst.pitch; } } diff --git a/engines/scumm/bomp.h b/engines/scumm/bomp.h index 7a38f45b9c..cf22abe3de 100644 --- a/engines/scumm/bomp.h +++ b/engines/scumm/bomp.h @@ -24,6 +24,7 @@ #define SCUMM_BOMP_H #include "common/scummsys.h" +#include "graphics/surface.h" namespace Scumm { @@ -34,6 +35,30 @@ void decompressBomp(byte *dst, const byte *src, int w, int h); void bompDecodeLine(byte *dst, const byte *src, int size); void bompDecodeLineReverse(byte *dst, const byte *src, int size); + +/** Bomp graphics data */ +struct BompDrawData { + Graphics::Surface dst; + int x, y; + + const byte *src; + int srcwidth, srcheight; + + byte scale_x, scale_y; + + byte *maskPtr; + int numStrips; + + uint16 shadowMode; + byte *shadowPalette; + + byte *actorPalette; + + bool mirror; +}; + +void drawBomp(const BompDrawData &bd); + } // End of namespace Scumm #endif diff --git a/engines/scumm/gfx.h b/engines/scumm/gfx.h index a4683095a2..4df50a7053 100644 --- a/engines/scumm/gfx.h +++ b/engines/scumm/gfx.h @@ -170,21 +170,6 @@ struct ColorCycle { byte end; }; -/** Bomp graphics data, used as parameter to ScummEngine::drawBomp. */ -struct BompDrawData { - Graphics::Surface dst; - - int x, y; - byte scale_x, scale_y; - const byte *dataptr; - int srcwidth, srcheight; - uint16 shadowMode; - - byte *maskPtr; - - BompDrawData() { memset(this, 0, sizeof(*this)); } -}; - struct StripTable; #define CHARSET_MASK_TRANSPARENCY 253 diff --git a/engines/scumm/object.cpp b/engines/scumm/object.cpp index 3667bee35f..5cd1297034 100644 --- a/engines/scumm/object.cpp +++ b/engines/scumm/object.cpp @@ -1650,6 +1650,17 @@ void ScummEngine_v6::drawBlastObject(BlastObject *eo) { if (!bomp) error("object %d is not a blast object", eo->number); + bdd.dst = *vs; + bdd.dst.pixels = vs->getPixels(0, 0); + bdd.x = eo->rect.left; + bdd.y = eo->rect.top; + + // Skip the bomp header + if (_game.version == 8) { + bdd.src = bomp + 8; + } else { + bdd.src = bomp + 10; + } if (_game.version == 8) { bdd.srcwidth = READ_LE_UINT32(bomp); bdd.srcheight = READ_LE_UINT32(bomp+4); @@ -1658,26 +1669,23 @@ void ScummEngine_v6::drawBlastObject(BlastObject *eo) { bdd.srcheight = READ_LE_UINT16(bomp+4); } - bdd.dst = *vs; - bdd.dst.pixels = vs->getPixels(0, 0); - // Skip the bomp header - if (_game.version == 8) { - bdd.dataptr = bomp + 8; - } else { - bdd.dataptr = bomp + 10; - } - bdd.x = eo->rect.left; - bdd.y = eo->rect.top; bdd.scale_x = (byte)eo->scaleX; bdd.scale_y = (byte)eo->scaleY; + bdd.maskPtr = NULL; + bdd.numStrips = _gdi->_numStrips; if ((bdd.scale_x != 255) || (bdd.scale_y != 255)) { bdd.shadowMode = 0; } else { bdd.shadowMode = eo->mode; } - drawBomp(bdd, false); + bdd.shadowPalette = _shadowPalette; + + bdd.actorPalette = 0; + bdd.mirror = false; + + drawBomp(bdd); markRectAsDirty(vs->number, bdd.x, bdd.x + bdd.srcwidth, bdd.y, bdd.y + bdd.srcheight); } diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp index ae18bf8673..3a25260263 100644 --- a/engines/scumm/scumm.cpp +++ b/engines/scumm/scumm.cpp @@ -250,7 +250,6 @@ ScummEngine::ScummEngine(OSystem *syst, const DetectorResult &dr) _doEffect = false; _currentLights = 0; - _bompActorPalettePtr = NULL; _shakeEnabled = false; _shakeFrame = 0; _screenStartStrip = 0; diff --git a/engines/scumm/scumm.h b/engines/scumm/scumm.h index 9b3429359a..5522814d39 100644 --- a/engines/scumm/scumm.h +++ b/engines/scumm/scumm.h @@ -1040,11 +1040,6 @@ protected: void dissolveEffect(int width, int height); void scrollEffect(int dir); - // bomp -public: - byte *_bompActorPalettePtr; - void drawBomp(const BompDrawData &bd, bool mirror); - protected: bool _shakeEnabled; uint _shakeFrame; |