bool SetupPalette(LPDIRECTDRAWPALETTE lpDDPalette) { if (!lpDDPalette) { //logOutput << CurrentTimeString() << "Detaching palette" << endl; g_CurrentPalette.Free(); g_bUsePalette = false; return false; } logOutput << CurrentTimeString() << "initializing palette" << endl; DWORD caps; HRESULT hr; if (FAILED(hr = lpDDPalette->GetCaps(&caps))) { logOutput << CurrentTimeString() << "Failed to get palette caps" << endl; printDDrawError(hr, "SetupPalette"); return false; } if (caps & DDPCAPS_8BITENTRIES) { logOutput << CurrentTimeString() << "8-bit index-palette used (lookup color is an index to another lookup table), not implemented" << endl; return false; } DWORD numEntries = 0; if (caps & DDPCAPS_8BIT) numEntries = 0x100; else if (caps & DDPCAPS_4BIT) numEntries = 0x10; else if (caps & DDPCAPS_2BIT) numEntries = 0x04; else if (caps & DDPCAPS_1BIT) numEntries = 0x02; else { logOutput << CurrentTimeString() << "Unrecognized palette format" << endl; return false; } //logOutput << CurrentTimeString() << "Trying to retrieve " << numEntries << " palette entries" << endl; g_CurrentPalette.Reallocate(numEntries); hr = lpDDPalette->GetEntries(0, 0, numEntries, g_CurrentPalette.entries); if (FAILED(hr)) { logOutput << CurrentTimeString() << "Failed to retrieve palette entries" << endl; printDDrawError(hr, "SetupPalette"); g_CurrentPalette.Free(); return false; } g_CurrentPalette.primary_surface_palette_ref = lpDDPalette; g_CurrentPalette.bInitialized = true; g_bUsePalette = true; logOutput << CurrentTimeString() << "Initialized palette with " << numEntries << " color entries" << endl; return true; }