winamp/Src/Wasabi/api/skin/gammamgr.cpp
2024-09-24 14:54:57 +02:00

135 lines
3.7 KiB
C++

#include <precomp.h>
#include <api.h>
#include "gammamgr.h"
#include <api/service/servicei.h>
#include <api/skin/skinelem.h>
#include <api/syscb/callbacks/skincb.h>
void GammaMgr::init()
{
skinXML.registerCallback(L"WinampAbstractionLayer\fgammaset", &xmlreader); //back compat
skinXML.registerCallback(L"WinampAbstractionLayer\fgammaset\fgammagroup", &xmlreader); //back compat
skinXML.registerCallback(L"WasabiXML\fgammaset", &xmlreader);
skinXML.registerCallback(L"WasabiXML\fgammaset\fgammagroup", &xmlreader);
curset = -1;
}
void GammaMgr::deinit()
{
WASABI_API_COLORTHEMES->deleteAllGammaSets();
skinXML.unregisterCallback(&xmlreader);
}
void GammaMgr::onBeforeLoadingGammaGroups()
{
WASABI_API_COLORTHEMES->deleteAllGammaSets();
curset = -1;
}
void GammaMgr::onAfterLoadingGammaGroups()
{}
void GammaMgr::loadDefault()
{
WASABI_API_COLORTHEMES->StartTransaction();
#ifdef ON_LOAD_EXTRA_COLORTHEMES
ON_LOAD_EXTRA_COLORTHEMES();
#endif
WASABI_API_COLORTHEMES->EndTransaction();
if (WASABI_API_COLORTHEMES->getGammaSet() == NULL)
{
wchar_t txt[256] = {0};
WASABI_API_CONFIG->getStringPrivate(StringPrintfW(L"Color Themes/%s", WASABI_API_SKIN->getSkinName()), txt, 256, L"Default");
WASABI_API_COLORTHEMES->setGammaSet(txt);
}
}
int GammaMgr::gammaEqual(const wchar_t *id1, const wchar_t *id2)
{
const wchar_t *a = WASABI_API_PALETTE->getGammaGroupFromId(id1);
const wchar_t *b = WASABI_API_PALETTE->getGammaGroupFromId(id2);
if (!a || !b) return 1;
return !WCSICMP(a, b);
}
void GammaMgrXmlReader::xmlReaderOnStartElementCallback(const wchar_t *xmltag, skin_xmlreaderparams *params)
{
GammaMgr::xmlReaderOnStartElementCallback(xmltag, params);
}
void GammaMgr::xmlReaderOnStartElementCallback(const wchar_t *xmltag, skin_xmlreaderparams *params)
{
if (!WCSICMP(xmltag, L"gammaset"))
{
const wchar_t *id = params->getItemValue(L"id");
WASABI_API_COLORTHEMES->resetGammaSet(id);
curset = WASABI_API_COLORTHEMES->newGammaSet(id);
}
else if (!WCSICMP(xmltag, L"gammagroup"))
{
const wchar_t *id = params->getItemValue(L"id");
if (!id) // TODO: should we pop up a skin error msgbox?
return;
StringW value = params->getItemValue(L"value");
int r = 0, g = 0, b = 0;
wchar_t *p = value.getNonConstVal();
if (!p) // TODO: should we pop up a skin error msgbox?
return;
wchar_t *q = p;
while (q && *q && *q != ',') q++;
if (q && *q == ',') *q++ = 0;
r = WTOI(p);
if (*q)
{
p = q;
while (*q && *q != ',') q++;
if (*q == ',') *q++ = 0;
g = WTOI(p);
if (*q) b = WTOI(q);
}
int makegray = params->getItemValueInt(L"gray");
int boost = params->getItemValueInt(L"boost");
if (!WCSICMP(id, L"General") && curset>=0)
{
ColorThemeGroup *generalgroup = WASABI_API_COLORTHEMES->enumColorThemeGroup(curset, -1);
if (generalgroup)
{
generalgroup->setRed(r);
generalgroup->setGreen(g);
generalgroup->setBlue(b);
generalgroup->setGray(makegray);
generalgroup->setBoost(boost);
}
}
else if (curset != -1)
{
ColorThemeGroupI new_group(id, r, g, b, makegray, boost);
WASABI_API_COLORTHEMES->addGammaGroup(curset, &new_group);
}
}
}
GammaMgrXmlReader GammaMgr::xmlreader;
int GammaMgr::curset;
#define CBCLASS ColorThemeGroupI
START_DISPATCH;
CB(COLORTHEMEGROUPGETNAME, getName);
CB(COLORTHEMEGROUPGETRED, getRed);
CB(COLORTHEMEGROUPGETGREEN, getGreen);
CB(COLORTHEMEGROUPGETBLUE, getBlue);
CB(COLORTHEMEGROUPGETGRAY, getGray);
CB(COLORTHEMEGROUPGETBOOST, getBoost);
VCB(COLORTHEMEGROUPSETNAME, setName);
VCB(COLORTHEMEGROUPSETRED, setRed);
VCB(COLORTHEMEGROUPSETGREEN, setGreen);
VCB(COLORTHEMEGROUPSETBLUE, setBlue);
VCB(COLORTHEMEGROUPSETGRAY, setGray);
VCB(COLORTHEMEGROUPSETBOOST, setBoost);
END_DISPATCH;