diff --git a/miniwin/miniwin/src/include/miniwin_ddpalette_p.h b/miniwin/miniwin/src/include/miniwin_ddpalette_p.h index 04804431..59c69b6d 100644 --- a/miniwin/miniwin/src/include/miniwin_ddpalette_p.h +++ b/miniwin/miniwin/src/include/miniwin_ddpalette_p.h @@ -4,7 +4,11 @@ struct DirectDrawPaletteImpl : public IDirectDrawPalette { DirectDrawPaletteImpl(LPPALETTEENTRY lpColorTable); + ~DirectDrawPaletteImpl() override; HRESULT GetCaps(LPDWORD lpdwCaps) override; HRESULT GetEntries(DWORD dwFlags, DWORD dwBase, DWORD dwNumEntries, LPPALETTEENTRY lpEntries) override; HRESULT SetEntries(DWORD dwFlags, DWORD dwStartingEntry, DWORD dwCount, LPPALETTEENTRY lpEntries) override; + +private: + SDL_Palette* m_palette; }; diff --git a/miniwin/miniwin/src/miniwin_ddpalette.cpp b/miniwin/miniwin/src/miniwin_ddpalette.cpp index 0615f06c..7131ac13 100644 --- a/miniwin/miniwin/src/miniwin_ddpalette.cpp +++ b/miniwin/miniwin/src/miniwin_ddpalette.cpp @@ -1,8 +1,17 @@ #include "miniwin_ddpalette_p.h" #include "miniwin_ddraw.h" +#include + DirectDrawPaletteImpl::DirectDrawPaletteImpl(LPPALETTEENTRY lpColorTable) { + m_palette = SDL_CreatePalette(256); + SetEntries(0, 0, 256, lpColorTable); +} + +DirectDrawPaletteImpl::~DirectDrawPaletteImpl() +{ + SDL_DestroyPalette(m_palette); } HRESULT DirectDrawPaletteImpl::GetCaps(LPDWORD lpdwCaps) @@ -12,10 +21,26 @@ HRESULT DirectDrawPaletteImpl::GetCaps(LPDWORD lpdwCaps) HRESULT DirectDrawPaletteImpl::GetEntries(DWORD dwFlags, DWORD dwBase, DWORD dwNumEntries, LPPALETTEENTRY lpEntries) { + for (int i = dwBase; i < dwNumEntries; i++) { + lpEntries[i].peRed = m_palette->colors[i].r; + lpEntries[i].peGreen = m_palette->colors[i].g; + lpEntries[i].peBlue = m_palette->colors[i].b; + lpEntries[i].peFlags = PC_NONE; + } return DD_OK; } HRESULT DirectDrawPaletteImpl::SetEntries(DWORD dwFlags, DWORD dwStartingEntry, DWORD dwCount, LPPALETTEENTRY lpEntries) { + SDL_Color colors[256]; + for (int i = 0; i < dwCount; i++) { + colors[i].r = lpEntries[i].peRed; + colors[i].g = lpEntries[i].peGreen; + colors[i].b = lpEntries[i].peBlue; + colors[i].a = SDL_ALPHA_OPAQUE; + } + + SDL_SetPaletteColors(m_palette, colors, dwStartingEntry, dwCount); + return DD_OK; } diff --git a/miniwin/miniwin/src/miniwin_ddraw.cpp b/miniwin/miniwin/src/miniwin_ddraw.cpp index c6026930..b0d60e17 100644 --- a/miniwin/miniwin/src/miniwin_ddraw.cpp +++ b/miniwin/miniwin/src/miniwin_ddraw.cpp @@ -45,6 +45,10 @@ HRESULT DirectDrawImpl::CreatePalette( IUnknown* pUnkOuter ) { + if ((dwFlags & DDPCAPS_8BIT) != DDPCAPS_8BIT) { + return DDERR_INVALIDPARAMS; + } + *lplpDDPalette = static_cast(new DirectDrawPaletteImpl(lpColorTable)); return DD_OK; } diff --git a/miniwin/miniwin/src/miniwin_ddsurface.cpp b/miniwin/miniwin/src/miniwin_ddsurface.cpp index 0ed41e9e..944c1e98 100644 --- a/miniwin/miniwin/src/miniwin_ddsurface.cpp +++ b/miniwin/miniwin/src/miniwin_ddsurface.cpp @@ -21,6 +21,9 @@ DirectDrawSurfaceImpl::~DirectDrawSurfaceImpl() if (m_texture) { SDL_DestroyTexture(m_texture); } + if (m_palette) { + m_palette->Release(); + } } // IUnknown interface @@ -204,6 +207,8 @@ HRESULT DirectDrawSurfaceImpl::SetColorKey(DDColorKeyFlags dwFlags, LPDDCOLORKEY HRESULT DirectDrawSurfaceImpl::SetPalette(LPDIRECTDRAWPALETTE lpDDPalette) { + m_palette = lpDDPalette; + m_palette->AddRef(); return DD_OK; }