From a52881eb724ee7c53d77ebb05b0c019bc64a6950 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 May 2021 16:21:06 +0200 Subject: [PATCH] #89 fixes blt/blitfast where source and dest sourface are the same --- src/config.c | 5 ++++ src/ddsurface.c | 75 +++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 71 insertions(+), 9 deletions(-) diff --git a/src/config.c b/src/config.c index 806798b..a6939f5 100644 --- a/src/config.c +++ b/src/config.c @@ -547,6 +547,11 @@ static void cfg_create_ini() "[Cultures2MP]\n" "handlemouse=false\n" "\n" + "; Blade & Sword\n" + "[comeon]\n" + "renderer=opengl\n" + "nonexclusive=true\n" + "\n" , fh); fclose(fh); diff --git a/src/ddsurface.c b/src/ddsurface.c index 17aa4a4..04095ee 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -200,13 +200,41 @@ HRESULT dds_Blt(IDirectDrawSurfaceImpl *This, LPRECT lpDestRect, LPDIRECTDRAWSUR unsigned int dst_pitch = width * This->lx_pitch; - int i; - for (i = 0; i < height; i++) + if (This == src_surface) { - memcpy(dst, src, dst_pitch); + if (dst_y > src_y) + { + src += src_surface->l_pitch * height; + dst += This->l_pitch * height; - src += src_surface->l_pitch; - dst += This->l_pitch; + for (int i = height; i-- > 0;) + { + src -= src_surface->l_pitch; + dst -= This->l_pitch; + + memmove(dst, src, dst_pitch); + } + } + else + { + for (int i = 0; i < height; i++) + { + memmove(dst, src, dst_pitch); + + src += src_surface->l_pitch; + dst += This->l_pitch; + } + } + } + else + { + for (int i = 0; i < height; i++) + { + memcpy(dst, src, dst_pitch); + + src += src_surface->l_pitch; + dst += This->l_pitch; + } } } else @@ -491,12 +519,41 @@ HRESULT dds_BltFast(IDirectDrawSurfaceImpl *This, DWORD dst_x, DWORD dst_y, LPDI unsigned int dst_pitch = dst_w * This->lx_pitch; - for (int i = 0; i < dst_h; i++) + if (This == src_surface) { - memcpy(dst, src, dst_pitch); + if (dst_y > src_y) + { + src += src_surface->l_pitch * dst_h; + dst += This->l_pitch * dst_h; - src += src_surface->l_pitch; - dst += This->l_pitch; + for (int i = dst_h; i-- > 0;) + { + src -= src_surface->l_pitch; + dst -= This->l_pitch; + + memmove(dst, src, dst_pitch); + } + } + else + { + for (int i = 0; i < dst_h; i++) + { + memmove(dst, src, dst_pitch); + + src += src_surface->l_pitch; + dst += This->l_pitch; + } + } + } + else + { + for (int i = 0; i < dst_h; i++) + { + memcpy(dst, src, dst_pitch); + + src += src_surface->l_pitch; + dst += This->l_pitch; + } } } }