mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-13 21:31:53 +00:00
NEVERHOOD: Start with graphics code (bitmap parsing and rle decompression)
This commit is contained in:
parent
70d20096c1
commit
7d5d5f139f
108
engines/neverhood/graphics.cpp
Normal file
108
engines/neverhood/graphics.cpp
Normal 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
|
45
engines/neverhood/graphics.h
Normal file
45
engines/neverhood/graphics.h
Normal 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 */
|
@ -3,6 +3,7 @@ MODULE := engines/neverhood
|
||||
MODULE_OBJS = \
|
||||
blbarchive.o \
|
||||
detection.o \
|
||||
graphics.o \
|
||||
neverhood.o \
|
||||
resourceman.o
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user