/* * UNPUBLISHED -- Rights reserved under the copyright laws of the * United States. Use of a copyright notice is precautionary only and * does not imply publication or disclosure. * * THIS DOCUMENTATION CONTAINS CONFIDENTIAL AND PROPRIETARY INFORMATION * OF BLIZZARD ENTERTAINMENT. ANY DUPLICATION, MODIFICATION, * DISTRIBUTION, OR DISCLOSURE IS STRICTLY PROHIBITED WITHOUT THE PRIOR * EXPRESS WRITTEN PERMISSION OF BLIZZARD ENTERTAINMENT. */ #include "../types.h" PALETTEENTRY logical_palette[256]; int palette_cpp_init_value; // weak PALETTEENTRY system_palette[256]; PALETTEENTRY orig_palette[256]; UINT gdwPalEntries; int palette_inf = 0x7F800000; // weak /* rdata */ int gamma_correction = 100; // idb int color_cycling_enabled = 1; // idb bool sgbFadedIn = 1; //----- (00448DFA) -------------------------------------------------------- struct palette_cpp_init { palette_cpp_init() { palette_cpp_init_value = palette_inf; } } _palette_cpp_init; // 47F16C: using guessed type int palette_inf; // 67DBCC: using guessed type int palette_cpp_init_value; //----- (00448E05) -------------------------------------------------------- void __cdecl palette_save_gamme() { SRegSaveValue("Diablo", "Gamma Correction", 0, gamma_correction); SRegSaveValue("Diablo", "Color Cycling", 0, color_cycling_enabled); } //----- (00448E33) -------------------------------------------------------- void __cdecl palette_init() { int v0; // eax int v1; // eax palette_load_gamma(); memcpy(system_palette, orig_palette, 0x400u); LoadSysPal(); v0 = lpDDInterface->CreatePalette(DDPCAPS_ALLOW256|DDPCAPS_8BIT, system_palette, &lpDDPalette, NULL); if ( v0 ) TermDlg(111, v0, "C:\\Src\\Diablo\\Source\\PALETTE.CPP", 143); v1 = lpDDSPrimary->SetPalette(lpDDPalette); if ( v1 ) TermDlg(111, v1, "C:\\Src\\Diablo\\Source\\PALETTE.CPP", 146); } //----- (00448EAB) -------------------------------------------------------- void __cdecl palette_load_gamma() { int v3; // eax int value; // [esp+8h] [ebp-4h] value = gamma_correction; if ( !SRegLoadValue("Diablo", "Gamma Correction", 0, &value) ) value = 100; if ( value >= 30 ) { if ( value > 100 ) value = 100; } else { value = 30; } gamma_correction = value - value % 5; if ( SRegLoadValue("Diablo", "Color Cycling", 0, &value) ) v3 = value; else v3 = 1; color_cycling_enabled = v3; } //----- (00448F20) -------------------------------------------------------- void __cdecl LoadSysPal() { HDC hDC; // ebx int i; // ecx int iStartIndex; // edi for(i = 0; i < 256; i++) system_palette[i].peFlags = PC_NOCOLLAPSE|PC_RESERVED; if ( !fullscreen ) { hDC = GetDC(NULL); gdwPalEntries = GetDeviceCaps(hDC, NUMRESERVED) / 2; GetSystemPaletteEntries(hDC, 0, gdwPalEntries, system_palette); for ( i = 0; i < gdwPalEntries; i++ ) system_palette[i].peFlags = 0; iStartIndex = 256 - gdwPalEntries; GetSystemPaletteEntries(hDC, iStartIndex, gdwPalEntries, &system_palette[iStartIndex]); if ( iStartIndex < 256 ) { for(i = iStartIndex; i < 256; i++) system_palette[i].peFlags = 0; } ReleaseDC(NULL, hDC); } } // 484364: using guessed type int fullscreen; //----- (00448FC9) -------------------------------------------------------- void __fastcall LoadPalette(char *pszFileName) { int i; // eax char PalData[256][3]; // [esp+0h] [ebp-304h] void *pBuf; // [esp+300h] [ebp-4h] WOpenFile(pszFileName, &pBuf, 0); WReadFile(pBuf, (char *)PalData, 768); WCloseFile(pBuf); for(i = 0; i < 256; i++) { orig_palette[i].peFlags = 0; orig_palette[i].peRed = PalData[i][0]; orig_palette[i].peGreen = PalData[i][1]; orig_palette[i].peBlue = PalData[i][2]; } } //----- (00449025) -------------------------------------------------------- void __fastcall LoadRndLvlPal(int l) { char *pszPal; // ecx char szTemp[260]; // [esp+4h] [ebp-104h] if ( l ) { sprintf(szTemp, "Levels\\L%iData\\L%i_%i.PAL", l, l, random(0, 4) + 1); pszPal = szTemp; } else { pszPal = "Levels\\TownData\\Town.pal"; } LoadPalette(pszPal); } //----- (0044906C) -------------------------------------------------------- void __cdecl ResetPal() { if ( !lpDDSPrimary || lpDDSPrimary->IsLost() != DDERR_SURFACELOST || !lpDDSPrimary->Restore() ) { SDrawRealizePalette(); } } //----- (00449097) -------------------------------------------------------- void __cdecl palette_inc_gamma() { if ( gamma_correction < 100 ) { gamma_correction += 5; if ( gamma_correction > 100 ) gamma_correction = 100; palette_apply_gamma_correction(system_palette, logical_palette, 256); palette_update(); } } //----- (004490D0) -------------------------------------------------------- void __cdecl palette_update() { int v0; // ecx int v1; // eax if ( lpDDPalette ) { v0 = 0; v1 = 256; if ( !fullscreen ) { v0 = gdwPalEntries; v1 = 2 * (128 - gdwPalEntries); } SDrawUpdatePalette(v0, v1, &system_palette[v0], 0); } } // 484364: using guessed type int fullscreen; //----- (00449107) -------------------------------------------------------- void __fastcall palette_apply_gamma_correction(PALETTEENTRY *dst, PALETTEENTRY *src, int n) { PALETTEENTRY *v3; // edi PALETTEENTRY *v4; // esi double v5; // [esp+18h] [ebp-Ch] v3 = src; v4 = dst; v5 = (double)gamma_correction * 0.01; if ( n > 0 ) { do { v4->peRed = pow(v3->peRed * 0.00390625, v5) * 256.0; v4->peGreen = pow(v3->peGreen * 0.00390625, v5) * 256.0; v4->peBlue = pow(v3->peBlue * 0.00390625, v5) * 256.0; ++v4; ++v3; --n; } while ( n ); } } //----- (004491D0) -------------------------------------------------------- void __cdecl palette_dec_gamma() { if ( gamma_correction > 30 ) { gamma_correction -= 5; if ( gamma_correction < 30 ) gamma_correction = 30; palette_apply_gamma_correction(system_palette, logical_palette, 256); palette_update(); } } //----- (00449209) -------------------------------------------------------- int __fastcall palette_update_gamma(int gamma) { if ( gamma ) { gamma_correction = 130 - gamma; palette_apply_gamma_correction(system_palette, logical_palette, 256); palette_update(); } return 130 - gamma_correction; } //----- (0044923E) -------------------------------------------------------- void __cdecl BlackPalette() { SetFadeLevel(0); } //----- (00449245) -------------------------------------------------------- void __fastcall SetFadeLevel(int fadeval) { int i; // eax if ( lpDDInterface ) { for(i = 0; i < 255; i++) { system_palette[i].peRed = (fadeval * logical_palette[i].peRed) >> 8; system_palette[i].peGreen = (fadeval * logical_palette[i].peGreen) >> 8; system_palette[i].peBlue = (fadeval * logical_palette[i].peBlue) >> 8; } Sleep(3); lpDDInterface->WaitForVerticalBlank(DDWAITVB_BLOCKBEGIN, NULL); palette_update(); } } //----- (004492B0) -------------------------------------------------------- void __fastcall PaletteFadeIn(int fr) { int i; // ebp palette_apply_gamma_correction(logical_palette, orig_palette, 256); for(i = 0; i < 256; i += fr) SetFadeLevel(i); SetFadeLevel(256); memcpy(logical_palette, orig_palette, 0x400u); sgbFadedIn = 1; } //----- (00449306) -------------------------------------------------------- void __fastcall PaletteFadeOut(int fr) { int i; // esi if ( sgbFadedIn ) { for(i = 256; i > 0; i -= fr) SetFadeLevel(i); SetFadeLevel(0); sgbFadedIn = 0; } } //----- (00449336) -------------------------------------------------------- void __cdecl palette_update_caves() { BYTE v0; // cx signed int v1; // esi signed int v2; // eax BYTE v4; // [esp+6h] [ebp-2h] BYTE v5; v0 = system_palette[1].peRed; v5 = system_palette[1].peGreen; v4 = system_palette[1].peBlue; v1 = 1; do { v2 = v1++; system_palette[v2].peRed = system_palette[v2 + 1].peRed; system_palette[v2].peGreen = system_palette[v2 + 1].peGreen; system_palette[v2].peBlue = system_palette[v2 + 1].peBlue; } while ( v1 < 31 ); system_palette[v1].peRed = v0; system_palette[v1].peGreen = v5; system_palette[v1].peBlue = v4; palette_update(); } //----- (00449398) -------------------------------------------------------- void __fastcall palette_update_quest_palette(int n) { int i; // eax for ( i = 32 - n; i >= 0; --i ) logical_palette[i] = orig_palette[i]; palette_apply_gamma_correction(system_palette, logical_palette, 32); palette_update(); } //----- (004493C6) -------------------------------------------------------- bool __cdecl palette_get_colour_cycling() { return color_cycling_enabled; } //----- (004493CC) -------------------------------------------------------- void __fastcall palette_set_color_cycling(bool enabled) { color_cycling_enabled = enabled; }