1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-16 16:10:06 +02:00

Refactor AColor.cpp

This commit is contained in:
dofuuz 2021-06-11 16:30:10 +09:00 committed by Paul Licameli
parent d6d486000a
commit ca58443644

View File

@ -638,85 +638,108 @@ void AColor::DarkMIDIChannel(wxDC * dc, int channel /* 1 - 16 */ )
unsigned char AColor::gradient_pre[ColorGradientTotal][2][gradientSteps][3]; unsigned char AColor::gradient_pre[ColorGradientTotal][2][gradientSteps][3];
void AColor::PreComputeGradient() { void AColor::PreComputeGradient() {
{ if (gradient_inited) return;
if (!gradient_inited) { gradient_inited = 1;
gradient_inited = 1;
for (int selected = 0; selected < ColorGradientTotal; selected++) for (int selected = 0; selected < ColorGradientTotal; selected++) {
for (int grayscale = 0; grayscale <= 1; grayscale++) { const int gsteps = 4;
float r, g, b; float gradient[gsteps + 1][3];
theTheme.Colour( clrSpectro1 ) = theTheme.Colour( clrUnselected );
theTheme.Colour( clrSpectro1Sel ) = theTheme.Colour( clrSelected );
int clrFirst = (selected == ColorGradientUnselected ) ? clrSpectro1 : clrSpectro1Sel;
for(int j=0;j<(gsteps+1);j++){
wxColour c = theTheme.Colour( clrFirst+j );
gradient[ j] [0] = c.Red()/255.0;
gradient[ j] [1] = c.Green()/255.0;
gradient[ j] [2] = c.Blue()/255.0;
}
int i; // Color
for (i=0; i<gradientSteps; i++) { for (int i = 0; i<gradientSteps; i++) {
float value = float(i)/gradientSteps; float r, g, b;
float value = float(i)/gradientSteps;
if (grayscale) { int left = (int)(value * gsteps);
r = g = b = 0.84 - 0.84 * value; int right = (left == gsteps ? gsteps : left + 1);
} else {
const int gsteps = 4; float rweight = (value * gsteps) - left;
float gradient[gsteps + 1][3]; float lweight = 1.0 - rweight;
theTheme.Colour( clrSpectro1 ) = theTheme.Colour( clrUnselected );
theTheme.Colour( clrSpectro1Sel ) = theTheme.Colour( clrSelected ); r = (gradient[left][0] * lweight) + (gradient[right][0] * rweight);
int clrFirst = (selected == ColorGradientUnselected ) ? clrSpectro1 : clrSpectro1Sel; g = (gradient[left][1] * lweight) + (gradient[right][1] * rweight);
for(int j=0;j<(gsteps+1);j++){ b = (gradient[left][2] * lweight) + (gradient[right][2] * rweight);
wxColour c = theTheme.Colour( clrFirst+j );
gradient[ j] [0] = c.Red()/255.0; switch (selected) {
gradient[ j] [1] = c.Green()/255.0; case ColorGradientUnselected:
gradient[ j] [2] = c.Blue()/255.0; // not dimmed
} break;
case ColorGradientTimeAndFrequencySelected:
float temp;
temp = r;
r = g;
g = b;
b = temp;
break;
case ColorGradientTimeSelected:
// partly dimmed
r *= 0.75f;
g *= 0.75f;
b *= 0.75f;
break;
int left = (int)(value * gsteps); // For now edge colour is just black (or white if grey-scale)
int right = (left == gsteps ? gsteps : left + 1); // Later we might invert or something else funky.
case ColorGradientEdge:
// fully dimmed
r = 0;
g = 0;
b = 0;
break;
}
gradient_pre[selected][0][i][0] = (unsigned char) (255 * r);
gradient_pre[selected][0][i][1] = (unsigned char) (255 * g);
gradient_pre[selected][0][i][2] = (unsigned char) (255 * b);
}
// Grayscale
for (int i = 0; i<gradientSteps; i++) {
float r, g, b;
float value = float(i)/gradientSteps;
float rweight = (value * gsteps) - left; r = g = b = 0.84 - 0.84 * value;
float lweight = 1.0 - rweight;
r = (gradient[left][0] * lweight) + (gradient[right][0] * rweight); switch (selected) {
g = (gradient[left][1] * lweight) + (gradient[right][1] * rweight); case ColorGradientUnselected:
b = (gradient[left][2] * lweight) + (gradient[right][2] * rweight); // not dimmed
} break;
switch (selected) { case ColorGradientTimeAndFrequencySelected:
case ColorGradientUnselected: // else fall through to SAME grayscale colour as normal selection.
// not dimmed // The white lines show it up clearly enough.
break;
case ColorGradientTimeAndFrequencySelected: case ColorGradientTimeSelected:
if( !grayscale ) // partly dimmed
{ r *= 0.75f;
float temp; g *= 0.75f;
temp = r; b *= 0.75f;
r = g; break;
g = b;
b = temp;
break;
}
// else fall through to SAME grayscale colour as normal selection.
// The white lines show it up clearly enough.
case ColorGradientTimeSelected:
// partly dimmed
r *= 0.75f;
g *= 0.75f;
b *= 0.75f;
break;
// For now edge colour is just black (or white if grey-scale) // For now edge colour is just black (or white if grey-scale)
// Later we might invert or something else funky. // Later we might invert or something else funky.
case ColorGradientEdge: case ColorGradientEdge:
// fully dimmed // fully dimmed
r = 1.0f * grayscale; r = 1.0f;
g = 1.0f * grayscale; g = 1.0f;
b = 1.0f * grayscale; b = 1.0f;
break; break;
} }
gradient_pre[selected][grayscale][i][0] = (unsigned char) (255 * r); gradient_pre[selected][1][i][0] = (unsigned char) (255 * r);
gradient_pre[selected][grayscale][i][1] = (unsigned char) (255 * g); gradient_pre[selected][1][i][1] = (unsigned char) (255 * g);
gradient_pre[selected][grayscale][i][2] = (unsigned char) (255 * b); gradient_pre[selected][1][i][2] = (unsigned char) (255 * b);
}
}
} }
} }
} }