CNC_TS_and_RA2_Mission_Editor/MissionEditor/Palettes.cpp
2024-05-29 00:43:35 -04:00

352 lines
13 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "stdafx.h"
#include "Palettes.h"
#include "variables.h"
#include "functions.h"
void Palettes::Init()
{
if (!FSunPackLib::XCC_ExtractFile("isotem.pal", u8AppDataPath + "\\TmpPalette.pal", loading.CacheMix()))
errstream << "IsoTem.pal failed\n";
m_hPalIsoTemp = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
if (!FSunPackLib::XCC_ExtractFile("isosno.pal", u8AppDataPath + "\\TmpPalette.pal", loading.CacheMix()))
errstream << "IsoSno.pal failed\n";
m_hPalIsoSnow = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
if (!FSunPackLib::XCC_ExtractFile("isourb.pal", u8AppDataPath + "\\TmpPalette.pal", loading.CacheMix()))
errstream << "IsoUrb.pal failed\n";
m_hPalIsoUrb = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
HMIXFILE m_hCache2 = loading.ExpandMixes()[100].hECache;
if (!FSunPackLib::XCC_ExtractFile("isolun.pal", u8AppDataPath + "\\TmpPalette.pal", m_hCache2))
errstream << "IsoLun.pal failed\n";
m_hPalIsoLun = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
if (!FSunPackLib::XCC_ExtractFile("isodes.pal", u8AppDataPath + "\\TmpPalette.pal", m_hCache2))
errstream << "IsoDes.pal failed\n";
m_hPalIsoDes = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
if (!FSunPackLib::XCC_ExtractFile("isoubn.pal", u8AppDataPath + "\\TmpPalette.pal", m_hCache2))
errstream << "IsoUbn.pal failed\n";
m_hPalIsoUbn = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
if (!FSunPackLib::XCC_ExtractFile("unittem.pal", u8AppDataPath + "\\TmpPalette.pal", loading.CacheMix()))
errstream << "UnitTem.pal failed";
m_hPalUnitTemp = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
if (!FSunPackLib::XCC_ExtractFile("unitsno.pal", u8AppDataPath + "\\TmpPalette.pal", loading.CacheMix()))
errstream << "UnitSno.pal failed\n";
m_hPalUnitSnow = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
if (!FSunPackLib::XCC_ExtractFile("uniturb.pal", u8AppDataPath + "\\TmpPalette.pal", loading.CacheMix()))
errstream << "UnitUrb.pal failed\n";
m_hPalUnitUrb = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
if (!FSunPackLib::XCC_ExtractFile("unitlun.pal", u8AppDataPath + "\\TmpPalette.pal", m_hCache2))
errstream << "UnitLun.pal failed\n";
m_hPalUnitLun = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
if (!FSunPackLib::XCC_ExtractFile("unitdes.pal", u8AppDataPath + "\\TmpPalette.pal", m_hCache2))
errstream << "UnitDes.pal failed\n";
m_hPalUnitDes = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
if (!FSunPackLib::XCC_ExtractFile("unitubn.pal", u8AppDataPath + "\\TmpPalette.pal", m_hCache2))
errstream << "UnitUbn.pal failed\n";
m_hPalUnitUbn = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
if (!FSunPackLib::XCC_ExtractFile("snow.pal", u8AppDataPath + "\\TmpPalette.pal", loading.CacheMix()))
errstream << "Snow.pal failed\n";
m_hPalSnow = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
if (!FSunPackLib::XCC_ExtractFile("temperat.pal", u8AppDataPath + "\\TmpPalette.pal", loading.CacheMix()))
errstream << "Temperat.pal failed\n";
m_hPalTemp = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
if (!FSunPackLib::XCC_ExtractFile("urban.pal", u8AppDataPath + "\\TmpPalette.pal", loading.CacheMix()))
errstream << "Urban.pal failed\n";
m_hPalUrb = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
if (!FSunPackLib::XCC_ExtractFile("lunar.pal", u8AppDataPath + "\\TmpPalette.pal", m_hCache2))
errstream << "lunar.pal failed\n";
m_hPalLun = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
if (!FSunPackLib::XCC_ExtractFile("desert.pal", u8AppDataPath + "\\TmpPalette.pal", m_hCache2))
errstream << "desert.pal failed\n";
m_hPalDes = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
if (!FSunPackLib::XCC_ExtractFile("urbann.pal", u8AppDataPath + "\\TmpPalette.pal", m_hCache2))
errstream << "urbann.pal failed\n";
m_hPalUbn = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
if (!FSunPackLib::XCC_ExtractFile("_ID2124019542", u8AppDataPath + "\\TmpPalette.pal", loading.CacheMix()))
errstream << "lib.pal failed\n";
m_hPalLib = FSunPackLib::LoadTSPalette(u8AppDataPath + "\\TmpPalette.pal", NULL);
deleteFile(u8AppDataPath + "\\TmpPalette.pal");
LoadedPalettes["isotem.pal"] = new Palette(m_hPalIsoTemp);
LoadedPalettes["isosno.pal"] = new Palette(m_hPalIsoSnow);
LoadedPalettes["isourb.pal"] = new Palette(m_hPalIsoUrb);
LoadedPalettes["isoubn.pal"] = new Palette(m_hPalIsoUbn);
LoadedPalettes["isolun.pal"] = new Palette(m_hPalIsoLun);
LoadedPalettes["isodes.pal"] = new Palette(m_hPalIsoDes);
LoadedPalettes["unittem.pal"] = new Palette(m_hPalUnitTemp, true);
LoadedPalettes["unitsno.pal"] = new Palette(m_hPalUnitSnow, true);
LoadedPalettes["uniturb.pal"] = new Palette(m_hPalUnitUrb, true);
LoadedPalettes["unitubn.pal"] = new Palette(m_hPalUnitUbn, true);
LoadedPalettes["unitlun.pal"] = new Palette(m_hPalUnitLun, true);
LoadedPalettes["unitdes.pal"] = new Palette(m_hPalUnitDes, true);
LoadedPalettes["temperat.pal"] = new Palette(m_hPalTemp);
LoadedPalettes["snow.pal"] = new Palette(m_hPalSnow);
LoadedPalettes["urban.pal"] = new Palette(m_hPalUrb);
LoadedPalettes["urbann.pal"] = new Palette(m_hPalUbn);
LoadedPalettes["lunar.pal"] = new Palette(m_hPalLun);
LoadedPalettes["desert.pal"] = new Palette(m_hPalDes);
LoadedPalettes["lib.pal"] = new Palette(m_hPalLib);
}
HTSPALETTE Palettes::GetIsoPalette(char theat)
{
HTSPALETTE isoPalette = m_hPalIsoTemp;
switch (theat) {
case 'T':
case 'G':
isoPalette = m_hPalIsoTemp;
break;
case 'A':
isoPalette = m_hPalIsoSnow;
break;
case 'U':
isoPalette = m_hPalIsoUrb;
break;
case 'N':
isoPalette = m_hPalIsoUbn;
break;
case 'D':
isoPalette = m_hPalIsoDes;
break;
case 'L':
isoPalette = m_hPalIsoLun;
break;
}
return isoPalette;
}
HTSPALETTE Palettes::GetUnitPalette(char theat)
{
HTSPALETTE isoPalette = m_hPalUnitTemp;
switch (theat) {
case 'T':
case 'G':
isoPalette = m_hPalUnitTemp;
break;
case 'A':
isoPalette = m_hPalUnitSnow;
break;
case 'U':
isoPalette = m_hPalUnitUrb;
break;
case 'N':
isoPalette = m_hPalUnitUbn;
break;
case 'D':
isoPalette = m_hPalUnitDes;
break;
case 'L':
isoPalette = m_hPalUnitLun;
break;
}
return isoPalette;
}
/*
Helper function that fetches the palette data from FsunPackLib
FSunPackLib doesn´t provide any special function to retrieve a color table entry,
so we have to build it ourself
Also builds color_conv
*/
void Palettes::FetchPalettes()
{
// SetTSPaletteEntry(HTSPALETTE hPalette, BYTE bIndex, RGBTRIPLE* rgb, RGBTRIPLE* orig);
// SetTSPaletteEntry can retrieve the current color table entry without modifying it!
// iso palette
HTSPALETTE hCur = 0;
if (Map->GetTheater() == THEATER0) hCur = m_hPalIsoTemp;
if (Map->GetTheater() == THEATER1) hCur = m_hPalIsoSnow;
if (Map->GetTheater() == THEATER2) hCur = m_hPalIsoUrb;
if (Map->GetTheater() == THEATER3) hCur = m_hPalIsoUbn;
if (Map->GetTheater() == THEATER4) hCur = m_hPalIsoLun;
if (Map->GetTheater() == THEATER5) hCur = m_hPalIsoDes;
int i;
for (i = 0; i < 256; i++) {
FSunPackLib::SetTSPaletteEntry(hCur, i, NULL /* don´t modify it!*/, &palIso[i] /*but retrieve it!*/);
}
// unit palette
if (Map->GetTheater() == THEATER0) hCur = m_hPalUnitTemp;
if (Map->GetTheater() == THEATER1) hCur = m_hPalUnitSnow;
if (Map->GetTheater() == THEATER2) hCur = m_hPalUnitUrb;
if (Map->GetTheater() == THEATER3) hCur = m_hPalUnitUbn;
if (Map->GetTheater() == THEATER4) hCur = m_hPalUnitLun;
if (Map->GetTheater() == THEATER5) hCur = m_hPalUnitDes;
for (i = 0; i < 256; i++) {
FSunPackLib::SetTSPaletteEntry(hCur, i, NULL /* don´t modify it!*/, &palUnit[i] /*but retrieve it!*/);
}
// theater palette
if (Map->GetTheater() == THEATER0) hCur = m_hPalTemp;
if (Map->GetTheater() == THEATER1) hCur = m_hPalSnow;
if (Map->GetTheater() == THEATER2) hCur = m_hPalUrb;
if (Map->GetTheater() == THEATER3) hCur = m_hPalUbn;
if (Map->GetTheater() == THEATER4) hCur = m_hPalLun;
if (Map->GetTheater() == THEATER5) hCur = m_hPalDes;
for (i = 0; i < 256; i++) {
FSunPackLib::SetTSPaletteEntry(hCur, i, NULL /* don´t modify it!*/, &palTheater[i] /*but retrieve it!*/);
}
// lib palette
hCur = m_hPalLib;
for (i = 0; i < 256; i++) {
FSunPackLib::SetTSPaletteEntry(hCur, i, NULL /* don´t modify it!*/, &palLib[i] /*but retrieve it!*/);
}
CreateConvTable(palIso, iPalIso);
CreateConvTable(palLib, iPalLib);
CreateConvTable(palUnit, iPalUnit);
CreateConvTable(palTheater, iPalTheater);
CIsoView& v = *((CFinalSunDlg*)theApp.m_pMainWnd)->m_view.m_isoview;
DDPIXELFORMAT pf;
memset(&pf, 0, sizeof(DDPIXELFORMAT));
pf.dwSize = sizeof(DDPIXELFORMAT);
v.lpds->GetPixelFormat(&pf);
v.pf = pf;
v.m_color_converter.reset(new FSunPackLib::ColorConverter(v.pf));
FSunPackLib::ColorConverter conf(pf);
for (auto const& [name, col] : rules["Colors"]) {
COLORREF cref = v.GetColor("", col);
color_conv[col] = conf.GetColor(GetRValue(cref), GetGValue(cref), GetBValue(cref));
colorref_conv[cref] = color_conv[col];
}
}
void Palettes::CreateConvTable(RGBTRIPLE* pal, int* iPal)
{
CIsoView& v = *((CFinalSunDlg*)theApp.m_pMainWnd)->m_view.m_isoview;
DDPIXELFORMAT pf;
memset(&pf, 0, sizeof(DDPIXELFORMAT));
pf.dwSize = sizeof(DDPIXELFORMAT);
v.lpds->GetPixelFormat(&pf);
FSunPackLib::ColorConverter conf(pf);
int i;
for (i = 0; i < 256; i++) {
iPal[i] = conf.GetColor(pal[i].rgbtRed, pal[i].rgbtGreen, pal[i].rgbtBlue);
}
}
Palette* Palettes::LoadPalette(const CString& palName, bool remappable)
{
if (LoadedPalettes.size() == 0) {
Palettes::Init();
}
auto it = LoadedPalettes.find(palName);
if (it != LoadedPalettes.end()) {
return it->second;
}
BytePalette buffer;
HMIXFILE mixIdx = loading.FindFileInMix(palName);
if (FSunPackLib::LoadTSPalette(reinterpret_cast<RGBTRIPLE*>(buffer.Data), palName, mixIdx)) {
auto pal = new Palette(buffer, remappable);
LoadedPalettes[palName] = pal;
return pal;
}
return nullptr;
}
void Palettes::Clear()
{
for (auto& pair : LoadedPalettes) {
delete(pair.second);
}
LoadedPalettes.clear();
RemappedPalettes.clear();
Init();
}
Palette::Palette(const BytePalette& bytes, bool remappable) :
Remappable(remappable)
{
for (auto idx = 0; idx < 256; idx++) {
Data[idx].R = bytes.Data[idx].red;
Data[idx].G = bytes.Data[idx].green;
Data[idx].B = bytes.Data[idx].blue;
Data[idx].Zero = 0;
}
}
Palette::Palette(HTSPALETTE indexer, bool remappable) :
Remappable(remappable)
{
for (auto idx = 0; idx < 256; idx++) {
RGBTRIPLE ret;
FSunPackLib::SetTSPaletteEntry(indexer, idx, NULL /* don´t modify it!*/, &ret /*but retrieve it!*/);
Data[idx].R = ret.rgbtRed;
Data[idx].G = ret.rgbtGreen;
Data[idx].B = ret.rgbtBlue;
Data[idx].Zero = 0;
}
}