aboutsummaryrefslogtreecommitdiff
path: root/engines/parallaction/disk_ns.cpp
diff options
context:
space:
mode:
authorNicola Mettifogo2008-11-04 13:57:04 +0000
committerNicola Mettifogo2008-11-04 13:57:04 +0000
commit9fe31503486326869f6728bb0d0da4629a81aba8 (patch)
treea47491477d73428307ccf29b6e71a764ff99947d /engines/parallaction/disk_ns.cpp
parent33b6bc4215fd7fbd94ea0a879b3d8e8ace3d0ab0 (diff)
downloadscummvm-rg350-9fe31503486326869f6728bb0d0da4629a81aba8.tar.gz
scummvm-rg350-9fe31503486326869f6728bb0d0da4629a81aba8.tar.bz2
scummvm-rg350-9fe31503486326869f6728bb0d0da4629a81aba8.zip
Refactoring of NS disk code, preliminary to change towards Common::Archive.
svn-id: r34894
Diffstat (limited to 'engines/parallaction/disk_ns.cpp')
-rw-r--r--engines/parallaction/disk_ns.cpp274
1 files changed, 113 insertions, 161 deletions
diff --git a/engines/parallaction/disk_ns.cpp b/engines/parallaction/disk_ns.cpp
index 6f968ca317..d6783df7dc 100644
--- a/engines/parallaction/disk_ns.cpp
+++ b/engines/parallaction/disk_ns.cpp
@@ -263,12 +263,21 @@ void Disk_ns::errorFileNotFound(const char *s) {
}
Common::SeekableReadStream *Disk_ns::openFile(const char *filename) {
- Common::File *stream = new Common::File;
- if (!stream->open(filename))
+ Common::SeekableReadStream *stream = tryOpenFile(filename);
+ if (!stream)
errorFileNotFound(filename);
return stream;
}
+Common::SeekableReadStream *Disk_ns::tryOpenFile(const char *filename) {
+ assert(filename);
+ Common::File *stream = new Common::File;
+ if (!stream->open(filename)) {
+ delete stream;
+ stream = 0;
+ }
+ return stream;
+}
Common::String Disk_ns::selectArchive(const Common::String& name) {
Common::String oldName = _resArchive.name();
@@ -295,6 +304,29 @@ DosDisk_ns::DosDisk_ns(Parallaction* vm) : Disk_ns(vm) {
DosDisk_ns::~DosDisk_ns() {
}
+Common::SeekableReadStream *DosDisk_ns::tryOpenArchivedFile(const char* name) {
+ debugC(3, kDebugDisk, "DosDisk_ns::openArchivedFile(%s)", name);
+
+ if (_resArchive.openArchivedFile(name)) {
+ return new DummyArchiveStream(_resArchive);
+ }
+
+ char path[PATH_LEN];
+ sprintf(path, "%s.pp", name);
+ if (_resArchive.openArchivedFile(path)) {
+ return new DummyArchiveStream(_resArchive);
+ }
+
+ return 0;
+}
+
+Common::SeekableReadStream *DosDisk_ns::openArchivedFile(const char* name) {
+ Common::SeekableReadStream *stream = tryOpenArchivedFile(name);
+ if (!stream)
+ errorFileNotFound(name);
+ return stream;
+}
+
//
// loads a cnv from an external file
//
@@ -310,38 +342,30 @@ Cnv* DosDisk_ns::loadExternalCnv(const char *filename) {
uint16 width = stream->readByte();
uint16 height = stream->readByte();
uint32 decsize = numFrames * width * height;
+
byte *data = (byte*)malloc(decsize);
stream->read(data, decsize);
- Cnv *cnv = new Cnv(numFrames, width, height, data);
-
delete stream;
- return cnv;
+ return new Cnv(numFrames, width, height, data, true);
}
Frames* DosDisk_ns::loadCnv(const char *filename) {
- char path[PATH_LEN];
-
- strcpy(path, filename);
- if (!_resArchive.openArchivedFile(path)) {
- sprintf(path, "%s.pp", filename);
- if (!_resArchive.openArchivedFile(path))
- errorFileNotFound(path);
- }
-
- uint16 numFrames = _resArchive.readByte();
- uint16 width = _resArchive.readByte();
- uint16 height = _resArchive.readByte();
+ Common::SeekableReadStream *stream = openArchivedFile(filename);
+ uint16 numFrames = stream->readByte();
+ uint16 width = stream->readByte();
+ uint16 height = stream->readByte();
uint32 decsize = numFrames * width * height;
byte *data = (byte*)malloc(decsize);
- Graphics::PackBitsReadStream decoder(_resArchive);
+ Graphics::PackBitsReadStream decoder(*stream);
decoder.read(data, decsize);
+ delete stream;
- return new Cnv(numFrames, width, height, data);
+ return new Cnv(numFrames, width, height, data, true);
}
GfxObj* DosDisk_ns::loadTalk(const char *name) {
@@ -382,15 +406,10 @@ Script* DosDisk_ns::loadLocation(const char *name) {
}
Script* DosDisk_ns::loadScript(const char* name) {
-
- char vC8[PATH_LEN];
-
- sprintf(vC8, "%s.script", name);
-
- if (!_resArchive.openArchivedFile(vC8))
- errorFileNotFound(vC8);
-
- return new Script(new DummyArchiveStream(_resArchive), true);
+ char path[PATH_LEN];
+ sprintf(path, "%s.script", name);
+ Common::SeekableReadStream *stream = openArchivedFile(path);
+ return new Script(stream, true);
}
GfxObj* DosDisk_ns::loadHead(const char* name) {
@@ -489,23 +508,21 @@ void DosDisk_ns::parseBackground(BackgroundInfo& info, Common::SeekableReadStrea
void DosDisk_ns::loadBackground(BackgroundInfo& info, const char *filename) {
- if (!_resArchive.openArchivedFile(filename))
- errorFileNotFound(filename);
+ Common::SeekableReadStream *stream = openArchivedFile(filename);
info.width = _vm->_screenWidth; // 320
info.height = _vm->_screenHeight; // 200
- parseBackground(info, _resArchive);
+ parseBackground(info, *stream);
info.bg.create(info.width, info.height, 1);
info.mask.create(info.width, info.height);
info.mask.bigEndian = true;
info.path.create(info.width, info.height);
- Graphics::PackBitsReadStream stream(_resArchive);
- unpackBackground(&stream, (byte*)info.bg.pixels, info.mask.data, info.path.data);
-
- return;
+ Graphics::PackBitsReadStream pbstream(*stream);
+ unpackBackground(&pbstream, (byte*)info.bg.pixels, info.mask.data, info.path.data);
+ delete stream;
}
//
@@ -517,20 +534,14 @@ void DosDisk_ns::loadBackground(BackgroundInfo& info, const char *filename) {
void DosDisk_ns::loadMaskAndPath(BackgroundInfo& info, const char *name) {
char path[PATH_LEN];
sprintf(path, "%s.msk", name);
-
- if (!_resArchive.openArchivedFile(path))
- errorFileNotFound(name);
-
- parseDepths(info, _resArchive);
-
+ Common::SeekableReadStream *stream = openArchivedFile(path);
+ parseDepths(info, *stream);
info.path.create(info.width, info.height);
- _resArchive.read(info.path.data, info.path.size);
-
+ stream->read(info.path.data, info.path.size);
info.mask.create(info.width, info.height);
info.mask.bigEndian = true;
- _resArchive.read(info.mask.data, info.mask.size);
-
- return;
+ stream->read(info.mask.data, info.mask.size);
+ delete stream;
}
void DosDisk_ns::loadSlide(BackgroundInfo& info, const char *filename) {
@@ -745,9 +756,7 @@ public:
-
AmigaDisk_ns::AmigaDisk_ns(Parallaction *vm) : Disk_ns(vm) {
-
}
@@ -858,35 +867,13 @@ void AmigaDisk_ns::unpackBitmap(byte *dst, byte *src, uint16 numFrames, uint16 b
}
-Frames* AmigaDisk_ns::makeStaticCnv(Common::SeekableReadStream &stream) {
-
- stream.skip(1);
- uint16 width = stream.readByte();
- uint16 height = stream.readByte();
-
- assert((width & 7) == 0);
-
- byte bytesPerPlane = width / 8;
-
- uint32 rawsize = bytesPerPlane * NUM_PLANES * height;
- byte *buf = (byte*)malloc(rawsize);
- stream.read(buf, rawsize);
-
- Graphics::Surface *cnv = new Graphics::Surface;
- cnv->create(width, height, 1);
-
- unpackBitmap((byte*)cnv->pixels, buf, 1, bytesPerPlane, height);
- free(buf);
+Cnv* AmigaDisk_ns::makeCnv(Common::SeekableReadStream *stream, bool disposeStream) {
+ assert(stream);
- return new SurfaceToFrames(cnv);
-}
-
-Cnv* AmigaDisk_ns::makeCnv(Common::SeekableReadStream &stream) {
-
- uint16 numFrames = stream.readByte();
- uint16 width = stream.readByte();
- uint16 height = stream.readByte();
+ uint16 numFrames = stream->readByte();
+ uint16 width = stream->readByte();
+ uint16 height = stream->readByte();
assert((width & 7) == 0);
@@ -894,7 +881,7 @@ Cnv* AmigaDisk_ns::makeCnv(Common::SeekableReadStream &stream) {
uint32 rawsize = numFrames * bytesPerPlane * NUM_PLANES * height;
byte *buf = (byte*)malloc(rawsize);
- stream.read(buf, rawsize);
+ stream->read(buf, rawsize);
uint32 decsize = numFrames * width * height;
byte *data = (byte*)calloc(decsize, 1);
@@ -903,6 +890,9 @@ Cnv* AmigaDisk_ns::makeCnv(Common::SeekableReadStream &stream) {
free(buf);
+ if (disposeStream)
+ delete stream;
+
return new Cnv(numFrames, width, height, data, true);
}
#undef NUM_PLANES
@@ -927,39 +917,25 @@ Script* AmigaDisk_ns::loadLocation(const char *name) {
Script* AmigaDisk_ns::loadScript(const char* name) {
debugC(1, kDebugDisk, "AmigaDisk_ns::loadScript '%s'", name);
-
- char vC8[PATH_LEN];
-
- sprintf(vC8, "%s.script", name);
-
- if (!_resArchive.openArchivedFile(vC8))
- errorFileNotFound(vC8);
-
- return new Script(new DummyArchiveStream(_resArchive), true);
+ char path[PATH_LEN];
+ sprintf(path, "%s.script", name);
+ Common::SeekableReadStream *stream = openArchivedFile(path);
+ return new Script(stream, true);
}
Frames* AmigaDisk_ns::loadPointer(const char* name) {
debugC(1, kDebugDisk, "AmigaDisk_ns::loadPointer");
-
Common::SeekableReadStream *stream = openFile(name);
- Frames *frames = makeStaticCnv(*stream);
- delete stream;
-
- return frames;
+ return makeCnv(stream, true);
}
GfxObj* AmigaDisk_ns::loadStatic(const char* name) {
debugC(1, kDebugDisk, "AmigaDisk_ns::loadStatic '%s'", name);
-
- Common::SeekableReadStream *s = openArchivedFile(name, true);
- Frames *cnv = makeStaticCnv(*s);
-
- delete s;
-
- return new GfxObj(0, cnv, name);
+ Common::SeekableReadStream *s = openArchivedFile(name);
+ return new GfxObj(0, makeCnv(s, true), name);
}
-Common::SeekableReadStream *AmigaDisk_ns::openArchivedFile(const char* name, bool errorOnFileNotFound) {
+Common::SeekableReadStream *AmigaDisk_ns::tryOpenArchivedFile(const char* name) {
debugC(3, kDebugDisk, "AmigaDisk_ns::openArchivedFile(%s)", name);
if (_resArchive.openArchivedFile(name)) {
@@ -978,12 +954,17 @@ Common::SeekableReadStream *AmigaDisk_ns::openArchivedFile(const char* name, boo
return new PowerPackerStream(_resArchive);
}
- if (errorOnFileNotFound)
- errorFileNotFound(name);
+ return 0;
+}
- return NULL;
+Common::SeekableReadStream *AmigaDisk_ns::openArchivedFile(const char* name) {
+ Common::SeekableReadStream *stream = tryOpenArchivedFile(name);
+ if (!stream)
+ errorFileNotFound(name);
+ return stream;
}
+
/*
FIXME: mask values are not computed correctly for level 1 and 2
@@ -1063,7 +1044,7 @@ public:
void AmigaDisk_ns::loadBackground(BackgroundInfo& info, const char *name) {
- Common::SeekableReadStream *s = openArchivedFile(name, true);
+ Common::SeekableReadStream *s = openArchivedFile(name);
byte *pal;
PaletteFxRange ranges[6];
@@ -1105,8 +1086,8 @@ void AmigaDisk_ns::loadMask(BackgroundInfo& info, const char *name) {
char path[PATH_LEN];
sprintf(path, "%s.mask", name);
- Common::SeekableReadStream *s = openArchivedFile(path, false);
- if (s == NULL) {
+ Common::SeekableReadStream *s = tryOpenArchivedFile(path);
+ if (!s) {
debugC(5, kDebugDisk, "Mask file not found");
return; // no errors if missing mask files: not every location has one
}
@@ -1139,8 +1120,8 @@ void AmigaDisk_ns::loadPath(BackgroundInfo& info, const char *name) {
char path[PATH_LEN];
sprintf(path, "%s.path", name);
- Common::SeekableReadStream *s = openArchivedFile(path, false);
- if (s == NULL)
+ Common::SeekableReadStream *s = tryOpenArchivedFile(path);
+ if (!s)
return; // no errors if missing path files: not every location has one
@@ -1184,33 +1165,22 @@ void AmigaDisk_ns::loadSlide(BackgroundInfo& info, const char *name) {
Frames* AmigaDisk_ns::loadFrames(const char* name) {
debugC(1, kDebugDisk, "AmigaDisk_ns::loadFrames '%s'", name);
- Common::SeekableReadStream *s;
-
char path[PATH_LEN];
sprintf(path, "anims/%s", name);
- s = openArchivedFile(path, false);
+ Common::SeekableReadStream *s = tryOpenArchivedFile(path);
if (!s)
- s = openArchivedFile(name, true);
-
- Cnv *cnv = makeCnv(*s);
- delete s;
+ s = openArchivedFile(name);
- return cnv;
+ return makeCnv(s, true);
}
GfxObj* AmigaDisk_ns::loadHead(const char* name) {
debugC(1, kDebugDisk, "AmigaDisk_ns::loadHead '%s'", name);
-
char path[PATH_LEN];
sprintf(path, "%s.head", name);
-
- Common::SeekableReadStream *s = openArchivedFile(path, true);
- Frames *cnv = makeStaticCnv(*s);
-
- delete s;
-
- return new GfxObj(0, cnv, name);
+ Common::SeekableReadStream *s = openArchivedFile(path);
+ return new GfxObj(0, makeCnv(s, true), name);
}
@@ -1223,64 +1193,47 @@ GfxObj* AmigaDisk_ns::loadObjects(const char *name) {
else
sprintf(path, "objs/%s.objs", name);
- Common::SeekableReadStream *s = openArchivedFile(path, true);
-
- Cnv *cnv = makeCnv(*s);
- delete s;
-
- return new GfxObj(0, cnv, name);
+ Common::SeekableReadStream *s = openArchivedFile(path);
+ return new GfxObj(0, makeCnv(s, true), name);
}
GfxObj* AmigaDisk_ns::loadTalk(const char *name) {
debugC(1, kDebugDisk, "AmigaDisk_ns::loadTalk '%s'", name);
- Common::SeekableReadStream *s;
-
char path[PATH_LEN];
if (_vm->getFeatures() & GF_DEMO)
sprintf(path, "%s.talk", name);
else
sprintf(path, "talk/%s.talk", name);
- s = openArchivedFile(path, false);
- if (s == NULL) {
- s = openArchivedFile(name, true);
+ Common::SeekableReadStream *s = tryOpenArchivedFile(path);
+ if (!s) {
+ s = openArchivedFile(name);
}
-
- Cnv *cnv = makeCnv(*s);
- delete s;
-
- return new GfxObj(0, cnv, name);
+ return new GfxObj(0, makeCnv(s, true), name);
}
Table* AmigaDisk_ns::loadTable(const char* name) {
debugC(1, kDebugDisk, "AmigaDisk_ns::loadTable '%s'", name);
char path[PATH_LEN];
- sprintf(path, "%s.table", name);
-
- bool dispose = false;
-
- Common::SeekableReadStream *stream;
+ Common::SeekableReadStream *stream = 0;
if (!scumm_stricmp(name, "global")) {
- Common::SeekableReadStream *s = openFile(path);
- dispose = true;
- stream = s;
+ sprintf(path, "%s.table", name);
+ stream = openFile(path);
} else {
if (!(_vm->getFeatures() & GF_DEMO))
sprintf(path, "objs/%s.table", name);
- if (!_resArchive.openArchivedFile(path))
- errorFileNotFound(path);
+ else
+ sprintf(path, "%s.table", name);
- stream = &_resArchive;
+ stream = openArchivedFile(path);
}
Table *t = createTableFromStream(100, *stream);
-
- if (dispose)
- delete stream;
+ delete stream;
return t;
}
@@ -1291,32 +1244,31 @@ Font* AmigaDisk_ns::loadFont(const char* name) {
char path[PATH_LEN];
sprintf(path, "%sfont", name);
- Font *font = 0;
+ Common::SeekableReadStream *stream = 0;
if (_vm->getFeatures() & GF_LANG_IT) {
// Italian version has separate font files
- Common::SeekableReadStream *stream = openFile(path);
- font = createFont(name, *stream);
- delete stream;
+ stream = openFile(path);
} else {
- if (!_resArchive.openArchivedFile(path))
- errorFileNotFound(path);
- font = createFont(name, _resArchive);
+ stream = openArchivedFile(path);
}
+ Font *font = createFont(name, *stream);
+ delete stream;
+
return font;
}
Common::SeekableReadStream* AmigaDisk_ns::loadMusic(const char* name) {
- return openArchivedFile(name);
+ return tryOpenArchivedFile(name);
}
Common::ReadStream* AmigaDisk_ns::loadSound(const char* name) {
char path[PATH_LEN];
sprintf(path, "%s.snd", name);
- return openArchivedFile(path);
+ return tryOpenArchivedFile(path);
}
} // namespace Parallaction