[D3D] Some texture enumeration 'fixes'

Lionel Ulmer lionel.ulmer at free.fr
Thu May 8 11:29:59 CDT 2003


As usual, Windows games only expect ARGB textures (and do not even bother to
check the bitmasks). So, as for the 'packed' texture formats, enumerate only
the 32 bpp ARGB format.

Changelog:
 - only enumerate 32 bpp ARGB texture format and remove RGBA one
 - add support for 32 bpp ARGB texture format

-- 
		 Lionel Ulmer - http://www.bbrox.org/
-------------- next part --------------
Index: dlls/ddraw/d3ddevice/mesa.c
===================================================================
RCS file: /home/wine/wine/dlls/ddraw/d3ddevice/mesa.c,v
retrieving revision 1.92
diff -u -r1.92 mesa.c
--- dlls/ddraw/d3ddevice/mesa.c	4 May 2003 02:24:03 -0000	1.92
+++ dlls/ddraw/d3ddevice/mesa.c	8 May 2003 16:23:42 -0000
@@ -385,6 +389,8 @@
     pformat->dwSize = sizeof(DDPIXELFORMAT);
     pformat->dwFourCC = 0;
 
+#if 0
+    /* See argument about the RGBA format for 'packed' texture formats */
     TRACE("Enumerating GL_RGBA unpacked (32)\n");
     pformat->dwFlags = DDPF_RGB | DDPF_ALPHAPIXELS;
     pformat->u1.dwRGBBitCount = 32;
@@ -394,6 +400,17 @@
     pformat->u5.dwRGBAlphaBitMask = 0x000000FF;
     if (cb_1) if (cb_1(&sdesc , context) == 0) return DD_OK;
     if (cb_2) if (cb_2(pformat, context) == 0) return DD_OK;
+#endif
+    
+    TRACE("Enumerating GL_RGBA unpacked (32)\n");
+    pformat->dwFlags = DDPF_RGB | DDPF_ALPHAPIXELS;
+    pformat->u1.dwRGBBitCount = 32;
+    pformat->u2.dwRBitMask =        0x00FF0000;
+    pformat->u3.dwGBitMask =        0x0000FF00;
+    pformat->u4.dwBBitMask =        0x000000FF;
+    pformat->u5.dwRGBAlphaBitMask = 0xFF000000;
+    if (cb_1) if (cb_1(&sdesc , context) == 0) return DD_OK;
+    if (cb_2) if (cb_2(pformat, context) == 0) return DD_OK;
 
     TRACE("Enumerating GL_RGB unpacked (24)\n");
     pformat->dwFlags = DDPF_RGB;
Index: dlls/ddraw/d3dtexture.c
===================================================================
RCS file: /home/wine/wine/dlls/ddraw/d3dtexture.c,v
retrieving revision 1.42
diff -u -r1.42 d3dtexture.c
--- dlls/ddraw/d3dtexture.c	7 Jan 2003 23:08:32 -0000	1.42
+++ dlls/ddraw/d3dtexture.c	8 May 2003 16:23:42 -0000
@@ -386,6 +386,35 @@
 	    } else if ((src_d->ddpfPixelFormat.u2.dwRBitMask ==        0x00FF0000) &&
 		       (src_d->ddpfPixelFormat.u3.dwGBitMask ==        0x0000FF00) &&
 		       (src_d->ddpfPixelFormat.u4.dwBBitMask ==        0x000000FF) &&
+		       (src_d->ddpfPixelFormat.u5.dwRGBAlphaBitMask == 0xFF000000)) {
+	        /* Convert from ARGB (Windows' format) to RGBA.
+		   Note: need to check for GL extensions handling ARGB instead of always converting */
+	        DWORD i;
+		DWORD *src = (DWORD *) src_d->lpSurface, *dst;
+		
+		surface = (DWORD *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, src_d->dwWidth * src_d->dwHeight * sizeof(DWORD));
+		dst = (DWORD *) surface;
+		if (src_d->dwFlags & DDSD_CKSRCBLT) {
+		    for (i = 0; i < src_d->dwHeight * src_d->dwWidth; i++) {
+		        DWORD color = *src++;
+			*dst = (color & 0x00FFFFFF) << 8;
+			if ((color < src_d->ddckCKSrcBlt.dwColorSpaceLowValue) ||
+			    (color > src_d->ddckCKSrcBlt.dwColorSpaceHighValue))
+			    *dst |= (color & 0xFF000000) >> 24;
+			dst++;
+		    }
+		} else {
+		    for (i = 0; i < src_d->dwHeight * src_d->dwWidth; i++) {
+		        DWORD color = *src++;
+			*dst = (color & 0x00FFFFFF) << 8;
+			*dst |= (color & 0xFF000000) >> 24;
+		    }
+		}
+		format = GL_RGBA;
+		pixel_format = GL_UNSIGNED_INT_8_8_8_8;
+	    } else if ((src_d->ddpfPixelFormat.u2.dwRBitMask ==        0x00FF0000) &&
+		       (src_d->ddpfPixelFormat.u3.dwGBitMask ==        0x0000FF00) &&
+		       (src_d->ddpfPixelFormat.u4.dwBBitMask ==        0x000000FF) &&
 		       (src_d->ddpfPixelFormat.u5.dwRGBAlphaBitMask == 0x00000000)) {
 	        /* Just add an alpha component and handle color-keying... */
 	        DWORD i;


More information about the wine-patches mailing list