CubicSDR/src/visual/ColorTheme.cpp

288 lines
18 KiB
C++
Raw Permalink Normal View History

// Copyright (c) Charles J. Cliffe
//Google Turbo color scheme: Copyright 2019 Google LLC.
//Author: Anton Mikhailov
// SPDX-License-Identifier: GPL-2.0+
#include "ColorTheme.h"
ThemeMgr ThemeMgr::mgr;
2021-04-04 22:20:33 -04:00
void ThemeMgr::setTheme(int themeId_in) {
currentTheme = themes[themeId_in];
themeId = themeId_in;
}
2021-04-04 22:20:33 -04:00
int ThemeMgr::getTheme() const {
return themeId;
}
ThemeMgr::ThemeMgr() {
themes[COLOR_THEME_DEFAULT] = new DefaultColorTheme;
themes[COLOR_THEME_DEFAULT_JET] = new DefaultColorThemeJet;
themes[COLOR_THEME_BW] = new BlackAndWhiteColorTheme;
themes[COLOR_THEME_SHARP] = new SharpColorTheme;
themes[COLOR_THEME_RAD] = new RadColorTheme;
themes[COLOR_THEME_TOUCH] = new TouchColorTheme;
themes[COLOR_THEME_HD] = new HDColorTheme;
themes[COLOR_THEME_RADAR] = new RadarColorTheme;
currentTheme = themes[COLOR_THEME_DEFAULT];
themeId = COLOR_THEME_DEFAULT;
}
ThemeMgr::~ThemeMgr() {
std::map<int, ColorTheme *>::iterator i;
for (i = themes.begin(); i != themes.end(); i++) {
delete i->second;
}
}
DefaultColorTheme::DefaultColorTheme() {
name = "Default";
//Google Turbo color scheme: https://ai.googleblog.com/2019/08/turbo-improved-rainbow-colormap-for.html
//Author: Anton Mikhailov
static std::vector<GradientColor> turbo_srgb_floats = { {0.18995,0.07176,0.23217},{0.19483,0.08339,0.26149},{0.19956,0.09498,0.29024},{0.20415,0.10652,0.31844},{0.20860,0.11802,0.34607},{0.21291,0.12947,0.37314},{0.21708,0.14087,0.39964},{0.22111,0.15223,0.42558},{0.22500,0.16354,0.45096},{0.22875,0.17481,0.47578},{0.23236,0.18603,0.50004},{0.23582,0.19720,0.52373},{0.23915,0.20833,0.54686},{0.24234,0.21941,0.56942},{0.24539,0.23044,0.59142},{0.24830,0.24143,0.61286},{0.25107,0.25237,0.63374},{0.25369,0.26327,0.65406},{0.25618,0.27412,0.67381},{0.25853,0.28492,0.69300},{0.26074,0.29568,0.71162},{0.26280,0.30639,0.72968},{0.26473,0.31706,0.74718},{0.26652,0.32768,0.76412},{0.26816,0.33825,0.78050},{0.26967,0.34878,0.79631},{0.27103,0.35926,0.81156},{0.27226,0.36970,0.82624},{0.27334,0.38008,0.84037},{0.27429,0.39043,0.85393},{0.27509,0.40072,0.86692},{0.27576,0.41097,0.87936},{0.27628,0.42118,0.89123},{0.27667,0.43134,0.90254},{0.27691,0.44145,0.91328},{0.27701,0.45152,0.92347},{0.27698,0.46153,0.93309},{0.27680,0.47151,0.94214},{0.27648,0.48144,0.95064},{0.27603,0.49132,0.95857},{0.27543,0.50115,0.96594},{0.27469,0.51094,0.97275},{0.27381,0.52069,0.97899},{0.27273,0.53040,0.98461},{0.27106,0.54015,0.98930},{0.26878,0.54995,0.99303},{0.26592,0.55979,0.99583},{0.26252,0.56967,0.99773},{0.25862,0.57958,0.99876},{0.25425,0.58950,0.99896},{0.24946,0.59943,0.99835},{0.24427,0.60937,0.99697},{0.23874,0.61931,0.99485},{0.23288,0.62923,0.99202},{0.22676,0.63913,0.98851},{0.22039,0.64901,0.98436},{0.21382,0.65886,0.97959},{0.20708,0.66866,0.97423},{0.20021,0.67842,0.96833},{0.19326,0.68812,0.96190},{0.18625,0.69775,0.95498},{0.17923,0.70732,0.94761},{0.17223,0.71680,0.93981},{0.16529,0.72620,0.93161},{0.15844,0.73551,0.92305},{0.15173,0.74472,0.91416},{0.14519,0.75381,0.90496},{0.13886,0.76279,0.89550},{0.13278,0.77165,0.88580},{0.12698,0.78037,0.87590},{0.12151,0.78896,0.86581},{0.11639,0.79740,0.85559},{0.11167,0.80569,0.84525},{0.10738,0.81381,0.83484},{0.10357,0.82177,0.82437},{0.10026,0.82955,0.81389},{0.09750,0.83714,0.80342},{0.09532,0.84455,0.79299},{0.09377,0.85175,0.78264},{0.09287,0.85875,0.77240},{0.09267,0.86554,0.76230},{0.09320,0.87211,0.75237},{0.09451,0.87844,0.74265},{0.09662,0.88454,0.73316},{0.09958,0.89040,0.72393},{0.10342,0.89600,0.71500},{0.10815,0.90142,0.70599},{0.11374,0.90673,0.69651},{0.12014,0.91193,0.68660},{0.12733,0.91701,0.67627},{0.13526,0.92197,0.66556},{0.14391,0.92680,0.65448},{0.15323,0.93151,0.64308},{0.16319,0.93609,0.63137},{0.17377,0.94053,0.61938},{0.18491,0.94484,0.60713},{0.19659,0.94901,0.59466},{0.20877,0.95304,0.58199},{0.22142,0.95692,0.56914},{0.23449,0.96065,0.55614},{0.24797,0.96423,0.54303},{0.26180,0.96765,0.52981},{0.27597,0.97092,0.51653},{0.29042,0.97403,0.50321},{0.30513,0.97697,0.48987},{0.32006,0.97974,0.47654},{0.33517,0.98234,0.46325},{0.35043,0.98477,0.45002},{0.36581,0.98702,0.43688},{0.38127,0.98909,0.42386},{0.39678,0.99098,0.41098},{0.41229,0.99268,0.39826},{0.42778,0.99419,0.38575},{0.44321,0.99551,0.37345},{0.45854,0.99663,0.36140},{0.47375,0.99755,0.34963},{0.48879,0.99828,0.33816},{0.50362,0.99879,0.32701},{0.51822,0.99910,0.31622},{0.53255,0.99919,0.30581},{0.54658,0.99907,0.29581},{0.56026,0.99873,0.28623},{0.57357,0.99817,0.27712},{0.58646,0.99739,0.26849},{0.59891,0.99638,0.26038},{0.61088,0.99514,0.25280},{0.62233,0.99366,0.24579},{0.63323,0.99195,0.23937},{0.64362,0.98999,0.23356},{0.65394,0.98775,0.22835},{0.66428,0.98524,0.22370},{0.67462,0.98246,0.21960},{0.68494,0.97941,0.21602},{0.69525,0.97610,0.21294},{0.70553,0.97255,0.21032},{0.71577,0.96875,0.20815},{0.72596,0.96470,0.20640},{0.73610,0.96043,0.20504},{0.74617,0.95593,0.20406},{0.75617,0.95121,0.20343},{0.76608,0.94627,0.20311},{0.77591,0.94113,0.20310},{0.78563,0.93579,0.20336},{0.79524,0.93025,0.20386},{0.80473,0.92452,0.20459},{0.81410,0.91861,0.20552},{0.82333,0.91253,0.20663},{0.83241,0.90627,0.20788},{0.84133,0.89986,0.20926},{0.85010,0.89328,0.21074},{0.85868,0.88655,0.21230},{0.86709,0.87968,0.21391},{0.87530,0.87267,0.21555},{0.88331,0.86553,0.21719},{0.89112,0.85826,0.21880},{0.89870
waterfallGradient.addColors(turbo_srgb_floats);
waterfallGradient.generate(256);
waterfallHighlight = RGBA4f(1, 1, 1);
waterfallNew = RGBA4f(0, 1, 0);
waterfallHover = RGBA4f(1, 1, 0);
waterfallDestroy = RGBA4f(1, 0, 0);
fftLine = RGBA4f(0.9f, 0.9f, 0.9f);
fftHighlight = RGBA4f(1, 1, 1);
scopeLine = RGBA4f(0.9f, 0.9f, 0.9f);
tuningBarLight = RGBA4f(0.2f, 0.2f, 0.9f);
tuningBarDark = RGBA4f(0.0f, 0.0f, 0.35f);
tuningBarUp = RGBA4f(1.0f, 139.0f/255.0f, 96.0f/255.0f);
tuningBarDown = RGBA4f(148.0f/255.0f, 148.0f/255.0f, 1.0f);
meterLevel = RGBA4f(0.1f, 0.75f, 0.1f);
meterValue = RGBA4f(0.75f, 0.1f, 0.1f);
text = RGBA4f(1, 1, 1);
freqLine = RGBA4f(1, 1, 1);
button = RGBA4f(0.65f, 0.65f, 0.65f);
buttonHighlight = RGBA4f(1, 1, 0);
2015-01-15 00:59:33 -05:00
scopeBackground = RGBA4f(0.1f, 0.1f, 0.1f);
fftBackground = RGBA4f(0.1f, 0.1f, 0.1f);
generalBackground = RGBA4f(0.1f, 0.1f, 0.1f);
}
DefaultColorThemeJet::DefaultColorThemeJet()
{
/* This is the original DefaultColorTheme:
waterfallGradient.addColor(GradientColor(0, 0, 0));
waterfallGradient.addColor(GradientColor(0, 0, 1.0));
waterfallGradient.addColor(GradientColor(0, 1.0, 0));
waterfallGradient.addColor(GradientColor(1.0, 1.0, 0));
waterfallGradient.addColor(GradientColor(1.0, 0.2f, 0.0));
*/
name = "DefaultJet";
// Original DefaultColorTheme of CubicSDR 0.25:
waterfallGradient.clear();
waterfallGradient.addColors({ {0, 0, 0}, {0, 0, 1.0}, {0, 1.0, 0}, {1.0, 1.0, 0},{1.0, 0.2f, 0.0}});
waterfallGradient.generate(256);
}
2015-01-15 20:37:51 -05:00
RadarColorTheme::RadarColorTheme() {
name = "Radar";
waterfallGradient.addColor(GradientColor(5.0f / 255.0f, 45.0f / 255.0f, 10.0f / 255.0f));
waterfallGradient.addColor(GradientColor(30.0f / 255.0f, 150.0f / 255.0f, 40.0f / 255.0f));
waterfallGradient.addColor(GradientColor(40.0f / 255.0f, 240.0f / 255.0f, 60.0f / 255.0f));
waterfallGradient.addColor(GradientColor(250.0f / 255.0f, 250.0f / 255.0f, 250.0f / 255.0f));
2015-01-15 20:37:51 -05:00
waterfallGradient.generate(256);
waterfallHighlight = RGBA4f(1, 1, 1);
waterfallNew = RGBA4f(0, 1, 0);
waterfallHover = RGBA4f(1, 1, 0);
waterfallDestroy = RGBA4f(1, 0, 0);
fftLine = RGBA4f(0.8f, 1.0f, 0.8f);
fftHighlight = RGBA4f(1, 1, 1);
scopeLine = RGBA4f(0.8f, 1.0f, 0.8f);
tuningBarLight = RGBA4f(0.0, 0.45f, 0.0);
tuningBarDark = RGBA4f(0.0, 0.1f, 0.0);
tuningBarUp = RGBA4f(1.0f, 139.0f/255.0f, 96.0f/255.0f);
tuningBarDown = RGBA4f(148.0f/255.0f, 0.0, 0.0);
meterLevel = RGBA4f(0, 0.5f, 0);
meterValue = RGBA4f(0, 0.5f, 0);
text = RGBA4f(0.8f, 1.0, 0.8f);
freqLine = RGBA4f(1, 1, 1);
button = RGBA4f(0.65f, 0.75f, 0.65f);
buttonHighlight = RGBA4f(0.65f, 1.0f, 0.65f);
2015-01-15 20:37:51 -05:00
scopeBackground = RGBA4f(0.05f, 0.1f, 0.05f);
fftBackground = RGBA4f(0.05f, 0.1f, 0.05f);
generalBackground = RGBA4f(0.05f, 0.1f, 0.05f);
2015-01-15 20:37:51 -05:00
}
BlackAndWhiteColorTheme::BlackAndWhiteColorTheme() {
name = "Black & White";
waterfallGradient.addColor(GradientColor(0, 0, 0));
waterfallGradient.addColor(GradientColor(0.75f, 0.75f, 0.75f));
waterfallGradient.addColor(GradientColor(1.0f, 1.0f, 1.0f));
waterfallGradient.generate(256);
waterfallHighlight = RGBA4f(1, 1, 0.9f);
waterfallNew = RGBA4f(0, 1, 0);
waterfallHover = RGBA4f(1, 1, 0);
waterfallDestroy = RGBA4f(1, 0, 0);
fftLine = RGBA4f(0.9f, 0.9f, 0.9f);
fftHighlight = RGBA4f(1, 1, 0.9f);
scopeLine = RGBA4f(0.9f, 0.9f, 0.9f);
tuningBarLight = RGBA4f(0.4f, 0.4f, 0.4f);
tuningBarDark = RGBA4f(0.1f, 0.1f, 0.1f);
tuningBarUp = RGBA4f(0.8f, 0.8f, 0.8f);
tuningBarDown = RGBA4f(0.4f, 0.4f, 0.4f);
meterLevel = RGBA4f(0.5f, 0.5f, 0.5f);
meterValue = RGBA4f(0.5f, 0.5f, 0.5f);
text = RGBA4f(1, 1, 1);
freqLine = RGBA4f(1, 1, 1);
button = RGBA4f(0.65f, 0.65f, 0.65f);
buttonHighlight = RGBA4f(1, 1, 1);
2015-01-15 00:59:33 -05:00
scopeBackground = RGBA4f(0.1f, 0.1f, 0.1f);
fftBackground = RGBA4f(0.1f, 0.1f, 0.1f);
generalBackground = RGBA4f(0.1f, 0.1f, 0.1f);
2015-01-15 00:59:33 -05:00
}
SharpColorTheme::SharpColorTheme() {
name = "Sharp";
waterfallGradient.addColor(GradientColor(0, 0, 0));
waterfallGradient.addColor(GradientColor(0.0, 0, 0.5f));
waterfallGradient.addColor(GradientColor(0.0, 0.0, 1.0f));
waterfallGradient.addColor(GradientColor(65.0f / 255.0f, 161.0f / 255.0f, 1.0f));
waterfallGradient.addColor(GradientColor(1.0f, 1.0f, 1.0f));
waterfallGradient.addColor(GradientColor(1.0f, 1.0f, 1.0f));
waterfallGradient.addColor(GradientColor(1.0f, 1.0f, 0.5f));
waterfallGradient.addColor(GradientColor(1.0f, 1.0f, 0.0f));
waterfallGradient.addColor(GradientColor(1.0f, 0.5f, 0.0f));
waterfallGradient.addColor(GradientColor(1.0f, 0.25f, 0.0f));
waterfallGradient.addColor(GradientColor(0.5f, 0.1f, 0.0f));
waterfallGradient.generate(256);
waterfallHighlight = RGBA4f(0.9f, 0.9f, 1.0f);
waterfallNew = RGBA4f(0, 1, 0);
waterfallHover = RGBA4f(1, 1, 0);
waterfallDestroy = RGBA4f(1, 0, 0);
fftLine = RGBA4f(0.9f, 0.9f, 1.0);
fftHighlight = RGBA4f(0.9f, 0.9f, 1.0);
scopeLine = RGBA4f(0.85f, 0.85f, 1.0);
tuningBarLight = RGBA4f(28.0f / 255.0f, 106.0f / 255.0f, 179.0f / 255.0f);
tuningBarDark = RGBA4f(14.0f / 255.0f, 53.0f / 255.0f, 89.5f / 255.0f);
tuningBarUp = RGBA4f(0.7f, 0.7f, 0.7f);
tuningBarDown = RGBA4f(1.0f, 0.0, 0.0);
meterLevel = RGBA4f(28.0f / 255.0f, 106.0f / 255.0f, 179.0f / 255.0f);
meterValue = RGBA4f(190.0f / 255.0f, 190.0f / 255.0f, 60.0f / 255.0f);
text = RGBA4f(0.9f, 0.9f, 1);
freqLine = RGBA4f(0.85f, 0.85f, 1.0f);
button = RGBA4f(217.0f / 255.0f, 218.0f / 255.0f, 228.0f / 255.0f);
buttonHighlight = RGBA4f(208.0f / 255.0f, 249.0f / 255.0f, 255.0f / 255.0f);
2015-01-15 00:59:33 -05:00
scopeBackground = RGBA4f(0.05f, 0.05f, 0.15f);
fftBackground = RGBA4f(0.05f, 0.05f, 0.15f);
generalBackground = RGBA4f(0.05f, 0.05f, 0.15f);
}
RadColorTheme::RadColorTheme() {
name = "Rad";
waterfallGradient.addColor(GradientColor(0, 0, 0.5f));
waterfallGradient.addColor(GradientColor(25.0f / 255.0f, 154.0f / 255.0f, 0.0));
waterfallGradient.addColor(GradientColor(201.0f / 255.0f, 115.0f / 255.0f, 0.0));
waterfallGradient.addColor(GradientColor(1.0, 40.0f / 255.0f, 40.0f / 255.0f));
waterfallGradient.addColor(GradientColor(1.0, 1.0, 1.0));
waterfallGradient.generate(256);
waterfallHighlight = RGBA4f(1, 1, 1);
waterfallNew = RGBA4f(0, 1, 0);
waterfallHover = RGBA4f(1, 1, 0);
waterfallDestroy = RGBA4f(1, 0, 0);
fftLine = RGBA4f(1.0, 0.9f, 0.9f);
fftHighlight = RGBA4f(1, 1, 1);
scopeLine = RGBA4f(1.0, 0.9f, 0.9f);
tuningBarLight = RGBA4f(0.0, 0.45f, 0.0);
tuningBarDark = RGBA4f(0.0, 0.1f, 0.0);
tuningBarUp = RGBA4f(1.0, 0.0, 0.0);
tuningBarDown = RGBA4f(0.0, 0.5f, 1.0);
meterLevel = RGBA4f(0, 0.5f, 0);
meterValue = RGBA4f(0.5f, 0, 0);
text = RGBA4f(1, 1, 1);
freqLine = RGBA4f(1, 1, 1);
button = RGBA4f(0.65f, 0.65f, 0.65f);
buttonHighlight = RGBA4f(0.76f, 0.65f, 0);
2015-01-15 20:37:51 -05:00
scopeBackground = RGBA4f(13.0f / 255.0f, 47.0f / 255.0f, 9.0f / 255.0f);
fftBackground = RGBA4f(0, 0, 50.0f / 255.0f);
generalBackground = RGBA4f(13.0f / 255.0f, 47.0f / 255.0f, 9.0f / 255.0f);
}
TouchColorTheme::TouchColorTheme() {
name = "Touch";
waterfallGradient.addColor(GradientColor(0, 0, 0));
waterfallGradient.addColor(GradientColor(55.0f / 255.0f, 40.0f / 255.0f, 55.0f / 255.0f));
waterfallGradient.addColor(GradientColor(61.0f / 255.0f, 57.0f / 255.0f, 88.0f / 255.0f));
waterfallGradient.addColor(GradientColor(0.0f / 255.0f, 255.0f / 255.0f, 255.0f / 255.0f));
waterfallGradient.addColor(GradientColor(10.0f / 255.0f, 255.0f / 255.0f, 85.0f / 255.0f));
waterfallGradient.addColor(GradientColor(255.0f / 255.0f, 255.0f / 255.0f, 75.0f / 255.0f));
waterfallGradient.addColor(GradientColor(255.0f / 255.0f, 0.0f / 255.0f, 0.0f / 255.0f));
waterfallGradient.addColor(GradientColor(255.0f / 255.0f, 255.0f / 255.0f, 255.0f / 255.0f));
waterfallGradient.generate(256);
waterfallHighlight = RGBA4f(1, 1, 1);
waterfallNew = RGBA4f(0, 1, 0);
waterfallHover = RGBA4f(1, 1, 0);
waterfallDestroy = RGBA4f(1, 0, 0);
fftLine = RGBA4f(234.0f / 255.0f, 232.0f / 255.0f, 247.0f / 255.0f);
fftHighlight = RGBA4f(1.0f, 1.0f, 1.0f);
scopeLine = RGBA4f(234.0f / 255.0f, 232.0f / 255.0f, 247.0f / 255.0f);
tuningBarLight = RGBA4f(0.2f, 0.2f, 0.7f);
tuningBarDark = RGBA4f(0.1f, 0.1f, 0.45f);
tuningBarUp = RGBA4f(0.5f, 139.0f/255.0f, 96.0f/255.0f);
tuningBarDown = RGBA4f(0.6f, 108.0f/255.0f, 1.0f);
meterLevel = RGBA4f(61.0f / 255.0f, 57.0f / 255.0f, 88.0f / 255.0f);
meterValue = RGBA4f(61.0f / 255.0f, 57.0f / 255.0f, 88.0f / 255.0f);
text = RGBA4f(1, 1, 1);
freqLine = RGBA4f(1, 1, 1);
button = RGBA4f(1.0f, 1.0f, 1.0f);
buttonHighlight = RGBA4f(208.0f / 255.0f, 202.0f / 255.0f, 247.0f / 255.0f);
2015-01-15 20:37:51 -05:00
scopeBackground = RGBA4f(39.0f / 255.0f, 36.0f / 255.0f, 56.0f / 255.0f);
fftBackground = RGBA4f(39.0f / 255.0f, 36.0f / 255.0f, 56.0f / 255.0f);
generalBackground = RGBA4f(61.0f / 255.0f, 57.0f / 255.0f, 88.0f / 255.0f);
2015-01-15 20:37:51 -05:00
}
HDColorTheme::HDColorTheme() {
name = "HD";
waterfallGradient.addColor(GradientColor(5.0f / 255.0f, 5.0f / 255.0f, 60.0f / 255.0f));
waterfallGradient.addColor(GradientColor(5.0f / 255.0f, 20.0f / 255.0f, 120.0f / 255.0f));
waterfallGradient.addColor(GradientColor(50.0f / 255.0f, 100.0f / 255.0f, 200.0f / 255.0f));
waterfallGradient.addColor(GradientColor(75.0f / 255.0f, 190.0f / 255.0f, 100.0f / 255.0f));
waterfallGradient.addColor(GradientColor(240.0f / 255.0f, 55.0f / 255.0f, 5.0f / 255.0f));
waterfallGradient.addColor(GradientColor(255.0f / 255.0f, 55.0f / 255.0f, 100.0f / 255.0f));
waterfallGradient.addColor(GradientColor(255.0f / 255.0f, 235.0f / 255.0f, 100.0f / 255.0f));
waterfallGradient.addColor(GradientColor(250.0f / 255.0f, 250.0f / 255.0f, 250.0f / 255.0f));
waterfallGradient.generate(256);
waterfallHighlight = RGBA4f(1, 1, 1);
waterfallNew = RGBA4f(0, 1, 0);
waterfallHover = RGBA4f(1, 1, 0);
waterfallDestroy = RGBA4f(1, 0, 0);
fftLine = RGBA4f(0.9f, 0.9f, 0.9f);
fftHighlight = RGBA4f(1, 1, 1);
scopeLine = RGBA4f(0.9f, 0.9f, 0.9f);
tuningBarLight = RGBA4f(0.4f, 0.4f, 1.0);
tuningBarDark = RGBA4f(0.1f, 0.1f, 0.45f);
tuningBarUp = RGBA4f(1.0, 139.0f/255.0f, 96.0f/255.0f);
tuningBarDown = RGBA4f(148.0f/255.0f, 148.0f/255.0f, 1.0f);
meterLevel = RGBA4f(0, 0.5f, 0);
meterValue = RGBA4f(0.0, 0.0, 1.0);
text = RGBA4f(1, 1, 1);
freqLine = RGBA4f(1, 1, 1);
button = RGBA4f(0, 0.7f, 0.7f);
buttonHighlight = RGBA4f(1, 1, 1);
scopeBackground = RGBA4f(0.0, 0.0, 48.0f / 255.0f);
fftBackground = RGBA4f(0.0, 0.0, 48.0f / 255.0f);
generalBackground = RGBA4f(0.0, 0.0, 0.0);
2015-01-15 00:59:33 -05:00
}