[Scummvm-git-logs] scummvm master -> ee35a3d268ed39355ff2673fe447c2894f0df750

sev- noreply at scummvm.org
Fri Mar 24 20:32:53 UTC 2023


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
ee35a3d268 GRAPHICS: Use standard palettes in ManagedSurface


Commit: ee35a3d268ed39355ff2673fe447c2894f0df750
    https://github.com/scummvm/scummvm/commit/ee35a3d268ed39355ff2673fe447c2894f0df750
Author: Cameron Cawley (ccawley2011 at gmail.com)
Date: 2023-03-24T21:32:48+01:00

Commit Message:
GRAPHICS: Use standard palettes in ManagedSurface

Changed paths:
    graphics/managed_surface.cpp
    graphics/managed_surface.h


diff --git a/graphics/managed_surface.cpp b/graphics/managed_surface.cpp
index fa93da052be..98f036a3483 100644
--- a/graphics/managed_surface.cpp
+++ b/graphics/managed_surface.cpp
@@ -32,14 +32,14 @@ ManagedSurface::ManagedSurface() :
 		w(_innerSurface.w), h(_innerSurface.h), pitch(_innerSurface.pitch), format(_innerSurface.format),
 		_disposeAfterUse(DisposeAfterUse::NO), _owner(nullptr),
 		_transparentColor(0),_transparentColorSet(false), _paletteSet(false) {
-	Common::fill(&_palette[0], &_palette[256], 0);
+	memset(_palette, 0, sizeof(_palette));
 }
 
 ManagedSurface::ManagedSurface(const ManagedSurface &surf) :
 		w(_innerSurface.w), h(_innerSurface.h), pitch(_innerSurface.pitch), format(_innerSurface.format),
 		_disposeAfterUse(DisposeAfterUse::NO), _owner(nullptr),
 		_transparentColor(0), _transparentColorSet(false), _paletteSet(false) {
-	Common::fill(&_palette[0], &_palette[256], 0);
+	memset(_palette, 0, sizeof(_palette));
 	*this = surf;
 }
 
@@ -47,7 +47,7 @@ ManagedSurface::ManagedSurface(int width, int height) :
 		w(_innerSurface.w), h(_innerSurface.h), pitch(_innerSurface.pitch), format(_innerSurface.format),
 		_disposeAfterUse(DisposeAfterUse::NO), _owner(nullptr),
 		_transparentColor(0), _transparentColorSet(false), _paletteSet(false) {
-	Common::fill(&_palette[0], &_palette[256], 0);
+	memset(_palette, 0, sizeof(_palette));
 	create(width, height);
 }
 
