1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-15 06:04:49 +01:00
cnc-ddraw/src/ddpalette.c

94 lines
2.5 KiB
C
Raw Permalink Normal View History

2020-10-13 09:20:52 +02:00
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include "dd.h"
#include "ddpalette.h"
#include "ddsurface.h"
#include "IDirectDrawPalette.h"
#include "debug.h"
2021-06-11 20:30:43 +02:00
HRESULT ddp_GetEntries(
IDirectDrawPaletteImpl* This,
DWORD dwFlags,
DWORD dwBase,
DWORD dwNumEntries,
LPPALETTEENTRY lpEntries)
2020-10-13 09:20:52 +02:00
{
2021-05-22 12:23:25 +02:00
for (int i = dwBase, x = 0; i < dwBase + dwNumEntries; i++, x++)
2020-10-13 09:20:52 +02:00
{
2021-05-22 12:23:25 +02:00
lpEntries[x].peRed = This->data_rgb[i].rgbRed;
lpEntries[x].peGreen = This->data_rgb[i].rgbGreen;
lpEntries[x].peBlue = This->data_rgb[i].rgbBlue;
2020-10-13 09:20:52 +02:00
}
return DD_OK;
}
2021-06-11 20:30:43 +02:00
HRESULT ddp_SetEntries(
IDirectDrawPaletteImpl* This,
DWORD dwFlags,
DWORD dwStartingEntry,
DWORD dwCount,
LPPALETTEENTRY lpEntries)
2020-10-13 09:20:52 +02:00
{
2021-05-22 12:23:25 +02:00
for (int i = dwStartingEntry, x = 0; i < dwStartingEntry + dwCount; i++, x++)
2020-10-13 09:20:52 +02:00
{
This->data_bgr[i] = (lpEntries[x].peBlue << 16) | (lpEntries[x].peGreen << 8) | lpEntries[x].peRed;
2021-05-22 12:23:25 +02:00
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;
2020-10-13 09:20:52 +02:00
}
if (!(This->flags & DDPCAPS_ALLOW256))
{
This->data_bgr[0] = 0;
This->data_bgr[255] = (255 << 16) | (255 << 8) | 255;
2021-05-22 12:23:25 +02:00
This->data_rgb[0].rgbRed = 0;
This->data_rgb[0].rgbGreen = 0;
This->data_rgb[0].rgbBlue = 0;
This->data_rgb[0].rgbReserved = 0;
2021-05-22 12:23:25 +02:00
This->data_rgb[255].rgbRed = 255;
This->data_rgb[255].rgbGreen = 255;
This->data_rgb[255].rgbBlue = 255;
This->data_rgb[255].rgbReserved = 0;
}
2024-03-22 22:27:00 +01:00
if (g_ddraw.ref && g_ddraw.primary && g_ddraw.primary->palette == This && g_ddraw.render.run)
2020-10-13 09:20:52 +02:00
{
2024-03-22 22:27:00 +01:00
InterlockedExchange(&g_ddraw.render.palette_updated, TRUE);
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
2020-10-13 09:20:52 +02:00
}
return DD_OK;
}
2021-06-11 20:30:43 +02:00
HRESULT dd_CreatePalette(
DWORD dwFlags,
LPPALETTEENTRY lpDDColorArray,
IDirectDrawPaletteImpl** lpDDPalette,
IUnknown FAR* unkOuter)
2020-10-13 09:20:52 +02:00
{
2022-09-30 14:27:41 +02:00
dbg_dump_ddp_flags(dwFlags);
2021-06-11 20:30:43 +02:00
if (!lpDDPalette || !lpDDColorArray)
return DDERR_INVALIDPARAMS;
IDirectDrawPaletteImpl* p =
(IDirectDrawPaletteImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawPaletteImpl));
TRACE(" palette = %p\n", p);
2020-10-13 09:20:52 +02:00
2020-10-15 05:13:37 +02:00
p->lpVtbl = &g_ddp_vtbl;
p->flags = dwFlags;
2020-10-13 09:20:52 +02:00
ddp_SetEntries(p, dwFlags, 0, 256, lpDDColorArray);
IDirectDrawPalette_AddRef(p);
2021-06-11 20:30:43 +02:00
*lpDDPalette = p;
2020-10-15 05:13:37 +02:00
2020-10-13 09:20:52 +02:00
return DD_OK;
}