From edf69fcc2a6537ccba0cb4815ff88ae3161a6e7b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 15 Sep 2022 10:10:52 +0200 Subject: [PATCH] add support for DDSD_LPSURFACE and DDSD_PITCH --- inc/IDirectDrawSurface.h | 1 + src/IDirectDraw/IDirectDrawSurface.c | 2 +- src/ddsurface.c | 11 +++++++++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/inc/IDirectDrawSurface.h b/inc/IDirectDrawSurface.h index f5f897e..36590d2 100644 --- a/inc/IDirectDrawSurface.h +++ b/inc/IDirectDrawSurface.h @@ -30,6 +30,7 @@ typedef struct IDirectDrawSurfaceImpl void* surface; DWORD l_pitch; DWORD lx_pitch; + BOOL custom_surface; PBITMAPINFO bmi; HBITMAP bitmap; diff --git a/src/IDirectDraw/IDirectDrawSurface.c b/src/IDirectDraw/IDirectDrawSurface.c index de4b209..2f55074 100644 --- a/src/IDirectDraw/IDirectDrawSurface.c +++ b/src/IDirectDraw/IDirectDrawSurface.c @@ -85,7 +85,7 @@ ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This) { DeleteObject(This->bitmap); } - else if (This->surface) + else if (This->surface && !This->custom_surface) { HeapFree(GetProcessHeap(), 0, This->surface); } diff --git a/src/ddsurface.c b/src/ddsurface.c index 5611f0a..143ad73 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -596,7 +596,6 @@ HRESULT dds_GetAttachedSurface(IDirectDrawSurfaceImpl* This, LPDDSCAPS lpDdsCaps IDirectDrawSurface_AddRef(This); *lpDDsurface = This; } - } return DD_OK; } @@ -1037,7 +1036,15 @@ HRESULT dd_CreateSurface( dst_surface->height = lpDDSurfaceDesc->dwHeight; } - if (dst_surface->width && dst_surface->height) + if ((dst_surface->flags & DDSD_LPSURFACE) && (dst_surface->flags & DDSD_PITCH)) + { + dst_surface->surface = lpDDSurfaceDesc->lpSurface; + dst_surface->l_pitch = lpDDSurfaceDesc->lPitch; + dst_surface->lx_pitch = dst_surface->bpp / 8; + dst_surface->size = dst_surface->l_pitch * dst_surface->height; + dst_surface->custom_surface = TRUE; + } + else if (dst_surface->width && dst_surface->height) { dst_surface->lx_pitch = dst_surface->bpp / 8; dst_surface->l_pitch = ((dst_surface->width * dst_surface->bpp + 31) & ~31) >> 3;