diff --git a/CMakeLists.txt b/CMakeLists.txt index 1ab58ce..d34b73c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -136,6 +136,7 @@ SET (cubicsdr_sources src/util/MouseTracker.cpp src/util/GLFont.cpp src/util/DataTree.cpp + src/visual/ColorTheme.cpp src/visual/PrimaryGLContext.cpp src/visual/InteractiveCanvas.cpp src/visual/MeterCanvas.cpp @@ -177,6 +178,7 @@ SET (cubicsdr_headers src/util/MouseTracker.h src/util/GLFont.h src/util/DataTree.h + src/visual/ColorTheme.h src/visual/PrimaryGLContext.h src/visual/InteractiveCanvas.h src/visual/MeterCanvas.h diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index c641864..c27f6cd 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -19,6 +19,7 @@ #include "AudioThread.h" #include "CubicSDR.h" #include "DataTree.h" +#include "ColorTheme.h" #include @@ -67,19 +68,19 @@ AppFrame::AppFrame() : demodTray->Add(demodVisuals, 30, wxEXPAND | wxALL, 0); - demodTray->AddSpacer(2); + demodTray->AddSpacer(1); demodSignalMeter = new MeterCanvas(this, NULL); demodSignalMeter->setMax(0.5); demodSignalMeter->setHelpTip("Current Signal Level. Click / Drag to set Squelch level."); demodTray->Add(demodSignalMeter, 1, wxEXPAND | wxALL, 0); - demodTray->AddSpacer(2); + demodTray->AddSpacer(1); scopeCanvas = new ScopeCanvas(this, NULL); demodScopeTray->Add(scopeCanvas, 8, wxEXPAND | wxALL, 0); - demodScopeTray->AddSpacer(2); + demodScopeTray->AddSpacer(1); demodTuner = new TuningCanvas(this, NULL); demodTuner->setHelpTip("Testing tuner"); @@ -87,7 +88,7 @@ AppFrame::AppFrame() : demodTray->Add(demodScopeTray, 30, wxEXPAND | wxALL, 0); - demodTray->AddSpacer(2); + demodTray->AddSpacer(1); demodGainMeter = new MeterCanvas(this, NULL); demodGainMeter->setMax(2.0); @@ -95,11 +96,11 @@ AppFrame::AppFrame() : demodTray->Add(demodGainMeter, 1, wxEXPAND | wxALL, 0); vbox->Add(demodTray, 12, wxEXPAND | wxALL, 0); - vbox->AddSpacer(2); + vbox->AddSpacer(1); spectrumCanvas = new SpectrumCanvas(this, NULL); spectrumCanvas->setup(2048); vbox->Add(spectrumCanvas, 5, wxEXPAND | wxALL, 0); - vbox->AddSpacer(2); + vbox->AddSpacer(1); waterfallCanvas = new WaterfallCanvas(this, NULL); waterfallCanvas->setup(2048, 512); waterfallCanvas->attachSpectrumCanvas(spectrumCanvas); @@ -283,26 +284,19 @@ void AppFrame::OnMenu(wxCommandEvent& event) { } else if (event.GetId() == wxID_EXIT) { Close(false); } else if (event.GetId() == wxID_THEME_DEFAULT) { - waterfallCanvas->setTheme(COLOR_THEME_DEFAULT); - demodWaterfallCanvas->setTheme(COLOR_THEME_DEFAULT); + ThemeMgr::mgr.setTheme(COLOR_THEME_DEFAULT); } else if (event.GetId() == wxID_THEME_SHARP) { - waterfallCanvas->setTheme(COLOR_THEME_SHARP); - demodWaterfallCanvas->setTheme(COLOR_THEME_SHARP); + ThemeMgr::mgr.setTheme(COLOR_THEME_SHARP); } else if (event.GetId() == wxID_THEME_BW) { - waterfallCanvas->setTheme(COLOR_THEME_BW); - demodWaterfallCanvas->setTheme(COLOR_THEME_BW); + ThemeMgr::mgr.setTheme(COLOR_THEME_BW); } else if (event.GetId() == wxID_THEME_RAD) { - waterfallCanvas->setTheme(COLOR_THEME_RAD); - demodWaterfallCanvas->setTheme(COLOR_THEME_RAD); + ThemeMgr::mgr.setTheme(COLOR_THEME_RAD); } else if (event.GetId() == wxID_THEME_TOUCH) { - waterfallCanvas->setTheme(COLOR_THEME_TOUCH); - demodWaterfallCanvas->setTheme(COLOR_THEME_TOUCH); + ThemeMgr::mgr.setTheme(COLOR_THEME_TOUCH); } else if (event.GetId() == wxID_THEME_HD) { - waterfallCanvas->setTheme(COLOR_THEME_HD); - demodWaterfallCanvas->setTheme(COLOR_THEME_HD); + ThemeMgr::mgr.setTheme(COLOR_THEME_HD); } else if (event.GetId() == wxID_THEME_RADAR) { - waterfallCanvas->setTheme(COLOR_THEME_RADAR); - demodWaterfallCanvas->setTheme(COLOR_THEME_RADAR); + ThemeMgr::mgr.setTheme(COLOR_THEME_RADAR); } switch (event.GetId()) { diff --git a/src/demod/DemodulatorInstance.cpp b/src/demod/DemodulatorInstance.cpp index e82c8af..fbad2c1 100644 --- a/src/demod/DemodulatorInstance.cpp +++ b/src/demod/DemodulatorInstance.cpp @@ -126,14 +126,14 @@ bool DemodulatorInstance::isTerminated() { case DemodulatorThreadCommand::DEMOD_THREAD_CMD_AUDIO_TERMINATED: t_Audio->join(); audioTerminated = true; - delete t_Audio; +// delete t_Audio; break; case DemodulatorThreadCommand::DEMOD_THREAD_CMD_DEMOD_TERMINATED: #ifdef __APPLE__ pthread_join(t_Demod, NULL); #else t_Demod->join(); - delete t_Demod; +// delete t_Demod; #endif demodTerminated = true; break; @@ -142,7 +142,7 @@ bool DemodulatorInstance::isTerminated() { pthread_join(t_PreDemod, NULL); #else t_PreDemod->join(); - delete t_PreDemod; +// delete t_PreDemod; #endif preDemodTerminated = true; break; diff --git a/src/sdr/SDRThread.cpp b/src/sdr/SDRThread.cpp index 8cd7dbb..7596103 100644 --- a/src/sdr/SDRThread.cpp +++ b/src/sdr/SDRThread.cpp @@ -212,14 +212,15 @@ void SDRThread::threadMain() { rtlsdr_reset_buffer(dev); } if (offset_changed && !freq_changed) { - new_freq = frequency; freq_changed = true; + new_freq = frequency; offset = new_offset; } if (rate_changed) { sampleRate = new_rate; rtlsdr_set_sample_rate(dev, new_rate); - } else if (freq_changed) { + } + if (freq_changed) { frequency = new_freq; rtlsdr_set_center_freq(dev, frequency - offset); } diff --git a/src/visual/ColorTheme.cpp b/src/visual/ColorTheme.cpp new file mode 100644 index 0000000..046931b --- /dev/null +++ b/src/visual/ColorTheme.cpp @@ -0,0 +1,212 @@ +#include "ColorTheme.h" +#include "CubicSDR.h" +#include "CubicSDRDefs.h" + +ThemeMgr ThemeMgr::mgr; + +void ThemeMgr::setTheme(int themeId) { + currentTheme = themes[themeId]; + this->themeId = themeId; +} + +int ThemeMgr::getTheme() { + return themeId; +} + +ThemeMgr::ThemeMgr() { + themes[COLOR_THEME_DEFAULT] = new DefaultColorTheme; + 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::iterator i; + for (i = themes.begin(); i != themes.end(); i++) { + delete i->second; + } +} + +DefaultColorTheme::DefaultColorTheme() { + name = "Default"; + 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.2, 0.0)); + waterfallGradient.generate(256); + waterfallHighlight = RGBColor(1, 1, 1); + waterfallNew = RGBColor(0, 1, 0); + waterfallHover = RGBColor(1, 1, 0); + waterfallDestroy = RGBColor(1, 0, 0); + fftLine = RGBColor(0.9, 0.9, 0.9); + fftHighlight = RGBColor(1, 1, 1); + scopeLine = RGBColor(0.9, 0.9, 0.9); + tuningBar = RGBColor(0.2, 0.2, 0.9); + meterLevel = RGBColor(0.1, 0.75, 0.1); + meterValue = RGBColor(0.75, 0.1, 0.1); + text = RGBColor(1, 1, 1); + freqLine = RGBColor(1, 1, 1); + button = RGBColor(0.65, 0.65, 0.65); + buttonHighlight = RGBColor(1, 1, 0); +} + +BlackAndWhiteColorTheme::BlackAndWhiteColorTheme() { + name = "Black & White"; + waterfallGradient.addColor(GradientColor(0, 0, 0)); + waterfallGradient.addColor(GradientColor(0.75, 0.75, 0.75)); + waterfallGradient.addColor(GradientColor(1.0, 1.0, 1.0)); + waterfallGradient.generate(256); + waterfallHighlight = RGBColor(1, 1, 1); + waterfallNew = RGBColor(0, 1, 0); + waterfallHover = RGBColor(1, 1, 0); + waterfallDestroy = RGBColor(1, 0, 0); + fftLine = RGBColor(0.9, 0.9, 0.9); + fftHighlight = RGBColor(1, 1, 1); + scopeLine = RGBColor(0.9, 0.9, 0.9); + tuningBar = RGBColor(0.2, 0.2, 0.9); + meterLevel = RGBColor(0, 1, 0); + meterValue = RGBColor(1, 0, 0); + text = RGBColor(1, 1, 1); + freqLine = RGBColor(1, 1, 1); + button = RGBColor(0.65, 0.65, 0.65); + buttonHighlight = RGBColor(1, 1, 0); +} + +SharpColorTheme::SharpColorTheme() { + name = "Sharp"; + waterfallGradient.addColor(GradientColor(0, 0, 0)); + waterfallGradient.addColor(GradientColor(0.0, 0, 0.5)); + waterfallGradient.addColor(GradientColor(0.0, 0.0, 1.0)); + waterfallGradient.addColor(GradientColor(65.0 / 255.0, 161.0 / 255.0, 1.0)); + waterfallGradient.addColor(GradientColor(1.0, 1.0, 1.0)); + waterfallGradient.addColor(GradientColor(1.0, 1.0, 1.0)); + waterfallGradient.addColor(GradientColor(1.0, 1.0, 0.5)); + waterfallGradient.addColor(GradientColor(1.0, 1.0, 0.0)); + waterfallGradient.addColor(GradientColor(1.0, 0.5, 0.0)); + waterfallGradient.addColor(GradientColor(1.0, 0.25, 0.0)); + waterfallGradient.addColor(GradientColor(0.5, 0.1, 0.0)); + waterfallGradient.generate(256); + waterfallHighlight = RGBColor(1, 1, 1); + waterfallNew = RGBColor(0, 1, 0); + waterfallHover = RGBColor(1, 1, 0); + waterfallDestroy = RGBColor(1, 0, 0); + fftLine = RGBColor(0.9, 0.9, 0.9); + fftHighlight = RGBColor(1, 1, 1); + scopeLine = RGBColor(0.9, 0.9, 0.9); + tuningBar = RGBColor(0.2, 0.2, 0.9); + meterLevel = RGBColor(0, 1, 0); + meterValue = RGBColor(1, 0, 0); + text = RGBColor(1, 1, 1); + freqLine = RGBColor(1, 1, 1); + button = RGBColor(0.65, 0.65, 0.65); + buttonHighlight = RGBColor(1, 1, 0); +} + +RadColorTheme::RadColorTheme() { + name = "Rad"; + waterfallGradient.addColor(GradientColor(0, 0, 0.5)); + waterfallGradient.addColor(GradientColor(25.0 / 255.0, 154.0 / 255.0, 0.0)); + waterfallGradient.addColor(GradientColor(201.0 / 255.0, 115.0 / 255.0, 0.0)); + waterfallGradient.addColor(GradientColor(1.0, 40.0 / 255.0, 40.0 / 255.0)); + waterfallGradient.addColor(GradientColor(1.0, 1.0, 1.0)); + waterfallGradient.generate(256); + waterfallHighlight = RGBColor(1, 1, 1); + waterfallNew = RGBColor(0, 1, 0); + waterfallHover = RGBColor(1, 1, 0); + waterfallDestroy = RGBColor(1, 0, 0); + fftLine = RGBColor(0.9, 0.9, 0.9); + fftHighlight = RGBColor(1, 1, 1); + scopeLine = RGBColor(0.9, 0.9, 0.9); + tuningBar = RGBColor(0.2, 0.2, 0.9); + meterLevel = RGBColor(0, 1, 0); + meterValue = RGBColor(1, 0, 0); + text = RGBColor(1, 1, 1); + freqLine = RGBColor(1, 1, 1); + button = RGBColor(0.65, 0.65, 0.65); + buttonHighlight = RGBColor(1, 1, 0); +} + +TouchColorTheme::TouchColorTheme() { + name = "Touch"; + waterfallGradient.addColor(GradientColor(0, 0, 0)); + waterfallGradient.addColor(GradientColor(55.0 / 255.0, 40.0 / 255.0, 55.0 / 255.0)); + waterfallGradient.addColor(GradientColor(60.0 / 255.0, 60.0 / 255.0, 90.0 / 255.0)); + waterfallGradient.addColor(GradientColor(0.0 / 255.0, 255.0 / 255.0, 255.0 / 255.0)); + waterfallGradient.addColor(GradientColor(10.0 / 255.0, 255.0 / 255.0, 85.0 / 255.0)); + waterfallGradient.addColor(GradientColor(255.0 / 255.0, 255.0 / 255.0, 75.0 / 255.0)); + waterfallGradient.addColor(GradientColor(255.0 / 255.0, 0.0 / 255.0, 0.0 / 255.0)); + waterfallGradient.addColor(GradientColor(255.0 / 255.0, 255.0 / 255.0, 255.0 / 255.0)); + waterfallGradient.generate(256); + waterfallHighlight = RGBColor(1, 1, 1); + waterfallNew = RGBColor(0, 1, 0); + waterfallHover = RGBColor(1, 1, 0); + waterfallDestroy = RGBColor(1, 0, 0); + fftLine = RGBColor(0.9, 0.9, 0.9); + fftHighlight = RGBColor(1, 1, 1); + scopeLine = RGBColor(0.9, 0.9, 0.9); + tuningBar = RGBColor(0.2, 0.2, 0.9); + meterLevel = RGBColor(0, 1, 0); + meterValue = RGBColor(1, 0, 0); + text = RGBColor(1, 1, 1); + freqLine = RGBColor(1, 1, 1); + button = RGBColor(0.65, 0.65, 0.65); + buttonHighlight = RGBColor(1, 1, 0); +} + +HDColorTheme::HDColorTheme() { + name = "HD"; + waterfallGradient.addColor(GradientColor(5.0 / 255.0, 5.0 / 255.0, 60.0 / 255.0)); + waterfallGradient.addColor(GradientColor(5.0 / 255.0, 20.0 / 255.0, 120.0 / 255.0)); + waterfallGradient.addColor(GradientColor(50.0 / 255.0, 100.0 / 255.0, 200.0 / 255.0)); + waterfallGradient.addColor(GradientColor(75.0 / 255.0, 190.0 / 255.0, 100.0 / 255.0)); + waterfallGradient.addColor(GradientColor(240.0 / 255.0, 55.0 / 255.0, 5.0 / 255.0)); + waterfallGradient.addColor(GradientColor(255.0 / 255.0, 55.0 / 255.0, 100.0 / 255.0)); + waterfallGradient.addColor(GradientColor(255.0 / 255.0, 235.0 / 255.0, 100.0 / 255.0)); + waterfallGradient.addColor(GradientColor(250.0 / 255.0, 250.0 / 255.0, 250.0 / 255.0)); + waterfallGradient.generate(256); + waterfallHighlight = RGBColor(1, 1, 1); + waterfallNew = RGBColor(0, 1, 0); + waterfallHover = RGBColor(1, 1, 0); + waterfallDestroy = RGBColor(1, 0, 0); + fftLine = RGBColor(0.9, 0.9, 0.9); + fftHighlight = RGBColor(1, 1, 1); + scopeLine = RGBColor(0.9, 0.9, 0.9); + tuningBar = RGBColor(0.2, 0.2, 0.9); + meterLevel = RGBColor(0, 1, 0); + meterValue = RGBColor(1, 0, 0); + text = RGBColor(1, 1, 1); + freqLine = RGBColor(1, 1, 1); + button = RGBColor(0.65, 0.65, 0.65); + buttonHighlight = RGBColor(1, 1, 0); +} + +RadarColorTheme::RadarColorTheme() { + name = "Rad"; + waterfallGradient.addColor(GradientColor(5.0 / 255.0, 45.0 / 255.0, 10.0 / 255.0)); + waterfallGradient.addColor(GradientColor(30.0 / 255.0, 150.0 / 255.0, 40.0 / 255.0)); + waterfallGradient.addColor(GradientColor(40.0 / 255.0, 240.0 / 255.0, 60.0 / 255.0)); + waterfallGradient.addColor(GradientColor(250.0 / 255.0, 250.0 / 255.0, 250.0 / 255.0)); + waterfallGradient.generate(256); + waterfallHighlight = RGBColor(1, 1, 1); + waterfallNew = RGBColor(0, 1, 0); + waterfallHover = RGBColor(1, 1, 0); + waterfallDestroy = RGBColor(1, 0, 0); + fftLine = RGBColor(0.9, 0.9, 0.9); + fftHighlight = RGBColor(1, 1, 1); + scopeLine = RGBColor(0.9, 0.9, 0.9); + tuningBar = RGBColor(0.2, 0.2, 0.9); + meterLevel = RGBColor(0, 1, 0); + meterValue = RGBColor(1, 0, 0); + text = RGBColor(1, 1, 1); + freqLine = RGBColor(1, 1, 1); + button = RGBColor(0.65, 0.65, 0.65); + buttonHighlight = RGBColor(1, 1, 0); +} + diff --git a/src/visual/ColorTheme.h b/src/visual/ColorTheme.h new file mode 100644 index 0000000..e12aecc --- /dev/null +++ b/src/visual/ColorTheme.h @@ -0,0 +1,110 @@ +#pragma once + +#include "Gradient.h" + +#include +#include +#include + +#define COLOR_THEME_DEFAULT 0 +#define COLOR_THEME_BW 1 +#define COLOR_THEME_SHARP 2 +#define COLOR_THEME_RAD 3 +#define COLOR_THEME_TOUCH 4 +#define COLOR_THEME_HD 5 +#define COLOR_THEME_RADAR 6 +#define COLOR_THEME_MAX 7 + +class RGBColor { +public: + float r, g, b; + RGBColor(float r, float g, float b) : + r(r), g(g), b(b) { + } + + RGBColor() : + RGBColor(0, 0, 0) { + } + + ~RGBColor() { + } + + RGBColor & operator=(const RGBColor &other) { + r = other.r; + g = other.g; + b = other.b; + return *this; + } +}; + +class ColorTheme { +public: + RGBColor waterfallHighlight; + RGBColor waterfallNew; + RGBColor wfHighlight; + RGBColor waterfallHover; + RGBColor waterfallDestroy; + RGBColor fftLine; + RGBColor fftHighlight; + RGBColor scopeLine; + RGBColor tuningBar; + RGBColor meterLevel; + RGBColor meterValue; + RGBColor text; + RGBColor freqLine; + RGBColor button; + RGBColor buttonHighlight; + + Gradient waterfallGradient; + + std::string name; +}; + +class ThemeMgr { +public: + ThemeMgr(); + ~ThemeMgr(); + ColorTheme *currentTheme; + std::map themes; + void setTheme(int themeId); + int getTheme(); + int themeId; + + static ThemeMgr mgr; +}; + +class DefaultColorTheme: public ColorTheme { +public: + DefaultColorTheme(); +}; + +class BlackAndWhiteColorTheme: public ColorTheme { +public: + BlackAndWhiteColorTheme(); +}; + +class SharpColorTheme: public ColorTheme { +public: + SharpColorTheme(); +}; + +class RadColorTheme: public ColorTheme { +public: + RadColorTheme(); +}; + +class TouchColorTheme: public ColorTheme { +public: + TouchColorTheme(); +}; + +class HDColorTheme: public ColorTheme { +public: + HDColorTheme(); +}; + +class RadarColorTheme: public ColorTheme { +public: + RadarColorTheme(); +}; + diff --git a/src/visual/MeterCanvas.cpp b/src/visual/MeterCanvas.cpp index 45ae8f2..7e1d42c 100644 --- a/src/visual/MeterCanvas.cpp +++ b/src/visual/MeterCanvas.cpp @@ -69,11 +69,8 @@ void MeterCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) { if (mouseTracker.mouseInView()) { glContext->Draw(0.4, 0.4, 0.4, 0.5, mouseTracker.getMouseY()); } - - glContext->Draw(0.1, 0.75, 0.1, 0.5, level / level_max); - - glContext->Draw(0.75, 0.1, 0.1, 0.5, userInputValue / level_max); - + glContext->Draw(ThemeMgr::mgr.currentTheme->meterLevel.r, ThemeMgr::mgr.currentTheme->meterLevel.g, ThemeMgr::mgr.currentTheme->meterLevel.b, 0.5, level / level_max); + glContext->Draw(ThemeMgr::mgr.currentTheme->meterValue.r, ThemeMgr::mgr.currentTheme->meterValue.g, ThemeMgr::mgr.currentTheme->meterValue.b, 0.5, userInputValue / level_max); glContext->DrawEnd(); SwapBuffers(); diff --git a/src/visual/ModeSelectorCanvas.cpp b/src/visual/ModeSelectorCanvas.cpp index 3696186..0a8904e 100644 --- a/src/visual/ModeSelectorCanvas.cpp +++ b/src/visual/ModeSelectorCanvas.cpp @@ -64,7 +64,11 @@ void ModeSelectorCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) { int yval = getHoveredSelection(); for (int i = 0; i < numChoices; i++) { - glContext->DrawSelector(selections[i].label, i, numChoices, i == currentSelection || yval == i, (yval == i)?0.9:0.75, (yval == i)?0.9:0.75, (yval == i)?0.2:0.75, 1.0); + if (yval == i) { + glContext->DrawSelector(selections[i].label, i, numChoices, true, ThemeMgr::mgr.currentTheme->buttonHighlight.r, ThemeMgr::mgr.currentTheme->buttonHighlight.g, ThemeMgr::mgr.currentTheme->buttonHighlight.b, 1.0); + } else { + glContext->DrawSelector(selections[i].label, i, numChoices, i == currentSelection, ThemeMgr::mgr.currentTheme->button.r, ThemeMgr::mgr.currentTheme->button.g, ThemeMgr::mgr.currentTheme->button.b, 1.0); + } } glContext->DrawEnd(); diff --git a/src/visual/ScopeContext.cpp b/src/visual/ScopeContext.cpp index 15d43ef..66eda44 100644 --- a/src/visual/ScopeContext.cpp +++ b/src/visual/ScopeContext.cpp @@ -1,6 +1,7 @@ #include "ScopeContext.h" #include "ScopeCanvas.h" +#include "ColorTheme.h" ScopeContext::ScopeContext(ScopeCanvas *canvas, wxGLContext *sharedContext) : PrimaryGLContext(canvas, sharedContext) { @@ -24,7 +25,7 @@ void ScopeContext::Plot(std::vector &points, bool stereo) { glColor3f(1.0, 1.0, 1.0); if (stereo) { - glColor3f(0.7, 0.7, 0.7); + glColor3f(ThemeMgr::mgr.currentTheme->scopeLine.r, ThemeMgr::mgr.currentTheme->scopeLine.g, ThemeMgr::mgr.currentTheme->scopeLine.b); glBegin(GL_LINES); glVertex2f(-1.0, 0.0); glVertex2f(1.0, 0.0); @@ -44,7 +45,7 @@ void ScopeContext::Plot(std::vector &points, bool stereo) { glEnd(); } - glColor3f(0.9, 0.9, 0.9); + glColor3f(ThemeMgr::mgr.currentTheme->scopeLine.r, ThemeMgr::mgr.currentTheme->scopeLine.g, ThemeMgr::mgr.currentTheme->scopeLine.b); if (points.size()) { glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(2, GL_FLOAT, 0, &points[0]); diff --git a/src/visual/SpectrumCanvas.cpp b/src/visual/SpectrumCanvas.cpp index bdfc668..2791bef 100644 --- a/src/visual/SpectrumCanvas.cpp +++ b/src/visual/SpectrumCanvas.cpp @@ -78,7 +78,7 @@ void SpectrumCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) { std::vector &demods = wxGetApp().getDemodMgr().getDemodulators(); for (int i = 0, iMax = demods.size(); i < iMax; i++) { - glContext->DrawDemodInfo(demods[i], 1, 1, 1, getCenterFrequency(), getBandwidth()); + glContext->DrawDemodInfo(demods[i], ThemeMgr::mgr.currentTheme->fftHighlight.r, ThemeMgr::mgr.currentTheme->fftHighlight.g, ThemeMgr::mgr.currentTheme->fftHighlight.b, getCenterFrequency(), getBandwidth()); } glContext->EndDraw(); diff --git a/src/visual/SpectrumContext.cpp b/src/visual/SpectrumContext.cpp index b8de9fc..45af5f7 100644 --- a/src/visual/SpectrumContext.cpp +++ b/src/visual/SpectrumContext.cpp @@ -4,6 +4,7 @@ #include "CubicSDR.h" #include #include +#include "ColorTheme.h" SpectrumContext::SpectrumContext(SpectrumCanvas *canvas, wxGLContext *sharedContext) : PrimaryGLContext(canvas, sharedContext), fft_size(0) { @@ -18,7 +19,7 @@ SpectrumContext::SpectrumContext(SpectrumCanvas *canvas, wxGLContext *sharedCont void SpectrumContext::Draw(std::vector &points, long long freq, int bandwidth) { glDisable(GL_TEXTURE_2D); - glColor3f(1.0, 1.0, 1.0); + glColor3f(ThemeMgr::mgr.currentTheme->fftLine.r, ThemeMgr::mgr.currentTheme->fftLine.g, ThemeMgr::mgr.currentTheme->fftLine.b); if (points.size()) { glPushMatrix(); @@ -41,8 +42,8 @@ void SpectrumContext::Draw(std::vector &points, long long freq, int bandw long long rightFreq = leftFreq + (float) bandwidth; long long firstMhz = (leftFreq / 1000000) * 1000000; - long double mhzStart = ((long double)(firstMhz - leftFreq) / (long double)(rightFreq - leftFreq)) * 2.0; - long double mhzStep = (100000.0 / (long double)(rightFreq - leftFreq)) * 2.0; + long double mhzStart = ((long double) (firstMhz - leftFreq) / (long double) (rightFreq - leftFreq)) * 2.0; + long double mhzStep = (100000.0 / (long double) (rightFreq - leftFreq)) * 2.0; long double currentMhz = trunc(floor(firstMhz / 1000000.0)); @@ -61,10 +62,11 @@ void SpectrumContext::Draw(std::vector &points, long long freq, int bandw if (fractpart < 0.001) { glLineWidth(4.0); - glColor3f(1.0, 1.0, 1.0); + glColor3f(ThemeMgr::mgr.currentTheme->freqLine.r, ThemeMgr::mgr.currentTheme->freqLine.g, ThemeMgr::mgr.currentTheme->freqLine.b); } else { glLineWidth(1.0); - glColor3f(0.55, 0.55, 0.55); + glColor3f(ThemeMgr::mgr.currentTheme->freqLine.r * 0.65, ThemeMgr::mgr.currentTheme->freqLine.g * 0.65, + ThemeMgr::mgr.currentTheme->freqLine.b * 0.65); } glDisable(GL_TEXTURE_2D); diff --git a/src/visual/TuningCanvas.cpp b/src/visual/TuningCanvas.cpp index b0d6ab5..67e8225 100644 --- a/src/visual/TuningCanvas.cpp +++ b/src/visual/TuningCanvas.cpp @@ -25,7 +25,7 @@ EVT_ENTER_WINDOW(TuningCanvas::OnMouseEnterWindow) wxEND_EVENT_TABLE() TuningCanvas::TuningCanvas(wxWindow *parent, int *attribList) : -InteractiveCanvas(parent, attribList), dragAccum(0) { + InteractiveCanvas(parent, attribList), dragAccum(0) { glContext = new TuningContext(this, &wxGetApp().GetContext(this)); } @@ -52,7 +52,8 @@ void TuningCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) { } if (mouseTracker.mouseDown()) { - glContext->Draw(0.2, 0.2, 0.9, 0.6, mouseTracker.getOriginMouseX(), mouseTracker.getMouseX()); + glContext->Draw(ThemeMgr::mgr.currentTheme->tuningBar.r, ThemeMgr::mgr.currentTheme->tuningBar.g, ThemeMgr::mgr.currentTheme->tuningBar.b, + 0.6, mouseTracker.getOriginMouseX(), mouseTracker.getMouseX()); } glContext->DrawEnd(); @@ -64,23 +65,28 @@ void TuningCanvas::OnIdle(wxIdleEvent &event) { if (mouseTracker.mouseDown()) { DemodulatorInstance *activeDemod = wxGetApp().getDemodMgr().getLastActiveDemodulator(); - dragAccum += mouseTracker.getMouseX() - mouseTracker.getOriginMouseX(); + float dragDelta = mouseTracker.getMouseX() - mouseTracker.getOriginMouseX(); + + dragAccum += dragDelta; + + float moveVal = dragAccum * 10.0; if (uxDown > 0.275) { - wxGetApp().setFrequency(wxGetApp().getFrequency() + (int) (mouseTracker.getOriginDeltaMouseX() * (float)wxGetApp().getSampleRate() * 15.0)); + wxGetApp().setFrequency( + wxGetApp().getFrequency() + + (int) (dragAccum * fabs(dragAccum * 10.0) * fabs(dragAccum * 10.0) * (float) wxGetApp().getSampleRate())); + } else if (fabs(moveVal) >= 1.0) { + if (uxDown < -0.275 && activeDemod != NULL) { + activeDemod->setFrequency(activeDemod->getFrequency() + (int) (moveVal * fabs(moveVal) * fabs(moveVal) * fabs(moveVal))); + } else if (activeDemod != NULL) { + activeDemod->setBandwidth(activeDemod->getBandwidth() + (int) (moveVal * fabs(moveVal) * fabs(moveVal) * fabs(moveVal))); + } } - if (abs(dragAccum * 10.0) >= 1) { - if (uxDown < -0.275 && activeDemod != NULL) { - activeDemod->setFrequency(activeDemod->getFrequency() + (int) (dragAccum * 10.0)); - } else if (activeDemod != NULL) { - activeDemod->setBandwidth(activeDemod->getBandwidth() + (int) (dragAccum * 10.0)); - } - - while (dragAccum * 10.0 >= 1.0) { + while (fabs(dragAccum * 10.0) >= 1.0) { + if (dragAccum > 0) { dragAccum -= 1.0 / 10.0; - } - while (dragAccum * -10.0 <= -1.0) { + } else { dragAccum += 1.0 / 10.0; } } @@ -100,7 +106,7 @@ void TuningCanvas::OnMouseDown(wxMouseEvent& event) { uxDown = 2.0 * (mouseTracker.getMouseX() - 0.5); dragAccum = 0; - SetCursor (wxCURSOR_IBEAM); + SetCursor(wxCURSOR_IBEAM); } void TuningCanvas::OnMouseWheelMoved(wxMouseEvent& event) { @@ -110,17 +116,17 @@ void TuningCanvas::OnMouseWheelMoved(wxMouseEvent& event) { void TuningCanvas::OnMouseReleased(wxMouseEvent& event) { InteractiveCanvas::OnMouseReleased(event); mouseTracker.setVertDragLock(false); - SetCursor (wxCURSOR_SIZEWE); + SetCursor(wxCURSOR_SIZEWE); } void TuningCanvas::OnMouseLeftWindow(wxMouseEvent& event) { InteractiveCanvas::OnMouseLeftWindow(event); - SetCursor (wxCURSOR_CROSS); + SetCursor(wxCURSOR_CROSS); } void TuningCanvas::OnMouseEnterWindow(wxMouseEvent& event) { InteractiveCanvas::mouseTracker.OnMouseEnterWindow(event); - SetCursor (wxCURSOR_SIZEWE); + SetCursor(wxCURSOR_SIZEWE); } void TuningCanvas::setHelpTip(std::string tip) { diff --git a/src/visual/TuningContext.cpp b/src/visual/TuningContext.cpp index a51f2cb..8123b68 100644 --- a/src/visual/TuningContext.cpp +++ b/src/visual/TuningContext.cpp @@ -1,6 +1,8 @@ #include "TuningContext.h" #include "TuningCanvas.h" +#include "ColorTheme.h" + // http://stackoverflow.com/questions/7276826/c-format-number-with-commas class comma_numpunct: public std::numpunct { protected: @@ -69,7 +71,7 @@ void TuningContext::DrawDemodFreqBw(long long freq, unsigned int bw, long long c fontHeight = 12; } - glColor3f(0.85, 0.85, 0.85); + glColor3f(ThemeMgr::mgr.currentTheme->text.r, ThemeMgr::mgr.currentTheme->text.g, ThemeMgr::mgr.currentTheme->text.b); getFont(fontSize).drawString("Freq: ", -0.75, 0, fontHeight, GLFont::GLFONT_ALIGN_RIGHT, GLFont::GLFONT_ALIGN_CENTER); if (bw) { diff --git a/src/visual/WaterfallCanvas.cpp b/src/visual/WaterfallCanvas.cpp index 1f5a8a5..8558a1d 100644 --- a/src/visual/WaterfallCanvas.cpp +++ b/src/visual/WaterfallCanvas.cpp @@ -36,7 +36,7 @@ wxEND_EVENT_TABLE() WaterfallCanvas::WaterfallCanvas(wxWindow *parent, int *attribList) : InteractiveCanvas(parent, attribList), spectrumCanvas(NULL), dragState(WF_DRAG_NONE), nextDragState(WF_DRAG_NONE), fft_size(0), waterfall_lines( 0), plan( - NULL), in(NULL), out(NULL), resampler(NULL), resamplerRatio(0), lastInputBandwidth(0), zoom(1), mouseZoom(1), theme(0) { + NULL), in(NULL), out(NULL), resampler(NULL), resamplerRatio(0), lastInputBandwidth(0), zoom(1), mouseZoom(1) { glContext = new WaterfallContext(this, &wxGetApp().GetContext(this)); @@ -95,11 +95,6 @@ void WaterfallCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) { glContext->SetCurrent(*this); glViewport(0, 0, ClientSize.x, ClientSize.y); - if (theme != glContext->getTheme()) { - glContext->setTheme(theme); - theme = glContext->getTheme(); - } - glContext->BeginDraw(); glContext->Draw(spectrum_points); @@ -121,49 +116,49 @@ void WaterfallCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) { float centerPos = mouseTracker.getOriginMouseX() + width / 2.0; if (isNew) { - glContext->DrawDemod(lastActiveDemodulator, 1, 1, 1, currentCenterFreq, currentBandwidth); - glContext->DrawFreqSelector(centerPos, 0, 1, 0, width ? width : (1.0 / (float) ClientSize.x), currentCenterFreq, + glContext->DrawDemod(lastActiveDemodulator, ThemeMgr::mgr.currentTheme->waterfallHighlight.r, ThemeMgr::mgr.currentTheme->waterfallHighlight.g, ThemeMgr::mgr.currentTheme->waterfallHighlight.b, currentCenterFreq, currentBandwidth); + glContext->DrawFreqSelector(centerPos, ThemeMgr::mgr.currentTheme->waterfallNew.r, ThemeMgr::mgr.currentTheme->waterfallNew.g, ThemeMgr::mgr.currentTheme->waterfallNew.b, width ? width : (1.0 / (float) ClientSize.x), currentCenterFreq, currentBandwidth); } else { - glContext->DrawDemod(lastActiveDemodulator, 1, 0, 0, currentCenterFreq, currentBandwidth); - glContext->DrawFreqSelector(centerPos, 1, 1, 0, width ? width : (1.0 / (float) ClientSize.x), currentCenterFreq, + glContext->DrawDemod(lastActiveDemodulator, ThemeMgr::mgr.currentTheme->waterfallDestroy.r, ThemeMgr::mgr.currentTheme->waterfallDestroy.g, ThemeMgr::mgr.currentTheme->waterfallDestroy.b, currentCenterFreq, currentBandwidth); + glContext->DrawFreqSelector(centerPos, ThemeMgr::mgr.currentTheme->waterfallHover.r, ThemeMgr::mgr.currentTheme->waterfallHover.g, ThemeMgr::mgr.currentTheme->waterfallHover.b, width ? width : (1.0 / (float) ClientSize.x), currentCenterFreq, currentBandwidth); } } else { if (isNew) { - glContext->DrawDemod(lastActiveDemodulator, 1, 1, 1, currentCenterFreq, currentBandwidth); - glContext->DrawFreqSelector(mouseTracker.getMouseX(), 0, 1, 0, 1.0 / (float) ClientSize.x, currentCenterFreq, currentBandwidth); + glContext->DrawDemod(lastActiveDemodulator, ThemeMgr::mgr.currentTheme->waterfallHighlight.r, ThemeMgr::mgr.currentTheme->waterfallHighlight.g, ThemeMgr::mgr.currentTheme->waterfallHighlight.b, currentCenterFreq, currentBandwidth); + glContext->DrawFreqSelector(mouseTracker.getMouseX(), ThemeMgr::mgr.currentTheme->waterfallNew.r, ThemeMgr::mgr.currentTheme->waterfallNew.g, ThemeMgr::mgr.currentTheme->waterfallNew.b, 1.0 / (float) ClientSize.x, currentCenterFreq, currentBandwidth); } else { - glContext->DrawDemod(lastActiveDemodulator, 1, 0, 0, currentCenterFreq, currentBandwidth); - glContext->DrawFreqSelector(mouseTracker.getMouseX(), 1, 1, 0, 1.0 / (float) ClientSize.x, currentCenterFreq, currentBandwidth); + glContext->DrawDemod(lastActiveDemodulator,ThemeMgr::mgr.currentTheme->waterfallDestroy.r, ThemeMgr::mgr.currentTheme->waterfallDestroy.g, ThemeMgr::mgr.currentTheme->waterfallDestroy.b, currentCenterFreq, currentBandwidth); + glContext->DrawFreqSelector(mouseTracker.getMouseX(), ThemeMgr::mgr.currentTheme->waterfallHover.r, ThemeMgr::mgr.currentTheme->waterfallHover.g, ThemeMgr::mgr.currentTheme->waterfallHover.b, 1.0 / (float) ClientSize.x, currentCenterFreq, currentBandwidth); } } } else { if (activeDemodulator == NULL) { if (lastActiveDemodulator) { if (isNew) { - glContext->DrawDemod(lastActiveDemodulator, 1, 1, 1, currentCenterFreq, currentBandwidth); - glContext->DrawFreqSelector(mouseTracker.getMouseX(), 0, 1, 0, 0, currentCenterFreq, currentBandwidth); + glContext->DrawDemod(lastActiveDemodulator, ThemeMgr::mgr.currentTheme->waterfallHighlight.r, ThemeMgr::mgr.currentTheme->waterfallHighlight.g, ThemeMgr::mgr.currentTheme->waterfallHighlight.b, currentCenterFreq, currentBandwidth); + glContext->DrawFreqSelector(mouseTracker.getMouseX(), ThemeMgr::mgr.currentTheme->waterfallNew.r, ThemeMgr::mgr.currentTheme->waterfallNew.g, ThemeMgr::mgr.currentTheme->waterfallNew.b, 0, currentCenterFreq, currentBandwidth); } else { - glContext->DrawDemod(lastActiveDemodulator, 1, 0, 0, currentCenterFreq, currentBandwidth); - glContext->DrawFreqSelector(mouseTracker.getMouseX(), 1, 1, 0, 0, currentCenterFreq, currentBandwidth); + glContext->DrawDemod(lastActiveDemodulator, ThemeMgr::mgr.currentTheme->waterfallDestroy.r, ThemeMgr::mgr.currentTheme->waterfallDestroy.g, ThemeMgr::mgr.currentTheme->waterfallDestroy.b, currentCenterFreq, currentBandwidth); + glContext->DrawFreqSelector(mouseTracker.getMouseX(), ThemeMgr::mgr.currentTheme->waterfallHover.r, ThemeMgr::mgr.currentTheme->waterfallHover.g, ThemeMgr::mgr.currentTheme->waterfallHover.b, 0, currentCenterFreq, currentBandwidth); } } else { - glContext->DrawFreqSelector(mouseTracker.getMouseX(), 1, 1, 0, 0, currentCenterFreq, currentBandwidth); + glContext->DrawFreqSelector(mouseTracker.getMouseX(), ThemeMgr::mgr.currentTheme->waterfallNew.r, ThemeMgr::mgr.currentTheme->waterfallNew.g, ThemeMgr::mgr.currentTheme->waterfallNew.b, 0, currentCenterFreq, currentBandwidth); } } else { if (lastActiveDemodulator) { - glContext->DrawDemod(lastActiveDemodulator, 1, 1, 1, currentCenterFreq, currentBandwidth); + glContext->DrawDemod(lastActiveDemodulator, ThemeMgr::mgr.currentTheme->waterfallHighlight.r, ThemeMgr::mgr.currentTheme->waterfallHighlight.g, ThemeMgr::mgr.currentTheme->waterfallHighlight.b, currentCenterFreq, currentBandwidth); } - glContext->DrawDemod(activeDemodulator, 1, 1, 0, currentCenterFreq, currentBandwidth); + glContext->DrawDemod(activeDemodulator, ThemeMgr::mgr.currentTheme->waterfallHover.r, ThemeMgr::mgr.currentTheme->waterfallHover.g, ThemeMgr::mgr.currentTheme->waterfallHover.b, currentCenterFreq, currentBandwidth); } } } else { if (activeDemodulator) { - glContext->DrawDemod(activeDemodulator, 1, 1, 1, currentCenterFreq, currentBandwidth); + glContext->DrawDemod(activeDemodulator, ThemeMgr::mgr.currentTheme->waterfallHighlight.r, ThemeMgr::mgr.currentTheme->waterfallHighlight.g, ThemeMgr::mgr.currentTheme->waterfallHighlight.b, currentCenterFreq, currentBandwidth); } if (lastActiveDemodulator) { - glContext->DrawDemod(lastActiveDemodulator, 1, 1, 1, currentCenterFreq, currentBandwidth); + glContext->DrawDemod(lastActiveDemodulator, ThemeMgr::mgr.currentTheme->waterfallHighlight.r, ThemeMgr::mgr.currentTheme->waterfallHighlight.g, ThemeMgr::mgr.currentTheme->waterfallHighlight.b, currentCenterFreq, currentBandwidth); } } @@ -171,7 +166,7 @@ void WaterfallCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) { if (activeDemodulator == demods[i] || lastActiveDemodulator == demods[i]) { continue; } - glContext->DrawDemod(demods[i], 1, 1, 1, currentCenterFreq, currentBandwidth); + glContext->DrawDemod(demods[i], ThemeMgr::mgr.currentTheme->waterfallHighlight.r, ThemeMgr::mgr.currentTheme->waterfallHighlight.g, ThemeMgr::mgr.currentTheme->waterfallHighlight.b, currentCenterFreq, currentBandwidth); } glContext->EndDraw(); @@ -829,11 +824,3 @@ void WaterfallCanvas::OnMouseRightReleased(wxMouseEvent& event) { mouseTracker.setHorizDragLock(false); mouseZoom = 1.0; } - -void WaterfallCanvas::setTheme(int theme_id) { - theme = theme_id; -} - -int WaterfallCanvas::getTheme() { - return glContext->getTheme(); -} diff --git a/src/visual/WaterfallCanvas.h b/src/visual/WaterfallCanvas.h index c8c8933..7ab97e9 100644 --- a/src/visual/WaterfallCanvas.h +++ b/src/visual/WaterfallCanvas.h @@ -29,8 +29,6 @@ public: DragState getNextDragState(); void attachSpectrumCanvas(SpectrumCanvas *canvas_in); - void setTheme(int theme_id); - int getTheme(); private: void OnPaint(wxPaintEvent& event); @@ -77,8 +75,6 @@ private: int lastInputBandwidth; float mouseZoom, zoom; - int theme; - std::vector shiftBuffer; std::vector resampleBuffer; // event table diff --git a/src/visual/WaterfallContext.cpp b/src/visual/WaterfallContext.cpp index 4284d69..6aeef55 100644 --- a/src/visual/WaterfallContext.cpp +++ b/src/visual/WaterfallContext.cpp @@ -3,83 +3,7 @@ #include "CubicSDR.h" WaterfallContext::WaterfallContext(WaterfallCanvas *canvas, wxGLContext *sharedContext) : - PrimaryGLContext(canvas, sharedContext), waterfall(0), waterfall_tex(NULL), waterfall_lines(0), fft_size(0), theme(COLOR_THEME_DEFAULT) { - Gradient *grad = new Gradient(); - grad->addColor(GradientColor(0, 0, 0)); - grad->addColor(GradientColor(0, 0, 1.0)); - grad->addColor(GradientColor(0, 1.0, 0)); - grad->addColor(GradientColor(1.0, 1.0, 0)); - grad->addColor(GradientColor(1.0, 0.2, 0.0)); - grad->generate(256); - gradients[COLOR_THEME_DEFAULT] = grad; - - grad = new Gradient(); - grad->addColor(GradientColor(0, 0, 0)); - grad->addColor(GradientColor(0.0, 0, 0.5)); - grad->addColor(GradientColor(0.0, 0.0, 1.0)); - grad->addColor(GradientColor(65.0 / 255.0, 161.0 / 255.0, 1.0)); - grad->addColor(GradientColor(1.0, 1.0, 1.0)); - grad->addColor(GradientColor(1.0, 1.0, 1.0)); - grad->addColor(GradientColor(1.0, 1.0, 0.5)); - grad->addColor(GradientColor(1.0, 1.0, 0.0)); - grad->addColor(GradientColor(1.0, 0.5, 0.0)); - grad->addColor(GradientColor(1.0, 0.25, 0.0)); - grad->addColor(GradientColor(0.5, 0.1, 0.0)); - grad->generate(256); - gradients[COLOR_THEME_SHARP] = grad; - - grad = new Gradient(); - grad->addColor(GradientColor(0, 0, 0)); - grad->addColor(GradientColor(0.75, 0.75, 0.75)); - grad->addColor(GradientColor(1.0, 1.0, 1.0)); - grad->generate(256); - gradients[COLOR_THEME_BW] = grad; - - grad = new Gradient(); - grad->addColor(GradientColor(0, 0, 0.5)); - grad->addColor(GradientColor(25.0/255.0, 154.0/255.0, 0.0)); - grad->addColor(GradientColor(201.0/255.0, 115.0/255.0, 0.0)); - grad->addColor(GradientColor(1.0, 40.0/255.0, 40.0/255.0)); - grad->addColor(GradientColor(1.0, 1.0, 1.0)); - grad->generate(256); - gradients[COLOR_THEME_RAD] = grad; - - - grad = new Gradient(); - grad->addColor(GradientColor(0, 0, 0)); - grad->addColor(GradientColor(55.0/255.0, 40.0/255.0, 55.0/255.0)); - grad->addColor(GradientColor(60.0/255.0, 60.0/255.0, 90.0/255.0)); - grad->addColor(GradientColor(0.0/255.0, 255.0/255.0, 255.0/255.0)); - grad->addColor(GradientColor(10.0/255.0, 255.0/255.0, 85.0/255.0)); - grad->addColor(GradientColor(255.0/255.0, 255.0/255.0, 75.0/255.0)); - grad->addColor(GradientColor(255.0/255.0, 0.0/255.0, 0.0/255.0)); - grad->addColor(GradientColor(255.0/255.0, 255.0/255.0, 255.0/255.0)); - grad->generate(256); - gradients[COLOR_THEME_TOUCH] = grad; - - - grad = new Gradient(); - grad->addColor(GradientColor(5.0/255.0, 5.0/255.0, 60.0/255.0)); - grad->addColor(GradientColor(5.0/255.0, 20.0/255.0, 120.0/255.0)); - grad->addColor(GradientColor(50.0/255.0, 100.0/255.0, 200.0/255.0)); - grad->addColor(GradientColor(75.0/255.0, 190.0/255.0, 100.0/255.0)); - grad->addColor(GradientColor(240.0/255.0, 55.0/255.0, 5.0/255.0)); - grad->addColor(GradientColor(255.0/255.0, 55.0/255.0, 100.0/255.0)); - grad->addColor(GradientColor(255.0/255.0, 235.0/255.0, 100.0/255.0)); - grad->addColor(GradientColor(250.0/255.0, 250.0/255.0, 250.0/255.0)); - grad->generate(256); - gradients[COLOR_THEME_HD] = grad; - - - - - grad = new Gradient(); - grad->addColor(GradientColor(5.0/255.0, 45.0/255.0, 10.0/255.0)); - grad->addColor(GradientColor(30.0/255.0, 150.0/255.0, 40.0/255.0)); - grad->addColor(GradientColor(40.0/255.0, 240.0/255.0, 60.0/255.0)); - grad->addColor(GradientColor(250.0/255.0, 250.0/255.0, 250.0/255.0)); - grad->generate(256); - gradients[COLOR_THEME_RADAR] = grad; + PrimaryGLContext(canvas, sharedContext), waterfall(0), waterfall_tex(NULL), waterfall_lines(0), fft_size(0), activeTheme(NULL) { } void WaterfallContext::Setup(int fft_size_in, int num_waterfall_lines_in) { @@ -113,34 +37,25 @@ void WaterfallContext::Setup(int fft_size_in, int num_waterfall_lines_in) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - - glPixelTransferi(GL_MAP_COLOR, GL_TRUE); - glPixelMapfv(GL_PIXEL_MAP_I_TO_R, 256, &(gradients[theme]->getRed())[0]); - glPixelMapfv(GL_PIXEL_MAP_I_TO_G, 256, &(gradients[theme]->getGreen())[0]); - glPixelMapfv(GL_PIXEL_MAP_I_TO_B, 256, &(gradients[theme]->getBlue())[0]); - } -void WaterfallContext::setTheme(int theme_id) { +void WaterfallContext::refreshTheme() { glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, waterfall); - if (theme >= COLOR_THEME_MAX) { - theme = COLOR_THEME_MAX - 1; - } - if (theme < 0) { - theme = 0; - } - theme = theme_id; - glPixelTransferi(GL_MAP_COLOR, GL_TRUE); - glPixelMapfv(GL_PIXEL_MAP_I_TO_R, 256, &(gradients[theme]->getRed())[0]); - glPixelMapfv(GL_PIXEL_MAP_I_TO_G, 256, &(gradients[theme]->getGreen())[0]); - glPixelMapfv(GL_PIXEL_MAP_I_TO_B, 256, &(gradients[theme]->getBlue())[0]); + glPixelMapfv(GL_PIXEL_MAP_I_TO_R, 256, &(ThemeMgr::mgr.currentTheme->waterfallGradient.getRed())[0]); + glPixelMapfv(GL_PIXEL_MAP_I_TO_G, 256, &(ThemeMgr::mgr.currentTheme->waterfallGradient.getGreen())[0]); + glPixelMapfv(GL_PIXEL_MAP_I_TO_B, 256, &(ThemeMgr::mgr.currentTheme->waterfallGradient.getBlue())[0]); } void WaterfallContext::Draw(std::vector &points) { + if (activeTheme != ThemeMgr::mgr.currentTheme) { + refreshTheme(); + activeTheme = ThemeMgr::mgr.currentTheme; + } + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); if (points.size()) { @@ -180,7 +95,3 @@ void WaterfallContext::Draw(std::vector &points) { glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); } - -int WaterfallContext::getTheme() { - return theme; -} diff --git a/src/visual/WaterfallContext.h b/src/visual/WaterfallContext.h index 5677b93..507d338 100644 --- a/src/visual/WaterfallContext.h +++ b/src/visual/WaterfallContext.h @@ -2,16 +2,7 @@ #include "PrimaryGLContext.h" #include "Gradient.h" - - -#define COLOR_THEME_DEFAULT 0 -#define COLOR_THEME_BW 1 -#define COLOR_THEME_SHARP 2 -#define COLOR_THEME_RAD 3 -#define COLOR_THEME_TOUCH 4 -#define COLOR_THEME_HD 5 -#define COLOR_THEME_RADAR 6 -#define COLOR_THEME_MAX 7 +#include "ColorTheme.h" class WaterfallCanvas; @@ -21,14 +12,13 @@ public: void Draw(std::vector &points); void Setup(int fft_size_in, int num_waterfall_lines_in); - void setTheme(int theme_id); - int getTheme(); + void refreshTheme(); private: - Gradient *gradients[COLOR_THEME_MAX]; GLuint waterfall; - int theme; unsigned char *waterfall_tex; int fft_size; int waterfall_lines; + + ColorTheme *activeTheme; };