1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-15 06:04:49 +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;
int data_bgr[256];
RGBQUAD* data_rgb;
RGBQUAD data_rgb[256];
DWORD flags;
} IDirectDrawPaletteImpl;

View File

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

View File

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

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;

View File

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

View File

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

View File

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

View File

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