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

@ -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;