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

dreammaster dreammaster at scummvm.org
Sat Oct 8 02:25:10 CEST 2016


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:
d09c49fb0d TITANIC: Fix transparency handling of Doorbot and Photograph


Commit: d09c49fb0d321b97b8a09c16f169930c8e176aa1
    https://github.com/scummvm/scummvm/commit/d09c49fb0d321b97b8a09c16f169930c8e176aa1
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2016-10-07T20:25:07-04:00

Commit Message:
TITANIC: Fix transparency handling of Doorbot and Photograph

Changed paths:
    engines/titanic/support/font.cpp
    engines/titanic/support/transparency_surface.h
    engines/titanic/support/video_surface.cpp
    engines/titanic/support/video_surface.h



diff --git a/engines/titanic/support/font.cpp b/engines/titanic/support/font.cpp
index 39a0b77..45d5937 100644
--- a/engines/titanic/support/font.cpp
+++ b/engines/titanic/support/font.cpp
@@ -292,13 +292,13 @@ void STFont::copyRect(CVideoSurface *surface, const Point &pt, Rect &rect) {
 	if (surface->lock()) {
 		uint16 *lineP = surface->getBasePtr(pt.x, pt.y);
 		uint16 color = getColor();
-		bool is16Bit = surface->getPixelDepth() == 2;
 
 		for (int yp = rect.top; yp < rect.bottom; ++yp, lineP += surface->getWidth()) {
 			uint16 *destP = lineP;
 			for (int xp = rect.left; xp < rect.right; ++xp, ++destP) {
 				const byte *transP = _dataPtr + yp * _dataWidth + xp;
-				surface->copyPixel(destP, &color, *transP >> 3, is16Bit, true);
+				surface->copyPixel(destP, &color, *transP >> 3,
+					surface->getRawSurface()->format, true);
 			}
 		}
 
diff --git a/engines/titanic/support/transparency_surface.h b/engines/titanic/support/transparency_surface.h
index 06861b6..0391b6d 100644
--- a/engines/titanic/support/transparency_surface.h
+++ b/engines/titanic/support/transparency_surface.h
@@ -71,12 +71,12 @@ public:
 	/**
 	 * Returns the alpha value for the pixel (0-31)
 	 */
-	uint getAlpha() const { return getPixel() >> 3; }
+	uint getAlpha() const { return 31 - (getPixel() >> 3); }
 
 	/**
 	 * Returns true if the pixel is completely transparent
 	 */
-	bool isPixelTransparent() const { return getAlpha() == 0; }
+	bool isPixelTransparent() const { return getAlpha() == 31; }
 };
 
 } // End of namespace Titanic
