diff options
author | Matthew Hoops | 2014-02-27 21:27:24 -0500 |
---|---|---|
committer | Matthew Hoops | 2014-02-28 00:31:59 -0500 |
commit | 0f07f85a948e39c286b0bbd9e9191d517108c2da (patch) | |
tree | 4a851be91c6a64cf085b053cee8cc031d4a526bf | |
parent | 08ea14a8d0e1a1478d1f486edeecea3e619e0cd0 (diff) | |
download | scummvm-rg350-0f07f85a948e39c286b0bbd9e9191d517108c2da.tar.gz scummvm-rg350-0f07f85a948e39c286b0bbd9e9191d517108c2da.tar.bz2 scummvm-rg350-0f07f85a948e39c286b0bbd9e9191d517108c2da.zip |
IMAGE: Split raw bitmap decoding into a Codec
-rw-r--r-- | image/bmp.cpp | 82 | ||||
-rw-r--r-- | image/bmp.h | 5 | ||||
-rw-r--r-- | image/codecs/bmp_raw.cpp | 113 | ||||
-rw-r--r-- | image/codecs/bmp_raw.h | 52 | ||||
-rw-r--r-- | image/module.mk | 1 |
5 files changed, 186 insertions, 67 deletions
diff --git a/image/bmp.cpp b/image/bmp.cpp index 113e268956..eb8e300daf 100644 --- a/image/bmp.cpp +++ b/image/bmp.cpp @@ -23,9 +23,11 @@ #include "image/bmp.h" #include "common/stream.h" +#include "common/substream.h" #include "common/textconsole.h" #include "graphics/pixelformat.h" #include "graphics/surface.h" +#include "image/codecs/bmp_raw.h" namespace Image { @@ -33,6 +35,7 @@ BitmapDecoder::BitmapDecoder() { _surface = 0; _palette = 0; _paletteColorCount = 0; + _codec = 0; } BitmapDecoder::~BitmapDecoder() { @@ -40,13 +43,15 @@ BitmapDecoder::~BitmapDecoder() { } void BitmapDecoder::destroy() { - if (_surface) { - _surface->free(); - delete _surface; _surface = 0; - } + _surface = 0; + + delete[] _palette; + _palette = 0; - delete[] _palette; _palette = 0; _paletteColorCount = 0; + + delete _codec; + _codec = 0; } bool BitmapDecoder::loadStream(Common::SeekableReadStream &stream) { @@ -95,7 +100,7 @@ bool BitmapDecoder::loadStream(Common::SeekableReadStream &stream) { return false; } - /* uint32 imageSize = */ stream.readUint32LE(); + uint32 imageSize = stream.readUint32LE(); /* uint32 pixelsPerMeterX = */ stream.readUint32LE(); /* uint32 pixelsPerMeterY = */ stream.readUint32LE(); _paletteColorCount = stream.readUint32LE(); @@ -115,67 +120,12 @@ bool BitmapDecoder::loadStream(Common::SeekableReadStream &stream) { } } - // Start us at the beginning of the image - stream.seek(imageOffset); - - Graphics::PixelFormat format = Graphics::PixelFormat::createFormatCLUT8(); - - // BGRA for 24bpp and 32 bpp - if (bitsPerPixel == 24 || bitsPerPixel == 32) - format = Graphics::PixelFormat(4, 8, 8, 8, 8, 8, 16, 24, 0); - - _surface = new Graphics::Surface(); - _surface->create(width, height, format); + // Grab the frame data + Common::SeekableSubReadStream subStream(&stream, imageOffset, imageOffset + imageSize); - int srcPitch = width * (bitsPerPixel >> 3); - const int extraDataLength = (srcPitch % 4) ? 4 - (srcPitch % 4) : 0; - - if (bitsPerPixel == 8) { - byte *dst = (byte *)_surface->getPixels(); - - for (int32 i = 0; i < height; i++) { - stream.read(dst + (height - i - 1) * width, width); - stream.skip(extraDataLength); - } - } else if (bitsPerPixel == 24) { - byte *dst = (byte *)_surface->getBasePtr(0, height - 1); - - for (int32 i = 0; i < height; i++) { - for (uint32 j = 0; j < width; j++) { - byte b = stream.readByte(); - byte g = stream.readByte(); - byte r = stream.readByte(); - uint32 color = format.RGBToColor(r, g, b); - - *((uint32 *)dst) = color; - dst += format.bytesPerPixel; - } - - stream.skip(extraDataLength); - dst -= _surface->pitch * 2; - } - } else { // 32 bpp - byte *dst = (byte *)_surface->getBasePtr(0, height - 1); - - for (int32 i = 0; i < height; i++) { - for (uint32 j = 0; j < width; j++) { - byte b = stream.readByte(); - byte g = stream.readByte(); - byte r = stream.readByte(); - // Ignore the last byte, as in v3 it is unused - // and should thus NOT be used as alpha. - // ref: http://msdn.microsoft.com/en-us/library/windows/desktop/dd183376%28v=vs.85%29.aspx - stream.readByte(); - uint32 color = format.RGBToColor(r, g, b); - - *((uint32 *)dst) = color; - dst += format.bytesPerPixel; - } - - stream.skip(extraDataLength); - dst -= _surface->pitch * 2; - } - } + // We only support raw bitmaps for now + _codec = new BitmapRawDecoder(width, height, bitsPerPixel); + _surface = _codec->decodeFrame(subStream); return true; } diff --git a/image/bmp.h b/image/bmp.h index bc4cfc3edd..b482cc674b 100644 --- a/image/bmp.h +++ b/image/bmp.h @@ -45,6 +45,8 @@ struct Surface; namespace Image { +class Codec; + class BitmapDecoder : public ImageDecoder { public: BitmapDecoder(); @@ -58,7 +60,8 @@ public: uint16 getPaletteColorCount() const { return _paletteColorCount; } private: - Graphics::Surface *_surface; + Codec *_codec; + const Graphics::Surface *_surface; byte *_palette; uint16 _paletteColorCount; }; diff --git a/image/codecs/bmp_raw.cpp b/image/codecs/bmp_raw.cpp new file mode 100644 index 0000000000..83aedc84e6 --- /dev/null +++ b/image/codecs/bmp_raw.cpp @@ -0,0 +1,113 @@ +/* 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. + * + */ + +#include "image/codecs/bmp_raw.h" + +#include "common/stream.h" +#include "common/textconsole.h" +#include "graphics/surface.h" + +namespace Image { + +BitmapRawDecoder::BitmapRawDecoder(int width, int height, int bitsPerPixel) : Codec(), + _surface(0), _width(width), _height(height), _bitsPerPixel(bitsPerPixel) { +} + +BitmapRawDecoder::~BitmapRawDecoder() { + if (_surface) { + _surface->free(); + delete _surface; + } +} + +const Graphics::Surface *BitmapRawDecoder::decodeFrame(Common::SeekableReadStream &stream) { + Graphics::PixelFormat format = getPixelFormat(); + + _surface = new Graphics::Surface(); + _surface->create(_width, _height, format); + + int srcPitch = _width * (_bitsPerPixel >> 3); + const int extraDataLength = (srcPitch % 4) ? 4 - (srcPitch % 4) : 0; + + if (_bitsPerPixel == 8) { + byte *dst = (byte *)_surface->getPixels(); + + for (int i = 0; i < _height; i++) { + stream.read(dst + (_height - i - 1) * _width, _width); + stream.skip(extraDataLength); + } + } else if (_bitsPerPixel == 24) { + byte *dst = (byte *)_surface->getBasePtr(0, _height - 1); + + for (int i = 0; i < _height; i++) { + for (int j = 0; j < _width; j++) { + byte b = stream.readByte(); + byte g = stream.readByte(); + byte r = stream.readByte(); + uint32 color = format.RGBToColor(r, g, b); + + *((uint32 *)dst) = color; + dst += format.bytesPerPixel; + } + + stream.skip(extraDataLength); + dst -= _surface->pitch * 2; + } + } else { // 32 bpp + byte *dst = (byte *)_surface->getBasePtr(0, _height - 1); + + for (int i = 0; i < _height; i++) { + for (int j = 0; j < _width; j++) { + byte b = stream.readByte(); + byte g = stream.readByte(); + byte r = stream.readByte(); + // Ignore the last byte, as in v3 it is unused + // and should thus NOT be used as alpha. + // ref: http://msdn.microsoft.com/en-us/library/windows/desktop/dd183376%28v=vs.85%29.aspx + stream.readByte(); + uint32 color = format.RGBToColor(r, g, b); + + *((uint32 *)dst) = color; + dst += format.bytesPerPixel; + } + + stream.skip(extraDataLength); + dst -= _surface->pitch * 2; + } + } + + return _surface; +} + +Graphics::PixelFormat BitmapRawDecoder::getPixelFormat() const { + switch (_bitsPerPixel) { + case 8: + return Graphics::PixelFormat::createFormatCLUT8(); + case 24: + case 32: + return Graphics::PixelFormat(4, 8, 8, 8, 8, 8, 16, 24, 0); + } + + error("Unhandled BMP raw %dbpp", _bitsPerPixel); +} + +} // End of namespace Image diff --git a/image/codecs/bmp_raw.h b/image/codecs/bmp_raw.h new file mode 100644 index 0000000000..d589d7ef22 --- /dev/null +++ b/image/codecs/bmp_raw.h @@ -0,0 +1,52 @@ +/* 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. + * + */ + +#ifndef IMAGE_CODECS_BMP_RAW_H +#define IMAGE_CODECS_BMP_RAW_H + +#include "image/codecs/codec.h" + +namespace Image { + +/** + * Bitmap raw image decoder. + * + * Used in image: + * - BitmapDecoder + */ +class BitmapRawDecoder : public Codec { +public: + BitmapRawDecoder(int width, int height, int bitsPerPixel); + ~BitmapRawDecoder(); + + const Graphics::Surface *decodeFrame(Common::SeekableReadStream &stream); + Graphics::PixelFormat getPixelFormat() const; + +private: + Graphics::Surface *_surface; + int _width, _height; + int _bitsPerPixel; +}; + +} // End of namespace Image + +#endif diff --git a/image/module.mk b/image/module.mk index 46129cbde4..ab0a2a9a1f 100644 --- a/image/module.mk +++ b/image/module.mk @@ -8,6 +8,7 @@ MODULE_OBJS := \ pict.o \ png.o \ tga.o \ + codecs/bmp_raw.o \ codecs/cdtoons.o \ codecs/cinepak.o \ codecs/indeo3.o \ |