From 806924f86ebab6d8b36a55244610675904547d6c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Dec 2024 00:05:51 +0100 Subject: [PATCH] assign default palette to primary surface --- inc/ddpalette.h | 261 ++++++++++++++++++++++++++++++++++++++++++++++++ src/ddpalette.c | 2 +- src/ddsurface.c | 17 +++- 3 files changed, 277 insertions(+), 3 deletions(-) diff --git a/inc/ddpalette.h b/inc/ddpalette.h index 7d264db69b..ebb4479091 100644 --- a/inc/ddpalette.h +++ b/inc/ddpalette.h @@ -11,4 +11,265 @@ HRESULT ddp_GetEntries(IDirectDrawPaletteImpl* This, DWORD dwFlags, DWORD dwBase HRESULT ddp_SetEntries(IDirectDrawPaletteImpl* This, DWORD dwFlags, DWORD dwStartingEntry, DWORD dwCount, LPPALETTEENTRY lpEntries); HRESULT dd_CreatePalette(DWORD dwFlags, LPPALETTEENTRY lpDDColorArray, IDirectDrawPaletteImpl** lpDDPalette, IUnknown FAR* unkOuter); +// Original palette copied from Windows ME +static PALETTEENTRY g_ddp_me_palette[] = +{ + { 0, 0, 0, 0 }, + { 128, 0, 0, 0 }, + { 0, 128, 0, 0 }, + { 128, 128, 0, 0 }, + { 0, 0, 128, 0 }, + { 128, 0, 128, 0 }, + { 0, 128, 128, 0 }, + { 192, 192, 192, 0 }, + { 192, 220, 192, 0 }, + { 166, 202, 240, 0 }, + { 95, 63, 63, 0 }, + { 127, 63, 63, 0 }, + { 159, 63, 63, 0 }, + { 191, 63, 63, 0 }, + { 223, 63, 63, 0 }, + { 255, 63, 63, 0 }, + { 63, 95, 63, 0 }, + { 95, 95, 63, 0 }, + { 127, 95, 63, 0 }, + { 159, 95, 63, 0 }, + { 191, 95, 63, 0 }, + { 223, 95, 63, 0 }, + { 255, 95, 63, 0 }, + { 63, 127, 63, 0 }, + { 95, 127, 63, 0 }, + { 127, 127, 63, 0 }, + { 159, 127, 63, 0 }, + { 191, 127, 63, 0 }, + { 223, 127, 63, 0 }, + { 255, 127, 63, 0 }, + { 63, 159, 63, 0 }, + { 95, 159, 63, 0 }, + { 127, 159, 63, 0 }, + { 159, 159, 63, 0 }, + { 191, 159, 63, 0 }, + { 223, 159, 63, 0 }, + { 255, 159, 63, 0 }, + { 63, 191, 63, 0 }, + { 95, 191, 63, 0 }, + { 127, 191, 63, 0 }, + { 159, 191, 63, 0 }, + { 191, 191, 63, 0 }, + { 223, 191, 63, 0 }, + { 255, 191, 63, 0 }, + { 63, 223, 63, 0 }, + { 95, 223, 63, 0 }, + { 127, 223, 63, 0 }, + { 159, 223, 63, 0 }, + { 191, 223, 63, 0 }, + { 223, 223, 63, 0 }, + { 255, 223, 63, 0 }, + { 63, 255, 63, 0 }, + { 95, 255, 63, 0 }, + { 127, 255, 63, 0 }, + { 159, 255, 63, 0 }, + { 191, 255, 63, 0 }, + { 223, 255, 63, 0 }, + { 255, 255, 63, 0 }, + { 63, 63, 95, 0 }, + { 95, 63, 95, 0 }, + { 127, 63, 95, 0 }, + { 159, 63, 95, 0 }, + { 191, 63, 95, 0 }, + { 223, 63, 95, 0 }, + { 255, 63, 95, 0 }, + { 63, 95, 95, 0 }, + { 95, 95, 95, 0 }, + { 127, 95, 95, 0 }, + { 159, 95, 95, 0 }, + { 191, 95, 95, 0 }, + { 223, 95, 95, 0 }, + { 255, 95, 95, 0 }, + { 63, 127, 95, 0 }, + { 95, 127, 95, 0 }, + { 127, 127, 95, 0 }, + { 159, 127, 95, 0 }, + { 191, 127, 95, 0 }, + { 223, 127, 95, 0 }, + { 255, 127, 95, 0 }, + { 63, 159, 95, 0 }, + { 95, 159, 95, 0 }, + { 127, 159, 95, 0 }, + { 159, 159, 95, 0 }, + { 191, 159, 95, 0 }, + { 223, 159, 95, 0 }, + { 255, 159, 95, 0 }, + { 63, 191, 95, 0 }, + { 95, 191, 95, 0 }, + { 127, 191, 95, 0 }, + { 159, 191, 95, 0 }, + { 191, 191, 95, 0 }, + { 223, 191, 95, 0 }, + { 255, 191, 95, 0 }, + { 63, 223, 95, 0 }, + { 95, 223, 95, 0 }, + { 127, 223, 95, 0 }, + { 159, 223, 95, 0 }, + { 191, 223, 95, 0 }, + { 223, 223, 95, 0 }, + { 255, 223, 95, 0 }, + { 63, 255, 95, 0 }, + { 95, 255, 95, 0 }, + { 127, 255, 95, 0 }, + { 159, 255, 95, 0 }, + { 191, 255, 95, 0 }, + { 223, 255, 95, 0 }, + { 255, 255, 95, 0 }, + { 63, 63, 127, 0 }, + { 95, 63, 127, 0 }, + { 127, 63, 127, 0 }, + { 159, 63, 127, 0 }, + { 191, 63, 127, 0 }, + { 223, 63, 127, 0 }, + { 255, 63, 127, 0 }, + { 63, 95, 127, 0 }, + { 95, 95, 127, 0 }, + { 127, 95, 127, 0 }, + { 159, 95, 127, 0 }, + { 191, 95, 127, 0 }, + { 223, 95, 127, 0 }, + { 255, 95, 127, 0 }, + { 63, 127, 127, 0 }, + { 95, 127, 127, 0 }, + { 127, 127, 127, 0 }, + { 159, 127, 127, 0 }, + { 191, 127, 127, 0 }, + { 223, 127, 127, 0 }, + { 255, 127, 127, 0 }, + { 63, 159, 127, 0 }, + { 95, 159, 127, 0 }, + { 127, 159, 127, 0 }, + { 159, 159, 127, 0 }, + { 191, 159, 127, 0 }, + { 223, 159, 127, 0 }, + { 255, 159, 127, 0 }, + { 63, 191, 127, 0 }, + { 95, 191, 127, 0 }, + { 127, 191, 127, 0 }, + { 159, 191, 127, 0 }, + { 191, 191, 127, 0 }, + { 223, 191, 127, 0 }, + { 255, 191, 127, 0 }, + { 63, 223, 127, 0 }, + { 95, 223, 127, 0 }, + { 127, 223, 127, 0 }, + { 159, 223, 127, 0 }, + { 191, 223, 127, 0 }, + { 223, 223, 127, 0 }, + { 255, 223, 127, 0 }, + { 63, 255, 127, 0 }, + { 95, 255, 127, 0 }, + { 127, 255, 127, 0 }, + { 159, 255, 127, 0 }, + { 191, 255, 127, 0 }, + { 223, 255, 127, 0 }, + { 255, 255, 127, 0 }, + { 63, 63, 159, 0 }, + { 95, 63, 159, 0 }, + { 127, 63, 159, 0 }, + { 159, 63, 159, 0 }, + { 191, 63, 159, 0 }, + { 223, 63, 159, 0 }, + { 255, 63, 159, 0 }, + { 63, 95, 159, 0 }, + { 95, 95, 159, 0 }, + { 127, 95, 159, 0 }, + { 159, 95, 159, 0 }, + { 191, 95, 159, 0 }, + { 223, 95, 159, 0 }, + { 255, 95, 159, 0 }, + { 63, 127, 159, 0 }, + { 95, 127, 159, 0 }, + { 127, 127, 159, 0 }, + { 159, 127, 159, 0 }, + { 191, 127, 159, 0 }, + { 223, 127, 159, 0 }, + { 255, 127, 159, 0 }, + { 63, 159, 159, 0 }, + { 95, 159, 159, 0 }, + { 127, 159, 159, 0 }, + { 159, 159, 159, 0 }, + { 191, 159, 159, 0 }, + { 223, 159, 159, 0 }, + { 255, 159, 159, 0 }, + { 63, 191, 159, 0 }, + { 95, 191, 159, 0 }, + { 127, 191, 159, 0 }, + { 159, 191, 159, 0 }, + { 191, 191, 159, 0 }, + { 223, 191, 159, 0 }, + { 255, 191, 159, 0 }, + { 63, 223, 159, 0 }, + { 95, 223, 159, 0 }, + { 127, 223, 159, 0 }, + { 159, 223, 159, 0 }, + { 191, 223, 159, 0 }, + { 223, 223, 159, 0 }, + { 255, 223, 159, 0 }, + { 63, 255, 159, 0 }, + { 95, 255, 159, 0 }, + { 127, 255, 159, 0 }, + { 159, 255, 159, 0 }, + { 191, 255, 159, 0 }, + { 223, 255, 159, 0 }, + { 255, 255, 159, 0 }, + { 63, 63, 191, 0 }, + { 95, 63, 191, 0 }, + { 127, 63, 191, 0 }, + { 159, 63, 191, 0 }, + { 191, 63, 191, 0 }, + { 223, 63, 191, 0 }, + { 255, 63, 191, 0 }, + { 63, 95, 191, 0 }, + { 95, 95, 191, 0 }, + { 127, 95, 191, 0 }, + { 159, 95, 191, 0 }, + { 191, 95, 191, 0 }, + { 223, 95, 191, 0 }, + { 255, 95, 191, 0 }, + { 63, 127, 191, 0 }, + { 95, 127, 191, 0 }, + { 127, 127, 191, 0 }, + { 159, 127, 191, 0 }, + { 191, 127, 191, 0 }, + { 223, 127, 191, 0 }, + { 255, 127, 191, 0 }, + { 63, 159, 191, 0 }, + { 95, 159, 191, 0 }, + { 127, 159, 191, 0 }, + { 159, 159, 191, 0 }, + { 191, 159, 191, 0 }, + { 223, 159, 191, 0 }, + { 255, 159, 191, 0 }, + { 63, 191, 191, 0 }, + { 95, 191, 191, 0 }, + { 127, 191, 191, 0 }, + { 159, 191, 191, 0 }, + { 191, 191, 191, 0 }, + { 223, 191, 191, 0 }, + { 255, 191, 191, 0 }, + { 63, 223, 191, 0 }, + { 95, 223, 191, 0 }, + { 127, 223, 191, 0 }, + { 159, 223, 191, 0 }, + { 191, 223, 191, 0 }, + { 223, 223, 191, 0 }, + { 255, 251, 240, 0 }, + { 58, 109, 165, 0 }, + { 128, 128, 128, 0 }, + { 255, 0, 0, 0 }, + { 0, 255, 0, 0 }, + { 255, 255, 0, 0 }, + { 0, 0, 255, 0 }, + { 255, 0, 255, 0 }, + { 0, 255, 255, 0 }, + { 255, 255, 255, 0 } +}; + #endif diff --git a/src/ddpalette.c b/src/ddpalette.c index ed2b8583a0..e7bde4b74d 100644 --- a/src/ddpalette.c +++ b/src/ddpalette.c @@ -84,7 +84,7 @@ HRESULT dd_CreatePalette( p->lpVtbl = &g_ddp_vtbl; p->flags = dwFlags; - ddp_SetEntries(p, dwFlags, 0, 256, lpDDColorArray); + ddp_SetEntries(p, dwFlags, 0, 256, lpDDColorArray); IDirectDrawPalette_AddRef(p); *lpDDPalette = p; diff --git a/src/ddsurface.c b/src/ddsurface.c index eee23ed0ae..b521eb4cc8 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -14,6 +14,7 @@ #include "ddclipper.h" #include "utils.h" #include "versionhelpers.h" +#include "ddpalette.h" LONG g_dds_gdi_handles; @@ -1093,8 +1094,7 @@ HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* lpD if (lpDDPalette) IDirectDrawPalette_AddRef(lpDDPalette); - if (This->palette) - IDirectDrawPalette_Release(This->palette); + IDirectDrawPaletteImpl* old_palette = This->palette; if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref) { @@ -1113,6 +1113,9 @@ HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* lpD This->palette = lpDDPalette; } + if (old_palette) + IDirectDrawPalette_Release(old_palette); + return DD_OK; } @@ -1574,6 +1577,16 @@ HRESULT dd_CreateSurface( { g_ddraw.primary = dst_surface; FakePrimarySurface = dst_surface->surface; + + if (dst_surface->bpp == 8) + { + IDirectDrawPaletteImpl* lpDDPalette; + dd_CreatePalette(DDPCAPS_ALLOW256, g_ddp_me_palette, &lpDDPalette, NULL); + dds_SetPalette(dst_surface, lpDDPalette); + + // Make sure temp palette will be released once replaced + IDirectDrawPalette_Release(lpDDPalette); + } } }