aboutsummaryrefslogtreecommitdiff
path: root/engines/parallaction
diff options
context:
space:
mode:
authorNicola Mettifogo2009-06-12 08:51:05 +0000
committerNicola Mettifogo2009-06-12 08:51:05 +0000
commit36828287ad6041de7c8e98d0fe2979730a8b094f (patch)
treec4ea87c25281a75638a4e64aab367659ae2d4a6a /engines/parallaction
parentb9017519fa1408311199bd0b41c271e35afee02c (diff)
downloadscummvm-rg350-36828287ad6041de7c8e98d0fe2979730a8b094f.tar.gz
scummvm-rg350-36828287ad6041de7c8e98d0fe2979730a8b094f.tar.bz2
scummvm-rg350-36828287ad6041de7c8e98d0fe2979730a8b094f.zip
* Moved the updated IFF code from Parallaction to common/
* Updated Parallaction and SAGA to use the new decoder infrastructure. svn-id: r41465
Diffstat (limited to 'engines/parallaction')
-rw-r--r--engines/parallaction/disk.cpp38
-rw-r--r--engines/parallaction/disk.h6
-rw-r--r--engines/parallaction/disk_br.cpp1
-rw-r--r--engines/parallaction/disk_ns.cpp1
-rw-r--r--engines/parallaction/iff.cpp186
-rw-r--r--engines/parallaction/iff.h206
-rw-r--r--engines/parallaction/module.mk1
7 files changed, 34 insertions, 405 deletions
diff --git a/engines/parallaction/disk.cpp b/engines/parallaction/disk.cpp
index a58fa35655..6928c1eefc 100644
--- a/engines/parallaction/disk.cpp
+++ b/engines/parallaction/disk.cpp
@@ -1,6 +1,30 @@
+/* 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$
+ *
+ */
+
#include "parallaction/disk.h"
#include "parallaction/graphics.h"
-#include "parallaction/iff.h"
namespace Parallaction {
@@ -13,7 +37,7 @@ void ILBMLoader::setupBuffer(uint32 w, uint32 h) {
assert(_surf);
}
_surf->create(w, h, 1);
- _mode = ILBMDecoder::ILBM_UNPACK_PLANES;
+ _mode = Graphics::ILBMDecoder::ILBM_UNPACK_PLANES;
_intBuffer = (byte*)_surf->pixels;
break;
@@ -23,7 +47,7 @@ void ILBMLoader::setupBuffer(uint32 w, uint32 h) {
assert(_maskBuffer);
}
_maskBuffer->create(w, h);
- _mode = ILBMDecoder::ILBM_2_PACK_PLANES;
+ _mode = Graphics::ILBMDecoder::ILBM_2_PACK_PLANES;
_intBuffer = _maskBuffer->data;
break;
@@ -33,7 +57,7 @@ void ILBMLoader::setupBuffer(uint32 w, uint32 h) {
assert(_pathBuffer);
}
_pathBuffer->create(w, h);
- _mode = ILBMDecoder::ILBM_1_PACK_PLANES;
+ _mode = Graphics::ILBMDecoder::ILBM_1_PACK_PLANES;
_intBuffer = _pathBuffer->data;
break;
@@ -43,7 +67,7 @@ void ILBMLoader::setupBuffer(uint32 w, uint32 h) {
}
}
-bool ILBMLoader::callback(IFFChunk &chunk) {
+bool ILBMLoader::callback(Common::IFFChunk &chunk) {
switch (chunk._type) {
case ID_BMHD:
_decoder.loadHeader(chunk._stream);
@@ -77,8 +101,8 @@ bool ILBMLoader::callback(IFFChunk &chunk) {
}
void ILBMLoader::load(Common::ReadStream *in, bool disposeStream) {
- IFFParser parser(in, disposeStream);
- Common::Functor1Mem< IFFChunk&, bool, ILBMLoader > c(this, &ILBMLoader::callback);
+ Common::IFFParser parser(in, disposeStream);
+ Common::Functor1Mem< Common::IFFChunk&, bool, ILBMLoader > c(this, &ILBMLoader::callback);
parser.parse(c);
}
diff --git a/engines/parallaction/disk.h b/engines/parallaction/disk.h
index 936be1e140..a9da429473 100644
--- a/engines/parallaction/disk.h
+++ b/engines/parallaction/disk.h
@@ -33,7 +33,7 @@
#include "common/file.h"
#include "graphics/surface.h"
-#include "parallaction/iff.h"
+#include "graphics/iff.h"
@@ -99,14 +99,14 @@ struct ILBMLoader {
uint32 _mode;
byte* _intBuffer;
uint32 _numCRNG;
- ILBMDecoder _decoder;
+ Graphics::ILBMDecoder _decoder;
ILBMLoader(uint32 bodyMode, byte *palette = 0, PaletteFxRange *crng = 0);
ILBMLoader(Graphics::Surface *surf, byte *palette = 0, PaletteFxRange *crng = 0);
ILBMLoader(MaskBuffer *buffer);
ILBMLoader(PathBuffer *buffer);
- bool callback(IFFChunk &chunk);
+ bool callback(Common::IFFChunk &chunk);
void setupBuffer(uint32 w, uint32 h);
void load(Common::ReadStream *in, bool disposeStream = false);
};
diff --git a/engines/parallaction/disk_br.cpp b/engines/parallaction/disk_br.cpp
index 3572129dc0..46c849e6f2 100644
--- a/engines/parallaction/disk_br.cpp
+++ b/engines/parallaction/disk_br.cpp
@@ -28,7 +28,6 @@
#include "common/config-manager.h"
#include "parallaction/parallaction.h"
#include "parallaction/parser.h"
-#include "parallaction/iff.h"
namespace Parallaction {
diff --git a/engines/parallaction/disk_ns.cpp b/engines/parallaction/disk_ns.cpp
index b002d1e1f5..d35b338069 100644
--- a/engines/parallaction/disk_ns.cpp
+++ b/engines/parallaction/disk_ns.cpp
@@ -23,7 +23,6 @@
*
*/
-#include "parallaction/iff.h"
#include "common/config-manager.h"
#include "parallaction/parser.h"
#include "parallaction/parallaction.h"
diff --git a/engines/parallaction/iff.cpp b/engines/parallaction/iff.cpp
deleted file mode 100644
index 024af5b6a7..0000000000
--- a/engines/parallaction/iff.cpp
+++ /dev/null
@@ -1,186 +0,0 @@
-/* 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$
- *
- */
-
-
-#include "common/iff_container.h"
-#include "common/stream.h"
-#include "common/util.h"
-#include "parallaction/iff.h"
-
-namespace Parallaction {
-
-
-void IFFParser::setInputStream(Common::ReadStream *stream) {
- assert(stream);
- _formChunk.setInputStream(stream);
- _chunk.setInputStream(stream);
-
- _formChunk.readHeader();
- if (_formChunk.id != ID_FORM) {
- error("IFFParser input is not a FORM type IFF file");
- }
- _formSize = _formChunk.size;
- _formType = _formChunk.readUint32BE();
-}
-
-uint32 IFFParser::getFORMSize() const {
- return _formSize;
-}
-
-Common::IFF_ID IFFParser::getFORMType() const {
- return _formType;
-}
-
-void IFFParser::parse(IFFCallback &callback) {
- bool stop;
- do {
- _chunk.feed();
- _formChunk.incBytesRead(_chunk.size);
-
- if (_formChunk.hasReadAll()) {
- break;
- }
-
- _formChunk.incBytesRead(8);
- _chunk.readHeader();
-
- // invoke the callback
- Common::SubReadStream stream(&_chunk, _chunk.size);
- IFFChunk chunk(_chunk.id, _chunk.size, &stream);
- stop = callback(chunk);
-
- // eats up all the remaining data in the chunk
- while (!stream.eos()) {
- stream.readByte();
- }
-
-
- } while (!stop);
-}
-
-
-
-void ILBMDecoder::loadHeader(Common::ReadStream *stream) {
- assert(stream);
- stream->read(&_header, sizeof(_header));
- _header.width = FROM_BE_16(_header.width);
- _header.height = FROM_BE_16(_header.height);
- _header.x = FROM_BE_16(_header.x);
- _header.y = FROM_BE_16(_header.y);
- _header.transparentColor = FROM_BE_16(_header.transparentColor);
- _header.pageWidth = FROM_BE_16(_header.pageWidth);
- _header.pageHeight = FROM_BE_16(_header.pageHeight);
-}
-
-void ILBMDecoder::loadBitmap(uint32 mode, byte *buffer, Common::ReadStream *stream) {
- assert(stream);
- uint32 numPlanes = MIN(mode & ILBM_UNPACK_PLANES, (uint32)_header.depth);
- assert(numPlanes == 1 || numPlanes == 2 || numPlanes == 3 || numPlanes == 4 || numPlanes == 5 || numPlanes == 8);
-
- bool packPixels = (mode & ILBM_PACK_PLANES) != 0;
- if (numPlanes != 1 && numPlanes != 2 && numPlanes != 4) {
- packPixels = false;
- }
-
- uint32 outPitch = _header.width;
- if (packPixels) {
- outPitch /= (8 / numPlanes);
- }
- byte *out = buffer;
-
- switch (_header.pack) {
- case 1: { // PackBits compressed bitmap
- Graphics::PackBitsReadStream packStream(*stream);
-
- // setup a buffer to hold enough data to build a line in the output
- uint32 scanlineWidth = ((_header.width + 15)/16) << 1;
- byte *scanline = new byte[scanlineWidth * _header.depth];
-
- for (uint i = 0; i < _header.height; ++i) {
- byte *s = scanline;
- for (uint32 j = 0; j < _header.depth; ++j) {
- packStream.read(s, scanlineWidth);
- s += scanlineWidth;
- }
-
- planarToChunky(out, outPitch, scanline, scanlineWidth, numPlanes, packPixels);
- out += outPitch;
- }
-
- delete []scanline;
- break;
- }
-
- default:
- // implement other compression types here!
- error("only RLE compressed ILBM files are supported");
- break;
- }
-}
-
-void ILBMDecoder::planarToChunky(byte *out, uint32 outPitch, byte *in, uint32 inWidth, uint32 nPlanes, bool packPlanes) {
- byte pix, ofs, bit;
- byte *s;
-
- uint32 pixels = outPitch;
- if (packPlanes) {
- pixels *= (8 / nPlanes);
- }
-
- for (uint32 x = 0; x < pixels; ++x) {
-
- pix = 0;
- ofs = x >> 3;
- bit = 0x80 >> (x & 7);
-
- // first build a pixel by scanning all the usable planes in the input
- s = in;
- for (uint32 plane = 0; plane < nPlanes; ++plane) {
- if (s[ofs] & bit) {
- pix |= (1 << plane);
- }
- s += inWidth;
- }
-
-
- // then output the pixel according to the requested packing
- if (!packPlanes) {
- out[x] = pix;
- } else
- if (nPlanes == 1) {
- out[x/8] |= (pix << (x & 7));
- } else
- if (nPlanes == 2) {
- out[x/4] |= (pix << ((x & 3) << 1));
- } else
- if (nPlanes == 4) {
- out[x/2] |= (pix << ((x & 1) << 2));
- }
- }
-
-}
-
-
-} // End of namespace Parallaction
diff --git a/engines/parallaction/iff.h b/engines/parallaction/iff.h
deleted file mode 100644
index 98e36e1b00..0000000000
--- a/engines/parallaction/iff.h
+++ /dev/null
@@ -1,206 +0,0 @@
-/* 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 PARALLACTION_IFF_H
-#define PARALLACTION_IFF_H
-
-#include "common/stream.h"
-#include "common/func.h"
-#include "common/iff_container.h" // for IFF chunk names
-#include "graphics/iff.h" // for BMHD
-
-
-namespace Parallaction {
-
-/**
- * Represents a IFF chunk available to client code.
- *
- * Client code must *not* deallocate _stream when done.
- */
-struct IFFChunk {
- Common::IFF_ID _type;
- uint32 _size;
- Common::ReadStream *_stream;
-
- IFFChunk(Common::IFF_ID type, uint32 size, Common::ReadStream *stream) : _type(type), _size(size), _stream(stream) {
- assert(_stream);
- }
-};
-
-/**
- * Parser for IFF containers.
- */
-class IFFParser {
-
- /**
- * This private class implements IFF chunk navigation.
- */
- class IFFChunkNav : public Common::ReadStream {
- protected:
- Common::ReadStream *_input;
- uint32 _bytesRead;
- public:
- Common::IFF_ID id;
- uint32 size;
-
- IFFChunkNav() : _input(0) {
- }
- void setInputStream(Common::ReadStream *input) {
- _input = input;
- size = _bytesRead = 0;
- }
- void incBytesRead(uint32 inc) {
- _bytesRead += inc;
- if (_bytesRead > size) {
- error("Chunk overread");
- }
- }
- void readHeader() {
- id = _input->readUint32BE();
- size = _input->readUint32BE();
- _bytesRead = 0;
- }
- bool hasReadAll() const {
- return (size - _bytesRead) == 0;
- }
- void feed() {
- if (size % 2) {
- size++;
- }
- while (!hasReadAll()) {
- readByte();
- }
- }
- // Common::ReadStream implementation
- bool eos() const { return _input->eos(); }
- bool err() const { return _input->err(); }
- void clearErr() { _input->clearErr(); }
-
- uint32 read(void *dataPtr, uint32 dataSize) {
- incBytesRead(dataSize);
- return _input->read(dataPtr, dataSize);
- }
- };
-
- IFFChunkNav _formChunk; //!< The root chunk of the file.
- IFFChunkNav _chunk; //!< The current chunk.
-
- Common::ReadStream *_stream;
- bool _disposeStream;
-
- void setInputStream(Common::ReadStream *stream);
-
-public:
- IFFParser(Common::ReadStream *stream, bool disposeStream = false) : _stream(stream), _disposeStream(stream) {
- setInputStream(stream);
- }
- ~IFFParser() {
- if (_disposeStream) {
- delete _stream;
- }
- _stream = 0;
- }
-
- /**
- * Returns the IFF FORM type.
- * @return the IFF FORM type of the stream, or 0 if FORM header is not found.
- */
- Common::IFF_ID getFORMType() const;
-
- /**
- * Returns the size of the data.
- * @return the size of the data in file, or -1 if FORM header is not found.
- */
- uint32 getFORMSize() const;
-
- /**
- * Callback type for the parser.
- */
- typedef Common::Functor1< IFFChunk&, bool > IFFCallback;
-
- /**
- * Parse the IFF container, invoking the callback on each chunk encountered.
- * The callback can interrupt the parsing by returning 'true'.
- */
- void parse(IFFCallback &callback);
-
-private:
- uint32 _formSize;
- Common::IFF_ID _formType;
-};
-
-
-
-
-struct ILBMDecoder {
- /**
- * ILBM header data, necessary for loadBitmap()
- */
- Graphics::BMHD _header;
-
- /**
- * Available decoding modes for loadBitmap().
- */
- enum {
- ILBM_UNPACK_PLANES = 0xFF, //!< Decode all bitplanes, and map 1 pixel to 1 byte.
- ILBM_PACK_PLANES = 0x100, //!< Request unpacking, used as a mask with below options.
-
- ILBM_1_PLANES = 1, //!< Decode only the first bitplane, don't pack.
- ILBM_1_PACK_PLANES = ILBM_1_PLANES | ILBM_PACK_PLANES, //!< Decode only the first bitplane, pack 8 pixels in 1 byte.
- ILBM_2_PLANES = 2, //!< Decode first 2 bitplanes, don't pack.
- ILBM_2_PACK_PLANES = ILBM_2_PLANES | ILBM_PACK_PLANES, //!< Decode first 2 bitplanes, pack 4 pixels in 1 byte.
- ILBM_3_PLANES = 3, //!< Decode first 3 bitplanes, don't pack.
- ILBM_4_PLANES = 4, //!< Decode first 4 bitplanes, don't pack.
- ILBM_4_PACK_PLANES = ILBM_4_PLANES | ILBM_PACK_PLANES, //!< Decode first 4 bitplanes, pack 2 pixels in 1 byte.
- ILBM_5_PLANES = 5, //!< Decode first 5 bitplanes, don't pack.
- ILBM_8_PLANES = 8 //!< Decode all 8 bitplanes.
- };
-
- /**
- * Fills the _header member from the given stream.
- */
- void loadHeader(Common::ReadStream *stream);
-
- /**
- * Loads and unpacks the ILBM bitmap data from the stream into the buffer.
- * The functions assumes the buffer is large enough to contain all data.
- * The caller controls how data should be packed by choosing mode from
- * the enum above.
- */
- void loadBitmap(uint32 mode, byte *buffer, Common::ReadStream *stream);
-
- /**
- * Converts from bitplanar to chunky representation. Intended for internal
- * usage, but you can be (ab)use it from client code if you know what you
- * are doing.
- */
- void planarToChunky(byte *out, uint32 width, byte *in, uint32 planeWidth, uint32 nPlanes, bool packPlanes);
-};
-
-
-}
-
-#endif
-
diff --git a/engines/parallaction/module.mk b/engines/parallaction/module.mk
index bd45598d17..d65653cd92 100644
--- a/engines/parallaction/module.mk
+++ b/engines/parallaction/module.mk
@@ -19,7 +19,6 @@ MODULE_OBJS := \
gui.o \
gui_br.o \
gui_ns.o \
- iff.o \
input.o \
inventory.o \
objects.o \