diff options
author | johndoe123 | 2014-01-30 20:18:55 +0100 |
---|---|---|
committer | johndoe123 | 2014-01-30 20:18:55 +0100 |
commit | cf51529cfd0fedb33b1b0c70beb59997b21cfc5b (patch) | |
tree | 1df30e23c7f1eac7ca4a8ddfba40c89c2577dda7 /graphics/decoders | |
parent | 542197a891eac799855571fe2849e0dca43bdd2b (diff) | |
parent | 462f7c1c24a48b7555316a3afae357bad14cc14b (diff) | |
download | scummvm-rg350-cf51529cfd0fedb33b1b0c70beb59997b21cfc5b.tar.gz scummvm-rg350-cf51529cfd0fedb33b1b0c70beb59997b21cfc5b.tar.bz2 scummvm-rg350-cf51529cfd0fedb33b1b0c70beb59997b21cfc5b.zip |
Merge remote-tracking branch 'origin/master' into bbvs
Diffstat (limited to 'graphics/decoders')
-rw-r--r-- | graphics/decoders/iff.cpp | 6 | ||||
-rw-r--r-- | graphics/decoders/iff.h | 4 | ||||
-rw-r--r-- | graphics/decoders/image_decoder.h | 6 | ||||
-rw-r--r-- | graphics/decoders/png.cpp | 12 | ||||
-rw-r--r-- | graphics/decoders/tga.cpp | 2 | ||||
-rw-r--r-- | graphics/decoders/tga.h | 1 |
6 files changed, 25 insertions, 6 deletions
diff --git a/graphics/decoders/iff.cpp b/graphics/decoders/iff.cpp index 7b37969fc1..fe27258d28 100644 --- a/graphics/decoders/iff.cpp +++ b/graphics/decoders/iff.cpp @@ -30,6 +30,10 @@ namespace Graphics { IFFDecoder::IFFDecoder() { _surface = 0; _palette = 0; + + // these 2 properties are not reset by destroy(), so the default is set here. + _numRelevantPlanes = 8; + _pixelPacking = false; destroy(); } @@ -54,8 +58,6 @@ void IFFDecoder::destroy() { _paletteRanges.clear(); _type = TYPE_UNKNOWN; _paletteColorCount = 0; - _numRelevantPlanes = 8; - _pixelPacking = false; } bool IFFDecoder::loadStream(Common::SeekableReadStream &stream) { diff --git a/graphics/decoders/iff.h b/graphics/decoders/iff.h index beac62e519..37cb4b38c1 100644 --- a/graphics/decoders/iff.h +++ b/graphics/decoders/iff.h @@ -85,6 +85,8 @@ public: /** * The number of planes to decode, also determines the pixel packing if _packPixels is true. * 8 == decode all planes, map 1 pixel in 1 byte. (default, no packing even if _packPixels is true) + * + * NOTE: this property must be reset manually, and is not reset by a call to destroy(). */ void setNumRelevantPlanes(const uint8 numRelevantPlanes) { _numRelevantPlanes = numRelevantPlanes; } @@ -94,6 +96,8 @@ public: * 2 == decode first 2 planes, pack 4 pixels in 1 byte. This makes _surface->w 1/4th of _header.width * 4 == decode first 4 planes, pack 2 pixels in 1 byte. This makes _surface->w half of _header.width * Packed bitmaps won't have a proper surface format since there is no way to tell it to use 1, 2 or 4 bits per pixel + * + * NOTE: this property must be reset manually, and is not reset by a call to destroy(). */ void setPixelPacking(const bool pixelPacking) { _pixelPacking = pixelPacking; } private: diff --git a/graphics/decoders/image_decoder.h b/graphics/decoders/image_decoder.h index 49e31c6e3a..a39a9a1493 100644 --- a/graphics/decoders/image_decoder.h +++ b/graphics/decoders/image_decoder.h @@ -44,6 +44,9 @@ public: /** * Load an image from the specified stream + * + * loadStream() should implicitly call destroy() to free the memory + * of the last loadStream() call. * * @param stream the input stream * @return whether loading the file succeeded @@ -54,6 +57,9 @@ public: /** * Destroy this decoder's surface and palette + * + * This should be called by a loadStream() implementation as well + * as the destructor. */ virtual void destroy() = 0; diff --git a/graphics/decoders/png.cpp b/graphics/decoders/png.cpp index 505475213f..c4fee46fec 100644 --- a/graphics/decoders/png.cpp +++ b/graphics/decoders/png.cpp @@ -38,7 +38,7 @@ namespace Graphics { -PNGDecoder::PNGDecoder() : _outputSurface(0), _palette(0), _paletteColorCount(0) { +PNGDecoder::PNGDecoder() : _outputSurface(0), _palette(0), _paletteColorCount(0), _stream(0) { } PNGDecoder::~PNGDecoder() { @@ -163,7 +163,13 @@ bool PNGDecoder::loadStream(Common::SeekableReadStream &stream) { _outputSurface->create(width, height, Graphics::PixelFormat::createFormatCLUT8()); png_set_packing(pngPtr); } else { - _outputSurface->create(width, height, Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 16, 8, 0)); + bool isAlpha = (colorType & PNG_COLOR_MASK_ALPHA); + if (png_get_valid(pngPtr, infoPtr, PNG_INFO_tRNS)) { + isAlpha = true; + png_set_expand(pngPtr); + } + _outputSurface->create(width, height, Graphics::PixelFormat(4, + 8, 8, 8, isAlpha ? 8 : 0, 24, 16, 8, 0)); if (!_outputSurface->getPixels()) { error("Could not allocate memory for output image."); } @@ -171,8 +177,6 @@ bool PNGDecoder::loadStream(Common::SeekableReadStream &stream) { png_set_strip_16(pngPtr); if (bitDepth < 8) png_set_expand(pngPtr); - if (png_get_valid(pngPtr, infoPtr, PNG_INFO_tRNS)) - png_set_expand(pngPtr); if (colorType == PNG_COLOR_TYPE_GRAY || colorType == PNG_COLOR_TYPE_GRAY_ALPHA) png_set_gray_to_rgb(pngPtr); diff --git a/graphics/decoders/tga.cpp b/graphics/decoders/tga.cpp index a9f136d238..bc27f18a49 100644 --- a/graphics/decoders/tga.cpp +++ b/graphics/decoders/tga.cpp @@ -50,6 +50,8 @@ void TGADecoder::destroy() { } bool TGADecoder::loadStream(Common::SeekableReadStream &tga) { + destroy(); + byte imageType, pixelDepth; bool success; success = readHeader(tga, imageType, pixelDepth); diff --git a/graphics/decoders/tga.h b/graphics/decoders/tga.h index d8ccf8f766..5b1e87d4c5 100644 --- a/graphics/decoders/tga.h +++ b/graphics/decoders/tga.h @@ -26,6 +26,7 @@ /* * TGA decoder used in engines: * - wintermute + * - zvision */ #ifndef GRAPHICS_DECODERS_TGA_H |