1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-24 17:49:52 +01:00

fix rgb palette

This commit is contained in:
FunkyFr3sh 2021-05-22 12:23:25 +02:00
parent 2425033a2f
commit 9e9783f8d2
8 changed files with 70 additions and 98 deletions

View File

@ -16,7 +16,7 @@ typedef struct IDirectDrawPaletteImpl
ULONG ref; ULONG ref;
int data_bgr[256]; int data_bgr[256];
RGBQUAD* data_rgb; RGBQUAD data_rgb[256];
DWORD flags; DWORD flags;
} IDirectDrawPaletteImpl; } IDirectDrawPaletteImpl;

View File

@ -29,7 +29,6 @@ HRESULT dds_SetClipper(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWCLIPPER lpClipp
HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWPALETTE lpDDPalette); HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWPALETTE lpDDPalette);
HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPVOID lpRect); HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPVOID lpRect);
void* dds_GetBuffer(IDirectDrawSurfaceImpl* This); void* dds_GetBuffer(IDirectDrawSurfaceImpl* This);
HDC dds_GetHDC(IDirectDrawSurfaceImpl* This);
HRESULT dd_CreateSurface(LPDDSURFACEDESC lpDDSurfaceDesc, LPDIRECTDRAWSURFACE FAR* lpDDSurface, IUnknown FAR* unkOuter); HRESULT dd_CreateSurface(LPDDSURFACEDESC lpDDSurfaceDesc, LPDIRECTDRAWSURFACE FAR* lpDDSurface, IUnknown FAR* unkOuter);

View File

@ -9,16 +9,11 @@
HRESULT ddp_GetEntries(IDirectDrawPaletteImpl *This, DWORD dwFlags, DWORD dwBase, DWORD dwNumEntries, LPPALETTEENTRY lpEntries) HRESULT ddp_GetEntries(IDirectDrawPaletteImpl *This, DWORD dwFlags, DWORD dwBase, DWORD dwNumEntries, LPPALETTEENTRY lpEntries)
{ {
int i, x; for (int i = dwBase, x = 0; i < dwBase + dwNumEntries; i++, x++)
for (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].peRed = This->data_rgb[i].rgbRed; lpEntries[x].peBlue = This->data_rgb[i].rgbBlue;
lpEntries[x].peGreen = This->data_rgb[i].rgbGreen;
lpEntries[x].peBlue = This->data_rgb[i].rgbBlue;
}
} }
return DD_OK; 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) HRESULT ddp_SetEntries(IDirectDrawPaletteImpl *This, DWORD dwFlags, DWORD dwStartingEntry, DWORD dwCount, LPPALETTEENTRY lpEntries)
{ {
int i, x; for (int i = dwStartingEntry, x = 0; i < dwStartingEntry + dwCount; i++, x++)
for (i = dwStartingEntry, x = 0; i < dwStartingEntry + dwCount; i++, x++)
{ {
This->data_bgr[i] = (lpEntries[x].peBlue << 16) | (lpEntries[x].peGreen << 8) | lpEntries[x].peRed; 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].rgbRed = lpEntries[x].peRed; This->data_rgb[i].rgbBlue = lpEntries[x].peBlue;
This->data_rgb[i].rgbGreen = lpEntries[x].peGreen; This->data_rgb[i].rgbReserved = 0;
This->data_rgb[i].rgbBlue = lpEntries[x].peBlue;
This->data_rgb[i].rgbReserved = 0;
}
} }
if (!(This->flags & DDPCAPS_ALLOW256)) 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[0] = 0;
This->data_bgr[255] = (255 << 16) | (255 << 8) | 255; 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].rgbRed = 0; This->data_rgb[0].rgbBlue = 0;
This->data_rgb[0].rgbGreen = 0; This->data_rgb[0].rgbReserved = 0;
This->data_rgb[0].rgbBlue = 0;
This->data_rgb[0].rgbReserved = 0;
This->data_rgb[255].rgbRed = 255; This->data_rgb[255].rgbRed = 255;
This->data_rgb[255].rgbGreen = 255; This->data_rgb[255].rgbGreen = 255;
This->data_rgb[255].rgbBlue = 255; This->data_rgb[255].rgbBlue = 255;
This->data_rgb[255].rgbReserved = 0; This->data_rgb[255].rgbReserved = 0;
}
} }
if (g_ddraw->primary && g_ddraw->primary->palette == This && g_ddraw->render.run) if (g_ddraw->primary && g_ddraw->primary->palette == This && g_ddraw->render.run)

View File

