diff options
Diffstat (limited to 'common/iff_container.h')
-rw-r--r-- | common/iff_container.h | 228 |
1 files changed, 228 insertions, 0 deletions
diff --git a/common/iff_container.h b/common/iff_container.h new file mode 100644 index 0000000000..730163254f --- /dev/null +++ b/common/iff_container.h @@ -0,0 +1,228 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2006 The ScummVM project + * + * 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 COMMON_IFF_CONTAINER_H +#define COMMON_IFF_CONTAINER_H + +#include "common/stdafx.h" +#include "common/scummsys.h" +#include "common/endian.h" +#include "common/stream.h" +#include "common/util.h" + +namespace Common { + +typedef uint32 IFF_ID; + +#define ID_FORM MKID_BE('FORM') +/* EA IFF 85 group identifier */ +#define ID_CAT MKID_BE('CAT ') +/* EA IFF 85 group identifier */ +#define ID_LIST MKID_BE('LIST') +/* EA IFF 85 group identifier */ +#define ID_PROP MKID_BE('PROP') +/* EA IFF 85 group identifier */ +#define ID_END MKID_BE('END ') +/* unofficial END-of-FORM identifier (see Amiga RKM Devices Ed.3 +page 376) */ +#define ID_ILBM MKID_BE('ILBM') +/* EA IFF 85 raster bitmap form */ +#define ID_DEEP MKID_BE('DEEP') +/* Chunky pixel image files (Used in TV Paint) */ +#define ID_RGB8 MKID_BE('RGB8') +/* RGB image forms, Turbo Silver (Impulse) */ +#define ID_RGBN MKID_BE('RGBN') +/* RGB image forms, Turbo Silver (Impulse) */ +#define ID_PBM MKID_BE('PBM ') +/* 256-color chunky format (DPaint 2 ?) */ +#define ID_ACBM MKID_BE('ACBM') +/* Amiga Contiguous Bitmap (AmigaBasic) */ +#define ID_8SVX MKID_BE('8SVX') +/* Amiga 8 bits voice */ + +/* generic */ + +#define ID_FVER MKID_BE('FVER') +/* AmigaOS version string */ +#define ID_JUNK MKID_BE('JUNK') +/* always ignore this chunk */ +#define ID_ANNO MKID_BE('ANNO') +/* EA IFF 85 Generic Annotation chunk */ +#define ID_AUTH MKID_BE('AUTH') +/* EA IFF 85 Generic Author chunk */ +#define ID_CHRS MKID_BE('CHRS') +/* EA IFF 85 Generic character string chunk */ +#define ID_NAME MKID_BE('NAME') +/* EA IFF 85 Generic Name of art, music, etc. chunk */ +#define ID_TEXT MKID_BE('TEXT') +/* EA IFF 85 Generic unformatted ASCII text chunk */ +#define ID_copy MKID_BE('(c) ') +/* EA IFF 85 Generic Copyright text chunk */ + +/* ILBM chunks */ + +#define ID_BMHD MKID_BE('BMHD') +/* ILBM BitmapHeader */ +#define ID_CMAP MKID_BE('CMAP') +/* ILBM 8bit RGB colormap */ +#define ID_GRAB MKID_BE('GRAB') +/* ILBM "hotspot" coordiantes */ +#define ID_DEST MKID_BE('DEST') +/* ILBM destination image info */ +#define ID_SPRT MKID_BE('SPRT') +/* ILBM sprite identifier */ +#define ID_CAMG MKID_BE('CAMG') +/* Amiga viewportmodes */ +#define ID_BODY MKID_BE('BODY') +/* ILBM image data */ +#define ID_CRNG MKID_BE('CRNG') +/* color cycling */ +#define ID_CCRT MKID_BE('CCRT') +/* color cycling */ +#define ID_CLUT MKID_BE('CLUT') +/* Color Lookup Table chunk */ +#define ID_DPI MKID_BE('DPI ') +/* Dots per inch chunk */ +#define ID_DPPV MKID_BE('DPPV') +/* DPaint perspective chunk (EA) */ +#define ID_DRNG MKID_BE('DRNG') +/* DPaint IV enhanced color cycle chunk (EA) */ +#define ID_EPSF MKID_BE('EPSF') +/* Encapsulated Postscript chunk */ +#define ID_CMYK MKID_BE('CMYK') +/* Cyan, Magenta, Yellow, & Black color map (Soft-Logik) */ +#define ID_CNAM MKID_BE('CNAM') +/* Color naming chunk (Soft-Logik) */ +#define ID_PCHG MKID_BE('PCHG') +/* Line by line palette control information (Sebastiano Vigna) */ +#define ID_PRVW MKID_BE('PRVW') +/* A mini duplicate ILBM used for preview (Gary Bonham) */ +#define ID_XBMI MKID_BE('XBMI') +/* eXtended BitMap Information (Soft-Logik) */ +#define ID_CTBL MKID_BE('CTBL') +/* Newtek Dynamic Ham color chunk */ +#define ID_DYCP MKID_BE('DYCP') +/* Newtek Dynamic Ham chunk */ +#define ID_SHAM MKID_BE('SHAM') +/* Sliced HAM color chunk */ +#define ID_ABIT MKID_BE('ABIT') +/* ACBM body chunk */ +#define ID_DCOL MKID_BE('DCOL') +/* unofficial direct color */ +#define ID_DPPS MKID_BE('DPPS') +/* ? */ +#define ID_TINY MKID_BE('TINY') +/* ? */ +#define ID_DPPV MKID_BE('DPPV') +/* ? */ + +/* 8SVX chunks */ + +#define ID_VHDR MKID_BE('VHDR') +/* 8SVX Voice8Header */ + + +char * ID2string(Common::IFF_ID id); + + +class IFFChunk : public Common::ReadStream { + +protected: + Common::ReadStream *_input; + uint32 bytesRead; + +public: + IFF_ID id; + uint32 size; + + IFFChunk(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; + } + + void feed() { + if (size % 2) { + size++; + } + while (!_input->eos() && !eos()) { + readByte(); + } + } + + // Common::ReadStream implementation + bool eos() const { + return (size - bytesRead) == 0; + } + + uint32 read(void *dataPtr, uint32 dataSize) { + incBytesRead(dataSize); + return _input->read(dataPtr, dataSize); + } + +}; + +class IFFParser { +public: + IFFParser(Common::ReadStream &input) : _formChunk(&input), _chunk(&input) { + _formChunk.readHeader(); + if (_formChunk.id != ID_FORM) { + error("IFFDecoder input is not a FORM type IFF file"); + } + _typeId = _formChunk.readUint32BE(); + } + + virtual ~IFFParser() {} + + IFFChunk *nextChunk() { + _chunk.feed(); + _formChunk.incBytesRead(_chunk.size); + + if (_formChunk.eos()) + return 0; + + _formChunk.incBytesRead(8); + _chunk.readHeader(); + + return &_chunk; + } + + IFF_ID _typeId; + +protected: + IFFChunk _formChunk; + IFFChunk _chunk; +}; + +} // namespace Common + +#endif |