aboutsummaryrefslogtreecommitdiff
path: root/graphics/video/codecs/msrle.cpp
diff options
context:
space:
mode:
authorMatthew Hoops2010-02-05 03:29:04 +0000
committerMatthew Hoops2010-02-05 03:29:04 +0000
commit19d3f5ad9b9af7b1f03db35ca97aefef9010acf4 (patch)
tree92137f0a6097b3cfcec34e91f9336e7057de0b06 /graphics/video/codecs/msrle.cpp
parent0d85b3946876f54acd1c6953461780c128f292e3 (diff)
downloadscummvm-rg350-19d3f5ad9b9af7b1f03db35ca97aefef9010acf4.tar.gz
scummvm-rg350-19d3f5ad9b9af7b1f03db35ca97aefef9010acf4.tar.bz2
scummvm-rg350-19d3f5ad9b9af7b1f03db35ca97aefef9010acf4.zip
Have SCI look through the patches directory (except in KQ6 where the patches in that directory are broken) to fix some GK1 Windows problems. Add the MSRLE codec to AVI (from DrMcCoy's Dark Seed II engine, with permission). GK1 Windows now will play the credits video.
svn-id: r47894
Diffstat (limited to 'graphics/video/codecs/msrle.cpp')
-rw-r--r--graphics/video/codecs/msrle.cpp133
1 files changed, 133 insertions, 0 deletions
diff --git a/graphics/video/codecs/msrle.cpp b/graphics/video/codecs/msrle.cpp
new file mode 100644
index 0000000000..64099430d3
--- /dev/null
+++ b/graphics/video/codecs/msrle.cpp
@@ -0,0 +1,133 @@
+/* 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$
+ *
+ */
+
+// Based off ffmpeg's msrledec.c
+
+#include "graphics/video/codecs/msrle.h"
+
+namespace Graphics {
+
+MSRLEDecoder::MSRLEDecoder(uint16 width, uint16 height, byte bitsPerPixel) {
+ _surface = new Graphics::Surface();
+ _surface->create(width, height, 1);
+ _bitsPerPixel = bitsPerPixel;
+}
+
+MSRLEDecoder::~MSRLEDecoder() {
+ _surface->free();
+ delete _surface;
+}
+
+Surface *MSRLEDecoder::decodeImage(Common::SeekableReadStream *stream) {
+ if (_bitsPerPixel == 8) {
+ decode8(stream);
+ } else
+ error("Unhandled %d bit Microsoft RLE encoding", _bitsPerPixel);
+
+ return _surface;
+}
+
+void MSRLEDecoder::decode8(Common::SeekableReadStream *stream) {
+
+ int x = 0;
+ int y = _surface->h - 1;
+
+ byte *data = (byte *) _surface->pixels;
+ uint16 width = _surface->w;
+ uint16 height = _surface->h;
+
+ byte *output = data + ((height - 1) * width);
+ byte *output_end = data + ((height) * width);
+
+ while (!stream->eos()) {
+ byte count = stream->readByte();
+ byte value = stream->readByte();
+
+ if (count == 0) {
+ if (value == 0) {
+ // End of line
+
+ x = 0;
+ y--;
+ output = data + (y * width);
+
+ if (y < 0) {
+ warning("Next line is beyond picture bounds");
+ return;
+ }
+
+ } else if (value == 1) {
+ // End of image
+
+ return;
+ } else if (value == 2) {
+ // Skip
+
+ count = stream->readByte();
+ value = stream->readByte();
+
+ y -= value;
+ x += count;
+
+ if (y < 0) {
+ warning("Skip beyond picture bounds");
+ return;
+ }
+
+ output = data + ((y * width) + x);
+
+ } else {
+ // Copy data
+
+ if (output + value > output_end) {
+ stream->skip(value);
+ continue;
+ }
+
+ for (int i = 0; i < value; i++)
+ *output++ = stream->readByte();
+
+ if (value & 1)
+ stream->skip(1);
+
+ x += value;
+ }
+
+ } else {
+ // Run data
+
+ if (output + count > output_end)
+ continue;
+
+ for (int i = 0; i < count; i++, x++)
+ *output++ = value;
+ }
+
+ }
+
+ warning("No end-of-picture code");
+}
+
+} // End of namespace Graphics