diff options
Diffstat (limited to 'engines/parallaction/disk_ns.cpp')
-rw-r--r-- | engines/parallaction/disk_ns.cpp | 225 |
1 files changed, 108 insertions, 117 deletions
diff --git a/engines/parallaction/disk_ns.cpp b/engines/parallaction/disk_ns.cpp index c0bb2691ef..8b5ce850ff 100644 --- a/engines/parallaction/disk_ns.cpp +++ b/engines/parallaction/disk_ns.cpp @@ -345,7 +345,7 @@ Cnv* DosDisk_ns::loadExternalCnv(const char *filename) { return new Cnv(numFrames, width, height, data); } -StaticCnv *DosDisk_ns::loadExternalStaticCnv(const char *filename) { +Graphics::Surface *DosDisk_ns::loadExternalStaticCnv(const char *filename) { char path[PATH_LEN]; @@ -356,16 +356,14 @@ StaticCnv *DosDisk_ns::loadExternalStaticCnv(const char *filename) { if (!stream.open(path)) errorFileNotFound(path); - StaticCnv *cnv = new StaticCnv; + Graphics::Surface *cnv = new Graphics::Surface; stream.skip(1); - cnv->_width = stream.readByte(); - cnv->_height = stream.readByte(); + byte w = stream.readByte(); + byte h = stream.readByte(); - uint16 size = cnv->_width*cnv->_height; - - cnv->_data0 = (byte*)malloc(size); - stream.read(cnv->_data0, size); + cnv->create(w, h, 1); + stream.read(cnv->pixels, w*h); return cnv; } @@ -395,7 +393,7 @@ Cnv* DosDisk_ns::loadCnv(const char *filename) { return new Cnv(numFrames, width, height, data); } -Cnv* DosDisk_ns::loadTalk(const char *name) { +Frames* DosDisk_ns::loadTalk(const char *name) { const char *ext = strstr(name, ".talk"); if (ext != NULL) { @@ -462,7 +460,7 @@ Script* DosDisk_ns::loadScript(const char* name) { return new Script(new DummyArchiveStream(_resArchive), true); } -StaticCnv* DosDisk_ns::loadHead(const char* name) { +Graphics::Surface* DosDisk_ns::loadHead(const char* name) { char path[PATH_LEN]; @@ -477,8 +475,8 @@ StaticCnv* DosDisk_ns::loadHead(const char* name) { } -StaticCnv* DosDisk_ns::loadPointer() { - return loadExternalStaticCnv("pointer"); +Graphics::Surface* DosDisk_ns::loadPointer(const char *name) { + return loadExternalStaticCnv(name); } @@ -489,7 +487,7 @@ Font* DosDisk_ns::loadFont(const char* name) { } -Cnv* DosDisk_ns::loadObjects(const char *name) { +Frames* DosDisk_ns::loadObjects(const char *name) { if (IS_MINI_CHARACTER(name)) { name += 4; @@ -501,7 +499,7 @@ Cnv* DosDisk_ns::loadObjects(const char *name) { } -StaticCnv* DosDisk_ns::loadStatic(const char* name) { +Graphics::Surface* DosDisk_ns::loadStatic(const char* name) { char path[PATH_LEN]; @@ -512,22 +510,21 @@ StaticCnv* DosDisk_ns::loadStatic(const char* name) { errorFileNotFound(path); } - StaticCnv* cnv = new StaticCnv; + Graphics::Surface* cnv = new Graphics::Surface; _resArchive.skip(1); - cnv->_width = _resArchive.readByte(); - cnv->_height = _resArchive.readByte(); + byte w = _resArchive.readByte(); + byte h = _resArchive.readByte(); - uint16 size = cnv->_width*cnv->_height; - cnv->_data0 = (byte*)malloc(size); + cnv->create(w, h, 1); Graphics::PackBitsReadStream decoder(_resArchive); - decoder.read(cnv->_data0, size); + decoder.read(cnv->pixels, w*h); return cnv; } -Cnv* DosDisk_ns::loadFrames(const char* name) { +Frames* DosDisk_ns::loadFrames(const char* name) { return loadCnv(name); } @@ -565,10 +562,16 @@ void DosDisk_ns::parseDepths(Common::SeekableReadStream &stream) { } -void DosDisk_ns::parseBackground(Common::SeekableReadStream &stream) { +void DosDisk_ns::parseBackground(BackgroundInfo& info, Common::SeekableReadStream &stream) { + + byte tmp[3]; - stream.read(_vm->_gfx->_palette, BASE_PALETTE_SIZE); - _vm->_gfx->setPalette(_vm->_gfx->_palette); + for (uint i = 0; i < 32; i++) { + tmp[0] = stream.readByte(); + tmp[1] = stream.readByte(); + tmp[2] = stream.readByte(); + info.palette.setEntry(i, tmp[0], tmp[1], tmp[2]); + } parseDepths(stream); @@ -582,28 +585,22 @@ void DosDisk_ns::parseBackground(Common::SeekableReadStream &stream) { } -void DosDisk_ns::loadBackground(const char *filename) { +void DosDisk_ns::loadBackground(BackgroundInfo& info, const char *filename) { if (!_resArchive.openArchivedFile(filename)) errorFileNotFound(filename); - parseBackground(_resArchive); + info.width = _vm->_screenWidth; // 320 + info.height = _vm->_screenHeight; // 200 - byte *bg = (byte*)calloc(1, _vm->_screenSize); - byte *mask = (byte*)calloc(1, _vm->_screenMaskSize); - byte *path = (byte*)calloc(1, _vm->_screenPathSize); + parseBackground(info, _resArchive); + 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, bg, mask, path); - - _vm->_gfx->setBackground(bg); - _vm->_gfx->setMask(mask); - _vm->setPath(path); - - free(bg); - free(mask); - free(path); + unpackBackground(&stream, (byte*)info.bg.pixels, info.mask.data, info.path.data); return; } @@ -614,43 +611,44 @@ 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(BackgroundInfo& info, const char *name) { char path[PATH_LEN]; sprintf(path, "%s.msk", name); if (!_resArchive.openArchivedFile(path)) errorFileNotFound(name); - byte *maskBuf = (byte*)calloc(1, _vm->_screenMaskSize); - byte *pathBuf = (byte*)calloc(1, _vm->_screenPathSize); - parseDepths(_resArchive); - _resArchive.read(pathBuf, _vm->_screenPathSize); - _resArchive.read(maskBuf, _vm->_screenMaskSize); + info.path.create(info.width, info.height); + _resArchive.read(info.path.data, info.path.size); - _vm->_gfx->setMask(maskBuf); - _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) { +void DosDisk_ns::loadSlide(BackgroundInfo& info, const char *filename) { char path[PATH_LEN]; sprintf(path, "%s.slide", filename); - loadBackground(path); + loadBackground(info, path); + + return; } -void DosDisk_ns::loadScenery(const char *name, const char *mask) { - char path[PATH_LEN]; - sprintf(path, "%s.dyn", name); - loadBackground(path); +void DosDisk_ns::loadScenery(BackgroundInfo& info, const char *name, const char *mask, const char* path) { + char filename[PATH_LEN]; + sprintf(filename, "%s.dyn", name); + + loadBackground(info, filename); if (mask != NULL) { // load external masks and paths only for certain locations - loadMaskAndPath(mask); + loadMaskAndPath(info, mask); } + return; } Table* DosDisk_ns::loadTable(const char* name) { @@ -661,13 +659,7 @@ Table* DosDisk_ns::loadTable(const char* name) { if (!stream.open(path)) errorFileNotFound(path); - Table *t = new Table(100); - - fillBuffers(stream); - while (scumm_stricmp(_tokens[0], "ENDTABLE")) { - t->addData(_tokens[0]); - fillBuffers(stream); - } + Table *t = createTableFromStream(100, stream); stream.close(); @@ -974,7 +966,7 @@ void AmigaDisk_ns::unpackBitmap(byte *dst, byte *src, uint16 numFrames, uint16 b } -StaticCnv* AmigaDisk_ns::makeStaticCnv(Common::SeekableReadStream &stream) { +Graphics::Surface* AmigaDisk_ns::makeStaticCnv(Common::SeekableReadStream &stream) { stream.skip(1); uint16 width = stream.readByte(); @@ -988,19 +980,13 @@ StaticCnv* AmigaDisk_ns::makeStaticCnv(Common::SeekableReadStream &stream) { byte *buf = (byte*)malloc(rawsize); stream.read(buf, rawsize); - uint32 decsize = width * height; - byte *data = (byte*)calloc(decsize, 1); + Graphics::Surface *cnv = new Graphics::Surface; + cnv->create(width, height, 1); - unpackBitmap(data, buf, 1, bytesPerPlane, height); + unpackBitmap((byte*)cnv->pixels, buf, 1, bytesPerPlane, height); free(buf); - StaticCnv *cnv = new StaticCnv(); - cnv->_width = width; - cnv->_height = height; - cnv->_data0 = data; - cnv->_data1 = NULL; - return cnv; } @@ -1063,21 +1049,21 @@ Script* AmigaDisk_ns::loadScript(const char* name) { return new Script(new DummyArchiveStream(_resArchive), true); } -StaticCnv* AmigaDisk_ns::loadPointer() { +Graphics::Surface* AmigaDisk_ns::loadPointer(const char* name) { debugC(1, kDebugDisk, "AmigaDisk_ns::loadPointer"); Common::File stream; - if (!stream.open("pointer")) - errorFileNotFound("pointer"); + if (!stream.open(name)) + errorFileNotFound(name); return makeStaticCnv(stream); } -StaticCnv* AmigaDisk_ns::loadStatic(const char* name) { +Graphics::Surface* AmigaDisk_ns::loadStatic(const char* name) { debugC(1, kDebugDisk, "AmigaDisk_ns::loadStatic '%s'", name); Common::SeekableReadStream *s = openArchivedFile(name, true); - StaticCnv *cnv = makeStaticCnv(*s); + Graphics::Surface *cnv = makeStaticCnv(*s); delete s; @@ -1186,28 +1172,38 @@ public: }; -void AmigaDisk_ns::loadBackground(const char *name) { +void AmigaDisk_ns::loadBackground(BackgroundInfo& info, const char *name) { Common::SeekableReadStream *s = openArchivedFile(name, true); - Graphics::Surface surf; byte *pal; - BackgroundDecoder decoder(*s, surf, pal, _vm->_gfx->_palettefx); + + BackgroundDecoder decoder(*s, info.bg, pal, _vm->_gfx->_palettefx); decoder.decode(); - for (uint32 i = 0; i < BASE_PALETTE_COLORS * 3; i++) - _vm->_gfx->_palette[i] = pal[i] >> 2; + info.width = info.bg.w; + info.height = info.bg.h; + + byte *p = pal; + for (uint i = 0; i < 32; i++) { + byte r = *p >> 2; + p++; + byte g = *p >> 2; + p++; + byte b = *p >> 2; + p++; + info.palette.setEntry(i, r, g, b); + } + free(pal); - _vm->_gfx->setPalette(_vm->_gfx->_palette); - _vm->_gfx->setBackground(static_cast<byte*>(surf.pixels)); - surf.free(); + delete s; return; } -void AmigaDisk_ns::loadMask(const char *name) { +void AmigaDisk_ns::loadMask(BackgroundInfo& info, const char *name) { debugC(5, kDebugDisk, "AmigaDisk_ns::loadMask(%s)", name); char path[PATH_LEN]; @@ -1236,18 +1232,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); - byte *buf = (byte*)malloc(_vm->_screenMaskSize); - stream.read(buf, _vm->_screenMaskSize); - buildMask(buf); + info.mask.create(info.width, info.height); + stream.read(info.mask.data, info.mask.size); + buildMask(info.mask.data); - _vm->_gfx->setMask(buf); - free(buf); delete s; return; } -void AmigaDisk_ns::loadPath(const char *name) { +void AmigaDisk_ns::loadPath(BackgroundInfo& info, const char *name) { char path[PATH_LEN]; sprintf(path, "%s.path", name); @@ -1260,49 +1254,52 @@ void AmigaDisk_ns::loadPath(const char *name) { s->seek(0x120, SEEK_SET); // HACK: skipping IFF/ILBM header should be done by analysis, not magic Graphics::PackBitsReadStream stream(*s); - byte *buf = (byte*)malloc(_vm->_screenPathSize); - stream.read(buf, _vm->_screenPathSize); - _vm->setPath(buf); - free(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) { +void AmigaDisk_ns::loadScenery(BackgroundInfo& info, 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); + loadBackground(info, filename); if (mask == NULL) { - loadMask(background); - loadPath(background); + loadMask(info, background); + loadPath(info, background); } else { - loadMask(mask); - loadPath(mask); + loadMask(info, mask); + loadPath(info, mask); } return; } -void AmigaDisk_ns::loadSlide(const char *name) { +void AmigaDisk_ns::loadSlide(BackgroundInfo& info, 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); + if (s) - loadBackground(path); + loadBackground(info, path); else - loadBackground(name); + loadBackground(info, name); + + delete s; return; } -Cnv* AmigaDisk_ns::loadFrames(const char* name) { +Frames* AmigaDisk_ns::loadFrames(const char* name) { debugC(1, kDebugDisk, "AmigaDisk_ns::loadFrames '%s'", name); Common::SeekableReadStream *s; @@ -1320,14 +1317,14 @@ Cnv* AmigaDisk_ns::loadFrames(const char* name) { return cnv; } -StaticCnv* AmigaDisk_ns::loadHead(const char* name) { +Graphics::Surface* 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); - StaticCnv *cnv = makeStaticCnv(*s); + Graphics::Surface *cnv = makeStaticCnv(*s); delete s; @@ -1335,7 +1332,7 @@ StaticCnv* AmigaDisk_ns::loadHead(const char* name) { } -Cnv* AmigaDisk_ns::loadObjects(const char *name) { +Frames* AmigaDisk_ns::loadObjects(const char *name) { debugC(1, kDebugDisk, "AmigaDisk_ns::loadObjects"); char path[PATH_LEN]; @@ -1353,7 +1350,7 @@ Cnv* AmigaDisk_ns::loadObjects(const char *name) { } -Cnv* AmigaDisk_ns::loadTalk(const char *name) { +Frames* AmigaDisk_ns::loadTalk(const char *name) { debugC(1, kDebugDisk, "AmigaDisk_ns::loadTalk '%s'", name); Common::SeekableReadStream *s; @@ -1401,13 +1398,7 @@ Table* AmigaDisk_ns::loadTable(const char* name) { stream = &_resArchive; } - Table *t = new Table(100); - - fillBuffers(*stream); - while (scumm_stricmp(_tokens[0], "ENDTABLE")) { - t->addData(_tokens[0]); - fillBuffers(*stream); - } + Table *t = createTableFromStream(100, *stream); if (dispose) delete stream; |