[PATCH] Fix missing pitch in callback from EnumDisplayModes(). Also added test-case for it. Tested on WinXP & Linux
Peter Dons Tychsen (none)
donpedro at dhcppc4.
Tue Jan 1 14:33:32 CST 2008
---
dlls/ddraw/ddraw.c | 7 ++++++-
dlls/ddraw/tests/ddrawmodes.c | 17 +++++++++++++++--
2 files changed, 21 insertions(+), 3 deletions(-)
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 15e8edc..908fb3b 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -1288,8 +1288,13 @@ IDirectDrawImpl_EnumDisplayModes(IDirectDraw7 *iface,
callback_sd.dwHeight = mode.Height;
PixelFormat_WineD3DtoDD(&callback_sd.u4.ddpfPixelFormat, mode.Format);
+
+ /* Calc pitch and DWORD align like MSDN says */
+ callback_sd.u1.lPitch = (callback_sd.u4.ddpfPixelFormat.u1.dwRGBBitCount / 8) * mode.Width;
+ callback_sd.u1.lPitch = (callback_sd.u1.lPitch + 3) & ~3;
- TRACE("Enumerating %dx%d@%d\n", callback_sd.dwWidth, callback_sd.dwHeight, callback_sd.u4.ddpfPixelFormat.u1.dwRGBBitCount);
+ TRACE("Enumerating %dx%dx%d @%d\n", callback_sd.dwWidth, callback_sd.dwHeight, callback_sd.u4.ddpfPixelFormat.u1.dwRGBBitCount,
+ callback_sd.u2.dwRefreshRate);
if(cb(&callback_sd, Context) == DDENUMRET_CANCEL)
{
diff --git a/dlls/ddraw/tests/ddrawmodes.c b/dlls/ddraw/tests/ddrawmodes.c
index 4db0856..5af8ba4 100644
--- a/dlls/ddraw/tests/ddrawmodes.c
+++ b/dlls/ddraw/tests/ddrawmodes.c
@@ -108,9 +108,22 @@ static void flushdisplaymodes(void)
static HRESULT WINAPI enummodescallback(LPDDSURFACEDESC lpddsd, LPVOID lpContext)
{
- trace("Width = %i, Height = %i, Refresh Rate = %i\r\n",
+ trace("Width = %i, Height = %i, Refresh Rate = %i, Pitch = %i, flags =%02X\r\n",
lpddsd->dwWidth, lpddsd->dwHeight,
- U2(*lpddsd).dwRefreshRate);
+ U2(*lpddsd).dwRefreshRate, lpddsd->lPitch, lpddsd->dwFlags);
+
+ /* Check that the pitch is valid if applicable */
+ if(lpddsd->dwFlags & DDSD_PITCH)
+ {
+ ok(lpddsd->lPitch != 0, "EnumDisplayModes callback with bad pitch\n");
+ }
+
+ /* Check that frequency is valid if applicable */
+ if(lpddsd->dwFlags & DDSD_REFRESHRATE)
+ {
+ ok(lpddsd->dwRefreshRate != 0, "EnumDisplayModes callback with bad refresh rate\n");
+ }
+
adddisplaymode(lpddsd);
return DDENUMRET_OK;
--
1.5.3.6
--=-PGMcmVVkZheDV2QbTFTK--
More information about the wine-patches
mailing list