diff --git a/inc/IDirectDrawSurface.h b/inc/IDirectDrawSurface.h index f04e03a..e20b506 100644 --- a/inc/IDirectDrawSurface.h +++ b/inc/IDirectDrawSurface.h @@ -28,6 +28,8 @@ typedef struct IDirectDrawSurfaceImpl CRITICAL_SECTION cs; IDirectDrawPaletteImpl* palette; + PALETTEENTRY selected_pal[256]; + UINT selected_pal_count; void* surface; HANDLE mapping; diff --git a/inc/hook.h b/inc/hook.h index 235d579..e17e1ec 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -66,6 +66,7 @@ typedef HFONT(WINAPI* CREATEFONTINDIRECTAPROC)(CONST LOGFONT*); typedef HFONT(WINAPI* CREATEFONTAPROC)(int, int, int, int, int, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPCTSTR); typedef UINT(WINAPI* GETSYSTEMPALETTEENTRIESPROC)(HDC, UINT, UINT, LPPALETTEENTRY); typedef HPALETTE(WINAPI* SELECTPALETTEPROC)(HDC, HPALETTE, BOOL); +typedef UINT (WINAPI* REALIZEPALETTEPROC)(HDC); typedef HMODULE(WINAPI* LOADLIBRARYAPROC)(LPCSTR); typedef HMODULE(WINAPI* LOADLIBRARYWPROC)(LPCWSTR); @@ -121,6 +122,7 @@ extern CREATEFONTINDIRECTAPROC real_CreateFontIndirectA; extern CREATEFONTAPROC real_CreateFontA; extern GETSYSTEMPALETTEENTRIESPROC real_GetSystemPaletteEntries; extern SELECTPALETTEPROC real_SelectPalette; +extern REALIZEPALETTEPROC real_RealizePalette; extern LOADLIBRARYAPROC real_LoadLibraryA; extern LOADLIBRARYWPROC real_LoadLibraryW; extern LOADLIBRARYEXAPROC real_LoadLibraryExA; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index ccbea4b..6bb5250 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -60,6 +60,7 @@ HFONT WINAPI fake_CreateFontIndirectA(CONST LOGFONTA*); HFONT WINAPI fake_CreateFontA(int, int, int, int, int, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPCTSTR); UINT WINAPI fake_GetSystemPaletteEntries(HDC, UINT, UINT, LPPALETTEENTRY); HPALETTE WINAPI fake_SelectPalette(HDC, HPALETTE, BOOL); +UINT WINAPI fake_RealizePalette(HDC); HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName); HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName); diff --git a/src/hook.c b/src/hook.c index f73f31c..debebbf 100644 --- a/src/hook.c +++ b/src/hook.c @@ -59,6 +59,7 @@ CREATEFONTINDIRECTAPROC real_CreateFontIndirectA = CreateFontIndirectA; CREATEFONTAPROC real_CreateFontA = CreateFontA; GETSYSTEMPALETTEENTRIESPROC real_GetSystemPaletteEntries = GetSystemPaletteEntries; SELECTPALETTEPROC real_SelectPalette = SelectPalette; +REALIZEPALETTEPROC real_RealizePalette = RealizePalette; LOADLIBRARYAPROC real_LoadLibraryA = LoadLibraryA; LOADLIBRARYWPROC real_LoadLibraryW = LoadLibraryW; LOADLIBRARYEXAPROC real_LoadLibraryExA = LoadLibraryExA; @@ -153,6 +154,7 @@ HOOKLIST g_hook_hooklist[] = { "CreateFontA", (PROC)fake_CreateFontA, (PROC*)&real_CreateFontA, 0 }, { "GetSystemPaletteEntries", (PROC)fake_GetSystemPaletteEntries, (PROC*)&real_GetSystemPaletteEntries, 0 }, { "SelectPalette", (PROC)fake_SelectPalette, (PROC*)&real_SelectPalette, 0 }, + { "RealizePalette", (PROC)fake_RealizePalette, (PROC*)&real_RealizePalette, 0 }, { "CreateFontIndirectA", (PROC)fake_CreateFontIndirectA, (PROC*)&real_CreateFontIndirectA, 0 }, { "", NULL, NULL, 0 } } diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 081bdee..9cf2ad3 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -905,11 +905,11 @@ int WINAPI fake_GetDeviceCaps(HDC hdc, int index) return 20; } else - { - return 256; + { + return 256; + } } } - } return real_GetDeviceCaps(hdc, index); } @@ -1410,18 +1410,39 @@ HPALETTE WINAPI fake_SelectPalette(HDC hdc, HPALETTE hPal, BOOL bForceBkgd) { TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress()); - PALETTEENTRY pal[256]; - UINT count = GetPaletteEntries(hPal, 0, 256, pal); - - ddp_SetEntries(g_ddraw.primary->palette, 0, 0, count, pal); + g_ddraw.primary->selected_pal_count = GetPaletteEntries(hPal, 0, 256, g_ddraw.primary->selected_pal); - return real_SelectPalette(g_ddraw.primary->hdc, hPal, bForceBkgd); + return real_SelectPalette(g_ddraw.primary->hdc, hPal, bForceBkgd);; } } return real_SelectPalette(hdc, hPal, bForceBkgd); } +UINT WINAPI fake_RealizePalette(HDC hdc) +{ + if (g_ddraw.ref && + g_ddraw.bpp == 8 && + ((g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) || WindowFromDC(hdc) == GetDesktopWindow())) + { + if (g_ddraw.primary && g_ddraw.primary->palette) + { + TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress()); + + ddp_SetEntries( + g_ddraw.primary->palette, + 0, + 0, + g_ddraw.primary->selected_pal_count, + g_ddraw.primary->selected_pal); + + return g_ddraw.primary->selected_pal_count; + } + } + + return real_RealizePalette(hdc); +} + HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName) { HMODULE hmod_old = GetModuleHandleA(lpLibFileName);