aboutsummaryrefslogtreecommitdiff
path: root/engines/parallaction
diff options
context:
space:
mode:
authorNicola Mettifogo2008-02-02 00:41:31 +0000
committerNicola Mettifogo2008-02-02 00:41:31 +0000
commit249877fa82e6af59e6084bb3fa92cda49fb281aa (patch)
tree37d639e6aacf885844d77707e4b77a50c9ac4fab /engines/parallaction
parent7adfb1a2955f84a310d31777b193bdf5f33e0c0b (diff)
downloadscummvm-rg350-249877fa82e6af59e6084bb3fa92cda49fb281aa.tar.gz
scummvm-rg350-249877fa82e6af59e6084bb3fa92cda49fb281aa.tar.bz2
scummvm-rg350-249877fa82e6af59e6084bb3fa92cda49fb281aa.zip
Moved depth buffer and palette rotation data into BackgroundInfo.
svn-id: r30725
Diffstat (limited to 'engines/parallaction')
-rw-r--r--engines/parallaction/callables_ns.cpp2
-rw-r--r--engines/parallaction/disk.h2
-rw-r--r--engines/parallaction/disk_ns.cpp47
-rw-r--r--engines/parallaction/exec_br.cpp3
-rw-r--r--engines/parallaction/graphics.cpp19
-rw-r--r--engines/parallaction/graphics.h46
6 files changed, 62 insertions, 57 deletions
diff --git a/engines/parallaction/callables_ns.cpp b/engines/parallaction/callables_ns.cpp
index fed4368aa1..7ba42c2dba 100644
--- a/engines/parallaction/callables_ns.cpp
+++ b/engines/parallaction/callables_ns.cpp
@@ -331,7 +331,7 @@ void Parallaction_ns::_c_onMouse(void *parm) {
void Parallaction_ns::_c_setMask(void *parm) {
memset(_gfx->_backgroundInfo->mask.data + 3600, 0, 3600);
- _gfx->_bgLayers[1] = 500;
+ _gfx->_backgroundInfo->layers[1] = 500;
return;
}
diff --git a/engines/parallaction/disk.h b/engines/parallaction/disk.h
index b79c8125b9..77fc7764c9 100644
--- a/engines/parallaction/disk.h
+++ b/engines/parallaction/disk.h
@@ -133,7 +133,7 @@ private:
Frames* loadExternalStaticCnv(const char *filename);
void loadBackground(BackgroundInfo& info, const char *filename);
void loadMaskAndPath(BackgroundInfo& info, const char *name);
- void parseDepths(Common::SeekableReadStream &stream);
+ void parseDepths(BackgroundInfo &info, Common::SeekableReadStream &stream);
void parseBackground(BackgroundInfo& info, Common::SeekableReadStream &stream);
Font *createFont(const char *name, Cnv* cnv);
diff --git a/engines/parallaction/disk_ns.cpp b/engines/parallaction/disk_ns.cpp
index c6fad9765c..b0b1232a37 100644
--- a/engines/parallaction/disk_ns.cpp
+++ b/engines/parallaction/disk_ns.cpp
@@ -24,7 +24,6 @@
*/
#include "graphics/iff.h"
-#include "graphics/surface.h"
#include "parallaction/parallaction.h"
@@ -321,7 +320,6 @@ DosDisk_ns::~DosDisk_ns() {
// loads a cnv from an external file
//
Cnv* DosDisk_ns::loadExternalCnv(const char *filename) {
-// printf("Gfx::loadExternalCnv(%s)...", filename);
char path[PATH_LEN];
@@ -367,7 +365,6 @@ Frames* DosDisk_ns::loadExternalStaticCnv(const char *filename) {
}
Cnv* DosDisk_ns::loadCnv(const char *filename) {
-// printf("Gfx::loadCnv(%s)\n", filename);
char path[PATH_LEN];
@@ -525,12 +522,11 @@ void DosDisk_ns::unpackBackground(Common::ReadStream *stream, byte *screen, byte
return;
}
-
-void DosDisk_ns::parseDepths(Common::SeekableReadStream &stream) {
- _vm->_gfx->_bgLayers[0] = stream.readByte();
- _vm->_gfx->_bgLayers[1] = stream.readByte();
- _vm->_gfx->_bgLayers[2] = stream.readByte();
- _vm->_gfx->_bgLayers[3] = stream.readByte();
+void DosDisk_ns::parseDepths(BackgroundInfo &info, Common::SeekableReadStream &stream) {
+ info.layers[0] = stream.readByte();
+ info.layers[1] = stream.readByte();
+ info.layers[2] = stream.readByte();
+ info.layers[3] = stream.readByte();
}
@@ -545,14 +541,17 @@ void DosDisk_ns::parseBackground(BackgroundInfo& info, Common::SeekableReadStrea
info.palette.setEntry(i, tmp[0], tmp[1], tmp[2]);
}
- parseDepths(stream);
+ parseDepths(info, stream);
+ PaletteFxRange range;
for (uint32 _si = 0; _si < 6; _si++) {
- _vm->_gfx->_palettefx[_si]._timer = stream.readUint16BE();
- _vm->_gfx->_palettefx[_si]._step = stream.readUint16BE();
- _vm->_gfx->_palettefx[_si]._flags = stream.readUint16BE();
- _vm->_gfx->_palettefx[_si]._first = stream.readByte();
- _vm->_gfx->_palettefx[_si]._last = stream.readByte();
+ range._timer = stream.readUint16BE();
+ range._step = stream.readUint16BE();
+ range._flags = stream.readUint16BE();
+ range._first = stream.readByte();
+ range._last = stream.readByte();
+
+ info.setPaletteRange(_si, range);
}
}
@@ -590,7 +589,7 @@ void DosDisk_ns::loadMaskAndPath(BackgroundInfo& info, const char *name) {
if (!_resArchive.openArchivedFile(path))
errorFileNotFound(name);
- parseDepths(_resArchive);
+ parseDepths(info, _resArchive);
info.path.create(info.width, info.height);
_resArchive.read(info.path.data, info.path.size);
@@ -1145,15 +1144,18 @@ void AmigaDisk_ns::loadBackground(BackgroundInfo& info, const char *name) {
Common::SeekableReadStream *s = openArchivedFile(name, true);
byte *pal;
+ PaletteFxRange ranges[6];
- BackgroundDecoder decoder(*s, info.bg, pal, _vm->_gfx->_palettefx);
+ BackgroundDecoder decoder(*s, info.bg, pal, ranges);
decoder.decode();
+ uint i;
+
info.width = info.bg.w;
info.height = info.bg.h;
byte *p = pal;
- for (uint i = 0; i < 32; i++) {
+ for (i = 0; i < 32; i++) {
byte r = *p >> 2;
p++;
byte g = *p >> 2;
@@ -1165,6 +1167,10 @@ void AmigaDisk_ns::loadBackground(BackgroundInfo& info, const char *name) {
free(pal);
+ for (i = 0; i < 6; i++) {
+ info.setPaletteRange(i, ranges[i]);
+ }
+
delete s;
return;
@@ -1191,12 +1197,9 @@ void AmigaDisk_ns::loadMask(BackgroundInfo& info, const char *name) {
g = s->readByte();
b = s->readByte();
- _vm->_gfx->_bgLayers[i] = (((r << 4) & 0xF00) | (g & 0xF0) | (b >> 4)) & 0xFF;
-
-// printf("rgb = (%x, %x, %x) -> %x\n", r, g, b, _vm->_gfx->_bgLayers[i]);
+ info.layers[i] = (((r << 4) & 0xF00) | (g & 0xF0) | (b >> 4)) & 0xFF;
}
-
s->seek(0x126, SEEK_SET); // HACK: skipping IFF/ILBM header should be done by analysis, not magic
Graphics::PackBitsReadStream stream(*s);
diff --git a/engines/parallaction/exec_br.cpp b/engines/parallaction/exec_br.cpp
index 001bef4d43..960e005124 100644
--- a/engines/parallaction/exec_br.cpp
+++ b/engines/parallaction/exec_br.cpp
@@ -413,10 +413,11 @@ DECLARE_INSTRUCTION_OPCODE(color) {
DECLARE_INSTRUCTION_OPCODE(mask) {
Instruction *inst = *_instRunCtxt.inst;
-
+#if 0
_gfx->_bgLayers[0] = inst->_opA.getRValue();
_gfx->_bgLayers[1] = inst->_opB.getRValue();
_gfx->_bgLayers[2] = inst->_opC.getRValue();
+#endif
}
diff --git a/engines/parallaction/graphics.cpp b/engines/parallaction/graphics.cpp
index 551d865537..ca912e3f23 100644
--- a/engines/parallaction/graphics.cpp
+++ b/engines/parallaction/graphics.cpp
@@ -260,17 +260,18 @@ void Gfx::animatePalette() {
// avoid forcing setPalette when not needed
bool done = false;
+ PaletteFxRange *range;
for (uint16 i = 0; i < 4; i++) {
+ range = &_backgroundInfo->ranges[i];
- if ((_palettefx[i]._flags & 1) == 0) continue; // animated palette
+ if ((range->_flags & 1) == 0) continue; // animated palette
+ range->_timer += range->_step * 2; // update timer
- _palettefx[i]._timer += _palettefx[i]._step * 2; // update timer
+ if (range->_timer < 0x4000) continue; // check timeout
- if (_palettefx[i]._timer < 0x4000) continue; // check timeout
+ range->_timer = 0; // reset timer
- _palettefx[i]._timer = 0; // reset timer
-
- _palette.rotate(_palettefx[i]._first, _palettefx[i]._last, (_palettefx[i]._flags & 2) != 0);
+ _palette.rotate(range->_first, range->_last, (range->_flags & 2) != 0);
done = true;
}
@@ -733,7 +734,7 @@ void Gfx::grabBackground(const Common::Rect& r, Graphics::Surface &dst) {
uint16 Gfx::queryMask(uint16 v) {
for (uint16 _si = 0; _si < 3; _si++) {
- if (_bgLayers[_si+1] > v) return _si;
+ if (_backgroundInfo->layers[_si+1] > v) return _si;
}
return BUFFER_FOREGROUND;
@@ -757,10 +758,6 @@ Gfx::Gfx(Parallaction* vm) :
_screenX = 0;
_screenY = 0;
- _bgLayers[0] = _bgLayers[1] = _bgLayers[2] = _bgLayers[3] = 0;
-
- memset(_palettefx, 0, sizeof(_palettefx));
-
_halfbrite = false;
_hbCircleRadius = 0;
diff --git a/engines/parallaction/graphics.h b/engines/parallaction/graphics.h
index de5df06e66..2beab46cf5 100644
--- a/engines/parallaction/graphics.h
+++ b/engines/parallaction/graphics.h
@@ -335,6 +335,19 @@ struct BackgroundInfo {
PathBuffer path;
Palette palette;
+
+ int layers[4];
+ PaletteFxRange ranges[6];
+
+ BackgroundInfo() : width(0), height(0) {
+ layers[0] = layers[1] = layers[2] = layers[3] = 0;
+ memset(ranges, 0, sizeof(ranges));
+ }
+
+ void setPaletteRange(int index, const PaletteFxRange& range) {
+ assert(index < 6);
+ memcpy(&ranges[index], &range, sizeof(PaletteFxRange));
+ }
};
@@ -348,25 +361,15 @@ class Gfx {
public:
Disk *_disk;
+ GfxObjList _gfxobjList[3];
GfxObj* loadAnim(const char *name);
GfxObj* loadGet(const char *name);
GfxObj* loadDoor(const char *name);
- void clearGfxObjects();
-
- void showGfxObj(GfxObj* obj, bool visible);
- GfxObjList _gfxobjList[3];
void drawGfxObjects(Graphics::Surface &surf);
+ void showGfxObj(GfxObj* obj, bool visible);
+ void clearGfxObjects();
void sortAnimations();
- BackgroundInfo *_backgroundInfo;
- void freeBackground();
- void setBackground(uint type, const char* name, const char* mask, const char* path);
-
-public:
-
- // balloons and text
- void getStringExtent(char *text, uint16 maxwidth, int16* width, int16* height);
-
// labels
void setFloatingLabel(Label *label);
Label *renderFloatingLabel(Font *font, char *text);
@@ -375,27 +378,30 @@ public:
void hideLabel(uint id);
void freeLabels();
- // cut/paste
- void patchBackground(Graphics::Surface &surf, int16 x, int16 y, bool mask = false);
-
-
+ // dialogue balloons
int setLocationBalloon(char *text, bool endGame);
int setDialogueBalloon(char *text, uint16 winding, byte textColor);
int setSingleBalloon(char *text, uint16 x, uint16 y, uint16 winding, byte textColor);
void setBalloonText(uint id, char *text, byte textColor);
int hitTestDialogueBalloon(int x, int y);
+ void getStringExtent(char *text, uint16 maxwidth, int16* width, int16* height);
+ // other items
int setItem(Frames* frames, uint16 x, uint16 y);
void setItemFrame(uint item, uint16 f);
void hideDialogueStuff();
void freeBalloons();
void freeItems();
- // low level surfaces
+ // background surface
+ BackgroundInfo *_backgroundInfo;
+ void setBackground(uint type, const char* name, const char* mask, const char* path);
void clearBackground();
+ void patchBackground(Graphics::Surface &surf, int16 x, int16 y, bool mask = false);
void grabBackground(const Common::Rect& r, Graphics::Surface &dst);
void fillBackground(const Common::Rect& r, byte color);
void invertBackground(const Common::Rect& r);
+ void freeBackground();
// palette
void setPalette(Palette palette);
@@ -408,17 +414,15 @@ public:
// misc
uint16 queryMask(uint16 v);
- void updateScreen();
void setMask(MaskBuffer *buffer);
// init
Gfx(Parallaction* vm);
virtual ~Gfx();
+ void updateScreen();
public:
- uint16 _bgLayers[4];
- PaletteFxRange _palettefx[6];
Palette _palette;
uint _screenX; // scrolling position