diff --git a/src/ddsurface.c b/src/ddsurface.c
index b520577..a746813 100644
--- a/src/ddsurface.c
+++ b/src/ddsurface.c
@@ -52,6 +52,12 @@ HRESULT dds_Blt(IDirectDrawSurfaceImpl *This, LPRECT lpDestRect, LPDIRECTDRAWSUR
 
     if (src_surface)
     {
+        if (src_rect.left < 0)
+            src_rect.left = 0;
+
+        if (src_rect.top < 0)
+            src_rect.top = 0;
+
         if (src_rect.right > src_surface->width)
             src_rect.right = src_surface->width;
 
@@ -65,6 +71,12 @@ HRESULT dds_Blt(IDirectDrawSurfaceImpl *This, LPRECT lpDestRect, LPDIRECTDRAWSUR
             src_rect.top = src_rect.bottom;
     }
 
+    if (dst_rect.left < 0)
+        dst_rect.left = 0;
+
+    if (dst_rect.top < 0)
+        dst_rect.top = 0;
+
     if (dst_rect.right > This->width)
         dst_rect.right = This->width;
 
@@ -468,6 +480,12 @@ HRESULT dds_BltFast(IDirectDrawSurfaceImpl *This, DWORD dst_x, DWORD dst_y, LPDI
     {
         memcpy(&src_rect, lpSrcRect, sizeof(src_rect));
 
+        if (src_rect.left < 0)
+            src_rect.left = 0;
+
+        if (src_rect.top < 0)
+            src_rect.top = 0;
+
         if (src_rect.right > src_surface->width)
             src_rect.right = src_surface->width;
 
@@ -486,6 +504,12 @@ HRESULT dds_BltFast(IDirectDrawSurfaceImpl *This, DWORD dst_x, DWORD dst_y, LPDI
 
     RECT dst_rect = { dst_x, dst_y, (src_rect.right - src_rect.left) + dst_x, (src_rect.bottom - src_rect.top) + dst_y };
 
+    if (dst_rect.left < 0)
+        dst_rect.left = 0;
+
+    if (dst_rect.top < 0)
+        dst_rect.top = 0;
+
     if (dst_rect.right > This->width)
         dst_rect.right = This->width;
 
@@ -498,6 +522,8 @@ HRESULT dds_BltFast(IDirectDrawSurfaceImpl *This, DWORD dst_x, DWORD dst_y, LPDI
     if (dst_rect.top > dst_rect.bottom)
         dst_rect.top = dst_rect.bottom;
 
+    dst_x = dst_rect.left;
+    dst_y = dst_rect.top;
     int dst_w = dst_rect.right - dst_rect.left;
     int dst_h = dst_rect.bottom - dst_rect.top;