You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
154 lines
3.3 KiB
154 lines
3.3 KiB
//========= 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;
|
|
}
|