diff --git a/src/AColor.cpp b/src/AColor.cpp index f45847215..052b78bd8 100644 --- a/src/AColor.cpp +++ b/src/AColor.cpp @@ -19,7 +19,7 @@ It is also a place to document colour usage policy in Audacity #include "AColor.h" - +#include "AColorResources.h" #include @@ -635,13 +635,23 @@ void AColor::DarkMIDIChannel(wxDC * dc, int channel /* 1 - 16 */ ) -unsigned char AColor::gradient_pre[ColorGradientTotal][2][gradientSteps][3]; +unsigned char AColor::gradient_pre[ColorGradientTotal][colorSchemes][gradientSteps][3]; void AColor::PreComputeGradient() { if (gradient_inited) return; gradient_inited = 1; + // Keep in correspondence with enum SpectrogramSettings::ColorScheme + + // colorScheme 0: Color (New) + std::copy_n(&specColormap[0][0], gradientSteps * 3, &gradient_pre[ColorGradientUnselected][0][0][0]); + std::copy_n(&selColormap[0][0], gradientSteps * 3, &gradient_pre[ColorGradientTimeSelected][0][0][0]); + std::copy_n(&freqSelColormap[0][0], gradientSteps * 3, &gradient_pre[ColorGradientTimeAndFrequencySelected][0][0][0]); + std::fill_n(&gradient_pre[ColorGradientEdge][0][0][0], gradientSteps * 3, 0); + + for (int selected = 0; selected < ColorGradientTotal; selected++) { + // Get color scheme from Theme const int gsteps = 4; float gradient[gsteps + 1][3]; theTheme.Colour( clrSpectro1 ) = theTheme.Colour( clrUnselected ); @@ -654,7 +664,7 @@ void AColor::PreComputeGradient() { gradient[ j] [2] = c.Blue()/255.0; } - // Color + // colorScheme 1: Color (from theme) for (int i = 0; iGetSpectrogramSettings().spectralSelection = bSpectralSelect; } - if( wt && bHasGrayScale ){ - wt->GetSpectrogramSettings().isGrayscale = bGrayScale; + if (wt && bHasSpecColorScheme) { + wt->GetSpectrogramSettings().colorScheme = mSpecColorScheme; } return true; diff --git a/src/commands/SetTrackInfoCommand.h b/src/commands/SetTrackInfoCommand.h index d6b695d70..e51f228bf 100644 --- a/src/commands/SetTrackInfoCommand.h +++ b/src/commands/SetTrackInfoCommand.h @@ -124,7 +124,7 @@ public: bool bUseSpecPrefs; bool bSpectralSelect; - bool bGrayScale; + int mSpecColorScheme; // For tracking optional parameters. bool bHasColour; @@ -137,7 +137,7 @@ public: bool bHasUseSpecPrefs; bool bHasSpectralSelect; - bool bHasGrayScale; + bool bHasSpecColorScheme; }; class SetTrackCommand : public SetTrackBase diff --git a/src/prefs/SpectrogramSettings.cpp b/src/prefs/SpectrogramSettings.cpp index 6cde50a2b..b97945d44 100644 --- a/src/prefs/SpectrogramSettings.cpp +++ b/src/prefs/SpectrogramSettings.cpp @@ -70,7 +70,7 @@ SpectrogramSettings::SpectrogramSettings(const SpectrogramSettings &other) #ifdef EXPERIMENTAL_ZERO_PADDED_SPECTROGRAMS , zeroPaddingFactor(other.zeroPaddingFactor) #endif - , isGrayscale(other.isGrayscale) + , colorScheme(other.colorScheme) , scaleType(other.scaleType) #ifndef SPECTRAL_SELECTION_GLOBAL_SWITCH , spectralSelection(other.spectralSelection) @@ -107,7 +107,7 @@ SpectrogramSettings &SpectrogramSettings::operator= (const SpectrogramSettings & #ifdef EXPERIMENTAL_ZERO_PADDED_SPECTROGRAMS zeroPaddingFactor = other.zeroPaddingFactor; #endif - isGrayscale = other.isGrayscale; + colorScheme = other.colorScheme; scaleType = other.scaleType; #ifndef SPECTRAL_SELECTION_GLOBAL_SWITCH spectralSelection = other.spectralSelection; @@ -154,6 +154,23 @@ const EnumValueSymbols &SpectrogramSettings::GetScaleNames() return result; } +//static +const EnumValueSymbols &SpectrogramSettings::GetColorSchemeNames() +{ + static const EnumValueSymbols result{ + // Keep in correspondence with enum SpectrogramSettings::ColorScheme: + /* i18n-hint: New color scheme for spectrograms */ + XO("Color (New)") , + /* i18n-hint: color scheme from theme for spectrograms */ + XO("Color (from Theme)") , + /* i18n-hint: grayscale color scheme for spectrograms */ + XO("Grayscale") , + /* i18n-hint: inverse grayscale color scheme for spectrograms */ + XO("Inv. Grayscale") , + }; + return result; +} + //static const TranslatableStrings &SpectrogramSettings::GetAlgorithmNames() { @@ -227,6 +244,7 @@ bool SpectrogramSettings::Validate(bool quiet) ScaleType(std::max(0, std::min((int)(SpectrogramSettings::stNumScaleTypes) - 1, (int)(scaleType)))); + colorScheme = std::max(0, std::min(csNumColorScheme-1, colorScheme)); algorithm = Algorithm( std::max(0, std::min((int)(algNumAlgorithms) - 1, (int)(algorithm))) ); @@ -254,7 +272,7 @@ void SpectrogramSettings::LoadPrefs() gPrefs->Read(wxT("/Spectrum/WindowType"), &windowType, eWinFuncHann); - isGrayscale = (gPrefs->Read(wxT("/Spectrum/Grayscale"), 0L) != 0); + colorScheme = ColorScheme(gPrefs->Read(wxT("/Spectrum/ColorScheme"), 0L)); scaleType = ScaleType(gPrefs->Read(wxT("/Spectrum/ScaleType"), 0L)); @@ -302,7 +320,7 @@ void SpectrogramSettings::SavePrefs() gPrefs->Write(wxT("/Spectrum/WindowType"), windowType); - gPrefs->Write(wxT("/Spectrum/Grayscale"), isGrayscale); + gPrefs->Write(wxT("/Spectrum/ColorScheme"), (int) colorScheme); gPrefs->Write(wxT("/Spectrum/ScaleType"), (int) scaleType); @@ -361,10 +379,10 @@ void SpectrogramSettings::UpdatePrefs() gPrefs->Read(wxT("/Spectrum/WindowType"), &windowType, eWinFuncHann); } - if (isGrayscale == defaults().isGrayscale) { + if (colorScheme == defaults().colorScheme) { int temp; - gPrefs->Read(wxT("/Spectrum/Grayscale"), &temp, 0L); - isGrayscale = (temp != 0); + gPrefs->Read(wxT("/Spectrum/ColorScheme"), &temp, 0L); + colorScheme = ColorScheme(temp); } if (scaleType == defaults().scaleType) { diff --git a/src/prefs/SpectrogramSettings.h b/src/prefs/SpectrogramSettings.h index f608a5133..5a486ccc9 100644 --- a/src/prefs/SpectrogramSettings.h +++ b/src/prefs/SpectrogramSettings.h @@ -67,6 +67,7 @@ public: }; static const EnumValueSymbols &GetScaleNames(); + static const EnumValueSymbols &GetColorSchemeNames(); static const TranslatableStrings &GetAlgorithmNames(); static SpectrogramSettings &defaults(); @@ -128,7 +129,17 @@ public: size_t GetFFTLength() const; // window size (times zero padding, if STFT) size_t NBins() const; - bool isGrayscale; + typedef int ColorScheme; + enum ColorSchemeValues : int { + // Keep in correspondence with AColor::gradient_pre + csColorNew = 0, + csColorTheme, + csGrayscale, + csInvGrayscale, + + csNumColorScheme, + }; + ColorScheme colorScheme; ScaleType scaleType; diff --git a/src/prefs/SpectrumPrefs.cpp b/src/prefs/SpectrumPrefs.cpp index 2f6a9143c..e78f39279 100644 --- a/src/prefs/SpectrumPrefs.cpp +++ b/src/prefs/SpectrumPrefs.cpp @@ -101,7 +101,7 @@ enum { ID_GAIN, ID_RANGE, ID_FREQUENCY_GAIN, - ID_GRAYSCALE, + ID_COLOR_SCHEME, ID_SPECTRAL_SELECTION, #endif ID_DEFAULTS, @@ -223,11 +223,12 @@ void SpectrumPrefs::PopulateOrExchange(ShuttleGui & S) S.Id(ID_FREQUENCY_GAIN).TieNumericTextBox(XXO("High &boost (dB/dec):"), mTempSettings.frequencyGain, 8); + + S.Id(ID_COLOR_SCHEME).TieChoice(XXO("Color Sche&me:"), + mTempSettings.colorScheme, + Msgids( SpectrogramSettings::GetColorSchemeNames() ) ); } S.EndMultiColumn(); - - S.Id(ID_GRAYSCALE).TieCheckBox(XXO("Gra&yscale"), - mTempSettings.isGrayscale); } S.EndStatic(); } @@ -584,7 +585,7 @@ BEGIN_EVENT_TABLE(SpectrumPrefs, PrefsPanel) EVT_TEXT(ID_GAIN, SpectrumPrefs::OnControl) EVT_TEXT(ID_RANGE, SpectrumPrefs::OnControl) EVT_TEXT(ID_FREQUENCY_GAIN, SpectrumPrefs::OnControl) - EVT_CHECKBOX(ID_GRAYSCALE, SpectrumPrefs::OnControl) + EVT_CHOICE(ID_COLOR_SCHEME, SpectrumPrefs::OnControl) EVT_CHECKBOX(ID_SPECTRAL_SELECTION, SpectrumPrefs::OnControl) END_EVENT_TABLE() diff --git a/src/tracks/playabletrack/wavetrack/ui/SpectrumView.cpp b/src/tracks/playabletrack/wavetrack/ui/SpectrumView.cpp index bb0204d61..8b29d9c99 100644 --- a/src/tracks/playabletrack/wavetrack/ui/SpectrumView.cpp +++ b/src/tracks/playabletrack/wavetrack/ui/SpectrumView.cpp @@ -215,7 +215,7 @@ void DrawClipSpectrum(TrackPanelDrawingContext &context, freqHi = selectedRegion.f1(); #endif - const bool &isGrayscale = settings.isGrayscale; + const int &colorScheme = settings.colorScheme; const int &range = settings.range; const int &gain = settings.gain; @@ -576,7 +576,7 @@ void DrawClipSpectrum(TrackPanelDrawingContext &context, : clip->mSpecPxCache->values[correctedX * hiddenMid.height + yy]; unsigned char rv, gv, bv; - GetColorGradient(value, selected, isGrayscale, &rv, &gv, &bv); + GetColorGradient(value, selected, colorScheme, &rv, &gv, &bv); #ifdef EXPERIMENTAL_FFT_Y_GRID if (fftYGrid && yGrid[yy]) {