Fix uninitialized ddpfPixelFormat in VTable0x44 (#563)

This commit is contained in:
Anders Jenbo 2025-07-09 07:40:24 +02:00 committed by GitHub
parent 4dc8bfc0ac
commit b8e7c8f774
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 19 additions and 11 deletions

View File

@ -827,6 +827,7 @@ LPDIRECTDRAWSURFACE MxDisplaySurface::VTable0x44(
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT; ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT;
ddsd.dwWidth = p_bitmap->GetBmiWidth(); ddsd.dwWidth = p_bitmap->GetBmiWidth();
ddsd.dwHeight = p_bitmap->GetBmiHeightAbs(); ddsd.dwHeight = p_bitmap->GetBmiHeightAbs();
ddsd.ddpfPixelFormat = m_surfaceDesc.ddpfPixelFormat;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
*p_ret = 0; *p_ret = 0;
ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY;

View File

@ -143,9 +143,12 @@ enum class DDBltFlags : uint32_t {
}; };
ENABLE_BITMASK_OPERATORS(DDBltFlags) ENABLE_BITMASK_OPERATORS(DDBltFlags)
#define DDPF_ALPHAPIXELS DDPixelFormatFlags::ALPHAPIXELS
#define DDPF_PALETTEINDEXED8 DDPixelFormatFlags::PALETTEINDEXED8 #define DDPF_PALETTEINDEXED8 DDPixelFormatFlags::PALETTEINDEXED8
#define DDPF_RGB DDPixelFormatFlags::RGB #define DDPF_RGB DDPixelFormatFlags::RGB
#define DDPF_ALPHAPIXELS DDPixelFormatFlags::ALPHAPIXELS
enum class DDPixelFormatFlags : uint32_t { enum class DDPixelFormatFlags : uint32_t {
ALPHAPIXELS = 1 << 0, // dwRGBAlphaBitMask is valid
PALETTEINDEXED8 = 1 << 5, // The texture uses an 8 bit palette PALETTEINDEXED8 = 1 << 5, // The texture uses an 8 bit palette
RGB = 1 << 6, // dwRGBBitCount, dwRBitMask, dwGBitMask, and dwBBitMask is valid RGB = 1 << 6, // dwRGBBitCount, dwRBitMask, dwGBitMask, and dwBBitMask is valid
}; };

View File

@ -106,13 +106,17 @@ HRESULT DirectDrawImpl::CreateSurface(
#endif #endif
if ((lpDDSurfaceDesc->dwFlags & DDSD_PIXELFORMAT) == DDSD_PIXELFORMAT) { if ((lpDDSurfaceDesc->dwFlags & DDSD_PIXELFORMAT) == DDSD_PIXELFORMAT) {
if ((lpDDSurfaceDesc->ddpfPixelFormat.dwFlags & DDPF_RGB) == DDPF_RGB) { if ((lpDDSurfaceDesc->ddpfPixelFormat.dwFlags & DDPF_RGB) == DDPF_RGB) {
switch (lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount) { int bpp = lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount;
case 8: Uint32 rMask = lpDDSurfaceDesc->ddpfPixelFormat.dwRBitMask;
format = SDL_PIXELFORMAT_INDEX8; Uint32 gMask = lpDDSurfaceDesc->ddpfPixelFormat.dwGBitMask;
break; Uint32 bMask = lpDDSurfaceDesc->ddpfPixelFormat.dwBBitMask;
case 16: Uint32 aMask = (lpDDSurfaceDesc->ddpfPixelFormat.dwFlags & DDPF_ALPHAPIXELS) == DDPF_ALPHAPIXELS
format = SDL_PIXELFORMAT_RGB565; ? lpDDSurfaceDesc->ddpfPixelFormat.dwRGBAlphaBitMask
break; : 0;
format = SDL_GetPixelFormatForMasks(bpp, rMask, gMask, bMask, aMask);
if (format == SDL_PIXELFORMAT_UNKNOWN) {
return DDERR_INVALIDPIXELFORMAT;
} }
} }
} }
@ -168,7 +172,7 @@ HRESULT DirectDrawImpl::EnumDisplayModes(
ddsd.dwWidth = modes[i]->w; ddsd.dwWidth = modes[i]->w;
ddsd.dwHeight = modes[i]->h; ddsd.dwHeight = modes[i]->h;
ddsd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); ddsd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB; ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB | DDPF_ALPHAPIXELS;
ddsd.ddpfPixelFormat.dwRGBBitCount = details->bits_per_pixel; ddsd.ddpfPixelFormat.dwRGBBitCount = details->bits_per_pixel;
if (details->bits_per_pixel == 8) { if (details->bits_per_pixel == 8) {
ddsd.ddpfPixelFormat.dwFlags |= DDPF_PALETTEINDEXED8; ddsd.ddpfPixelFormat.dwFlags |= DDPF_PALETTEINDEXED8;
@ -271,7 +275,7 @@ HRESULT DirectDrawImpl::GetDisplayMode(LPDDSURFACEDESC lpDDSurfaceDesc)
lpDDSurfaceDesc->dwWidth = mode->w; lpDDSurfaceDesc->dwWidth = mode->w;
lpDDSurfaceDesc->dwHeight = mode->h; lpDDSurfaceDesc->dwHeight = mode->h;
lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount = details->bits_per_pixel; lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount = details->bits_per_pixel;
lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_RGB; lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_RGB | DDPF_ALPHAPIXELS;
if (details->bits_per_pixel == 8) { if (details->bits_per_pixel == 8) {
lpDDSurfaceDesc->ddpfPixelFormat.dwFlags |= DDPF_PALETTEINDEXED8; lpDDSurfaceDesc->ddpfPixelFormat.dwFlags |= DDPF_PALETTEINDEXED8;
} }

View File

@ -145,7 +145,7 @@ HRESULT DirectDrawSurfaceImpl::GetPalette(LPDIRECTDRAWPALETTE* lplpDDPalette)
HRESULT DirectDrawSurfaceImpl::GetPixelFormat(LPDDPIXELFORMAT lpDDPixelFormat) HRESULT DirectDrawSurfaceImpl::GetPixelFormat(LPDDPIXELFORMAT lpDDPixelFormat)
{ {
memset(lpDDPixelFormat, 0, sizeof(*lpDDPixelFormat)); memset(lpDDPixelFormat, 0, sizeof(*lpDDPixelFormat));
lpDDPixelFormat->dwFlags = DDPF_RGB; lpDDPixelFormat->dwFlags = DDPF_RGB | DDPF_ALPHAPIXELS;
const SDL_PixelFormatDetails* details = SDL_GetPixelFormatDetails(m_surface->format); const SDL_PixelFormatDetails* details = SDL_GetPixelFormatDetails(m_surface->format);
if (details->bits_per_pixel == 8) { if (details->bits_per_pixel == 8) {
lpDDPixelFormat->dwFlags |= DDPF_PALETTEINDEXED8; lpDDPixelFormat->dwFlags |= DDPF_PALETTEINDEXED8;

View File

@ -143,7 +143,7 @@ HRESULT FrameBufferImpl::GetPalette(LPDIRECTDRAWPALETTE* lplpDDPalette)
HRESULT FrameBufferImpl::GetPixelFormat(LPDDPIXELFORMAT lpDDPixelFormat) HRESULT FrameBufferImpl::GetPixelFormat(LPDDPIXELFORMAT lpDDPixelFormat)
{ {
memset(lpDDPixelFormat, 0, sizeof(*lpDDPixelFormat)); memset(lpDDPixelFormat, 0, sizeof(*lpDDPixelFormat));
lpDDPixelFormat->dwFlags = DDPF_RGB; lpDDPixelFormat->dwFlags = DDPF_RGB | DDPF_ALPHAPIXELS;
const SDL_PixelFormatDetails* details = SDL_GetPixelFormatDetails(m_transferBuffer->m_surface->format); const SDL_PixelFormatDetails* details = SDL_GetPixelFormatDetails(m_transferBuffer->m_surface->format);
if (details->bits_per_pixel == 8) { if (details->bits_per_pixel == 8) {
lpDDPixelFormat->dwFlags |= DDPF_PALETTEINDEXED8; lpDDPixelFormat->dwFlags |= DDPF_PALETTEINDEXED8;