diff --git a/engines/titanic/support/video_surface.cpp b/engines/titanic/support/video_surface.cpp
index 79d1f07..c71f898 100644
--- a/engines/titanic/support/video_surface.cpp
+++ b/engines/titanic/support/video_surface.cpp
@@ -53,14 +53,10 @@ void CVideoSurface::setupPalette(byte palette[32][32], byte val) {
 	for (uint idx1 = 0; idx1 < 32; ++idx1) {
 		for (uint idx2 = 0, base = 0; idx2 < 32; ++idx2, base += idx1) {
 			uint v = base / 31;
-			uint v2 = (v >> 36);
-			v = ((v2 >> 31) + v2) & 0xff;
-			palette[idx1][idx2] = v << 3;
+			palette[idx1][idx2] = (byte)v;
 
 			if (val != 0xff && v != idx2) {
-				v = 0x80808081 * v * val;
-				v2 = v >> 39;
-				palette[idx1][idx2] = ((v2 >> 31) + v2) << 3;
+				assert(0);
 			}
 		}
 	}
@@ -237,7 +233,6 @@ void CVideoSurface::transBlitRect(const Rect &srcRect, const Rect &destRect, CVi
 			const uint16 *srcPtr = (const uint16 *)srcSurface->getBasePtr(
 				srcRect.left, flipFlag ? srcRect.top : srcRect.bottom - 1);
 			uint16 *destPtr = (uint16 *)destArea.getBasePtr(0, destArea.h - 1);
-			bool is16Bit = src->getPixelDepth() == 2;
 			bool isAlpha = src->_transparencyMode == TRANS_ALPHA0 ||
 				src->_transparencyMode == TRANS_ALPHA255;
 
@@ -252,7 +247,7 @@ void CVideoSurface::transBlitRect(const Rect &srcRect, const Rect &destRect, CVi
 
 				for (int srcX = srcRect.left; srcX < srcRect.right; ++srcX) {
 					if (!transSurface.isPixelTransparent()) {
-						copyPixel(lineDestP, lineSrcP, transSurface.getAlpha(), is16Bit, isAlpha);
+						copyPixel(lineDestP, lineSrcP, transSurface.getAlpha(), srcSurface->format, isAlpha);
 					}
 
 					++lineSrcP;
@@ -291,30 +286,37 @@ bool CVideoSurface::hasFrame() {
 	}
 }
 
-void CVideoSurface::copyPixel(uint16 *destP, const uint16 *srcP, byte transVal, bool is16Bit, bool isAlpha) {
-	const Graphics::PixelFormat srcFormat = is16Bit ?
-		Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0) :
-		Graphics::PixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0);
+#define RGB_SHIFT 3
+void CVideoSurface::copyPixel(uint16 *destP, const uint16 *srcP, byte alpha,
+		const Graphics::PixelFormat &srcFormat, bool isAlpha) {
 	const Graphics::PixelFormat destFormat = _ddSurface->getFormat();
-	transVal &= 0xff;
-	assert(transVal < 32);
+	alpha &= 0xff;
+	assert(alpha < 32);
 
-	// Get the color
+	// Get the source color
 	byte r, g, b;
 	srcFormat.colorToRGB(*srcP, r, g, b);
+	r >>= RGB_SHIFT;
+	g >>= RGB_SHIFT;
+	b >>= RGB_SHIFT;
+
 	if (isAlpha) {
-		r = _palette1[31 - transVal][r >> 3];
-		g = _palette1[31 - transVal][g >> 3];
-		b = _palette1[31 - transVal][b >> 3];
+		r = _palette1[31 - alpha][r];
+		g = _palette1[31 - alpha][g];
+		b = _palette1[31 - alpha][b];
 	}
 
 	byte r2, g2, b2;
 	destFormat.colorToRGB(*destP, r2, g2, b2);
-	r2 = _palette1[transVal][r2 >> 3];
-	g2 = _palette1[transVal][g2 >> 3];
-	b2 = _palette1[transVal][b2 >> 3];
-
-	*destP = destFormat.RGBToColor(r + r2, g + g2, b + b2);
+	r2 >>= RGB_SHIFT;
+	g2 >>= RGB_SHIFT;
+	b2 >>= RGB_SHIFT;
+	r2 = _palette1[alpha][r2];
+	g2 = _palette1[alpha][g2];
+	b2 = _palette1[alpha][b2];
+
+	*destP = destFormat.RGBToColor((r + r2) << RGB_SHIFT,
+		(g + g2) << RGB_SHIFT, (b + b2) << RGB_SHIFT);
 }
 
 /*------------------------------------------------------------------------*/
diff --git a/engines/titanic/support/video_surface.h b/engines/titanic/support/video_surface.h
index 4a4ce18..690669b 100644
--- a/engines/titanic/support/video_surface.h
+++ b/engines/titanic/support/video_surface.h
@@ -58,7 +58,6 @@ public:
 	 */
 	static void setup() {
 		setupPalette(_palette1, 0xff);
-		setupPalette(_palette2, 0xe0);
 	}
 private:
 	/**
@@ -340,8 +339,16 @@ public:
 
 	/**
 	 * Copies a pixel, handling transparency
-	 */
-	void copyPixel(uint16 *destP, const uint16 *srcP, byte transVal, bool is16Bit, bool isAlpha);
+	 * @param destP		Dest pointer to 16-bit pixel
+	 * @param srcP		Source pointer to 16-bit pixel
+	 * @param alpha		Alpha (0-31). At 0, it's completely opaque,
+	 *	and overwrites the dest pixel. Through to 31, which is completely
+	 *	transparent, and ignores the source pixel.
+	 * @param srcFormat	The source surface format
+	 * @param isAlpha	If true, has alpha channel
+	 */
+	void copyPixel(uint16 *destP, const uint16 *srcP, byte alpha,
+		const Graphics::PixelFormat &srcFormat, bool isAlpha);
 };
 
 class OSVideoSurface : public CVideoSurface {





More information about the Scummvm-git-logs mailing list