https://bugs.winehq.org/show_bug.cgi?id=40441
--- Comment #7 from joaopa jeremielapuree@yahoo.fr --- I investigated this bug. In the function in /src/HelperLib/texturen.cpp void MakeTransparent(LPDIRECTDRAWSURFACE7 lpSurface,const BOOLEAN white) { DDSURFACEDESC2 ddsd; DWORD dwAlphaMask,dwRGBMask,dwColorkey; DWORD x,y; PWORD p16; PDWORD p32; DWORD texturenum=0; DWORD dwRGBBitCount;
nochmal: // For textures with real alpha (not palettized), set transparent bits printf("texturenum = %x, lpSurface = %p\n", texturenum, lpSurface); ZeroMemory(&ddsd,sizeof(ddsd)); ddsd.dwSize=sizeof(ddsd); while (lpSurface->Lock(NULL, &ddsd, 0, 0) == DDERR_WASSTILLDRAWING) ;
if (texturenum==0) { dwAlphaMask = ddsd.ddpfPixelFormat.dwRGBAlphaBitMask; dwRGBMask = ddsd.ddpfPixelFormat.dwRBitMask | ddsd.ddpfPixelFormat.dwGBitMask | ddsd.ddpfPixelFormat.dwBBitMask; dwColorkey = 0x00000000; // Colorkey on black if (white) dwColorkey = dwRGBMask; // Colorkey on white dwRGBBitCount=ddsd.ddpfPixelFormat.dwRGBBitCount; }
printf("dwRGBBitCount = %x\n", dwRGBBitCount); // Add an opaque alpha value to each non-colorkeyed pixel if (dwRGBBitCount == 16) { for (y = 0;y<ddsd.dwHeight;y++) { p16 = LPWORD(DWORD(ddsd.lpSurface) + y * DWORD(ddsd.lPitch)); for (x = 0;x<ddsd.dwWidth;x++) { *p16 = *p16 & WORD(dwRGBMask); if (*p16!=dwColorkey) *p16 = *p16 | (WORD)(dwAlphaMask); p16++; } } } if (dwRGBBitCount == 32) { for (y = 0;y<ddsd.dwHeight;y++) { p32=PDWORD(DWORD(ddsd.lpSurface)+y*DWORD(ddsd.lPitch)); for (x=0;x<ddsd.dwWidth;x++) { *p32=*p32&dwRGBMask; if (*p32!=dwColorkey)*p32=*p32|DWORD(dwAlphaMask); p32++; } } } lpSurface->Unlock(NULL);
if (ddsd.dwMipMapCount>1) { texturenum++;
DDSCAPS2 ddsCaps; ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_MIPMAP; ddsCaps.dwCaps2 = 0; ddsCaps.dwCaps3 = 0; ddsCaps.dwCaps4 = 0; if (SUCCEEDED(lpSurface->GetAttachedSurface( &ddsCaps, &lpSurface ))) lpSurface->Release(); goto nochmal; } }
the surface lptexture becomes NULL. So, NULL->Lock(NULL, &ddsd, 0, 0) is called. That works in Windows, not in Wine.