From 9e9783f8d2705dbbe4a39972f5daa1ebbb8d4169 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 22 May 2021 12:23:25 +0200 Subject: [PATCH] fix rgb palette --- inc/IDirectDrawPalette.h | 2 +- inc/ddsurface.h | 1 - src/ddpalette.c | 47 +++++++++++++--------------------- src/ddsurface.c | 55 +++++++++++++++------------------------- src/debug.c | 8 +++--- src/render_d3d9.c | 14 +++++----- src/render_gdi.c | 32 ++++++++++------------- src/utils.c | 9 ++++--- 8 files changed, 70 insertions(+), 98 deletions(-) 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); } }