summaryrefslogtreecommitdiff
path: root/gtk2_ardour/note_base.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2018-07-06 07:57:01 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2018-07-06 07:57:19 -0400
commitfc69b29c885245fff53b5c0f4117b9fbc5de7344 (patch)
tree83ab5c57dcdad94b8a7685cfb293a0d73d45c352 /gtk2_ardour/note_base.cc
parent3322e6f5a596c69a3c6e5fc3167fbebb69794887 (diff)
avoid crazy costs of looking up and constructing color modifier every time, and cache color values for MIDI notes
Diffstat (limited to 'gtk2_ardour/note_base.cc')
-rw-r--r--gtk2_ardour/note_base.cc46
1 files changed, 36 insertions, 10 deletions
diff --git a/gtk2_ardour/note_base.cc b/gtk2_ardour/note_base.cc
index 2e900c354e..915866ef61 100644
--- a/gtk2_ardour/note_base.cc
+++ b/gtk2_ardour/note_base.cc
@@ -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];
}
+