aboutsummaryrefslogtreecommitdiff
path: root/engines/parallaction/disk_ns.cpp
diff options
context:
space:
mode:
authorNicola Mettifogo2007-08-11 13:07:21 +0000
committerNicola Mettifogo2007-08-11 13:07:21 +0000
commit8c2ae45ab443ac4b9d3d21341fbb74b44858fd8f (patch)
tree662ffb2e86c5781225e78122700b5a638dcce9be /engines/parallaction/disk_ns.cpp
parent2c6c654435d94b523ac458fc18ebce46fdce1c21 (diff)
downloadscummvm-rg350-8c2ae45ab443ac4b9d3d21341fbb74b44858fd8f.tar.gz
scummvm-rg350-8c2ae45ab443ac4b9d3d21341fbb74b44858fd8f.tar.bz2
scummvm-rg350-8c2ae45ab443ac4b9d3d21341fbb74b44858fd8f.zip
Overhaul of background/mask/path handling:
- added new BackgroundInfo structure - added helper functions to aid management of BackgroundInfo. Engine is now responsible for allocation/deallocation. - simplified loading and handling of background resources. svn-id: r28524
Diffstat (limited to 'engines/parallaction/disk_ns.cpp')
-rw-r--r--engines/parallaction/disk_ns.cpp126
1 files changed, 57 insertions, 69 deletions
diff --git a/engines/parallaction/disk_ns.cpp b/engines/parallaction/disk_ns.cpp
index 6506ddd2ac..cfcb9552e4 100644
--- a/engines/parallaction/disk_ns.cpp
+++ b/engines/parallaction/disk_ns.cpp
@@ -562,7 +562,7 @@ void DosDisk_ns::parseDepths(Common::SeekableReadStream &stream) {
}
-void DosDisk_ns::parseBackground(Common::SeekableReadStream &stream) {
+void DosDisk_ns::parseBackground(Common::SeekableReadStream &stream, BackgroundInfo *info) {
byte tmp[3];
@@ -570,11 +570,9 @@ void DosDisk_ns::parseBackground(Common::SeekableReadStream &stream) {
tmp[0] = stream.readByte();
tmp[1] = stream.readByte();
tmp[2] = stream.readByte();
- _vm->_gfx->_palette.setEntry(i, tmp[0], tmp[1], tmp[2]);
+ info->palette.setEntry(i, tmp[0], tmp[1], tmp[2]);
}
- _vm->_gfx->setPalette(_vm->_gfx->_palette);
-
parseDepths(stream);
for (uint32 _si = 0; _si < 6; _si++) {
@@ -587,30 +585,25 @@ void DosDisk_ns::parseBackground(Common::SeekableReadStream &stream) {
}
-void DosDisk_ns::loadBackground(const char *filename) {
+BackgroundInfo* DosDisk_ns::loadBackground(const char *filename) {
if (!_resArchive.openArchivedFile(filename))
errorFileNotFound(filename);
- parseBackground(_resArchive);
-
- Graphics::Surface *bg = new Graphics::Surface;
- bg->create(_vm->_screenWidth, _vm->_screenHeight, 1);
+ BackgroundInfo *info = new BackgroundInfo;
+ info->width = _vm->_screenWidth; // 320
+ info->height = _vm->_screenHeight; // 200
- MaskBuffer *mask = new MaskBuffer;
- mask->create(_vm->_screenWidth, _vm->_screenHeight);
+ parseBackground(_resArchive, info);
- PathBuffer *path = new PathBuffer;
- path->create(_vm->_screenWidth, _vm->_screenHeight);
+ info->bg.create(info->width, info->height, 1);
+ info->mask.create(info->width, info->height);
+ info->path.create(info->width, info->height);
Graphics::PackBitsReadStream stream(_resArchive);
- unpackBackground(&stream, (byte*)bg->pixels, mask->data, path->data);
+ unpackBackground(&stream, (byte*)info->bg.pixels, info->mask.data, info->path.data);
- _vm->_gfx->setBackground(bg);
- _vm->_gfx->setMask(mask);
- _vm->setPath(path);
-
- return;
+ return info;
}
//
@@ -619,46 +612,41 @@ void DosDisk_ns::loadBackground(const char *filename) {
// mask and path are normally combined (via OR) into the background picture itself
// read the comment on the top of this file for more
//
-void DosDisk_ns::loadMaskAndPath(const char *name) {
+void DosDisk_ns::loadMaskAndPath(const char *name, BackgroundInfo *info) {
char path[PATH_LEN];
sprintf(path, "%s.msk", name);
if (!_resArchive.openArchivedFile(path))
errorFileNotFound(name);
- MaskBuffer *mask = new MaskBuffer;
- mask->create(_vm->_screenWidth, _vm->_screenHeight);
-
- PathBuffer *pathBuf = new PathBuffer;
- pathBuf->create(_vm->_screenWidth, _vm->_screenHeight);
-
parseDepths(_resArchive);
- _resArchive.read(pathBuf->data, pathBuf->size);
- _resArchive.read(mask->data, mask->size);
+ info->path.create(info->width, info->height);
+ _resArchive.read(info->path.data, info->path.size);
- _vm->_gfx->setMask(mask);
- _vm->setPath(pathBuf);
+ info->mask.create(info->width, info->height);
+ _resArchive.read(info->mask.data, info->mask.size);
return;
}
-void DosDisk_ns::loadSlide(const char *filename) {
+BackgroundInfo* DosDisk_ns::loadSlide(const char *filename) {
char path[PATH_LEN];
sprintf(path, "%s.slide", filename);
- loadBackground(path);
+ return loadBackground(path);
}
-void DosDisk_ns::loadScenery(const char *name, const char *mask) {
- char path[PATH_LEN];
- sprintf(path, "%s.dyn", name);
- loadBackground(path);
+BackgroundInfo* DosDisk_ns::loadScenery(const char *name, const char *mask, const char* path) {
+ char filename[PATH_LEN];
+ sprintf(filename, "%s.dyn", name);
+ BackgroundInfo *info = loadBackground(filename);
if (mask != NULL) {
// load external masks and paths only for certain locations
- loadMaskAndPath(mask);
+ loadMaskAndPath(mask, info);
}
+ return info;
}
Table* DosDisk_ns::loadTable(const char* name) {
@@ -1188,15 +1176,20 @@ public:
};
-void AmigaDisk_ns::loadBackground(const char *name) {
+BackgroundInfo* AmigaDisk_ns::loadBackground(const char *name) {
Common::SeekableReadStream *s = openArchivedFile(name, true);
- Graphics::Surface *surf = new Graphics::Surface;
byte *pal;
- BackgroundDecoder decoder(*s, *surf, pal, _vm->_gfx->_palettefx);
+
+ BackgroundInfo* info = new BackgroundInfo;
+
+ BackgroundDecoder decoder(*s, info->bg, pal, _vm->_gfx->_palettefx);
decoder.decode();
+ info->width = info->bg.w;
+ info->height = info->bg.h;
+
byte *p = pal;
for (uint i = 0; i < 32; i++) {
byte r = *p >> 2;
@@ -1205,21 +1198,18 @@ void AmigaDisk_ns::loadBackground(const char *name) {
p++;
byte b = *p >> 2;
p++;
- _vm->_gfx->_palette.setEntry(i, r, g, b);
-
+ info->palette.setEntry(i, r, g, b);
}
free(pal);
- _vm->_gfx->setPalette(_vm->_gfx->_palette);
- _vm->_gfx->setBackground(surf);
delete s;
- return;
+ return info;
}
-void AmigaDisk_ns::loadMask(const char *name) {
+void AmigaDisk_ns::loadMask(const char *name, BackgroundInfo* info) {
debugC(5, kDebugDisk, "AmigaDisk_ns::loadMask(%s)", name);
char path[PATH_LEN];
@@ -1248,18 +1238,16 @@ void AmigaDisk_ns::loadMask(const char *name) {
s->seek(0x126, SEEK_SET); // HACK: skipping IFF/ILBM header should be done by analysis, not magic
Graphics::PackBitsReadStream stream(*s);
- MaskBuffer *mask = new MaskBuffer;
- mask->create(_vm->_screenWidth, _vm->_screenHeight);
- stream.read(mask->data, mask->size);
- buildMask(mask->data);
- _vm->_gfx->setMask(mask);
+ info->mask.create(info->width, info->height);
+ stream.read(info->mask.data, info->mask.size);
+ buildMask(info->mask.data);
delete s;
return;
}
-void AmigaDisk_ns::loadPath(const char *name) {
+void AmigaDisk_ns::loadPath(const char *name, BackgroundInfo* info) {
char path[PATH_LEN];
sprintf(path, "%s.path", name);
@@ -1273,49 +1261,49 @@ void AmigaDisk_ns::loadPath(const char *name) {
Graphics::PackBitsReadStream stream(*s);
- PathBuffer *buf = new PathBuffer;
- buf->create(_vm->_screenWidth, _vm->_screenHeight);
- stream.read(buf->data, buf->size);
- _vm->setPath(buf);
+ info->path.create(info->width, info->height);
+ stream.read(info->path.data, info->path.size);
delete s;
return;
}
-void AmigaDisk_ns::loadScenery(const char* background, const char* mask) {
+BackgroundInfo* AmigaDisk_ns::loadScenery(const char* background, const char* mask, const char* path) {
debugC(1, kDebugDisk, "AmigaDisk_ns::loadScenery '%s', '%s'", background, mask);
- char path[PATH_LEN];
- sprintf(path, "%s.bkgnd", background);
+ char filename[PATH_LEN];
+ sprintf(filename, "%s.bkgnd", background);
- loadBackground(path);
+ BackgroundInfo* info = loadBackground(filename);
if (mask == NULL) {
- loadMask(background);
- loadPath(background);
+ loadMask(background, info);
+ loadPath(background, info);
} else {
- loadMask(mask);
- loadPath(mask);
+ loadMask(mask, info);
+ loadPath(mask, info);
}
- return;
+ return info;
}
-void AmigaDisk_ns::loadSlide(const char *name) {
+BackgroundInfo* AmigaDisk_ns::loadSlide(const char *name) {
debugC(1, kDebugDisk, "AmigaDisk_ns::loadSlide '%s'", name);
char path[PATH_LEN];
sprintf(path, "slides/%s", name);
Common::SeekableReadStream *s = openArchivedFile(path, false);
+
+ BackgroundInfo *info;
if (s)
- loadBackground(path);
+ info = loadBackground(path);
else
- loadBackground(name);
+ info = loadBackground(name);
delete s;
- return;
+ return info;
}
Cnv* AmigaDisk_ns::loadFrames(const char* name) {