diff --git a/inc/IDirectDrawPalette.h b/inc/IDirectDrawPalette.h
index e1f2ff4..37be24b 100644
--- a/inc/IDirectDrawPalette.h
+++ b/inc/IDirectDrawPalette.h
@@ -16,7 +16,7 @@ typedef struct IDirectDrawPaletteImpl
     ULONG ref;
 
     int data_bgr[256];
-    RGBQUAD* data_rgb;
+    RGBQUAD data_rgb[256];
     DWORD flags;
 
 } IDirectDrawPaletteImpl;
diff --git a/inc/ddsurface.h b/inc/ddsurface.h
index 3f99cb1..909163c 100644
--- a/inc/ddsurface.h
+++ b/inc/ddsurface.h
@@ -29,7 +29,6 @@ HRESULT dds_SetClipper(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWCLIPPER lpClipp
 HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWPALETTE lpDDPalette);
 HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPVOID lpRect);
 void* dds_GetBuffer(IDirectDrawSurfaceImpl* This);
-HDC dds_GetHDC(IDirectDrawSurfaceImpl* This);
 HRESULT dd_CreateSurface(LPDDSURFACEDESC lpDDSurfaceDesc, LPDIRECTDRAWSURFACE FAR* lpDDSurface, IUnknown FAR* unkOuter);
 
 
