diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /hammer/gamepalette.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'hammer/gamepalette.cpp')
| -rw-r--r-- | hammer/gamepalette.cpp | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/hammer/gamepalette.cpp b/hammer/gamepalette.cpp new file mode 100644 index 0000000..2febd44 --- /dev/null +++ b/hammer/gamepalette.cpp @@ -0,0 +1,154 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +// +//=============================================================================// +// +// CGamePalette implementation +// + +#include "stdafx.h" +#include "GamePalette.h" +#include "Hammer.h" +#include "tier1/strtools.h" +#pragma warning(push, 1) +#pragma warning(disable:4701 4702 4530) +#include <fstream> + +// memdbgon must be the last include file in a .cpp file!!! +#include "tier0/memdbgon.h" + +#pragma warning(pop) + +#pragma warning(disable:4244) + +CGamePalette::CGamePalette() +{ + fBrightness = 1.0; + + uPaletteBytes = sizeof(LOGPALETTE) + sizeof(PALETTEENTRY) * 256; + + // allocate memory + pPalette = (LOGPALETTE*) malloc(uPaletteBytes); + pOriginalPalette = (LOGPALETTE*) malloc(uPaletteBytes); + + memset(pPalette, 0, uPaletteBytes); + memset(pOriginalPalette, 0, uPaletteBytes); + + if(!pPalette || !pOriginalPalette) + { + AfxMessageBox("I couldn't allocate memory for the palette."); + PostQuitMessage(-1); + return; + } + + pPalette->palVersion = 0x300; + pPalette->palNumEntries = 256; + + pOriginalPalette->palVersion = 0x300; + pOriginalPalette->palNumEntries = 256; + + GDIPalette.CreatePalette(pPalette); +} + +CGamePalette::~CGamePalette() +{ + if(pPalette && pOriginalPalette) + { + // free memory + free(pPalette); + free(pOriginalPalette); + } +} + +BOOL CGamePalette::Create(LPCTSTR pszFile) +{ + char szRootDir[MAX_PATH]; + char szFullPath[MAX_PATH]; + APP()->GetDirectory(DIR_PROGRAM, szRootDir); + Q_MakeAbsolutePath( szFullPath, MAX_PATH, pszFile, szRootDir ); + + strFile = szFullPath; + + if( GetFileAttributes(strFile) == 0xffffffff ) + return FALSE; // not exist + + // open file & read palette + std::ifstream file(strFile, std::ios::binary); + + if( !file.is_open() ) + return FALSE; + + int i; + for(i = 0; i < 256; i++) + { + if(file.eof()) + break; + + pOriginalPalette->palPalEntry[i].peRed = file.get(); + pOriginalPalette->palPalEntry[i].peGreen = file.get(); + pOriginalPalette->palPalEntry[i].peBlue = file.get(); + pOriginalPalette->palPalEntry[i].peFlags = D3DRMPALETTE_READONLY | + PC_NOCOLLAPSE; + } + + file.close(); + + if(i < 256) + return FALSE; + + // copy into working palette + memcpy((void*) pPalette, (void*) pOriginalPalette, uPaletteBytes); + GDIPalette.SetPaletteEntries(0, 256, pPalette->palPalEntry); + + return TRUE; +} + +static BYTE fixbyte(float fValue) +{ + if(fValue > 255.0) + fValue = 255.0; + if(fValue < 0) + fValue = 0; + + return BYTE(fValue); +} + +void CGamePalette::SetBrightness(float fValue) +{ + if(fValue <= 0) + return; + + fBrightness = fValue; + + // if fValue is 1.0, memcpy + if(fValue == 1.0) + { + memcpy((void*) pPalette, (void*) pOriginalPalette, uPaletteBytes); + GDIPalette.SetPaletteEntries(0, 256, pPalette->palPalEntry); + return; + } + + // copy original palette to new palette, scaling by fValue + PALETTEENTRY * pOriginalEntry; + PALETTEENTRY * pNewEntry; + + for(int i = 0; i < 256; i++) + { + pOriginalEntry = &pOriginalPalette->palPalEntry[i]; + pNewEntry = &pPalette->palPalEntry[i]; + + pNewEntry->peRed = fixbyte(pOriginalEntry->peRed * fBrightness); + pNewEntry->peGreen = fixbyte(pOriginalEntry->peGreen * fBrightness); + pNewEntry->peBlue = fixbyte(pOriginalEntry->peBlue * fBrightness); + } + + GDIPalette.SetPaletteEntries(0, 256, pPalette->palPalEntry); +} + +float CGamePalette::GetBrightness() +{ + return fBrightness; +} |