source-engine/hammer/gamepalette.cpp

155 lines
3.3 KiB
C++
Raw Permalink Normal View History

2020-04-22 16:56:21 +00:00
//========= 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;
}