diff --git a/src/ddpalette.c b/src/ddpalette.c
index d1e9eb0..bf3392a 100644
--- a/src/ddpalette.c
+++ b/src/ddpalette.c
@@ -9,16 +9,11 @@
 
 HRESULT ddp_GetEntries(IDirectDrawPaletteImpl *This, DWORD dwFlags, DWORD dwBase, DWORD dwNumEntries, LPPALETTEENTRY lpEntries)
 {
-    int i, x;
-
-    for (i = dwBase, x = 0; i < dwBase + dwNumEntries; i++, x++)
+    for (int i = dwBase, x = 0; i < dwBase + dwNumEntries; i++, x++)
     {
-        if (This->data_rgb)
-        {
-            lpEntries[x].peRed = This->data_rgb[i].rgbRed;
-            lpEntries[x].peGreen = This->data_rgb[i].rgbGreen;
-            lpEntries[x].peBlue = This->data_rgb[i].rgbBlue;
-        }
+        lpEntries[x].peRed = This->data_rgb[i].rgbRed;
+        lpEntries[x].peGreen = This->data_rgb[i].rgbGreen;
+        lpEntries[x].peBlue = This->data_rgb[i].rgbBlue;
     }
 
     return DD_OK;
@@ -26,19 +21,14 @@ HRESULT ddp_GetEntries(IDirectDrawPaletteImpl *This, DWORD dwFlags, DWORD dwBase
 
 HRESULT ddp_SetEntries(IDirectDrawPaletteImpl *This, DWORD dwFlags, DWORD dwStartingEntry, DWORD dwCount, LPPALETTEENTRY lpEntries)
 {
-    int i, x;
-
-    for (i = dwStartingEntry, x = 0; i < dwStartingEntry + dwCount; i++, x++)
+    for (int i = dwStartingEntry, x = 0; i < dwStartingEntry + dwCount; i++, x++)
     {
         This->data_bgr[i] = (lpEntries[x].peBlue << 16) | (lpEntries[x].peGreen << 8) | lpEntries[x].peRed;
 
-        if (This->data_rgb)
-        {
-            This->data_rgb[i].rgbRed = lpEntries[x].peRed;
-            This->data_rgb[i].rgbGreen = lpEntries[x].peGreen;
-            This->data_rgb[i].rgbBlue = lpEntries[x].peBlue;
-            This->data_rgb[i].rgbReserved = 0;
-        }
+        This->data_rgb[i].rgbRed = lpEntries[x].peRed;
+        This->data_rgb[i].rgbGreen = lpEntries[x].peGreen;
+        This->data_rgb[i].rgbBlue = lpEntries[x].peBlue;
+        This->data_rgb[i].rgbReserved = 0;
     }
 
     if (!(This->flags & DDPCAPS_ALLOW256))
@@ -46,18 +36,15 @@ HRESULT ddp_SetEntries(IDirectDrawPaletteImpl *This, DWORD dwFlags, DWORD dwStar
         This->data_bgr[0] = 0;
         This->data_bgr[255] = (255 << 16) | (255 << 8) | 255;
 
-        if (This->data_rgb)
-        {
-            This->data_rgb[0].rgbRed = 0;
-            This->data_rgb[0].rgbGreen = 0;
-            This->data_rgb[0].rgbBlue = 0;
-            This->data_rgb[0].rgbReserved = 0;
+        This->data_rgb[0].rgbRed = 0;
+        This->data_rgb[0].rgbGreen = 0;
+        This->data_rgb[0].rgbBlue = 0;
+        This->data_rgb[0].rgbReserved = 0;
 
-            This->data_rgb[255].rgbRed = 255;
-            This->data_rgb[255].rgbGreen = 255;
-            This->data_rgb[255].rgbBlue = 255;
-            This->data_rgb[255].rgbReserved = 0;
-        }
+        This->data_rgb[255].rgbRed = 255;
+        This->data_rgb[255].rgbGreen = 255;
+        This->data_rgb[255].rgbBlue = 255;
+        This->data_rgb[255].rgbReserved = 0;
     }
 
     if (g_ddraw->primary && g_ddraw->primary->palette == This && g_ddraw->render.run)
diff --git a/src/ddsurface.c b/src/ddsurface.c
index 8659eaf..1ad8429 100644
--- a/src/ddsurface.c
+++ b/src/ddsurface.c
@@ -792,21 +792,34 @@ HRESULT dds_GetColorKey(IDirectDrawSurfaceImpl *This, DWORD flags, LPDDCOLORKEY
 
 HRESULT dds_GetDC(IDirectDrawSurfaceImpl *This, HDC FAR *lpHDC)
 {
+    if (!This)
+    {
+        if (lpHDC)
+            *lpHDC = NULL;
+
+        return DDERR_INVALIDPARAMS;
+    }
+
     if ((This->l_pitch % 4))
     {
         dprintf("NOT_IMPLEMENTED     GetDC: width=%d height=%d\n", This->width, This->height);
     }
 
     RGBQUAD *data = 
-        This->palette && This->palette->data_rgb ? This->palette->data_rgb :
+        This->palette ? This->palette->data_rgb :
         g_ddraw->primary && g_ddraw->primary->palette ? g_ddraw->primary->palette->data_rgb :
         NULL;
 
+    HDC dc = This->hdc;
+
+    if (This->backbuffer || (This->caps & DDSCAPS_BACKBUFFER))
+        dc = (HDC)InterlockedExchangeAdd((LONG*)&This->hdc, 0);
+
     if (data)
-        SetDIBColorTable(dds_GetHDC(This), 0, 256, data);
+        SetDIBColorTable(dc, 0, 256, data);
 
     if (lpHDC)
-        *lpHDC = dds_GetHDC(This);
+        *lpHDC = dc;
 
     return DD_OK;
 }
@@ -916,21 +929,7 @@ HRESULT dds_SetPalette(IDirectDrawSurfaceImpl *This, LPDIRECTDRAWPALETTE lpDDPal
         IDirectDrawPalette_Release(This->palette);
     }
 
-    EnterCriticalSection(&g_ddraw->cs);
-
     This->palette = (IDirectDrawPaletteImpl *)lpDDPalette;
-    This->palette->data_rgb = &This->bmi->bmiColors[0];
-
-    int i;
-    for (i = 0; i < 256; i++)
-    {
-        This->palette->data_rgb[i].rgbRed = This->palette->data_bgr[i] & 0xFF;
-        This->palette->data_rgb[i].rgbGreen = (This->palette->data_bgr[i] >> 8) & 0xFF;
-        This->palette->data_rgb[i].rgbBlue = (This->palette->data_bgr[i] >> 16) & 0xFF;
-        This->palette->data_rgb[i].rgbReserved = 0;
-    }
-
-    LeaveCriticalSection(&g_ddraw->cs);
 
     return DD_OK;
 }
@@ -941,13 +940,13 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl *This, LPVOID lpRect)
 
     if (hwnd && (This->caps & DDSCAPS_PRIMARYSURFACE))
     {
-        if (g_ddraw->primary->palette && g_ddraw->primary->palette->data_rgb)
-            SetDIBColorTable(dds_GetHDC(g_ddraw->primary), 0, 256, g_ddraw->primary->palette->data_rgb);
+        HDC primary_dc;
+        dds_GetDC(g_ddraw->primary, &primary_dc);
 
         //GdiTransparentBlt idea taken from Aqrit's war2 ddraw
 
         RGBQUAD quad;
-        GetDIBColorTable(dds_GetHDC(g_ddraw->primary), 0xFE, 1, &quad);
+        GetDIBColorTable(primary_dc, 0xFE, 1, &quad);
         COLORREF color = RGB(quad.rgbRed, quad.rgbGreen, quad.rgbBlue);
         BOOL erase = FALSE;
 
@@ -967,7 +966,7 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl *This, LPVOID lpRect)
                     0,
                     rc.right - rc.left,
                     rc.bottom - rc.top,
-                    dds_GetHDC(g_ddraw->primary),
+                    primary_dc,
                     rc.left,
                     rc.top,
                     rc.right - rc.left,
@@ -1021,17 +1020,6 @@ void* dds_GetBuffer(IDirectDrawSurfaceImpl* This)
     return This->surface;
 }
 
-HDC dds_GetHDC(IDirectDrawSurfaceImpl* This)
-{
-    if (!This)
-        return NULL;
-
-    if (This->backbuffer || (This->caps & DDSCAPS_BACKBUFFER))
-        return (HDC)InterlockedExchangeAdd((LONG*)&This->hdc, 0);
-
-    return This->hdc;
-}
-
 HRESULT dd_CreateSurface(LPDDSURFACEDESC lpDDSurfaceDesc, LPDIRECTDRAWSURFACE FAR *lpDDSurface, IUnknown FAR * unkOuter)
 {
     dbg_dump_dds_flags(lpDDSurfaceDesc->dwFlags);
@@ -1096,8 +1084,7 @@ HRESULT dd_CreateSurface(LPDDSURFACEDESC lpDDSurfaceDesc, LPDIRECTDRAWSURFACE FA
 
         if (dst_surface->bpp == 8)
         {
-            int i;
-            for (i = 0; i < 256; i++)
+            for (int i = 0; i < 256; i++)
             {
                 dst_surface->bmi->bmiColors[i].rgbRed = i;
                 dst_surface->bmi->bmiColors[i].rgbGreen = i;
diff --git a/src/debug.c b/src/debug.c
index 3ca4fb3..a549e3e 100644
--- a/src/debug.c
+++ b/src/debug.c
@@ -145,10 +145,10 @@ void dbg_draw_frame_info_start()
 
     if (g_ddraw->primary)
     {
-        if (g_ddraw->primary->palette && g_ddraw->primary->palette->data_rgb)
-            SetDIBColorTable(dds_GetHDC(g_ddraw->primary), 0, 256, g_ddraw->primary->palette->data_rgb);
-        
-        DrawText(dds_GetHDC(g_ddraw->primary), debug_text, -1, &debugrc, DT_NOCLIP);
+        HDC primary_dc;
+        dds_GetDC(g_ddraw->primary, &primary_dc);
+
+        DrawText(primary_dc, debug_text, -1, &debugrc, DT_NOCLIP);
     }
         
     DWORD tick_start = timeGetTime();
diff --git a/src/render_d3d9.c b/src/render_d3d9.c
index b7bedaa..e2d94d4 100644
--- a/src/render_d3d9.c
+++ b/src/render_d3d9.c
@@ -324,13 +324,13 @@ DWORD WINAPI d3d9_render_main(void)
         dbg_draw_frame_info_start();
 #endif
 
-        static int tex_index = 0, palIndex = 0;
+        static int tex_index = 0, pal_index = 0;
 
         fpsl_frame_start();
 
         EnterCriticalSection(&g_ddraw->cs);
 
-        if (g_ddraw->primary && (g_ddraw->bpp == 16 || (g_ddraw->primary->palette && g_ddraw->primary->palette->data_rgb)))
+        if (g_ddraw->primary && (g_ddraw->bpp == 16 || g_ddraw->primary->palette))
         {
             if (g_ddraw->vhack)
             {
@@ -376,17 +376,17 @@ DWORD WINAPI d3d9_render_main(void)
 
             if (g_ddraw->bpp == 8 && InterlockedExchange(&g_ddraw->render.palette_updated, FALSE))
             {
-                if (++palIndex >= D3D9_TEXTURE_COUNT)
-                    palIndex = 0;
+                if (++pal_index >= D3D9_TEXTURE_COUNT)
+                    pal_index = 0;
 
                 RECT rc = { 0,0,256,1 };
 
-                if (SUCCEEDED(IDirect3DDevice9_SetTexture(g_d3d9.device, 1, (IDirect3DBaseTexture9 *)g_d3d9.palette_tex[palIndex])) &&
-                    SUCCEEDED(IDirect3DTexture9_LockRect(g_d3d9.palette_tex[palIndex], 0, &lock_rc, &rc, 0)))
+                if (SUCCEEDED(IDirect3DDevice9_SetTexture(g_d3d9.device, 1, (IDirect3DBaseTexture9 *)g_d3d9.palette_tex[pal_index])) &&
+                    SUCCEEDED(IDirect3DTexture9_LockRect(g_d3d9.palette_tex[pal_index], 0, &lock_rc, &rc, 0)))
                 {
                     memcpy(lock_rc.pBits, g_ddraw->primary->palette->data_rgb, 256 * sizeof(int));
 
-                    IDirect3DTexture9_UnlockRect(g_d3d9.palette_tex[palIndex], 0);
+                    IDirect3DTexture9_UnlockRect(g_d3d9.palette_tex[pal_index], 0);
                 }
             }
 
diff --git a/src/render_gdi.c b/src/render_gdi.c
index 4d130a8..5131efb 100644
--- a/src/render_gdi.c
+++ b/src/render_gdi.c
@@ -46,14 +46,17 @@ DWORD WINAPI gdi_render_main(void)
 
         EnterCriticalSection(&g_ddraw->cs);
 
-        if (g_ddraw->primary && (g_ddraw->bpp == 16 || (g_ddraw->primary->palette && g_ddraw->primary->palette->data_rgb)))
+        if (g_ddraw->primary && (g_ddraw->bpp == 16 || g_ddraw->primary->palette))
         {
+            HDC primary_dc;
+            dds_GetDC(g_ddraw->primary, &primary_dc);
+
             if (warning_end_tick)
             {
                 if (timeGetTime() < warning_end_tick)
                 {
                     RECT rc = { 0, 0, g_ddraw->width, g_ddraw->height };
-                    DrawText(g_ddraw->primary->hdc, warning_text, -1, &rc, DT_NOCLIP | DT_CENTER);
+                    DrawText(primary_dc, warning_text, -1, &rc, DT_NOCLIP | DT_CENTER);
                 }
                 else
                 {
@@ -79,54 +82,47 @@ DWORD WINAPI gdi_render_main(void)
             }
             else if (upscale_hack)
             {
-                StretchDIBits(
+                StretchBlt(
                     g_ddraw->render.hdc, 
                     g_ddraw->render.viewport.x, 
                     g_ddraw->render.viewport.y,
                     g_ddraw->render.viewport.width, 
                     g_ddraw->render.viewport.height,
-                    0, 
-                    g_ddraw->height - g_ddraw->upscale_hack_height,
+                    primary_dc,
+                    0,
+                    0,
                     g_ddraw->upscale_hack_width,
                     g_ddraw->upscale_hack_height,
-                    g_ddraw->primary->surface,
-                    g_ddraw->primary->bmi, 
-                    DIB_RGB_COLORS, 
                     SRCCOPY);
             }
             else if (!g_ddraw->child_window_exists && 
                      (g_ddraw->render.width != g_ddraw->width || g_ddraw->render.height != g_ddraw->height))
             {
-                StretchDIBits(
+                StretchBlt(
                     g_ddraw->render.hdc, 
                     g_ddraw->render.viewport.x, 
                     g_ddraw->render.viewport.y, 
                     g_ddraw->render.viewport.width, 
                     g_ddraw->render.viewport.height, 
+                    primary_dc,
                     0, 
                     0, 
                     g_ddraw->width, 
                     g_ddraw->height, 
-                    g_ddraw->primary->surface, 
-                    g_ddraw->primary->bmi, 
-                    DIB_RGB_COLORS, 
                     SRCCOPY);
             }
             else
             {
-                SetDIBitsToDevice(
+                BitBlt(
                     g_ddraw->render.hdc, 
                     0, 
                     0, 
                     g_ddraw->width, 
                     g_ddraw->height, 
+                    primary_dc,
                     0, 
                     0, 
-                    0, 
-                    g_ddraw->height, 
-                    g_ddraw->primary->surface, 
-                    g_ddraw->primary->bmi, 
-                    DIB_RGB_COLORS);
+                    SRCCOPY);
             } 
         }
 
diff --git a/src/utils.c b/src/utils.c
index 5c978e0..3a58bab 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -317,13 +317,16 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam)
 
         if (g_ddraw->fixchildwindows)
         {
-            HDC hdc = GetDC(hwnd);
+            HDC dst_dc = GetDC(hwnd);
+            HDC src_dc;
+
+            dds_GetDC(this, &src_dc);
 
             MapWindowPoints(HWND_DESKTOP, g_ddraw->hwnd, (LPPOINT)&pos, 2);
 
-            BitBlt(hdc, 0, 0, size.right, size.bottom, dds_GetHDC(this), pos.left, pos.top, SRCCOPY);
+            BitBlt(dst_dc, 0, 0, size.right, size.bottom, src_dc, pos.left, pos.top, SRCCOPY);
 
-            ReleaseDC(hwnd, hdc);
+            ReleaseDC(hwnd, dst_dc);
         }
     }