diff options
| author | Matthew Hoops | 2012-03-20 14:18:57 -0400 | 
|---|---|---|
| committer | Matthew Hoops | 2012-03-20 14:49:16 -0400 | 
| commit | 71756bdf4eae5ba9cc3f329b85e894f04640aaef (patch) | |
| tree | 40d464262da107ab5eed82f198685209161ebac1 /graphics/surface.cpp | |
| parent | 03eba05b09e5c9e5a351f8111185934b92a3fed3 (diff) | |
| parent | 3c3576a224b92c703b4e8ea20008ac8a069980dd (diff) | |
| download | scummvm-rg350-71756bdf4eae5ba9cc3f329b85e894f04640aaef.tar.gz scummvm-rg350-71756bdf4eae5ba9cc3f329b85e894f04640aaef.tar.bz2 scummvm-rg350-71756bdf4eae5ba9cc3f329b85e894f04640aaef.zip | |
Merge remote branch 'upstream/master' into pegasus
Diffstat (limited to 'graphics/surface.cpp')
| -rw-r--r-- | graphics/surface.cpp | 79 | 
1 files changed, 79 insertions, 0 deletions
| diff --git a/graphics/surface.cpp b/graphics/surface.cpp index d5e2692338..a96950d2c6 100644 --- a/graphics/surface.cpp +++ b/graphics/surface.cpp @@ -20,6 +20,7 @@   */  #include "common/algorithm.h" +#include "common/endian.h"  #include "common/util.h"  #include "common/rect.h"  #include "common/textconsole.h" @@ -281,4 +282,82 @@ void Surface::move(int dx, int dy, int height) {  	}  } +Graphics::Surface *Surface::convertTo(const PixelFormat &dstFormat, const byte *palette) const { +	assert(pixels); + +	Graphics::Surface *surface = new Graphics::Surface(); + +	// If the target format is the same, just copy +	if (format == dstFormat) { +		surface->copyFrom(*this); +		return surface; +	} + +	if (format.bytesPerPixel == 0 || format.bytesPerPixel > 4) +		error("Surface::convertTo(): Can only convert from 1Bpp, 2Bpp, 3Bpp, and 4Bpp"); + +	if (dstFormat.bytesPerPixel != 2 && dstFormat.bytesPerPixel != 4) +		error("Surface::convertTo(): Can only convert to 2Bpp and 4Bpp"); + +	surface->create(w, h, dstFormat); + +	if (format.bytesPerPixel == 1) { +		// Converting from paletted to high color +		assert(palette); + +		for (int y = 0; y < h; y++) { +			const byte *srcRow = (byte *)getBasePtr(0, y); +			byte *dstRow = (byte *)surface->getBasePtr(0, y); + +			for (int x = 0; x < w; x++) { +				byte index = *srcRow++; +				byte r = palette[index * 3]; +				byte g = palette[index * 3 + 1]; +				byte b = palette[index * 3 + 2]; + +				uint32 color = dstFormat.RGBToColor(r, g, b); + +				if (dstFormat.bytesPerPixel == 2) +					*((uint16 *)dstRow) = color; +				else +					*((uint32 *)dstRow) = color; + +				dstRow += dstFormat.bytesPerPixel; +			} +		} +	} else { +		// Converting from high color to high color +		for (int y = 0; y < h; y++) { +			const byte *srcRow = (byte *)getBasePtr(0, y); +			byte *dstRow = (byte *)surface->getBasePtr(0, y); + +			for (int x = 0; x < w; x++) { +				uint32 srcColor; +				if (format.bytesPerPixel == 2) +					srcColor = READ_UINT16(srcRow); +				else if (format.bytesPerPixel == 3) +					srcColor = READ_UINT24(srcRow); +				else +					srcColor = READ_UINT32(srcRow); + +				srcRow += format.bytesPerPixel; + +				// Convert that color to the new format +				byte r, g, b, a; +				format.colorToARGB(srcColor, a, r, g, b); +				uint32 color = dstFormat.ARGBToColor(a, r, g, b); + +				if (dstFormat.bytesPerPixel == 2) +					*((uint16 *)dstRow) = color; +				else +					*((uint32 *)dstRow) = color; + +				dstRow += dstFormat.bytesPerPixel; +			} +		} +	} + +	return surface; +} +  } // End of namespace Graphics | 
