avoid crazy costs of looking up and constructing color modifier every time, and cache color values for MIDI notes
This commit is contained in:
parent
3322e6f5a5
commit
fc69b29c88
@ -46,11 +46,17 @@ const uint32_t NoteBase::midi_channel_colors[16] = {
|
||||
|
||||
bool NoteBase::_color_init = false;
|
||||
Gtkmm2ext::Color NoteBase::_selected_col = 0;
|
||||
Gtkmm2ext::SVAModifier NoteBase::color_modifier;
|
||||
Gtkmm2ext::Color NoteBase::velocity_color_table[128];
|
||||
|
||||
void
|
||||
NoteBase::set_colors ()
|
||||
{
|
||||
for (uint8_t i = 0; i < 128; ++i) {
|
||||
velocity_color_table[i] = 0; /* out of bounds because zero alpha makes no sense */
|
||||
}
|
||||
_selected_col = UIConfiguration::instance().color ("midi note selected outline");
|
||||
color_modifier = UIConfiguration::instance().modifier ("midi note");
|
||||
}
|
||||
|
||||
NoteBase::NoteBase(MidiRegionView& region, bool with_events, const boost::shared_ptr<NoteType> note)
|
||||
@ -324,15 +330,35 @@ NoteBase::big_enough_to_trim () const
|
||||
Gtkmm2ext::Color
|
||||
NoteBase::meter_style_fill_color(uint8_t vel, bool /* selected */)
|
||||
{
|
||||
if (vel < 32) {
|
||||
return UINT_INTERPOLATE(UIConfiguration::instance().color_mod ("midi meter color0", "midi note"), UIConfiguration::instance().color_mod ("midi meter color1", "midi note"), (vel / 32.0));
|
||||
} else if (vel < 64) {
|
||||
return UINT_INTERPOLATE(UIConfiguration::instance().color_mod ("midi meter color2", "midi note"), UIConfiguration::instance().color_mod ("midi meter color3", "midi note"), ((vel-32) / 32.0));
|
||||
} else if (vel < 100) {
|
||||
return UINT_INTERPOLATE(UIConfiguration::instance().color_mod ("midi meter color4", "midi note"), UIConfiguration::instance().color_mod ("midi meter color5", "midi note"), ((vel-64) / 36.0));
|
||||
} else if (vel < 112) {
|
||||
return UINT_INTERPOLATE(UIConfiguration::instance().color_mod ("midi meter color6", "midi note"), UIConfiguration::instance().color_mod ("midi meter color7", "midi note"), ((vel-100) / 12.0));
|
||||
} else {
|
||||
return UINT_INTERPOLATE(UIConfiguration::instance().color_mod ("midi meter color8", "midi note"), UIConfiguration::instance().color_mod ("midi meter color9", "midi note"), ((vel-112) / 17.0));
|
||||
/* note that because vel is uint8_t, we don't need bounds checking for
|
||||
the color lookup table.
|
||||
*/
|
||||
|
||||
if (velocity_color_table[vel] == 0) {
|
||||
|
||||
Gtkmm2ext::Color col;
|
||||
|
||||
if (vel < 32) {
|
||||
col = UINT_INTERPOLATE(UIConfiguration::instance().color ("midi meter color0"), UIConfiguration::instance().color ("midi meter color1"), (vel / 32.0));
|
||||
col = Gtkmm2ext::change_alpha (col, color_modifier.a());
|
||||
} else if (vel < 64) {
|
||||
col = UINT_INTERPOLATE(UIConfiguration::instance().color ("midi meter color2"), UIConfiguration::instance().color ("midi meter color3"), ((vel-32) / 32.0));
|
||||
col = Gtkmm2ext::change_alpha (col, color_modifier.a());
|
||||
} else if (vel < 100) {
|
||||
col = UINT_INTERPOLATE(UIConfiguration::instance().color ("midi meter color4"), UIConfiguration::instance().color ("midi meter color5"), ((vel-64) / 36.0));
|
||||
col = Gtkmm2ext::change_alpha (col, color_modifier.a());
|
||||
} else if (vel < 112) {
|
||||
col = UINT_INTERPOLATE(UIConfiguration::instance().color ("midi meter color6"), UIConfiguration::instance().color ("midi meter color7"), ((vel-100) / 12.0));
|
||||
col = Gtkmm2ext::change_alpha (col, color_modifier.a());
|
||||
} else {
|
||||
col = UINT_INTERPOLATE(UIConfiguration::instance().color ("midi meter color8"), UIConfiguration::instance().color ("midi meter color9"), ((vel-112) / 17.0));
|
||||
col = Gtkmm2ext::change_alpha (col, color_modifier.a());
|
||||
}
|
||||
|
||||
velocity_color_table[vel] = col;
|
||||
return col;
|
||||
}
|
||||
|
||||
return velocity_color_table[vel];
|
||||
}
|
||||
|
||||
|
@ -142,6 +142,8 @@ private:
|
||||
bool event_handler (GdkEvent *);
|
||||
|
||||
static Gtkmm2ext::Color _selected_col;
|
||||
static Gtkmm2ext::SVAModifier color_modifier;
|
||||
static Gtkmm2ext::Color velocity_color_table[128];
|
||||
static bool _color_init;
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user