[Scummvm-cvs-logs] CVS: scummvm/backends/morphos morphos.cpp,1.7,1.8 morphos_scaler.cpp,1.2,1.3

Ruediger Hanke tomjoad at users.sourceforge.net
Mon Sep 23 09:54:02 CEST 2002


Update of /cvsroot/scummvm/scummvm/backends/morphos
In directory usw-pr-cvs1:/tmp/cvs-serv16780

Modified Files:
	morphos.cpp morphos_scaler.cpp 
Log Message:
Scaler color fix for Radeon cards in 32 bit depth (and possibly other PC graphics cards, too)

Index: morphos.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/backends/morphos/morphos.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- morphos.cpp	23 Sep 2002 16:31:05 -0000	1.7
+++ morphos.cpp	23 Sep 2002 16:53:11 -0000	1.8
@@ -454,7 +454,7 @@
 void OSystem_MorphOS::CreateScreen(CS_DSPTYPE dspType)
 {
 	ULONG mode = INVALID_ID;
-	int   depths[] = { 8, 15, 16, 24, 32, 0 };
+	int   depths[] = { 8, 15, 16, 32, 0 };
 	int   i;
 	Screen *wb = NULL;
 

Index: morphos_scaler.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/backends/morphos/morphos_scaler.cpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- morphos_scaler.cpp	15 Sep 2002 09:16:28 -0000	1.2
+++ morphos_scaler.cpp	23 Sep 2002 16:53:11 -0000	1.3
@@ -33,6 +33,7 @@
 #define INTERPOLATE(A, B) (((A & colorMask) >> 1) + ((B & colorMask) >> 1) + (A & B & lowPixelMask))
 #define Q_INTERPOLATE(A, B, C, D) ((A & qcolorMask) >> 2) + ((B & qcolorMask) >> 2) + ((C & qcolorMask) >> 2) + ((D & qcolorMask) >> 2) + ((((A & qlowpixelMask) + (B & qlowpixelMask) + (C & qlowpixelMask) + (D & qlowpixelMask)) >> 2) & qlowpixelMask)
 #define SWAP_WORD(word) word = ((word & 0xff) << 8) | (word >> 8)
+#define SWAP_LONG(lng) lng = ((lng & 0xff) << 24) | ((lng & 0xff00) << 8) | ((lng & 0xff0000) >> 8) | (lng >> 24)
 
 MorphOSScaler::GfxScaler MorphOSScaler::ScummScalers[11]
 	=	{ { "none", 	   "normal",	  ST_NONE },
@@ -82,7 +83,8 @@
 
 	ScummPCMode = false;
 	if (pixfmt == PIXFMT_RGB15PC || pixfmt == PIXFMT_BGR15PC ||
-		pixfmt == PIXFMT_RGB16PC || pixfmt == PIXFMT_BGR16PC)
+		pixfmt == PIXFMT_RGB16PC || pixfmt == PIXFMT_BGR16PC ||
+		pixfmt == PIXFMT_BGRA32)
 		ScummPCMode = true;
 	
 	colorMask = (MakeColor(pixfmt, 255, 0, 0) - minr) | (MakeColor(pixfmt, 0, 255, 0) - ming) | (MakeColor(pixfmt, 0, 0, 255) - minb);
@@ -185,25 +187,22 @@
 			col = (((b*31)/255) << 11) | (((g*63)/255) << 5) | ((r*31)/255);
 			break;
 
-		case PIXFMT_RGB24:
 		case PIXFMT_ARGB32:
-			col = (r << 16) | (g << 8) | b;
-			break;
-
-		case PIXFMT_BGR24:
-			col = (b << 16) | (g << 8) | r;
-			break;
-
 		case PIXFMT_BGRA32:
-			col = (b << 24) | (g << 16) | (r << 8);
+			col = (r << 16) | (g << 8) | b;
 			break;
 
 		case PIXFMT_RGBA32:
 			col = (r << 24) | (g << 16) | (b << 8);
 			break;
 
+		case PIXFMT_RGB24:
+		case PIXFMT_BGR24:
+			error("The scaling engines do not support 24 bit modes at the moment");
+			break;
+
 		default:
-			error("Unsupported pixel format: %d. Please contact author at tomjoad at muenster.de.", pixfmt);
+			error("Unsupported pixel format: %d. Please contact author at tomjoad at muenster.de", pixfmt);
 	}
 
 	return col;
@@ -337,6 +336,13 @@
 			}
 			else
 			{
+				if (ScummPCMode)
+				{
+					SWAP_LONG(product1a);
+					SWAP_LONG(product1b);
+					SWAP_LONG(product2a);
+					SWAP_LONG(product2b);
+				}
 				*((unsigned long *) (&dst_line[0][x * 8])) = product1a;
 				*((unsigned long *) (&dst_line[0][x * 8 + 4])) = product1b;
 				*((unsigned long *) (&dst_line[1][x * 8])) = product2a;
@@ -559,6 +565,13 @@
 			}
 			else
 			{
+				if (ScummPCMode)
+				{
+					SWAP_LONG(product1a);
+					SWAP_LONG(product1b);
+					SWAP_LONG(product2a);
+					SWAP_LONG(product2b);
+				}
 				*((unsigned long *) (&dst_line[0][x * 8])) = product1a;
 				*((unsigned long *) (&dst_line[0][x * 8 + 4])) = product1b;
 				*((unsigned long *) (&dst_line[1][x * 8])) = product2a;
@@ -705,6 +718,14 @@
 			}
 			else
 			{
+				if (ScummPCMode)
+				{
+					SWAP_LONG(B);
+					SWAP_LONG(D);
+					SWAP_LONG(E);
+					SWAP_LONG(F);
+					SWAP_LONG(H);
+				}
 				*((unsigned long *) (&dst_line[0][x * 8])) = D == B && B != F && D != H ? D : E;
 				*((unsigned long *) (&dst_line[0][x * 8 + 4])) = B == F && B != D && F != H ? F : E;
 				*((unsigned long *) (&dst_line[1][x * 8])) = D == H && D != B && H != F ? D : E;
@@ -761,6 +782,9 @@
 			}
 			else
 			{
+				if (ScummPCMode)
+					SWAP_LONG(color);
+
 				*((unsigned long *) (&dst_line[0][x * 8])) = color;
 				*((unsigned long *) (&dst_line[0][x * 8 + 4])) = color;
 				*((unsigned long *) (&dst_line[1][x * 8])) = color;





More information about the Scummvm-git-logs mailing list