NEVERHOOD: Start with graphics code (bitmap parsing and rle decompression)

This commit is contained in:
johndoe123 2011-06-24 23:25:01 +00:00 committed by Willem Jan Palenstijn
parent 70d20096c1
commit 7d5d5f139f
5 changed files with 195 additions and 12 deletions

View File

@ -0,0 +1,108 @@
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#include "neverhood/graphics.h"
namespace Neverhood {
void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NUnknown *unknown, byte **palette, byte **pixels) {
uint16 flags;
flags = READ_LE_UINT16(sprite);
sprite += 2;
if (rle)
*rle = flags & 1;
if (flags & 2) {
if (dimensions) {
dimensions->width = READ_LE_UINT16(sprite);
dimensions->height = READ_LE_UINT16(sprite + 2);
}
sprite += 4;
} else if (dimensions) {
dimensions->width = 1;
dimensions->height = 1;
}
if (flags & 4) {
if (unknown) {
unknown->unk1 = READ_LE_UINT16(sprite);
unknown->unk2 = READ_LE_UINT16(sprite + 2);
}
sprite += 4;
} else if (unknown) {
unknown->unk1 = 0;
unknown->unk2 = 0;
}
if (flags & 8) {
if (palette)
*palette = sprite;
sprite += 1024;
} else if (palette)
*palette = NULL;
if (flags & 0x10) {
if (pixels)
*pixels = sprite;
} else if (pixels)
*pixels = NULL;
}
void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY) {
// TODO: Flip
int16 rows, chunks;
int16 skip, copy;
rows = READ_LE_UINT16(source);
chunks = READ_LE_UINT16(source + 2);
source += 4;
do {
if (chunks == 0) {
dest += rows * destPitch;
} else {
while (rows-- > 0) {
uint16 rowChunks = chunks;
while (rowChunks-- > 0) {
skip = READ_LE_UINT16(source);
copy = READ_LE_UINT16(source + 2);
source += 4;
memcpy(dest + skip, source, copy);
source += copy;
}
dest += destPitch;
}
}
rows = READ_LE_UINT16(source);
chunks = READ_LE_UINT16(source + 2);
source += 4;
} while (rows > 0);
}
} // End of namespace Neverhood

View File

@ -0,0 +1,45 @@
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#ifndef NEVERHOOD_GRAPHICS_H
#define NEVERHOOD_GRAPHICS_H
#include "common/array.h"
#include "common/file.h"
#include "neverhood/neverhood.h"
namespace Neverhood {
struct NDimensions {
int16 width, height;
};
struct NUnknown {
int16 unk1, unk2;
};
void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NUnknown *unknown, byte **palette, byte **pixels);
void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY);
} // End of namespace Neverhood
#endif /* NEVERHOOD_GRAPHICS_H */

View File

@ -3,6 +3,7 @@ MODULE := engines/neverhood
MODULE_OBJS = \
blbarchive.o \
detection.o \
graphics.o \
neverhood.o \
resourceman.o

View File

@ -38,6 +38,7 @@
#include "neverhood/neverhood.h"
#include "neverhood/blbarchive.h"
#include "neverhood/graphics.h"
#include "neverhood/resourceman.h"
namespace Neverhood {
@ -68,26 +69,50 @@ Common::Error NeverhoodEngine::run() {
_isSaveAllowed = false;
_res = new ResourceMan();
_res->addArchive("a.blb");
_res->addArchive("c.blb");
_res->addArchive("hd.blb");
_res->addArchive("i.blb");
_res->addArchive("m.blb");
_res->addArchive("s.blb");
_res->addArchive("t.blb");
#if 0
BlbArchive *blb = new BlbArchive();
blb->open("m.blb");
delete blb;
#endif
#if 1
ResourceMan *res = new ResourceMan();
res->addArchive("a.blb");
res->addArchive("c.blb");
res->addArchive("hd.blb");
res->addArchive("i.blb");
res->addArchive("m.blb");
res->addArchive("s.blb");
res->addArchive("t.blb");
ResourceFileEntry *r = res->findEntry(0x50A80517);
#if 0
ResourceFileEntry *r = _res->findEntry(0x50A80517);
#endif
#if 0
int resourceHandle = _res->useResource(0x0CA04202);
debug("resourceHandle = %d", resourceHandle);
byte *data = _res->loadResource(resourceHandle);
bool rle;
NDimensions dimensions;
NUnknown unknown;
byte *palette, *pixels;
parseBitmapResource(data, &rle, &dimensions, &unknown, &palette, &pixels);
debug("%d, %d", dimensions.width, dimensions.height);
byte *rawpixels = new byte[dimensions.width * dimensions.height];
memset(rawpixels, 0, dimensions.width * dimensions.height);
debug("rle = %d", rle);
unpackSpriteRle(pixels, dimensions.width, dimensions.height, rawpixels, dimensions.width, false, false);
Common::DumpFile d;
d.open("dump.0");
d.write(rawpixels, dimensions.width * dimensions.height);
d.close();
delete[] rawpixels;
_res->unloadResource(resourceHandle);
_res->unuseResource(resourceHandle);
#endif
delete _res;
return Common::kNoError;
}

View File

@ -43,6 +43,8 @@ enum NeverhoodGameFeatures {
struct NeverhoodGameDescription;
class ResourceMan;
class NeverhoodEngine : public ::Engine {
protected:
@ -66,6 +68,8 @@ public:
Common::KeyCode _keyState;
uint16 _buttonState;
ResourceMan *_res;
void updateEvents();
public: