diff --git a/src/ddsurface.c b/src/ddsurface.c
index b62a548..0d79386 100644
--- a/src/ddsurface.c
+++ b/src/ddsurface.c
@@ -193,7 +193,19 @@ HRESULT dds_Blt(IDirectDrawSurfaceImpl *This, LPRECT lpDestRect, LPDIRECTDRAWSUR
 
     if (src_surface && src_w > 0 && src_h > 0 && dst_w > 0 && dst_h > 0)
     {
-        if ((dwFlags & DDBLT_KEYSRC) || (dwFlags & DDBLT_KEYSRCOVERRIDE))
+        if (This->bpp != src_surface->bpp)
+        {
+            dprintfex("     NOT_IMPLEMENTED This->bpp=%u, src_surface->bpp=%u\n", This->bpp, src_surface->bpp);
+
+            HDC dst_dc;
+            dds_GetDC(This, &dst_dc);
+
+            HDC src_dc;
+            dds_GetDC(src_surface, &src_dc);
+
+            StretchBlt(dst_dc, dst_x, dst_y, dst_w, dst_h, src_dc, src_x, src_y, src_w, src_h, SRCCOPY);
+        }
+        else if ((dwFlags & DDBLT_KEYSRC) || (dwFlags & DDBLT_KEYSRCOVERRIDE))
         {
             DDCOLORKEY color_key;
 
@@ -636,7 +648,19 @@ HRESULT dds_BltFast(IDirectDrawSurfaceImpl *This, DWORD dst_x, DWORD dst_y, LPDI
 
     if (src_surface && dst_w > 0 && dst_h > 0)
     {
-        if (flags & DDBLTFAST_SRCCOLORKEY)
+        if (This->bpp != src_surface->bpp)
+        {
+            dprintfex("     NOT_IMPLEMENTED This->bpp=%u, src_surface->bpp=%u\n", This->bpp, src_surface->bpp);
+
+            HDC dst_dc;
+            dds_GetDC(This, &dst_dc);
+
+            HDC src_dc;
+            dds_GetDC(src_surface, &src_dc);
+
+            BitBlt(dst_dc, dst_x, dst_y, dst_w, dst_h, src_dc, src_x, src_y, SRCCOPY);
+        }
+        else if (flags & DDBLTFAST_SRCCOLORKEY)
         {
             if (This->bpp == 8)
             {
@@ -1246,6 +1270,29 @@ HRESULT dd_CreateSurface(IDirectDrawImpl* This, LPDDSURFACEDESC lpDDSurfaceDesc,
     dst_surface->caps = lpDDSurfaceDesc->ddsCaps.dwCaps;
     dst_surface->ddraw = This;
 
+    if (dst_surface->flags & DDSD_PIXELFORMAT)
+    {
+        switch (lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount)
+        {
+        case 8:
+            dst_surface->bpp = 8;
+            break;
+        case 15:
+            dprintf("     NOT_IMPLEMENTED bpp=%u\n", lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount);
+        case 16:
+            dst_surface->bpp = 16;
+            break;
+        case 24:
+            dprintf("     NOT_IMPLEMENTED bpp=%u\n", lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount);
+        case 32:
+            dst_surface->bpp = 32;
+            break;
+        default:
+            dprintf("     NOT_IMPLEMENTED bpp=%u\n", lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount);
+            break;
+        }
+    }
+
     if (dst_surface->caps & DDSCAPS_PRIMARYSURFACE)
     {
         dst_surface->width = g_ddraw->width;