SCUMM: got rid of the _bompActorPalettePtr member var (which was only used as a hidden param to drawBomp); turned drawBomp into a regular function (used to be a ScummEngine member method)

svn-id: r26045
This commit is contained in:
Max Horn 2007-03-10 00:34:20 +00:00
parent 728d01cb17
commit aba0cd04d6
8 changed files with 71 additions and 51 deletions

View file

@ -317,7 +317,7 @@ void AkosRenderer::setPalette(byte *new_palette) {
if (color == 255) { if (color == 255) {
palette[0] = color; palette[0] = color;
} else { } else {
_vm->_bompActorPalettePtr = palette; useBompPalette = true;
} }
} }
} }
@ -1025,14 +1025,7 @@ byte AkosRenderer::codec5(int xmoveCur, int ymoveCur) {
BompDrawData bdd; BompDrawData bdd;
bdd.srcwidth = _width;
bdd.srcheight = _height;
bdd.dst = _out; bdd.dst = _out;
bdd.dataptr = _srcptr;
bdd.scale_x = 255;
bdd.scale_y = 255;
bdd.shadowMode = _shadow_mode;
if (!_mirror) { if (!_mirror) {
bdd.x = (_actorX - xmoveCur - _width) + 1; bdd.x = (_actorX - xmoveCur - _width) + 1;
} else { } else {
@ -1040,10 +1033,23 @@ byte AkosRenderer::codec5(int xmoveCur, int ymoveCur) {
} }
bdd.y = _actorY + ymoveCur; bdd.y = _actorY + ymoveCur;
bdd.maskPtr = _vm->getMaskBuffer(0, 0, _zbuf); bdd.src = _srcptr;
_vm->drawBomp(bdd, !_mirror); bdd.srcwidth = _width;
bdd.srcheight = _height;
_vm->_bompActorPalettePtr = NULL; bdd.scale_x = 255;
bdd.scale_y = 255;
bdd.maskPtr = _vm->getMaskBuffer(0, 0, _zbuf);
bdd.numStrips = _numStrips;
bdd.shadowMode = _shadow_mode;
bdd.shadowPalette = _vm->_shadowPalette;
bdd.actorPalette = useBompPalette ? palette : 0;
bdd.mirror = !_mirror;
drawBomp(bdd);
return 0; return 0;
} }

View file

@ -59,6 +59,7 @@ protected:
// actor palette // actor palette
byte palette[256]; byte palette[256];
bool useBompPalette;
// pointer to various parts of the costume resource // pointer to various parts of the costume resource
const byte *akos; const byte *akos;
@ -84,6 +85,7 @@ protected:
public: public:
AkosRenderer(ScummEngine *scumm) : BaseCostumeRenderer(scumm) { AkosRenderer(ScummEngine *scumm) : BaseCostumeRenderer(scumm) {
useBompPalette = false;
akos = 0; akos = 0;
akhd = 0; akhd = 0;
akpl = 0; akpl = 0;

View file

@ -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; const byte *src;
byte *dst; byte *dst;
byte *mask = 0; byte *mask = 0;
@ -231,14 +231,14 @@ void ScummEngine::drawBomp(const BompDrawData &bd, bool mirror) {
clip.bottom = bd.dst.h - bd.y; 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); dst = (byte *)bd.dst.pixels + bd.y * bd.dst.pitch + (bd.x + clip.left);
const byte maskbit = revBitMask((bd.x + clip.left) & 7); const byte maskbit = revBitMask((bd.x + clip.left) & 7);
// Mask against any additionally imposed mask // Mask against any additionally imposed mask
if (bd.maskPtr) { 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 // Setup vertical scaling
@ -276,7 +276,7 @@ void ScummEngine::drawBomp(const BompDrawData &bd, bool mirror) {
// Loop over all lines // Loop over all lines
while (pos_y < clip.bottom) { while (pos_y < clip.bottom) {
// Decode a single (bomp encoded) line, reversed if we are in mirror mode // 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); bompDecodeLineReverse(line_buffer, src + 2, bd.srcwidth);
else else
bompDecodeLine(line_buffer, src + 2, bd.srcwidth); 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); bompApplyMask(line_ptr, mask, maskbit, width, 255);
// Apply custom color map, if available // Apply custom color map, if available
if (_bompActorPalettePtr) if (bd.actorPalette)
bompApplyActorPalette(_bompActorPalettePtr, line_ptr, width); bompApplyActorPalette(bd.actorPalette, line_ptr, width);
// Finally, draw the decoded, scaled, masked and recolored line onto // Finally, draw the decoded, scaled, masked and recolored line onto
// the target surface, using the specified shadow mode // 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 // Advance to the next line
pos_y++; pos_y++;
mask += _gdi->_numStrips; mask += bd.numStrips;
dst += bd.dst.pitch; dst += bd.dst.pitch;
} }
} }

View file

@ -24,6 +24,7 @@
#define SCUMM_BOMP_H #define SCUMM_BOMP_H
#include "common/scummsys.h" #include "common/scummsys.h"
#include "graphics/surface.h"
namespace Scumm { 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 bompDecodeLine(byte *dst, const byte *src, int size);
void bompDecodeLineReverse(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 } // End of namespace Scumm
#endif #endif

View file

@ -170,21 +170,6 @@ struct ColorCycle {
byte end; 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; struct StripTable;
#define CHARSET_MASK_TRANSPARENCY 253 #define CHARSET_MASK_TRANSPARENCY 253

View file

@ -1650,6 +1650,17 @@ void ScummEngine_v6::drawBlastObject(BlastObject *eo) {
if (!bomp) if (!bomp)
error("object %d is not a blast object", eo->number); 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) { if (_game.version == 8) {
bdd.srcwidth = READ_LE_UINT32(bomp); bdd.srcwidth = READ_LE_UINT32(bomp);
bdd.srcheight = READ_LE_UINT32(bomp+4); 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.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_x = (byte)eo->scaleX;
bdd.scale_y = (byte)eo->scaleY; bdd.scale_y = (byte)eo->scaleY;
bdd.maskPtr = NULL; bdd.maskPtr = NULL;
bdd.numStrips = _gdi->_numStrips;
if ((bdd.scale_x != 255) || (bdd.scale_y != 255)) { if ((bdd.scale_x != 255) || (bdd.scale_y != 255)) {
bdd.shadowMode = 0; bdd.shadowMode = 0;
} else { } else {
bdd.shadowMode = eo->mode; 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); markRectAsDirty(vs->number, bdd.x, bdd.x + bdd.srcwidth, bdd.y, bdd.y + bdd.srcheight);
} }

View file

@ -250,7 +250,6 @@ ScummEngine::ScummEngine(OSystem *syst, const DetectorResult &dr)
_doEffect = false; _doEffect = false;
_currentLights = 0; _currentLights = 0;
_bompActorPalettePtr = NULL;
_shakeEnabled = false; _shakeEnabled = false;
_shakeFrame = 0; _shakeFrame = 0;
_screenStartStrip = 0; _screenStartStrip = 0;

View file

@ -1040,11 +1040,6 @@ protected:
void dissolveEffect(int width, int height); void dissolveEffect(int width, int height);
void scrollEffect(int dir); void scrollEffect(int dir);
// bomp
public:
byte *_bompActorPalettePtr;
void drawBomp(const BompDrawData &bd, bool mirror);
protected: protected:
bool _shakeEnabled; bool _shakeEnabled;
uint _shakeFrame; uint _shakeFrame;