@@ -55,7 +55,7 @@ ManagedSurface::ManagedSurface(int width, int height, const Graphics::PixelForma
 		w(_innerSurface.w), h(_innerSurface.h), pitch(_innerSurface.pitch), format(_innerSurface.format),
 		_disposeAfterUse(DisposeAfterUse::NO), _owner(nullptr),
 		_transparentColor(0), _transparentColorSet(false), _paletteSet(false) {
-	Common::fill(&_palette[0], &_palette[256], 0);
+	memset(_palette, 0, sizeof(_palette));
 	create(width, height, pixelFormat);
 }
 
@@ -63,7 +63,7 @@ ManagedSurface::ManagedSurface(ManagedSurface &surf, const Common::Rect &bounds)
 		w(_innerSurface.w), h(_innerSurface.h), pitch(_innerSurface.pitch), format(_innerSurface.format),
 		_disposeAfterUse(DisposeAfterUse::NO), _owner(nullptr),
 		_transparentColor(0), _transparentColorSet(false), _paletteSet(false) {
-	Common::fill(&_palette[0], &_palette[256], 0);
+	memset(_palette, 0, sizeof(_palette));
 	create(surf, bounds);
 }
 
@@ -132,7 +132,7 @@ ManagedSurface &ManagedSurface::operator=(const ManagedSurface &surf) {
 		_transparentColorSet = surf._transparentColorSet;
 		_transparentColor = surf._transparentColor;
 		_paletteSet = surf._paletteSet;
-		Common::copy(&surf._palette[0], &surf._palette[256], _palette);
+		memcpy(_palette, surf._palette, sizeof(_palette));
 	}
 
 	return *this;
@@ -176,7 +176,7 @@ void ManagedSurface::create(ManagedSurface &surf, const Common::Rect &bounds) {
 	_transparentColorSet = surf._transparentColorSet;
 	_transparentColor = surf._transparentColor;
 	_paletteSet = surf._paletteSet;
-	Common::copy(&surf._palette[0], &surf._palette[256], _palette);
+	memcpy(_palette, surf._palette, sizeof(_palette));
 }
 
 void ManagedSurface::free() {
@@ -205,7 +205,7 @@ void ManagedSurface::copyFrom(const ManagedSurface &surf) {
 	_transparentColorSet = surf._transparentColorSet;
 	_transparentColor = surf._transparentColor;
 	_paletteSet = surf._paletteSet;
-	Common::copy(&surf._palette[0], &surf._palette[256], _palette);
+	memcpy(_palette, surf._palette, sizeof(_palette));
 }
 
 void ManagedSurface::copyFrom(const Surface &surf) {
@@ -223,7 +223,7 @@ void ManagedSurface::copyFrom(const Surface &surf) {
 	_transparentColorSet = false;
 	_transparentColor = 0;
 	_paletteSet = false;
-	Common::fill(&_palette[0], &_palette[256], 0);
+	memset(_palette, 0, sizeof(_palette));
 }
 
 void ManagedSurface::blitFrom(const Surface &src) {
@@ -271,7 +271,7 @@ void ManagedSurface::blitFrom(const ManagedSurface &src, const Common::Rect &src
 }
 
 void ManagedSurface::blitFromInner(const Surface &src, const Common::Rect &srcRect,
-		const Common::Rect &destRect, const uint32 *srcPalette) {
+		const Common::Rect &destRect, const byte *srcPalette) {
 
 	if (destRect.isEmpty())
 		return;
@@ -300,12 +300,8 @@ void ManagedSurface::blitFromInner(const Surface &src, const Common::Rect &srcRe
 
 
 	uint32 alphaMask = 0;
-	if (srcFormat.isCLUT8()) {
-		alphaMask = 0xff000000u;
-	} else {
-		if (srcFormat.aBits() > 0)
-			alphaMask = (((static_cast<uint32>(1) << (srcFormat.aBits() - 1)) - 1) * 2 + 1) << srcFormat.aShift;
-	}
+	if (srcFormat.aBits() > 0)
+		alphaMask = (((static_cast<uint32>(1) << (srcFormat.aBits() - 1)) - 1) * 2 + 1) << srcFormat.aShift;
 
 	const bool noScale = scaleX == SCALE_THRESHOLD && scaleY == SCALE_THRESHOLD;
 	for (int destY = destRect.top, scaleYCtr = 0; destY < destRect.bottom; ++destY, scaleYCtr += scaleY) {
@@ -343,28 +339,23 @@ void ManagedSurface::blitFromInner(const Surface &src, const Common::Rect &srcRe
 			}
 
 			uint32 col = 0;
-			if (srcFormat.isCLUT8()) {
-				assert(srcPalette != nullptr);	// Catch the cases when palette is missing
-				// Get the palette color
-				col = srcPalette[*srcVal];
-			} else {
-				// Use the src's pixel format to split up the source pixel
-				if (srcFormat.bytesPerPixel == 1)
-					col = *reinterpret_cast<const uint8 *>(srcVal);
-				else if (srcFormat.bytesPerPixel == 2)
-					col = *reinterpret_cast<const uint16 *>(srcVal);
-				else if (srcFormat.bytesPerPixel == 4)
-					col = *reinterpret_cast<const uint32 *>(srcVal);
-				else
-					col = READ_UINT24(srcVal);
-			}
+			// Use the src's pixel format to split up the source pixel
+			if (srcFormat.bytesPerPixel == 1)
+				col = *reinterpret_cast<const uint8 *>(srcVal);
+			else if (srcFormat.bytesPerPixel == 2)
+				col = *reinterpret_cast<const uint16 *>(srcVal);
+			else if (srcFormat.bytesPerPixel == 4)
+				col = *reinterpret_cast<const uint32 *>(srcVal);
+			else
+				col = READ_UINT24(srcVal);
 
-			const bool isOpaque = ((col & alphaMask) == alphaMask);
+			const bool isOpaque = srcFormat.isCLUT8() ? true : ((col & alphaMask) == alphaMask);
+			const bool isTransparent = srcFormat.isCLUT8() ? false : ((col & alphaMask) == 0);
 
 			uint32 destPixel = 0;
 
 			// Need to check isOpaque in case alpha mask is 0
-			if (!isOpaque && (col & alphaMask) == 0) {
+			if (!isOpaque && isTransparent) {
 				// Completely transparent, so skip
 				continue;
 			} else if (isOpaque && isSameFormat) {
@@ -376,10 +367,10 @@ void ManagedSurface::blitFromInner(const Surface &src, const Common::Rect &srcRe
 
 				// Different format or partially transparent
 				if (srcFormat.isCLUT8()) {
-					rSrc = col & 0xff;
-					gSrc = (col >> 8) & 0xff;
-					bSrc = (col >> 16) & 0xff;
-					aSrc = (col >> 24) & 0xff;
+					rSrc = srcPalette[(col * 3) + 0];
+					gSrc = srcPalette[(col * 3) + 1];
+					bSrc = srcPalette[(col * 3) + 2];
+					aSrc = 0xff;
 				} else {
 					srcFormat.colorToARGB(col, aSrc, rSrc, gSrc, bSrc);
 				}
@@ -505,24 +496,22 @@ void ManagedSurface::transBlitFrom(const ManagedSurface &src, const Common::Rect
 		const Surface *mask, bool maskOnly) {
 	if (transColor == (uint32)-1 && src._transparentColorSet)
 		transColor = src._transparentColor;
-	const uint32 *srcPalette = src._paletteSet ? src._palette : nullptr;
-	const uint32 *dstPalette = _paletteSet ? _palette : nullptr;
+	const byte *srcPalette = src._paletteSet ? src._palette : nullptr;
+	const byte *dstPalette = _paletteSet ? _palette : nullptr;
 
 	transBlitFromInner(src._innerSurface, srcRect, destRect, transColor, flipped, overrideColor,
 		srcAlpha, srcPalette, dstPalette, mask, maskOnly);
 }
 
-static uint findBestColor(const uint32 *palette, byte cr, byte cg, byte cb) {
+static uint findBestColor(const byte *palette, byte cr, byte cg, byte cb) {
 	uint bestColor = 0;
 	double min = 0xFFFFFFFF;
 
 	for (uint i = 0; i < 256; ++i) {
-		uint col = palette[i];
-
-		int rmean = ((col & 0xff) + cr) / 2;
-		int r = (col & 0xff) - cr;
-		int g = ((col >> 8) & 0xff) - cg;
-		int b = ((col >> 16) & 0xff) - cb;
+		int rmean = (*(palette + 3 * i + 0) + cr) / 2;
+		int r = *(palette + 3 * i + 0) - cr;
+		int g = *(palette + 3 * i + 1) - cg;
+		int b = *(palette + 3 * i + 2) - cb;
 
 		double dist = sqrt((((512 + rmean) * r * r) >> 8) + 4 * g * g + (((767 - rmean) * b * b) >> 8));
 		if (min > dist) {
@@ -534,15 +523,21 @@ static uint findBestColor(const uint32 *palette, byte cr, byte cg, byte cb) {
 	return bestColor;
 }
 
-static byte *createPaletteLookup(const uint32 *srcPalette, const uint32 *dstPalette) {
+static byte *createPaletteLookup(const byte *srcPalette, const byte *dstPalette) {
 	byte *lookup = new byte[256];
 
 	for (int i = 0; i < 256; i++) {
-		uint col = srcPalette[i];
-		if (col == dstPalette[i]) {
+		byte rSrc = srcPalette[(i * 3) + 0];
+		byte gSrc = srcPalette[(i * 3) + 1];
+		byte bSrc = srcPalette[(i * 3) + 2];
+		byte rDst = dstPalette[(i * 3) + 0];
+		byte gDst = dstPalette[(i * 3) + 1];
+		byte bDst = dstPalette[(i * 3) + 2];
+
+		if (rSrc == rDst && gSrc == gDst && bSrc == bDst) {
 			lookup[i] = i;
 		} else {
-			lookup[i] = findBestColor(dstPalette, col & 0xff, (col >> 8) & 0xff, (col >> 16) & 0xff);
+			lookup[i] = findBestColor(dstPalette, rSrc, gSrc, bSrc);
 		}
 	}
 
@@ -551,18 +546,17 @@ static byte *createPaletteLookup(const uint32 *srcPalette, const uint32 *dstPale
 
 template<typename TSRC, typename TDEST>
 void transBlitPixel(TSRC srcVal, TDEST &destVal, const Graphics::PixelFormat &srcFormat, const Graphics::PixelFormat &destFormat,
-		uint32 overrideColor, uint32 srcAlpha, const uint32 *srcPalette, const byte *lookup) {
+		uint32 overrideColor, uint32 srcAlpha, const byte *srcPalette, const byte *lookup) {
 	// Decode and re-encode each pixel
 	byte aSrc, rSrc, gSrc, bSrc;
 	if (srcFormat.isCLUT8()) {
 		assert(srcPalette != nullptr);	// Catch the cases when palette is missing
 
 		// Get the palette color
-		const uint32 col = srcPalette[srcVal];
-		rSrc = col & 0xff;
-		gSrc = (col >> 8) & 0xff;
-		bSrc = (col >> 16) & 0xff;
-		aSrc = (col >> 24) & 0xff;
+		rSrc = srcPalette[(srcVal * 3) + 0];
+		gSrc = srcPalette[(srcVal * 3) + 1];
+		bSrc = srcPalette[(srcVal * 3) + 2];
+		aSrc = 0xff;
 	} else {
 		srcFormat.colorToARGB(srcVal, aSrc, rSrc, gSrc, bSrc);
 	}
@@ -598,7 +592,7 @@ void transBlitPixel(TSRC srcVal, TDEST &destVal, const Graphics::PixelFormat &sr
 
 template<>
 void transBlitPixel<byte, byte>(byte srcVal, byte &destVal, const Graphics::PixelFormat &srcFormat, const Graphics::PixelFormat &destFormat,
-		uint32 overrideColor, uint32 srcAlpha, const uint32 *srcPalette, const byte *lookup) {
+		uint32 overrideColor, uint32 srcAlpha, const byte *srcPalette, const byte *lookup) {
 	if (srcAlpha == 0) {
 		// Completely transparent, so skip
 		return;
@@ -612,8 +606,8 @@ void transBlitPixel<byte, byte>(byte srcVal, byte &destVal, const Graphics::Pixe
 
 template<typename TSRC, typename TDEST>
 void transBlit(const Surface &src, const Common::Rect &srcRect, ManagedSurface &dest, const Common::Rect &destRect,
-		TSRC transColor, bool flipped, uint32 overrideColor, uint32 srcAlpha, const uint32 *srcPalette,
-		const uint32 *dstPalette, const Surface *mask, bool maskOnly) {
+		TSRC transColor, bool flipped, uint32 overrideColor, uint32 srcAlpha, const byte *srcPalette,
+		const byte *dstPalette, const Surface *mask, bool maskOnly) {
 	int scaleX = SCALE_THRESHOLD * srcRect.width() / destRect.width();
 	int scaleY = SCALE_THRESHOLD * srcRect.height() / destRect.height();
 	byte rst = 0, gst = 0, bst = 0, rdt = 0, gdt = 0, bdt = 0;
@@ -704,7 +698,7 @@ void transBlit(const Surface &src, const Common::Rect &srcRect, ManagedSurface &
 
 void ManagedSurface::transBlitFromInner(const Surface &src, const Common::Rect &srcRect,
 		const Common::Rect &destRect, uint32 transColor, bool flipped, uint32 overrideColor,
-		uint32 srcAlpha, const uint32 *srcPalette, const uint32 *dstPalette, const Surface *mask, bool maskOnly) {
+		uint32 srcAlpha, const byte *srcPalette, const byte *dstPalette, const Surface *mask, bool maskOnly) {
 	if (src.w == 0 || src.h == 0 || destRect.width() == 0 || destRect.height() == 0)
 		return;
 
@@ -750,23 +744,12 @@ void ManagedSurface::clear(uint32 color) {
 
 void ManagedSurface::grabPalette(byte *colors, uint start, uint num) const {
 	assert(start < 256 && (start + num) <= 256);
-	const uint32 *src = &_palette[start];
-
-	for (; num > 0; --num, colors += 3) {
-		uint32 p = *src++;
-		colors[0] =  p        & 0xff;
-		colors[1] = (p >> 8)  & 0xff;
-		colors[2] = (p >> 16) & 0xff;
-	}
+	memcpy(colors, _palette + 3 * start, 3 * num);
 }
 
 void ManagedSurface::setPalette(const byte *colors, uint start, uint num) {
 	assert(start < 256 && (start + num) <= 256);
-	uint32 *dest = &_palette[start];
-
-	for (; num > 0; --num, colors += 3) {
-		*dest++ = colors[0] | (colors[1] << 8) | (colors[2] << 16) | (0xff << 24);
-	}
+	memcpy(_palette + 3 * start, colors, 3 * num);
 
 	_paletteSet = true;
 
diff --git a/graphics/managed_surface.h b/graphics/managed_surface.h
index 02652fdebef..07b92105bc3 100644
--- a/graphics/managed_surface.h
+++ b/graphics/managed_surface.h
@@ -77,21 +77,21 @@ private:
 	/**
 	 * Local palette for 8-bit images.
 	 */
-	uint32 _palette[256];
+	byte _palette[256 * 3];
 	bool _paletteSet;
 protected:
 	/**
 	 * Inner method for blitting.
 	 */
 	void blitFromInner(const Surface &src, const Common::Rect &srcRect,
-		const Common::Rect &destRect, const uint32 *srcPalette);
+		const Common::Rect &destRect, const byte *srcPalette);
 
 	/**
 	 * Inner method for copying another surface into this one at a given destination position.
 	 */
 	void transBlitFromInner(const Surface &src, const Common::Rect &srcRect,
 		const Common::Rect &destRect, uint32 transColor, bool flipped, uint32 overrideColor,
-		uint32 srcAlpha, const uint32 *srcPalette, const uint32 *dstPalette, const Surface *mask, bool maskOnly);
+		uint32 srcAlpha, const byte *srcPalette, const byte *dstPalette, const Surface *mask, bool maskOnly);
 public:
 	/**
 	 * Clip the given source bounds so the passed destBounds will be entirely on-screen.




More information about the Scummvm-git-logs mailing list