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:
parent
2425033a2f
commit
9e9783f8d2
@ -16,7 +16,7 @@ typedef struct IDirectDrawPaletteImpl
|
||||
ULONG ref;
|
||||
|
||||
int data_bgr[256];
|
||||
RGBQUAD* data_rgb;
|
||||
RGBQUAD data_rgb[256];
|
||||
DWORD flags;
|
||||
|
||||
} IDirectDrawPaletteImpl;
|
||||
|
@ -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);
|
||||
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user