aboutsummaryrefslogtreecommitdiff
path: root/graphics/ilbm.h
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/ilbm.h')
-rw-r--r--graphics/ilbm.h127
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