diff options
Diffstat (limited to 'graphics/ilbm.h')
-rw-r--r-- | graphics/ilbm.h | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/graphics/ilbm.h b/graphics/ilbm.h index c95dc3504b..7d1f06767b 100644 --- a/graphics/ilbm.h +++ b/graphics/ilbm.h @@ -26,6 +26,133 @@ namespace Graphics { void decodeILBM(Common::ReadStream &input, Surface &surface, byte *&colors); + +typedef uint32 IFF_ID; + +struct Chunk { + IFF_ID id; + uint32 size; + uint32 bytesRead; + Common::ReadStream *_input; + + Chunk(Common::ReadStream *input): _input(input) { + size = bytesRead = 0; + } + + void incBytesRead(uint32 inc) { + bytesRead += inc; + if (bytesRead > size) { + error("Chunk overead"); + } + } + + void readHeader() { + id = _input->readUint32BE(); + size = _input->readUint32BE(); + bytesRead = 0; + } + + bool eos() { + return (size - bytesRead) == 0; + } + + void feed() { + if (size % 2) { + size++; + } + while (!_input->eos() && !eos()) { + readByte(); + } + } + + byte readByte() { + incBytesRead(1); + return _input->readByte(); + } + + int8 readSByte() { + incBytesRead(1); + return _input->readSByte(); + } + + uint16 readUint16() { + incBytesRead(2); + return _input->readUint16BE(); + } + + uint32 readUint32() { + incBytesRead(4); + return _input->readUint32BE(); + } + + int16 readSint16() { + return (int16)readUint16(); + } + + int32 readSint32() { + return (int32)readUint32(); + } +}; + + +struct BMHD { + uint16 width, height; + uint16 x, y; + byte depth; + byte masking; + byte pack; + byte flags; + uint16 transparentColor; + byte xAspect, yAspect; + uint16 pageWidth, pageHeight; + BMHD() { + memset(this, 0, sizeof(*this)); + } +}; + + + +class IFFDecoder { + +protected: + Chunk _formChunk; + Chunk _chunk; + + IFF_ID _typeId; + BMHD _bitmapHeader; + uint32 _colorCount; + + Surface *_surface; + byte *_colors; + + virtual bool isTypeSupported(IFF_ID type) = 0; + virtual void readBODY() = 0; + + virtual void readBMHD(); + virtual void readCMAP(); + +public: + IFFDecoder(Common::ReadStream &input); + virtual ~IFFDecoder(); + + virtual void decode(Surface &surface, byte *&colors); + +}; + + + +class PBMDecoder : public IFFDecoder { + +protected: + bool isTypeSupported(IFF_ID type); + void readBody(); + +public: + PBMDecoder(Common::ReadStream &input); + ~PBMDecoder(); + +}; + } // End of namespace Graphics #endif |