@ -792,21 +792,34 @@ HRESULT dds_GetColorKey(IDirectDrawSurfaceImpl *This, DWORD flags, LPDDCOLORKEY
HRESULT dds_GetDC(IDirectDrawSurfaceImpl *This, HDC FAR *lpHDC) HRESULT dds_GetDC(IDirectDrawSurfaceImpl *This, HDC FAR *lpHDC)
{ {
if (!This)
{
if (lpHDC)
*lpHDC = NULL;
return DDERR_INVALIDPARAMS;
}
if ((This->l_pitch % 4)) if ((This->l_pitch % 4))
{ {
dprintf("NOT_IMPLEMENTED GetDC: width=%d height=%d\n", This->width, This->height); dprintf("NOT_IMPLEMENTED GetDC: width=%d height=%d\n", This->width, This->height);
} }
RGBQUAD *data = 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 : g_ddraw->primary && g_ddraw->primary->palette ? g_ddraw->primary->palette->data_rgb :
NULL; NULL;
HDC dc = This->hdc;
if (This->backbuffer || (This->caps & DDSCAPS_BACKBUFFER))
dc = (HDC)InterlockedExchangeAdd((LONG*)&This->hdc, 0);
if (data) if (data)
SetDIBColorTable(dds_GetHDC(This), 0, 256, data); SetDIBColorTable(dc, 0, 256, data);
if (lpHDC) if (lpHDC)
*lpHDC = dds_GetHDC(This); *lpHDC = dc;
return DD_OK; return DD_OK;
} }
@ -916,21 +929,7 @@ HRESULT dds_SetPalette(IDirectDrawSurfaceImpl *This, LPDIRECTDRAWPALETTE lpDDPal
IDirectDrawPalette_Release(This->palette); IDirectDrawPalette_Release(This->palette);
} }
EnterCriticalSection(&g_ddraw->cs);
This->palette = (IDirectDrawPaletteImpl *)lpDDPalette; 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; return DD_OK;
} }
@ -941,13 +940,13 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl *This, LPVOID lpRect)
if (hwnd && (This->caps & DDSCAPS_PRIMARYSURFACE)) if (hwnd && (This->caps & DDSCAPS_PRIMARYSURFACE))
{ {
if (g_ddraw->primary->palette && g_ddraw->primary->palette->data_rgb) HDC primary_dc;
SetDIBColorTable(dds_GetHDC(g_ddraw->primary), 0, 256, g_ddraw->primary->palette->data_rgb); dds_GetDC(g_ddraw->primary, &primary_dc);
//GdiTransparentBlt idea taken from Aqrit's war2 ddraw //GdiTransparentBlt idea taken from Aqrit's war2 ddraw
RGBQUAD quad; 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); COLORREF color = RGB(quad.rgbRed, quad.rgbGreen, quad.rgbBlue);
BOOL erase = FALSE; BOOL erase = FALSE;
@ -967,7 +966,7 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl *This, LPVOID lpRect)
0, 0,
rc.right - rc.left, rc.right - rc.left,
rc.bottom - rc.top, rc.bottom - rc.top,
dds_GetHDC(g_ddraw->primary), primary_dc,
rc.left, rc.left,
rc.top, rc.top,
rc.right - rc.left, rc.right - rc.left,
@ -1021,17 +1020,6 @@ void* dds_GetBuffer(IDirectDrawSurfaceImpl* This)
return This->surface; 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) HRESULT dd_CreateSurface(LPDDSURFACEDESC lpDDSurfaceDesc, LPDIRECTDRAWSURFACE FAR *lpDDSurface, IUnknown FAR * unkOuter)
{ {
dbg_dump_dds_flags(lpDDSurfaceDesc->dwFlags); dbg_dump_dds_flags(lpDDSurfaceDesc->dwFlags);
@ -1096,8 +1084,7 @@ HRESULT dd_CreateSurface(LPDDSURFACEDESC lpDDSurfaceDesc, LPDIRECTDRAWSURFACE FA
if (dst_surface->bpp == 8) if (dst_surface->bpp == 8)
{ {
int i; for (int i = 0; i < 256; i++)
for (i = 0; i < 256; i++)
{ {
dst_surface->bmi->bmiColors[i].rgbRed = i; dst_surface->bmi->bmiColors[i].rgbRed = i;
dst_surface->bmi->bmiColors[i].rgbGreen = i; dst_surface->bmi->bmiColors[i].rgbGreen = i;

View File

@ -145,10 +145,10 @@ void dbg_draw_frame_info_start()
if (g_ddraw->primary) if (g_ddraw->primary)
{ {
if (g_ddraw->primary->palette && g_ddraw->primary->palette->data_rgb) HDC primary_dc;
SetDIBColorTable(dds_GetHDC(g_ddraw->primary), 0, 256, g_ddraw->primary->palette->data_rgb); dds_GetDC(g_ddraw->primary, &primary_dc);
DrawText(dds_GetHDC(g_ddraw->primary), debug_text, -1, &debugrc, DT_NOCLIP); DrawText(primary_dc, debug_text, -1, &debugrc, DT_NOCLIP);
} }
DWORD tick_start = timeGetTime(); DWORD tick_start = timeGetTime();

View File

@ -324,13 +324,13 @@ DWORD WINAPI d3d9_render_main(void)
dbg_draw_frame_info_start(); dbg_draw_frame_info_start();
#endif #endif
static int tex_index = 0, palIndex = 0; static int tex_index = 0, pal_index = 0;
fpsl_frame_start(); fpsl_frame_start();
EnterCriticalSection(&g_ddraw->cs); 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) 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 (g_ddraw->bpp == 8 && InterlockedExchange(&g_ddraw->render.palette_updated, FALSE))
{ {
if (++palIndex >= D3D9_TEXTURE_COUNT) if (++pal_index >= D3D9_TEXTURE_COUNT)
palIndex = 0; pal_index = 0;
RECT rc = { 0,0,256,1 }; RECT rc = { 0,0,256,1 };
if (SUCCEEDED(IDirect3DDevice9_SetTexture(g_d3d9.device, 1, (IDirect3DBaseTexture9 *)g_d3d9.palette_tex[palIndex])) && if (SUCCEEDED(IDirect3DDevice9_SetTexture(g_d3d9.device, 1, (IDirect3DBaseTexture9 *)g_d3d9.palette_tex[pal_index])) &&
SUCCEEDED(IDirect3DTexture9_LockRect(g_d3d9.palette_tex[palIndex], 0, &lock_rc, &rc, 0))) 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)); 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);
} }
} }

View File

@ -46,14 +46,17 @@ DWORD WINAPI gdi_render_main(void)
EnterCriticalSection(&g_ddraw->cs); 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 (warning_end_tick)
{ {
if (timeGetTime() < warning_end_tick) if (timeGetTime() < warning_end_tick)
{ {
RECT rc = { 0, 0, g_ddraw->width, g_ddraw->height }; 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 else
{ {
@ -79,54 +82,47 @@ DWORD WINAPI gdi_render_main(void)
} }
else if (upscale_hack) else if (upscale_hack)
{ {
StretchDIBits( StretchBlt(
g_ddraw->render.hdc, g_ddraw->render.hdc,
g_ddraw->render.viewport.x, g_ddraw->render.viewport.x,
g_ddraw->render.viewport.y, g_ddraw->render.viewport.y,
g_ddraw->render.viewport.width, g_ddraw->render.viewport.width,
g_ddraw->render.viewport.height, g_ddraw->render.viewport.height,
0, primary_dc,
g_ddraw->height - g_ddraw->upscale_hack_height, 0,
0,
g_ddraw->upscale_hack_width, g_ddraw->upscale_hack_width,
g_ddraw->upscale_hack_height, g_ddraw->upscale_hack_height,
g_ddraw->primary->surface,
g_ddraw->primary->bmi,
DIB_RGB_COLORS,
SRCCOPY); SRCCOPY);
} }
else if (!g_ddraw->child_window_exists && else if (!g_ddraw->child_window_exists &&
(g_ddraw->render.width != g_ddraw->width || g_ddraw->render.height != g_ddraw->height)) (g_ddraw->render.width != g_ddraw->width || g_ddraw->render.height != g_ddraw->height))
{ {
StretchDIBits( StretchBlt(
g_ddraw->render.hdc, g_ddraw->render.hdc,
g_ddraw->render.viewport.x, g_ddraw->render.viewport.x,
g_ddraw->render.viewport.y, g_ddraw->render.viewport.y,
g_ddraw->render.viewport.width, g_ddraw->render.viewport.width,
g_ddraw->render.viewport.height, g_ddraw->render.viewport.height,
primary_dc,
0, 0,
0, 0,
g_ddraw->width, g_ddraw->width,
g_ddraw->height, g_ddraw->height,
g_ddraw->primary->surface,
g_ddraw->primary->bmi,
DIB_RGB_COLORS,
SRCCOPY); SRCCOPY);
} }
else else
{ {
SetDIBitsToDevice( BitBlt(
g_ddraw->render.hdc, g_ddraw->render.hdc,
0, 0,
0, 0,
g_ddraw->width, g_ddraw->width,
g_ddraw->height, g_ddraw->height,
primary_dc,
0, 0,
0, 0,
0, SRCCOPY);
g_ddraw->height,
g_ddraw->primary->surface,
g_ddraw->primary->bmi,
DIB_RGB_COLORS);
} }
} }

View File

@ -317,13 +317,16 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam)
if (g_ddraw->fixchildwindows) 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); 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);
} }
} }