Getting DXBall to run

Lionel Ulmer lionel.ulmer at free.fr
Fri May 16 15:55:18 CDT 2003


> I traced it down to dlls/ddraw/dsurface/dib.c:create_dib where
> it says:
> 
>     if (!This->surface_desc.lpSurface) {
>         This->surface_desc.lpSurface = priv->dib.bitmap_data;
>         This->surface_desc.dwFlags |= DDSD_LPSURFACE;
>     }
> 
> I don't see why This->surface_desc.lpSurface is being tested
> here before doing the assignment since up in the function 
> there's this assert statement:
> 
>     assert(This->surface_desc.lpSurface != NULL);

Well, Wine will crash if 'This->surface_desc.lpSurface' is NULL.
This means that the '!This->surface_desc.lpSurface' test will always be
FALSE (otherwise we would have crashed before).

The real problem is that the application is setting the PITCH flag and gives
us a Pitch set to '0'... Which is *not* a good thing :-)

I tested the attached patch and it seems to work too (and I feel that it's a
bit better :-) ).

        Lionel

-- 
		 Lionel Ulmer - http://www.bbrox.org/
-------------- next part --------------
Index: dlls/ddraw/dsurface/dib.c
===================================================================
RCS file: /home/wine/wine/dlls/ddraw/dsurface/dib.c,v
retrieving revision 1.27
diff -u -r1.27 dib.c
--- dlls/ddraw/dsurface/dib.c	11 Feb 2003 21:58:07 -0000	1.27
+++ dlls/ddraw/dsurface/dib.c	16 May 2003 20:53:44 -0000
@@ -114,6 +114,13 @@
     b_info->bmiHeader.biClrUsed = 0;
     b_info->bmiHeader.biClrImportant = 0;
 
+    if (!This->surface_desc.u1.lPitch) {
+	/* This can't happen, right? */
+	/* or use GDI_GetObj to get it from the created DIB? */
+	This->surface_desc.u1.lPitch = get_dib_width_bytes(b_info->bmiHeader.biWidth, b_info->bmiHeader.biBitCount);
+	This->surface_desc.dwFlags |= DDSD_PITCH;
+    }
+    
     switch (This->surface_desc.u4.ddpfPixelFormat.u1.dwRGBBitCount)
     {
     case 16:
@@ -158,12 +165,6 @@
     }
 
     TRACE("DIBSection at : %p\n", priv->dib.bitmap_data);
-    if (!This->surface_desc.u1.lPitch) {
-	/* This can't happen, right? */
-	/* or use GDI_GetObj to get it from the created DIB? */
-	This->surface_desc.u1.lPitch = get_dib_width_bytes(b_info->bmiHeader.biWidth, b_info->bmiHeader.biBitCount);
-	This->surface_desc.dwFlags |= DDSD_PITCH;
-    }
 
     if (!This->surface_desc.lpSurface) {
 	This->surface_desc.lpSurface = priv->dib.bitmap_data;


More information about the wine-patches mailing list