scummvm/engines/m4/assets.h

185 lines
5.1 KiB
C
Raw Normal View History

/* 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.
*
* $URL$
* $Id$
*
*/
#ifndef M4_ASSETS_H
#define M4_ASSETS_H
#include "common/scummsys.h"
#include "common/stream.h"
#include "m4/sprite.h"
namespace M4 {
// Sequence chunks
#define CHUNK_SCEN MKID_BE('SCEN')
#define CHUNK_MACH MKID_BE('MACH')
#define CHUNK_SEQU MKID_BE('SEQU')
#define CHUNK_DATA MKID_BE('DATA')
#define CHUNK_CELS MKID_BE('CELS')
// Sprite chunks
#define HEAD_M4SS MKID_BE('M4SS') //'M4SS'
#define CELS__PAL MKID_BE(' PAL') //' PAL'
#define CELS___SS MKID_BE(' SS') //' SS'
class M4Engine;
class BaseAsset {
public:
BaseAsset(M4Engine *vm, Common::SeekableReadStream* stream, int size, const char *name);
~BaseAsset();
const Common::String getName() const { return _name; }
protected:
M4Engine *_vm;
Common::String _name;
};
class MachineAsset : public BaseAsset {
public:
MachineAsset(M4Engine *vm, Common::SeekableReadStream* stream, int size, const char *name);
~MachineAsset();
void getCode(byte *&code, uint32 &codeSize);
uint32 getStateOffset(uint32 state);
protected:
Common::Array<uint32> _stateTable;
byte *_code;
uint32 _codeSize;
};
class SequenceAsset : public BaseAsset {
public:
SequenceAsset(M4Engine *vm, Common::SeekableReadStream* stream, int size, const char *name);
~SequenceAsset();
void getCode(byte *&code, uint32 &codeSize);
int localVarCount() const { return _localVarCount; }
protected:
int _localVarCount;
byte *_code;
uint32 _codeSize;
};
class DataAsset : public BaseAsset {
public:
DataAsset(M4Engine *vm, Common::SeekableReadStream* stream, int size, const char *name);
~DataAsset();
int getCount() const { return _recCount; }
long *getRow(int index);
protected:
long *_data;
uint32 _recSize, _dataSize;
int _recCount;
};
struct SpriteAssetFrame {
uint32 stream;
int x, y, w, h;
uint32 comp;
M4Sprite *frame;
};
class SpriteAsset : public BaseAsset {
public:
SpriteAsset(M4Engine *vm, Common::SeekableReadStream* stream, int size, const char *name, bool asStream = false);
~SpriteAsset();
void loadM4SpriteAsset(M4Engine *vm, Common::SeekableReadStream* stream, bool asStream);
void loadMadsSpriteAsset(M4Engine *vm, Common::SeekableReadStream* stream);
int32 getCount() { return _frameCount; }
int32 getFrameRate() const { return _frameRate; }
int32 getPixelSpeed() const { return _pixelSpeed; }
int32 getFrameWidth(int index);
int32 getFrameHeight(int index);
int32 getMaxFrameWidth() const { return _maxWidth; }
int32 getMaxFrameHeight() const { return _maxHeight; }
M4Sprite *getFrame(int frameIndex);
void loadStreamingFrame(M4Sprite *frame, int frameIndex, int destX, int destY);
RGB8* getPalette() { return _palette; }
int getColorCount() { return _colorCount; }
RGBList *getRgbList();
void translate(RGBList *list, bool isTransparent = false);
int32 getFrameSize(int index);
M4Sprite *operator[](int index) { return getFrame(index); }
protected:
RGB8 _palette[256];
uint32 _colorCount;
uint32 _srcSize;
int32 _frameRate, _pixelSpeed;
int _maxWidth, _maxHeight;
int _frameCount;
Common::Array<uint32> _frameOffsets;
Common::Array<SpriteAssetFrame> _frames;
uint32 _frameStartOffset;
Common::SeekableReadStream *_stream;
int32 parseSprite(bool isBigEndian = false);
void loadFrameHeader(SpriteAssetFrame &frameHeader, bool isBigEndian = false);
};
enum AssetType {
kAssetTypeMACH,
kAssetTypeSEQU,
kAssetTypeDATA,
kAssetTypeCELS
};
enum CallbackHandlers {
kCallbackTriggerDispatch
};
class AssetManager {
public:
AssetManager(M4Engine *vm);
~AssetManager();
bool clearAssets(AssetType assetType, int32 minHash, int32 maxHash);
bool loadAsset(const char *assetName, RGB8 *palette);
int32 addSpriteAsset(const char *assetName, int32 hash, RGB8 *palette);
// TODO: Move to Palette class
void restorePalette(RGB8 *palette, byte *data);
MachineAsset *getMachine(int32 hash);
SequenceAsset *getSequence(int32 hash);
DataAsset *getData(int32 hash);
SpriteAsset *getSprite(int32 hash);
M4Sprite *getSpriteFrame(int32 hash, int frameIndex);
int32 getSpriteFrameCount(int32 hash);
protected:
// TODO: Check if we need _vm
M4Engine *_vm;
MachineAsset *_MACH[256];
SequenceAsset *_SEQU[256];
DataAsset *_DATA[256];
SpriteAsset *_CELS[256];
void convertAssetToLE(byte *assetData, uint32 assetSize);
};
} // End of namespace M4
#endif