summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk2_ardour/ardour_button.cc12
-rw-r--r--gtk2_ardour/ardour_knob.cc6
-rw-r--r--gtk2_ardour/audio_clock.cc16
-rw-r--r--gtk2_ardour/base_colors.h54
-rw-r--r--gtk2_ardour/button_joiner.cc10
-rw-r--r--gtk2_ardour/canvas_vars.h236
-rw-r--r--gtk2_ardour/colors.h493
-rw-r--r--gtk2_ardour/default_ui_config.in463
-rw-r--r--gtk2_ardour/level_meter.cc2
-rw-r--r--gtk2_ardour/meter_patterns.cc4
-rw-r--r--gtk2_ardour/monitor_section.cc6
-rw-r--r--gtk2_ardour/stereo_panner.cc5
-rw-r--r--gtk2_ardour/styles.rc.in105
-rw-r--r--gtk2_ardour/theme_manager.cc2
-rw-r--r--gtk2_ardour/time_axis_view_item.cc2
-rw-r--r--gtk2_ardour/ui_config.cc795
-rw-r--r--gtk2_ardour/ui_config.h71
-rw-r--r--gtk2_ardour/widget_list.rc6
-rw-r--r--libs/canvas/canvas/colors.h54
-rw-r--r--libs/canvas/canvas/colorspace.h54
-rw-r--r--libs/canvas/colors.cc247
-rw-r--r--libs/canvas/colorspace.cc940
-rw-r--r--libs/canvas/wave_view.cc2
-rw-r--r--libs/canvas/wscript1
24 files changed, 2584 insertions, 1002 deletions
diff --git a/gtk2_ardour/ardour_button.cc b/gtk2_ardour/ardour_button.cc
index 447fc1ef0c..ddd8b9ca3e 100644
--- a/gtk2_ardour/ardour_button.cc
+++ b/gtk2_ardour/ardour_button.cc
@@ -663,14 +663,14 @@ ArdourButton::set_colors ()
}
std::string name = get_name();
- fill_active_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: fill active", name));
- fill_inactive_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: fill", name));
+ fill_active_color = ARDOUR_UI::config()->color (string_compose ("%1: fill active", name));
+ fill_inactive_color = ARDOUR_UI::config()->color (string_compose ("%1: fill", name));
- text_active_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: text active", name));
- text_inactive_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: text", name));
+ text_active_color = ARDOUR_UI::config()->color (string_compose ("%1: text active", name));
+ text_inactive_color = ARDOUR_UI::config()->color (string_compose ("%1: text", name));
- led_active_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: led active", name));
- led_inactive_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: led", name));
+ led_active_color = ARDOUR_UI::config()->color (string_compose ("%1: led active", name));
+ led_inactive_color = ARDOUR_UI::config()->color (string_compose ("%1: led", name));
}
/**
diff --git a/gtk2_ardour/ardour_knob.cc b/gtk2_ardour/ardour_knob.cc
index c244411562..c0dc03fe2b 100644
--- a/gtk2_ardour/ardour_knob.cc
+++ b/gtk2_ardour/ardour_knob.cc
@@ -89,7 +89,7 @@ ArdourKnob::render (cairo_t* cr, cairo_rectangle_t *)
cairo_translate (cr, xc, yc); //after this, everything is based on the center of the knob
//get the knob color from the theme
- ArdourCanvas::Color knob_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1", get_name()));
+ ArdourCanvas::Color knob_color = ARDOUR_UI::config()->color (string_compose ("%1", get_name()));
float center_radius = 0.48*scale;
float border_width = 0.8;
@@ -119,10 +119,10 @@ ArdourKnob::render (cairo_t* cr, cairo_rectangle_t *)
//look up the arc colors from the config
double red_start, green_start, blue_start, unused;
- ArdourCanvas::Color arc_start_color = ARDOUR_UI::config()->color_by_name ( string_compose ("%1: arc start", get_name()));
+ ArdourCanvas::Color arc_start_color = ARDOUR_UI::config()->color ( string_compose ("%1: arc start", get_name()));
ArdourCanvas::color_to_rgba( arc_start_color, red_start, green_start, blue_start, unused );
double red_end, green_end, blue_end;
- ArdourCanvas::Color arc_end_color = ARDOUR_UI::config()->color_by_name ( string_compose ("%1: arc end", get_name()) );
+ ArdourCanvas::Color arc_end_color = ARDOUR_UI::config()->color ( string_compose ("%1: arc end", get_name()) );
ArdourCanvas::color_to_rgba( arc_end_color, red_end, green_end, blue_end, unused );
//vary the arc color over the travel of the knob
diff --git a/gtk2_ardour/audio_clock.cc b/gtk2_ardour/audio_clock.cc
index dcd626d287..b6c2040792 100644
--- a/gtk2_ardour/audio_clock.cc
+++ b/gtk2_ardour/audio_clock.cc
@@ -223,15 +223,15 @@ AudioClock::set_colors ()
uint32_t cursor_color;
if (active_state()) {
- bg_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1 active: background", get_name()));
- text_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1 active: text", get_name()));
- editing_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1 active: edited text", get_name()));
- cursor_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1 active: cursor", get_name()));
+ bg_color = ARDOUR_UI::config()->color (string_compose ("%1 active: background", get_name()));
+ text_color = ARDOUR_UI::config()->color (string_compose ("%1 active: text", get_name()));
+ editing_color = ARDOUR_UI::config()->color (string_compose ("%1 active: edited text", get_name()));
+ cursor_color = ARDOUR_UI::config()->color (string_compose ("%1 active: cursor", get_name()));
} else {
- bg_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: background", get_name()));
- text_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: text", get_name()));
- editing_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: edited text", get_name()));
- cursor_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: cursor", get_name()));
+ bg_color = ARDOUR_UI::config()->color (string_compose ("%1: background", get_name()));
+ text_color = ARDOUR_UI::config()->color (string_compose ("%1: text", get_name()));
+ editing_color = ARDOUR_UI::config()->color (string_compose ("%1: edited text", get_name()));
+ cursor_color = ARDOUR_UI::config()->color (string_compose ("%1: cursor", get_name()));
}
/* store for bg and cursor in render() */
diff --git a/gtk2_ardour/base_colors.h b/gtk2_ardour/base_colors.h
new file mode 100644
index 0000000000..570a7825c8
--- /dev/null
+++ b/gtk2_ardour/base_colors.h
@@ -0,0 +1,54 @@
+/*
+ Copyright (C) 2014 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+/* no guard #ifdef's - this file is intended to be included many times */
+
+/* note that because the integer values are interpreted as RGBA, we must include a A component, which is just 0xff
+ for all colors here. The alpha component is not used.
+*/
+
+CANVAS_BASE_COLOR(colorA,"colorA", 0xff0000ff) /* red */
+CANVAS_BASE_COLOR(colorAlight,"colorAlight", 0xff00e6ff) /* pink */
+
+/* oranges */
+
+CANVAS_BASE_COLOR(colorAB,"colorAB", 0xff4d00ff) /* redder/darker orange */
+CANVAS_BASE_COLOR(colorABlight,"colorABlight", 0xff9900ff) /* lighter orange */
+
+/* yellows */
+CANVAS_BASE_COLOR(colorB,"colorB", 0xffe600ff) /* bright yellow */
+
+/* greens */
+CANVAS_BASE_COLOR(colorA2,"colorC", 0x00ff1aff) /* darker green */
+CANVAS_BASE_COLOR(colorClight,"colorClight", 0x80ff00ff) /* light green */
+
+/* cyan */
+CANVAS_BASE_COLOR(colorCD,"colorCD", 0x00ffb3ff) /* cyan */
+
+/* blues */
+CANVAS_BASE_COLOR(colorD,"colorD", 0x00ffffff) /* light blue */
+CANVAS_BASE_COLOR(colorDdark,"colorDdark", 0x001affff) /* darkest blue */
+CANVAS_BASE_COLOR(colorDlight,"colorDlight", 0x00b3ffff) /* lightest blue */
+
+/* purple */
+CANVAS_BASE_COLOR(colorDA,"colorDA", 0x8000ffff) /* purple */
+
+
+
+
diff --git a/gtk2_ardour/button_joiner.cc b/gtk2_ardour/button_joiner.cc
index 0c60cba1db..da9ae45847 100644
--- a/gtk2_ardour/button_joiner.cc
+++ b/gtk2_ardour/button_joiner.cc
@@ -74,7 +74,7 @@ ButtonJoiner::ButtonJoiner (const std::string& str, Gtk::Widget& lw, Gtk::Widget
uint32_t border_color;
uint32_t r, g, b, a;
- border_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: border end", name));
+ border_color = ARDOUR_UI::config()->color (string_compose ("%1: border end", name));
UINT_TO_RGBA (border_color, &r, &g, &b, &a);
border_r = r/255.0;
@@ -256,15 +256,15 @@ ButtonJoiner::set_colors ()
active_fill_pattern = cairo_pattern_create_linear (0.0, 0.0, 0.0, get_height());
inactive_fill_pattern = cairo_pattern_create_linear (0.0, 0.0, 0.0, get_height());
- start_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: fill start", name));
- end_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: fill end", name));
+ start_color = ARDOUR_UI::config()->color (string_compose ("%1: fill start", name));
+ end_color = ARDOUR_UI::config()->color (string_compose ("%1: fill end", name));
UINT_TO_RGBA (start_color, &r, &g, &b, &a);
cairo_pattern_add_color_stop_rgba (inactive_fill_pattern, 0, r/255.0,g/255.0,b/255.0, a/255.0);
UINT_TO_RGBA (end_color, &r, &g, &b, &a);
cairo_pattern_add_color_stop_rgba (inactive_fill_pattern, 1, r/255.0,g/255.0,b/255.0, a/255.0);
- start_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: fill start active", name));
- end_color = ARDOUR_UI::config()->color_by_name (string_compose ("%1: fill end active", name));
+ start_color = ARDOUR_UI::config()->color (string_compose ("%1: fill start active", name));
+ end_color = ARDOUR_UI::config()->color (string_compose ("%1: fill end active", name));
UINT_TO_RGBA (start_color, &r, &g, &b, &a);
cairo_pattern_add_color_stop_rgba (active_fill_pattern, 0, r/255.0,g/255.0,b/255.0, a/255.0);
UINT_TO_RGBA (end_color, &r, &g, &b, &a);
diff --git a/gtk2_ardour/canvas_vars.h b/gtk2_ardour/canvas_vars.h
index 206c509f06..995db6ae13 100644
--- a/gtk2_ardour/canvas_vars.h
+++ b/gtk2_ardour/canvas_vars.h
@@ -17,242 +17,6 @@
*/
-CANVAS_VARIABLE(ActiveCrossfade, "active crossfade")
-CANVAS_VARIABLE(canvasvar_ArrangeBase, "arrange base")
-CANVAS_VARIABLE(AudioBusBase, "audio bus base")
-CANVAS_VARIABLE(AudioMasterBusBase, "audio master bus base")
-CANVAS_VARIABLE(AudioTrackBase, "audio track base")
-CANVAS_VARIABLE(AutomationLine, "automation line")
-CANVAS_VARIABLE(AutomationTrackFill, "automation track fill")
-CANVAS_VARIABLE(AutomationTrackOutline, "automation track outline")
-CANVAS_VARIABLE(CDMarkerBar, "cd marker bar")
-CANVAS_VARIABLE(CrossfadeEditorBase, "crossfade editor base")
-CANVAS_VARIABLE(CrossfadeEditorLine, "crossfade editor line")
-CANVAS_VARIABLE(CrossfadeEditorLineShading, "crossfade editor line shading")
-CANVAS_VARIABLE(CrossfadeEditorPointFill, "crossfade editor point fill")
-CANVAS_VARIABLE(CrossfadeEditorPointOutline, "crossfade editor point outline")
-CANVAS_VARIABLE(CrossfadeEditorWave, "crossfade editor wave")
-CANVAS_VARIABLE(SelectedCrossfadeEditorWaveFill, "selected crossfade editor wave fill")
-CANVAS_VARIABLE(CrossfadeLine, "crossfade line")
-CANVAS_VARIABLE(EditPoint, "edit point")
-CANVAS_VARIABLE(EnteredAutomationLine, "entered automation line")
-CANVAS_VARIABLE(ControlPointFill, "control point fill")
-CANVAS_VARIABLE(ControlPointOutline, "control point outline")
-CANVAS_VARIABLE(ControlPointSelected, "control point selected")
-CANVAS_VARIABLE(EnteredGainLine, "entered gain line")
-CANVAS_VARIABLE(EnteredMarker, "entered marker")
-CANVAS_VARIABLE(FrameHandle, "frame handle")
-CANVAS_VARIABLE(GainLine, "gain line")
-CANVAS_VARIABLE(GainLineInactive, "gain line inactive")
-CANVAS_VARIABLE(GhostTrackBase, "ghost track base")
-CANVAS_VARIABLE(GhostTrackMidiOutline, "ghost track midi outline")
-CANVAS_VARIABLE(GhostTrackWave, "ghost track wave")
-CANVAS_VARIABLE(GhostTrackWaveFill, "ghost track wave fill")
-CANVAS_VARIABLE(GhostTrackWaveClip, "ghost track wave clip")
-CANVAS_VARIABLE(GhostTrackZeroLine, "ghost track zero line")
-CANVAS_VARIABLE(ImageTrack, "image track")
-CANVAS_VARIABLE(InactiveCrossfade, "inactive crossfade")
-CANVAS_VARIABLE(InactiveFadeHandle, "inactive fade handle")
-CANVAS_VARIABLE(InactiveGroupTab, "inactive group tab")
-CANVAS_VARIABLE(LocationCDMarker, "location cd marker")
-CANVAS_VARIABLE(LocationLoop, "location loop")
-CANVAS_VARIABLE(LocationMarker, "location marker")
-CANVAS_VARIABLE(LocationPunch, "location punch")
-CANVAS_VARIABLE(LocationRange, "location range")
-CANVAS_VARIABLE(MarkerBar, "marker bar")
-CANVAS_VARIABLE(MarkerBarSeparator, "marker bar separator")
-CANVAS_VARIABLE(MarkerDragLine, "marker drag line")
-CANVAS_VARIABLE(MarkerLabel, "marker label")
-CANVAS_VARIABLE(MarkerTrack, "marker track")
-CANVAS_VARIABLE(MeasureLineBar, "measure line bar")
-CANVAS_VARIABLE(MeasureLineBeat, "measure line beat")
-CANVAS_VARIABLE(MeterBar, "meter bar")
-CANVAS_VARIABLE(MeterBridgePeakLabel, "meterbridge peaklabel")
-CANVAS_VARIABLE(MeterColorBBC, "meter color BBC")
-CANVAS_VARIABLE(MeterColor0, "meter fill: 0")
-CANVAS_VARIABLE(MeterColor1, "meter fill: 1")
-CANVAS_VARIABLE(MeterColor2, "meter fill: 2")
-CANVAS_VARIABLE(MeterColor3, "meter fill: 3")
-CANVAS_VARIABLE(MeterColor4, "meter fill: 4")
-CANVAS_VARIABLE(MeterColor5, "meter fill: 5")
-CANVAS_VARIABLE(MeterColor6, "meter fill: 6")
-CANVAS_VARIABLE(MeterColor7, "meter fill: 7")
-CANVAS_VARIABLE(MeterColor8, "meter fill: 8")
-CANVAS_VARIABLE(MeterColor9, "meter fill: 9")
-CANVAS_VARIABLE(MidiMeterColor0, "midi meter fill: 0")
-CANVAS_VARIABLE(MidiMeterColor1, "midi meter fill: 1")
-CANVAS_VARIABLE(MidiMeterColor2, "midi meter fill: 2")
-CANVAS_VARIABLE(MidiMeterColor3, "midi meter fill: 3")
-CANVAS_VARIABLE(MidiMeterColor4, "midi meter fill: 4")
-CANVAS_VARIABLE(MidiMeterColor5, "midi meter fill: 5")
-CANVAS_VARIABLE(MidiMeterColor6, "midi meter fill: 6")
-CANVAS_VARIABLE(MidiMeterColor7, "midi meter fill: 7")
-CANVAS_VARIABLE(MidiMeterColor8, "midi meter fill: 8")
-CANVAS_VARIABLE(MidiMeterColor9, "midi meter fill: 9")
-CANVAS_VARIABLE(MeterBackgroundBot, "meter background: bottom")
-CANVAS_VARIABLE(MeterBackgroundTop, "meter background: top")
-CANVAS_VARIABLE(MeterMarker, "meter marker")
-CANVAS_VARIABLE(MidiBusBase, "midi bus base")
-CANVAS_VARIABLE(MidiFrameBase, "midi frame base")
-CANVAS_VARIABLE(MidiNoteInactiveChannel, "midi note inactive channel")
-CANVAS_VARIABLE(MidiNoteColorBase, "midi note color min")
-CANVAS_VARIABLE(MidiNoteColorMid, "midi note color mid")
-CANVAS_VARIABLE(MidiNoteColorTop, "midi note color max")
-CANVAS_VARIABLE(SelectedMidiNoteColorBase, "selected midi note color min")
-CANVAS_VARIABLE(SelectedMidiNoteColorMid, "selected midi note color mid")
-CANVAS_VARIABLE(SelectedMidiNoteColorTop, "selected midi note color max")
-CANVAS_VARIABLE(MidiNoteSelected, "midi note selected")
-CANVAS_VARIABLE(MidiNoteVelocityText, "midi note velocity text")
-CANVAS_VARIABLE(MidiPatchChangeFill, "midi patch change fill")
-CANVAS_VARIABLE(MidiPatchChangeOutline, "midi patch change outline")
-CANVAS_VARIABLE(MidiPatchChangeInactiveChannelFill, "midi patch change inactive channel fill")
-CANVAS_VARIABLE(MidiPatchChangeInactiveChannelOutline, "midi patch change inactive channel outline")
-CANVAS_VARIABLE(MidiSysExFill, "midi sysex fill")
-CANVAS_VARIABLE(MidiSysExOutline, "midi sysex outline")
-CANVAS_VARIABLE(MidiSelectRectFill, "midi select rect fill")
-CANVAS_VARIABLE(MidiSelectRectOutline, "midi select rect outline")
-CANVAS_VARIABLE(MidiTrackBase, "midi track base")
-CANVAS_VARIABLE(NameHighlightFill, "name highlight fill")
-CANVAS_VARIABLE(NameHighlightOutline, "name highlight outline")
-CANVAS_VARIABLE(PianoRollBlackOutline, "piano roll black outline")
-CANVAS_VARIABLE(PianoRollBlack, "piano roll black")
-CANVAS_VARIABLE(PianoRollWhite, "piano roll white")
-CANVAS_VARIABLE(PlayHead, "play head")
-CANVAS_VARIABLE(ProcessorAutomationLine, "processor automation line")
-CANVAS_VARIABLE(PunchLine, "punch line")
-CANVAS_VARIABLE(RangeDragBarRect, "range drag bar rect")
-CANVAS_VARIABLE(RangeDragRect, "range drag rect")
-CANVAS_VARIABLE(RangeMarkerBar, "range marker bar")
-CANVAS_VARIABLE(RecordingRect, "recording rect")
-CANVAS_VARIABLE(RecWaveFormFill, "recorded waveform fill")
-CANVAS_VARIABLE(RecWaveForm, "recorded waveform outline")
-CANVAS_VARIABLE(RubberBandRect, "rubber band rect")
-CANVAS_VARIABLE(RulerBase, "ruler base")
-CANVAS_VARIABLE(RulerText, "ruler text")
-CANVAS_VARIABLE(SelectedCrossfadeEditorLine, "selected crossfade editor line")
-CANVAS_VARIABLE(SelectedCrossfadeEditorWave, "selected crossfade editor wave")
-CANVAS_VARIABLE(SelectedFrameBase, "selected region base")
-CANVAS_VARIABLE(SelectedWaveFormFill, "selected waveform fill")
-CANVAS_VARIABLE(SelectedWaveForm, "selected waveform outline")
-CANVAS_VARIABLE(SelectionRect, "selection rect")
-CANVAS_VARIABLE(Selection, "selection")
-CANVAS_VARIABLE(Shuttle, "shuttle")
-CANVAS_VARIABLE(Silence, "silence")
-CANVAS_VARIABLE(SilenceText, "silence text")
-CANVAS_VARIABLE(MonoPannerOutline, "mono panner outline")
-CANVAS_VARIABLE(MonoPannerFill, "mono panner fill")
-CANVAS_VARIABLE(MonoPannerText, "mono panner text")
-CANVAS_VARIABLE(MonoPannerBackground, "mono panner bg")
-CANVAS_VARIABLE(MonoPannerPositionFill, "mono panner position fill")
-CANVAS_VARIABLE(MonoPannerPositionOutline, "mono panner position outline")
-CANVAS_VARIABLE(StereoPannerOutline, "stereo panner outline")
-CANVAS_VARIABLE(StereoPannerFill, "stereo panner fill")
-CANVAS_VARIABLE(StereoPannerText, "stereo panner text")
-CANVAS_VARIABLE(StereoPannerBackground, "stereo panner bg")
-CANVAS_VARIABLE(StereoPannerRule, "stereo panner rule")
-CANVAS_VARIABLE(StereoPannerMonoOutline, "stereo panner mono outline")
-CANVAS_VARIABLE(StereoPannerMonoFill, "stereo panner mono fill")
-CANVAS_VARIABLE(StereoPannerMonoText, "stereo panner mono text")
-CANVAS_VARIABLE(StereoPannerMonoBackground, "stereo panner mono bg")
-CANVAS_VARIABLE(StereoPannerInvertedOutline, "stereo panner inverted outline")
-CANVAS_VARIABLE(StereoPannerInvertedFill, "stereo panner inverted fill")
-CANVAS_VARIABLE(StereoPannerInvertedText, "stereo panner inverted text")
-CANVAS_VARIABLE(StereoPannerInvertedBackground, "stereo panner inverted bg")
-CANVAS_VARIABLE(TempoBar, "tempo bar")
-CANVAS_VARIABLE(TempoMarker, "tempo marker")
-CANVAS_VARIABLE(TimeAxisFrame, "time axis frame")
-CANVAS_VARIABLE(SelectedTimeAxisFrame, "selected time axis frame")
-CANVAS_VARIABLE(TimeStretchFill, "time stretch fill")
-CANVAS_VARIABLE(TimeStretchOutline, "time stretch outline")
-CANVAS_VARIABLE(MonitorKnobArcStart, "monitor knob: arc start")
-CANVAS_VARIABLE(MonitorKnobArcEnd, "monitor knob: arc end")
-CANVAS_VARIABLE(TransportDragRect, "transport drag rect")
-CANVAS_VARIABLE(TransportLoopRect, "transport loop rect")
-CANVAS_VARIABLE(TransportMarkerBar, "transport marker bar")
-CANVAS_VARIABLE(TransportPunchRect, "transport punch rect")
-CANVAS_VARIABLE(TrimHandleLocked, "trim handle locked")
-CANVAS_VARIABLE(TrimHandle, "trim handle")
-CANVAS_VARIABLE(VerboseCanvasCursor, "verbose canvas cursor")
-CANVAS_VARIABLE(VestigialFrame, "vestigial frame")
-CANVAS_VARIABLE(VideoBar, "video timeline bar")
-CANVAS_VARIABLE(FrameBase, "region base")
-CANVAS_VARIABLE(CoveredRegion, "region area covered by another region")
-CANVAS_VARIABLE(WaveForm, "waveform outline")
-CANVAS_VARIABLE(WaveFormClip, "clipped waveform")
-CANVAS_VARIABLE(WaveFormFill, "waveform fill")
-CANVAS_VARIABLE(ZeroLine, "zero line")
-CANVAS_VARIABLE(MonitorSectionKnob, "monitor knob")
-
-CANVAS_VARIABLE(ButtonBorder, "border color")
-#define BUTTON_VARS(root,name) \
-CANVAS_VARIABLE(root ## Fill, name ": fill") \
-CANVAS_VARIABLE(root ## FillActive, name ": fill active") \
-CANVAS_VARIABLE(root ## LED, name ": led") \
-CANVAS_VARIABLE(root ## LEDActive, name ": led active") \
-CANVAS_VARIABLE(root ## Text, name ": text") \
-CANVAS_VARIABLE(root ## TextActive, name ": text active") \
-
-BUTTON_VARS(ProcessorPreFader, "processor prefader")
-BUTTON_VARS(ProcessorFader, "processor fader")
-BUTTON_VARS(ProcessorPostFader, "processor postfader")
-BUTTON_VARS(ProcessorControlButton, "processor control button")
-BUTTON_VARS(MonitorButton, "monitor button")
-BUTTON_VARS(SoloIsolateButton, "solo isolate")
-BUTTON_VARS(SoloSafeButton, "solo safe")
-BUTTON_VARS(MidiDeviceButton, "midi device")
-BUTTON_VARS(MeterBridgePeakIndicator, "meterbridge peakindicator")
-BUTTON_VARS(MeterBridgeLabel, "meterbridge label")
-BUTTON_VARS(MonitorSectionCutButton, "monitor section cut")
-BUTTON_VARS(MonitorSectionDimButton, "monitor section dim")
-BUTTON_VARS(MonitorSectionSoloButton, "monitor section solo")
-BUTTON_VARS(MonitorSectionInvertButton, "monitor section invert")
-BUTTON_VARS(MonitorSectionMonoButton, "monitor section mono")
-BUTTON_VARS(MonitorSectionSoloModelButton, "monitor section solo model")
-BUTTON_VARS(MonitorSectionSoloOverrideButton, "monitor solo override")
-BUTTON_VARS(MonitorSectionSoloExclusiveButton, "monitor solo exclusive")
-BUTTON_VARS(RudeSolo, "rude solo")
-BUTTON_VARS(RudeIsolate, "rude isolate")
-BUTTON_VARS(RudeAudition, "rude audition")
-BUTTON_VARS(FeedbackAlert, "feedback alert")
-BUTTON_VARS(InvertButton, "invert button")
-BUTTON_VARS(MuteButton, "mute button")
-BUTTON_VARS(SoloButton, "solo button")
-BUTTON_VARS(RecEnableButton, "record enable button")
-BUTTON_VARS(SendButton, "send alert button")
-BUTTON_VARS(TransportButton, "transport button")
-BUTTON_VARS(TransportRecenableButton, "transport recenable button")
-BUTTON_VARS(TransportOptionButton, "transport option button")
-BUTTON_VARS(TransportActiveOptionButton, "transport active option button")
-BUTTON_VARS(TrackNumberLabel, "tracknumber label")
-BUTTON_VARS(PluginBypassButton, "plugin bypass button")
-BUTTON_VARS(PunchButton, "punch button")
-BUTTON_VARS(MouseModeButton, "mouse mode button")
-BUTTON_VARS(NudgeButton, "nudge button")
-BUTTON_VARS(ZoomButton, "zoom button")
-BUTTON_VARS(ZoomMenu, "zoom menu")
-BUTTON_VARS(RouteButton, "route button")
-BUTTON_VARS(MixerStripButton, "mixer strip button")
-BUTTON_VARS(MixerStripNameButton, "mixer strip name button")
-BUTTON_VARS(MidiInputButton, "midi input button")
-BUTTON_VARS(LockButton, "lock button")
-BUTTON_VARS(GenericButton, "generic button")
-
-#define CLOCK_VARS(root,name) \
- CANVAS_VARIABLE(root ## Background, name ": background") \
- CANVAS_VARIABLE(root ## Text, name ": text") \
- CANVAS_VARIABLE(root ## EditedText, name ": edited text") \
- CANVAS_VARIABLE(root ## Cursor, name ": cursor")
-
-CLOCK_VARS(TransportClock, "transport clock")
-CLOCK_VARS(SecondaryClock, "secondary clock")
-CLOCK_VARS(TransportDeltaClock, "transport delta clock")
-CLOCK_VARS(SecondaryDeltaClock, "secondary delta clock")
-CLOCK_VARS(BigClock, "big clock")
-CLOCK_VARS(BigClockActive, "big clock active")
-CLOCK_VARS(PunchClock, "punch clock")
-CLOCK_VARS(SelectionClock, "selection clock")
-CLOCK_VARS(NudgeClock, "nudge clock")
-CLOCK_VARS(GenericClock, "clock")
CANVAS_FONT_VARIABLE(SmallFont, "small font")
CANVAS_FONT_VARIABLE(SmallerFont, "smaller font")
CANVAS_FONT_VARIABLE(NormalFont, "normal font")
diff --git a/gtk2_ardour/colors.h b/gtk2_ardour/colors.h
new file mode 100644
index 0000000000..afa0f1150b
--- /dev/null
+++ b/gtk2_ardour/colors.h
@@ -0,0 +1,493 @@
+/*
+ Copyright (C) 2012 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+/* no guard #ifdef's - this should only be included in ui_config.{cc,h}, where it is
+ * used with some preprocessor tricks.
+ */
+
+CANVAS_COLOR(ActiveCrossfade,"active crossfade", "colorD", HSV(0,-0.179775,-0.301961,0.180392)) /*0 */
+CANVAS_COLOR(canvasvar_ArrangeBase,"arrange base", "colorA", HSV(0,-1,-0.65098,1)) /*0 */
+CANVAS_COLOR(AudioBusBase,"audio bus base", "colorDdark", HSV(-17.6842,-0.751634,-0.4,0.407843)) /*17.6842 */
+CANVAS_COLOR(AudioTrackBase,"audio track base", "colorDlight", HSV(17.3846,-0.80102,-0.231373,0.407843)) /*17.3846 */
+CANVAS_COLOR(AudioMasterBusBase,"audio master bus base", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(AutomationLine,"automation line", "colorC", HSV(0,-0.361702,-0.262745,1)) /*0 */
+CANVAS_COLOR(AutomationTrackFill,"automation track fill", "colorDdark", HSV(-0.521739,-0.776699,-0.192157,0.407843)) /*0.521739 */
+CANVAS_COLOR(AutomationTrackOutline,"automation track outline", "colorA", HSV(0,-1,-0.843137,1)) /*0 */
+CANVAS_COLOR(CDMarkerBar,"cd marker bar", "colorDdark", HSV(-2,-0.907975,-0.360784,0.8)) /*2 */
+CANVAS_COLOR(CrossfadeEditorBase,"crossfade editor base", "colorDdark", HSV(0.545455,-0.547945,-0.713725,1)) /*0.545455 */
+CANVAS_COLOR(CrossfadeEditorLine,"crossfade editor line", "colorA", HSV(0,-1,-1,1)) /*0 */
+CANVAS_COLOR(CrossfadeEditorLineShading,"crossfade editor line shading", "colorDlight", HSV(0.0861244,0,-0.180392,0.329412)) /*0.0861244 */
+CANVAS_COLOR(CrossfadeEditorPointFill,"crossfade editor point fill", "colorC", HSV(0.117647,0,0,1)) /*0.117647 */
+CANVAS_COLOR(CrossfadeEditorPointOutline,"crossfade editor point outline", "colorDdark", HSV(-0.117647,0,0,1)) /*0.117647 */
+CANVAS_COLOR(CrossfadeEditorWave,"crossfade editor wave", "colorA", HSV(0,-1,0,0.156863)) /*0 */
+CANVAS_COLOR(SelectedCrossfadeEditorWaveFill,"selected crossfade editor wave fill", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(CrossfadeLine,"crossfade line", "colorA", HSV(0,-1,-1,1)) /*0 */
+CANVAS_COLOR(EditPoint,"edit point", "colorDdark", HSV(-0.117647,0,0,1)) /*0.117647 */
+CANVAS_COLOR(EnteredAutomationLine,"entered automation line", "colorA", HSV(0,-0.447964,-0.133333,1)) /*0 */
+CANVAS_COLOR(ControlPointFill,"control point fill", "colorA", HSV(0,-1,0,0.4)) /*0 */
+CANVAS_COLOR(ControlPointOutline,"control point outline", "colorA", HSV(0,0,0,0.933333)) /*0 */
+CANVAS_COLOR(ControlPointSelected,"control point selected", "colorD", HSV(0,-0.416667,-0.2,1)) /*0 */
+CANVAS_COLOR(EnteredGainLine,"entered gain line", "colorA", HSV(0,-0.447964,-0.133333,1)) /*0 */
+CANVAS_COLOR(EnteredMarker,"entered marker", "colorA", HSV(0,-0.447964,-0.133333,1)) /*0 */
+CANVAS_COLOR(FrameHandle,"frame handle", "colorDA", HSV(0.117647,0,0,0.588235)) /*0.117647 */
+CANVAS_COLOR(GainLine,"gain line", "colorC", HSV(0.0638298,0,-0.262745,1)) /*0.0638298 */
+CANVAS_COLOR(GainLineInactive,"gain line inactive", "colorC", HSV(0.206897,-0.845745,-0.262745,0.772549)) /*0.206897 */
+CANVAS_COLOR(GhostTrackBase,"ghost track base", "colorDA", HSV(0,-0.5,-0.513725,0.776471)) /*0 */
+CANVAS_COLOR(GhostTrackMidiOutline,"ghost track midi outline", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(GhostTrackWave,"ghost track wave", "colorA", HSV(0,-1,-0.87451,0.85098)) /*0 */
+CANVAS_COLOR(GhostTrackWaveFill,"ghost track wave fill", "colorA", HSV(0,-1,-0.87451,0.376471)) /*0 */
+CANVAS_COLOR(GhostTrackWaveClip,"ghost track wave clip", "colorA", HSV(0,-1,-0.87451,0.85098)) /*0 */
+CANVAS_COLOR(GhostTrackZeroLine,"ghost track zero line", "colorAlight", HSV(0.0262009,0,-0.101961,0.4)) /*0.0262009 */
+CANVAS_COLOR(ImageTrack,"image track", "colorB", HSV(-6,-0.977376,-0.133333,1)) /*6 */
+CANVAS_COLOR(InactiveCrossfade,"inactive crossfade", "colorB", HSV(-0.136364,-0.257384,-0.0705882,0.466667)) /*0.136364 */
+CANVAS_COLOR(InactiveFadeHandle,"inactive fade handle", "colorA", HSV(0,-1,-0.266667,0.666667)) /*0 */
+CANVAS_COLOR(InactiveGroupTab,"inactive group tab", "colorA", HSV(0,-1,-0.737255,1)) /*0 */
+CANVAS_COLOR(LocationCDMarker,"location cd marker", "colorCD", HSV(-0.118812,-0.12931,-0.0901961,1)) /*0.118812 */
+CANVAS_COLOR(LocationLoop,"location loop", "colorCD", HSV(-17.8763,-0.353333,-0.411765,1)) /*17.8763 */
+CANVAS_COLOR(LocationMarker,"location marker", "colorB", HSV(17.8943,-0.0696721,-0.0431373,1)) /*17.8943 */
+CANVAS_COLOR(LocationPunch,"location punch", "colorA", HSV(0,-0.467742,-0.513725,1)) /*0 */
+CANVAS_COLOR(LocationRange,"location range", "colorCD", HSV(-17.5102,-0.598361,-0.521569,1)) /*17.5102 */
+CANVAS_COLOR(MarkerBar,"marker bar", "colorDdark", HSV(-18,-0.884393,-0.321569,0.8)) /*18 */
+CANVAS_COLOR(MarkerBarSeparator,"marker bar separator", "colorA", HSV(0,-1,-0.666667,1)) /*0 */
+CANVAS_COLOR(MarkerDragLine,"marker drag line", "colorC", HSV(0.0759494,0,-0.690196,0.976471)) /*0.0759494 */
+CANVAS_COLOR(MarkerLabel,"marker label", "colorA", HSV(0,-1,-1,1)) /*0 */
+CANVAS_COLOR(MarkerTrack,"marker track", "colorB", HSV(-6,-0.977376,-0.133333,1)) /*6 */
+CANVAS_COLOR(MeasureLineBar,"measure line bar", "colorA", HSV(0,-1,0,0.611765)) /*0 */
+CANVAS_COLOR(MeasureLineBeat,"measure line beat", "colorA", HSV(0,-0.975309,-0.364706,0.462745)) /*0 */
+CANVAS_COLOR(MeterBar,"meter bar", "colorDdark", HSV(1.71429,-0.875,-0.560784,0.8)) /*1.71429 */
+CANVAS_COLOR(MeterBridgePeakLabel,"meterbridge peaklabel", "colorA", HSV(0,-0.0666667,0,1)) /*0 */
+CANVAS_COLOR(MeterColorBBC,"meter color BBC", "colorABlight", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(MeterColor0,"meter fill: 0", "colorC", HSV(0.176471,0,-0.466667,1)) /*0.176471 */
+CANVAS_COLOR(MeterColor1,"meter fill: 1", "colorC", HSV(0,0,-0.333333,1)) /*0 */
+CANVAS_COLOR(MeterColor2,"meter fill: 2", "colorC", HSV(0.117647,0,0,1)) /*0.117647 */
+CANVAS_COLOR(MeterColor3,"meter fill: 3", "colorC", HSV(0.117647,0,0,1)) /*0.117647 */
+CANVAS_COLOR(MeterColor4,"meter fill: 4", "colorB", HSV(0.117647,0,0,1)) /*0.117647 */
+CANVAS_COLOR(MeterColor5,"meter fill: 5", "colorB", HSV(0.117647,0,0,1)) /*0.117647 */
+CANVAS_COLOR(MeterColor6,"meter fill: 6", "colorABlight", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(MeterColor7,"meter fill: 7", "colorABlight", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(MeterColor8,"meter fill: 8", "colorA", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(MeterColor9,"meter fill: 9", "colorA", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(MidiMeterColor0,"midi meter fill: 0", "colorClight", HSV(-17.8652,-0.644,-0.0196078,1)) /*17.8652 */
+CANVAS_COLOR(MidiMeterColor1,"midi meter fill: 1", "colorABlight", HSV(-0.102564,-0.516529,-0.0509804,1)) /*0.102564 */
+CANVAS_COLOR(MidiMeterColor2,"midi meter fill: 2", "colorABlight", HSV(-0.102564,-0.516529,-0.0509804,1)) /*0.102564 */
+CANVAS_COLOR(MidiMeterColor3,"midi meter fill: 3", "colorAB", HSV(0.148148,-0.336066,-0.0431373,1)) /*0.148148 */
+CANVAS_COLOR(MidiMeterColor4,"midi meter fill: 4", "colorAB", HSV(0.148148,-0.336066,-0.0431373,1)) /*0.148148 */
+CANVAS_COLOR(MidiMeterColor5,"midi meter fill: 5", "colorAB", HSV(0.0786026,-0.0766129,-0.027451,1)) /*0.0786026 */
+CANVAS_COLOR(MidiMeterColor6,"midi meter fill: 6", "colorAB", HSV(0.0786026,-0.0766129,-0.027451,1)) /*0.0786026 */
+CANVAS_COLOR(MidiMeterColor7,"midi meter fill: 7", "colorC", HSV(0.315789,-0.713568,-0.219608,1)) /*0.315789 */
+CANVAS_COLOR(MidiMeterColor8,"midi meter fill: 8", "colorC", HSV(0.315789,-0.713568,-0.219608,1)) /*0.315789 */
+CANVAS_COLOR(MidiMeterColor9,"midi meter fill: 9", "colorCD", HSV(-17.9016,0,-0.0431373,0)) /*17.9016 */
+CANVAS_COLOR(MeterBackgroundBot,"meter background: bottom", "colorA", HSV(0,-1,-0.8,1)) /*0 */
+CANVAS_COLOR(MeterBackgroundTop,"meter background: top", "colorA", HSV(0,-1,-0.733333,1)) /*0 */
+CANVAS_COLOR(MeterMarker,"meter marker", "colorA", HSV(0,-0.272727,-0.0509804,1)) /*0 */
+CANVAS_COLOR(MidiBusBase,"midi bus base", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(MidiFrameBase,"midi frame base", "colorC", HSV(-16,-0.901639,-0.760784,0.4)) /*16 */
+CANVAS_COLOR(MidiNoteInactiveChannel,"midi note inactive channel", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(MidiNoteColorBase,"midi note color min", "colorClight", HSV(0,-0.5,-0.670588,1)) /*0 */
+CANVAS_COLOR(MidiNoteColorMid,"midi note color mid", "colorClight", HSV(0,-0.5,-0.341176,1)) /*0 */
+CANVAS_COLOR(MidiNoteColorTop,"midi note color max", "colorClight", HSV(-0.23622,-0.501961,0,1)) /*0.23622 */
+CANVAS_COLOR(SelectedMidiNoteColorBase,"selected midi note color min", "colorDdark", HSV(0.285714,-0.588235,-0.8,1)) /*0.285714 */
+CANVAS_COLOR(SelectedMidiNoteColorMid,"selected midi note color mid", "colorDdark", HSV(-0.315789,-0.586957,-0.458824,1)) /*0.315789 */
+CANVAS_COLOR(SelectedMidiNoteColorTop,"selected midi note color max", "colorDdark", HSV(0.0659341,-0.59009,-0.129412,1)) /*0.0659341 */
+CANVAS_COLOR(MidiNoteSelected,"midi note selected", "colorDdark", HSV(-0.233766,-0.698039,0,1)) /*0.233766 */
+CANVAS_COLOR(MidiNoteVelocityText,"midi note velocity text", "colorB", HSV(0.107143,-0.0819672,-0.0431373,0.737255)) /*0.107143 */
+CANVAS_COLOR(MidiPatchChangeFill,"midi patch change fill", "colorDdark", HSV(-18,-0.888889,-0.647059,0.627451)) /*18 */
+CANVAS_COLOR(MidiPatchChangeOutline,"midi patch change outline", "colorDlight", HSV(18,-0.950495,-0.207843,1)) /*18 */
+CANVAS_COLOR(MidiPatchChangeInactiveChannelFill,"midi patch change inactive channel fill", "colorDdark", HSV(-18,-0.888889,-0.647059,0.752941)) /*18 */
+CANVAS_COLOR(MidiPatchChangeInactiveChannelOutline,"midi patch change inactive channel outline", "colorDdark", HSV(-18,-0.761905,-0.835294,0.752941)) /*18 */
+CANVAS_COLOR(MidiSysExFill,"midi sysex fill", "colorB", HSV(0.130435,-0.236515,-0.054902,0.627451)) /*0.130435 */
+CANVAS_COLOR(MidiSysExOutline,"midi sysex outline", "colorDdark", HSV(-0.666667,-0.787736,-0.168627,1)) /*0.666667 */
+CANVAS_COLOR(MidiSelectRectFill,"midi select rect fill", "colorDdark", HSV(-0.0504202,-0.533333,0,0.533333)) /*0.0504202 */
+CANVAS_COLOR(MidiSelectRectOutline,"midi select rect outline", "colorDdark", HSV(0,-0.333333,0,1)) /*0 */
+CANVAS_COLOR(MidiTrackBase,"midi track base", "colorClight", HSV(-0.731707,-0.79902,-0.2,0.372549)) /*0.731707 */
+CANVAS_COLOR(NameHighlightFill,"name highlight fill", "colorDdark", HSV(-0.117647,0,0,1)) /*0.117647 */
+CANVAS_COLOR(NameHighlightOutline,"name highlight outline", "colorDA", HSV(0.117647,0,0,0.588235)) /*0.117647 */
+CANVAS_COLOR(PianoRollBlackOutline,"piano roll black outline", "colorA", HSV(0,-1,-0.0431373,0.462745)) /*0 */
+CANVAS_COLOR(PianoRollBlack,"piano roll black", "colorClight", HSV(1.13687e-13,-0.963636,-0.568627,0.419608)) /*1.13687e-13 */
+CANVAS_COLOR(PianoRollWhite,"piano roll white", "colorC", HSV(-16,-0.96129,-0.392157,0.396078)) /*16 */
+CANVAS_COLOR(PlayHead,"play head", "colorA", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(ProcessorAutomationLine,"processor automation line", "colorDlight", HSV(17.9055,-0.48996,-0.0235294,1)) /*17.9055 */
+CANVAS_COLOR(PunchLine,"punch line", "colorA", HSV(0,0,-0.341176,1)) /*0 */
+CANVAS_COLOR(RangeDragBarRect,"range drag bar rect", "colorA", HSV(0,-1,-0.411765,0.776471)) /*0 */
+CANVAS_COLOR(RangeDragRect,"range drag rect", "colorC", HSV(17.8235,-0.656566,-0.223529,0.776471)) /*17.8235 */
+CANVAS_COLOR(RangeMarkerBar,"range marker bar", "colorDdark", HSV(2,-0.892857,-0.45098,0.8)) /*2 */
+CANVAS_COLOR(RecordingRect,"recording rect", "colorA", HSV(0,-0.196078,-0.2,1)) /*0 */
+CANVAS_COLOR(RecWaveFormFill,"recorded waveform fill", "colorA", HSV(0,-1,0,0.85098)) /*0 */
+CANVAS_COLOR(RecWaveForm,"recorded waveform outline", "colorDdark", HSV(-1.5,-0.483871,-0.878431,1)) /*1.5 */
+CANVAS_COLOR(RubberBandRect,"rubber band rect", "colorA", HSV(0,-1,-0.223529,0.34902)) /*0 */
+CANVAS_COLOR(RulerBase,"ruler base", "colorA", HSV(0,-0.75,-0.827451,1)) /*0 */
+CANVAS_COLOR(RulerText,"ruler text", "colorA", HSV(0,-1,-0.101961,1)) /*0 */
+CANVAS_COLOR(SelectedCrossfadeEditorLine,"selected crossfade editor line", "colorD", HSV(0,0,-0.141176,1)) /*0 */
+CANVAS_COLOR(SelectedCrossfadeEditorWave,"selected crossfade editor wave", "colorB", HSV(-0.0262009,-0.0803213,-0.0235294,0.627451)) /*0.0262009 */
+CANVAS_COLOR(SelectedFrameBase,"selected region base", "colorDlight", HSV(15.3333,-0.907216,-0.619608,1)) /*15.3333 */
+CANVAS_COLOR(SelectedWaveFormFill,"selected waveform fill", "colorABlight", HSV(0,0,0,0.85098)) /*0 */
+CANVAS_COLOR(SelectedWaveForm,"selected waveform outline", "colorA", HSV(0,-1,-0.941176,0.8)) /*0 */
+CANVAS_COLOR(SelectionRect,"selection rect", "colorClight", HSV(0.909091,-0.864754,-0.0431373,0.466667)) /*0.909091 */
+CANVAS_COLOR(Selection,"selection", "colorA", HSV(0,-1,-0.611765,0.698039)) /*0 */
+CANVAS_COLOR(Shuttle,"shuttle", "colorClight", HSV(0,-0.175824,-0.286275,1)) /*0 */
+CANVAS_COLOR(Silence,"silence", "colorD", HSV(0,-0.619608,0,0.478431)) /*0 */
+CANVAS_COLOR(SilenceText,"silence text", "colorDdark", HSV(17.7647,-0.0555556,-0.576471,1)) /*17.7647 */
+CANVAS_COLOR(MonoPannerOutline,"mono panner outline", "colorDdark", HSV(-17.7209,-0.542553,-0.631373,1)) /*17.7209 */
+CANVAS_COLOR(MonoPannerFill,"mono panner fill", "colorDlight", HSV(17.8537,-0.598039,-0.2,0.788235)) /*17.8537 */
+CANVAS_COLOR(MonoPannerText,"mono panner text", "colorA", HSV(0,-1,-1,1)) /*0 */
+CANVAS_COLOR(MonoPannerBackground,"mono panner bg", "colorA", HSV(0,-0.891304,-0.819608,1)) /*0 */
+CANVAS_COLOR(MonoPannerPositionFill,"mono panner position fill", "colorDlight", HSV(17.7895,-0.681564,-0.298039,1)) /*17.7895 */
+CANVAS_COLOR(MonoPannerPositionOutline,"mono panner position outline", "colorDdark", HSV(-17.7209,-0.542553,-0.631373,1)) /*17.7209 */
+CANVAS_COLOR(StereoPannerOutline,"stereo panner outline", "colorDdark", HSV(-17.7209,-0.542553,-0.631373,1)) /*17.7209 */
+CANVAS_COLOR(StereoPannerFill,"stereo panner fill", "colorDlight", HSV(17.8537,-0.598039,-0.2,0.788235)) /*17.8537 */
+CANVAS_COLOR(StereoPannerText,"stereo panner text", "colorA", HSV(0,-1,-1,1)) /*0 */
+CANVAS_COLOR(StereoPannerBackground,"stereo panner bg", "colorA", HSV(0,-0.891304,-0.819608,1)) /*0 */
+CANVAS_COLOR(StereoPannerRule,"stereo panner rule", "colorDdark", HSV(-17.7931,-0.543307,-0.501961,1)) /*17.7931 */
+CANVAS_COLOR(StereoPannerMonoOutline,"stereo panner mono outline", "colorABlight", HSV(0,0,-0.372549,1)) /*0 */
+CANVAS_COLOR(StereoPannerMonoFill,"stereo panner mono fill", "colorAB", HSV(0.139535,-0.446352,-0.0862745,0.792157)) /*0.139535 */
+CANVAS_COLOR(StereoPannerMonoText,"stereo panner mono text", "colorA", HSV(0,-1,-1,1)) /*0 */
+CANVAS_COLOR(StereoPannerMonoBackground,"stereo panner mono bg", "colorA", HSV(0,-0.891304,-0.819608,1)) /*0 */
+CANVAS_COLOR(StereoPannerInvertedOutline,"stereo panner inverted outline", "colorA", HSV(0,0,-0.25098,1)) /*0 */
+CANVAS_COLOR(StereoPannerInvertedFill,"stereo panner inverted fill", "colorA", HSV(0,-0.684211,-0.105882,0.788235)) /*0 */
+CANVAS_COLOR(StereoPannerInvertedText,"stereo panner inverted text", "colorA", HSV(0,-1,-1,1)) /*0 */
+CANVAS_COLOR(StereoPannerInvertedBackground,"stereo panner inverted bg", "colorA", HSV(0,-0.891304,-0.819608,1)) /*0 */
+CANVAS_COLOR(TempoBar,"tempo bar", "colorDdark", HSV(-2,-0.88189,-0.501961,0.8)) /*2 */
+CANVAS_COLOR(TempoMarker,"tempo marker", "colorA", HSV(0,-0.272727,-0.0509804,1)) /*0 */
+CANVAS_COLOR(TimeAxisFrame,"time axis frame", "colorA", HSV(0,-1,-1,1)) /*0 */
+CANVAS_COLOR(SelectedTimeAxisFrame,"selected time axis frame", "colorA", HSV(0,0,-0.0666667,1)) /*0 */
+CANVAS_COLOR(TimeStretchFill,"time stretch fill", "colorA", HSV(0,-0.800885,-0.113725,0.588235)) /*0 */
+CANVAS_COLOR(TimeStretchOutline,"time stretch outline", "colorA", HSV(0,-1,-0.611765,0.588235)) /*0 */
+CANVAS_COLOR(MonitorKnobArcStart,"monitor knob: arc start", "colorDlight", HSV(0.0722892,-0.528409,-0.309804,1)) /*0.0722892 */
+CANVAS_COLOR(MonitorKnobArcEnd,"monitor knob: arc end", "colorDlight", HSV(0.202247,-0.190909,-0.568627,1)) /*0.202247 */
+CANVAS_COLOR(TransportDragRect,"transport drag rect", "colorA", HSV(0,-1,-0.411765,0.776471)) /*0 */
+CANVAS_COLOR(TransportLoopRect,"transport loop rect", "colorC", HSV(0.0674157,-0.252101,-0.533333,0.976471)) /*0.0674157 */
+CANVAS_COLOR(TransportMarkerBar,"transport marker bar", "colorDdark", HSV(1,-0.921053,-0.403922,0.8)) /*1 */
+CANVAS_COLOR(TransportPunchRect,"transport punch rect", "colorA", HSV(0,-0.366972,-0.572549,0.898039)) /*0 */
+CANVAS_COLOR(TrimHandleLocked,"trim handle locked", "colorA", HSV(0,-0.0641026,-0.0823529,0.156863)) /*0 */
+CANVAS_COLOR(TrimHandle,"trim handle", "colorDA", HSV(-18,0,0,0.266667)) /*18 */
+CANVAS_COLOR(VerboseCanvasCursor,"verbose canvas cursor", "colorB", HSV(-0.0287081,-0.180392,0,0.737255)) /*0.0287081 */
+CANVAS_COLOR(VestigialFrame,"vestigial frame", "colorA", HSV(0,-1,-1,0.0588235)) /*0 */
+CANVAS_COLOR(VideoBar,"video timeline bar", "colorA", HSV(0,-1,-0.811765,1)) /*0 */
+CANVAS_COLOR(FrameBase,"region base", "colorDdark", HSV(-17.0769,-0.909722,-0.435294,1)) /*17.0769 */
+CANVAS_COLOR(CoveredRegion,"region area covered by another region", "colorA", HSV(0,-1,-0.686275,0.690196)) /*0 */
+CANVAS_COLOR(WaveForm,"waveform outline", "colorA", HSV(0,-1,-1,1)) /*0 */
+CANVAS_COLOR(WaveFormClip,"clipped waveform", "colorA", HSV(0,0,0,0.898039)) /*0 */
+CANVAS_COLOR(WaveFormFill,"waveform fill", "colorA", HSV(0,-1,0,0.85098)) /*0 */
+CANVAS_COLOR(ZeroLine,"zero line", "colorA", HSV(0,-1,-0.501961,0.878431)) /*0 */
+CANVAS_COLOR(MonitorSectionKnob,"monitor knob", "colorA", HSV(0,-0.941176,-0.666667,1)) /*0 */
+CANVAS_COLOR(ButtonBorder,"border color", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(ProcessorPreFaderFill,"processor prefader: fill", "colorA", HSV(0,-0.444444,-0.470588,1)) /*0 */
+CANVAS_COLOR(ProcessorPreFaderFillActive,"processor prefader: fill active", "colorA", HSV(0,-0.552083,-0.623529,1)) /*0 */
+CANVAS_COLOR(ProcessorPreFaderLED,"processor prefader: led", "colorC", HSV(-17.831,-0.164706,-0.666667,1)) /*17.831 */
+CANVAS_COLOR(ProcessorPreFaderLEDActive,"processor prefader: led active", "colorC", HSV(-18,-0.384236,-0.203922,1)) /*18 */
+CANVAS_COLOR(ProcessorPreFaderText,"processor prefader: text", "colorB", HSV(-2.57143,-0.958824,-0.333333,1)) /*2.57143 */
+CANVAS_COLOR(ProcessorPreFaderTextActive,"processor prefader: text active", "colorB", HSV(6,-0.991597,-0.0666667,1)) /*6 */
+CANVAS_COLOR(ProcessorFaderFill,"processor fader: fill", "colorDlight", HSV(0.0722892,-0.528409,-0.309804,1)) /*0.0722892 */
+CANVAS_COLOR(ProcessorFaderFillActive,"processor fader: fill active", "colorDlight", HSV(0.113208,-0.258741,-0.439216,1)) /*0.113208 */
+CANVAS_COLOR(ProcessorFaderLED,"processor fader: led", "colorC", HSV(-17.831,-0.164706,-0.666667,1)) /*17.831 */
+CANVAS_COLOR(ProcessorFaderLEDActive,"processor fader: led active", "colorC", HSV(-18,-0.384236,-0.203922,1)) /*18 */
+CANVAS_COLOR(ProcessorFaderText,"processor fader: text", "colorB", HSV(-2.57143,-0.958824,-0.333333,1)) /*2.57143 */
+CANVAS_COLOR(ProcessorFaderTextActive,"processor fader: text active", "colorB", HSV(6,-0.991597,-0.0666667,1)) /*6 */
+CANVAS_COLOR(ProcessorPostFaderFill,"processor postfader: fill", "colorClight", HSV(18,-0.666667,-0.647059,1)) /*18 */
+CANVAS_COLOR(ProcessorPostFaderFillActive,"processor postfader: fill active", "colorC", HSV(-0.375,-0.536232,-0.729412,1)) /*0.375 */
+CANVAS_COLOR(ProcessorPostFaderLED,"processor postfader: led", "colorC", HSV(-17.831,-0.164706,-0.666667,1)) /*17.831 */
+CANVAS_COLOR(ProcessorPostFaderLEDActive,"processor postfader: led active", "colorC", HSV(-18,-0.384236,-0.203922,1)) /*18 */
+CANVAS_COLOR(ProcessorPostFaderText,"processor postfader: text", "colorB", HSV(-2.57143,-0.958824,-0.333333,1)) /*2.57143 */
+CANVAS_COLOR(ProcessorPostFaderTextActive,"processor postfader: text active", "colorB", HSV(6,-0.991597,-0.0666667,1)) /*6 */
+CANVAS_COLOR(ProcessorControlButtonFill,"processor control button: fill", "colorA", HSV(0,-1,-0.866667,1)) /*0 */
+CANVAS_COLOR(ProcessorControlButtonFillActive,"processor control button: fill active", "colorA", HSV(0,-1,-0.8,1)) /*0 */
+CANVAS_COLOR(ProcessorControlButtonLED,"processor control button: led", "colorA", HSV(0,-1,-0.937255,1)) /*0 */
+CANVAS_COLOR(ProcessorControlButtonLEDActive,"processor control button: led active", "colorDlight", HSV(0.0722892,-0.528409,-0.309804,1)) /*0.0722892 */
+CANVAS_COLOR(ProcessorControlButtonText,"processor control button: text", "colorA", HSV(0,-1,0,1)) /*0 */
+CANVAS_COLOR(ProcessorControlButtonTextActive,"processor control button: text active", "colorA", HSV(0,-1,0,1)) /*0 */
+CANVAS_COLOR(MonitorButtonFill,"monitor button: fill", "colorDdark", HSV(-2.57143,-0.932692,-0.592157,1)) /*2.57143 */
+CANVAS_COLOR(MonitorButtonFillActive,"monitor button: fill active", "colorABlight", HSV(-0.0625,-0.0253807,-0.227451,1)) /*0.0625 */
+CANVAS_COLOR(MonitorButtonLED,"monitor button: led", "colorA", HSV(0,0,-0.6,1)) /*0 */
+CANVAS_COLOR(MonitorButtonLEDActive,"monitor button: led active", "colorA", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(MonitorButtonText,"monitor button: text", "colorDdark", HSV(-1.05882,-0.921296,-0.152941,1)) /*1.05882 */
+CANVAS_COLOR(MonitorButtonTextActive,"monitor button: text active", "colorA", HSV(0,-1,-0.898039,1)) /*0 */
+CANVAS_COLOR(SoloIsolateButtonFill,"solo isolate: fill", "colorDdark", HSV(-2.57143,-0.932692,-0.592157,1)) /*2.57143 */
+CANVAS_COLOR(SoloIsolateButtonFillActive,"solo isolate: fill active", "colorAB", HSV(-0.857143,-0.837209,-0.662745,1)) /*0.857143 */
+CANVAS_COLOR(SoloIsolateButtonLED,"solo isolate: led", "colorA", HSV(0,0,-0.6,1)) /*0 */
+CANVAS_COLOR(SoloIsolateButtonLEDActive,"solo isolate: led active", "colorA", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(SoloIsolateButtonText,"solo isolate: text", "colorDdark", HSV(-1.05882,-0.921296,-0.152941,1)) /*1.05882 */
+CANVAS_COLOR(SoloIsolateButtonTextActive,"solo isolate: text active", "colorDdark", HSV(-1.05882,-0.921659,-0.14902,1)) /*1.05882 */
+CANVAS_COLOR(SoloSafeButtonFill,"solo safe: fill", "colorDdark", HSV(-2.57143,-0.932692,-0.592157,1)) /*2.57143 */
+CANVAS_COLOR(SoloSafeButtonFillActive,"solo safe: fill active", "colorAB", HSV(-0.857143,-0.837209,-0.662745,1)) /*0.857143 */
+CANVAS_COLOR(SoloSafeButtonLED,"solo safe: led", "colorA", HSV(0,0,-0.6,1)) /*0 */
+CANVAS_COLOR(SoloSafeButtonLEDActive,"solo safe: led active", "colorA", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(SoloSafeButtonText,"solo safe: text", "colorDdark", HSV(-1.05882,-0.921296,-0.152941,1)) /*1.05882 */
+CANVAS_COLOR(SoloSafeButtonTextActive,"solo safe: text active", "colorDdark", HSV(-1.05882,-0.921659,-0.14902,1)) /*1.05882 */
+CANVAS_COLOR(MidiDeviceButtonFill,"midi device: fill", "colorDdark", HSV(-0.666667,-0.903226,-0.635294,1)) /*0.666667 */
+CANVAS_COLOR(MidiDeviceButtonFillActive,"midi device: fill active", "colorDdark", HSV(-2.57143,-0.907895,-0.701961,1)) /*2.57143 */
+CANVAS_COLOR(MidiDeviceButtonLED,"midi device: led", "colorC", HSV(-0.117647,0,-0.6,1)) /*0.117647 */
+CANVAS_COLOR(MidiDeviceButtonLEDActive,"midi device: led active", "colorC", HSV(0.117647,0,0,1)) /*0.117647 */
+CANVAS_COLOR(MidiDeviceButtonText,"midi device: text", "colorDdark", HSV(-1.05882,-0.921296,-0.152941,1)) /*1.05882 */
+CANVAS_COLOR(MidiDeviceButtonTextActive,"midi device: text active", "colorB", HSV(6,-0.991597,-0.0666667,1)) /*6 */
+CANVAS_COLOR(MeterBridgePeakIndicatorFill,"meterbridge peakindicator: fill", "colorA", HSV(0,-1,-0.733333,1)) /*0 */
+CANVAS_COLOR(MeterBridgePeakIndicatorFillActive,"meterbridge peakindicator: fill active", "colorA", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(MeterBridgePeakIndicatorLED,"meterbridge peakindicator: led", "colorA", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(MeterBridgePeakIndicatorLEDActive,"meterbridge peakindicator: led active", "colorA", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(MeterBridgePeakIndicatorText,"meterbridge peakindicator: text", "colorA", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(MeterBridgePeakIndicatorTextActive,"meterbridge peakindicator: text active", "colorA", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(MeterBridgeLabelFill,"meterbridge label: fill", "colorA", HSV(0,-1,-0.733333,1)) /*0 */
+CANVAS_COLOR(MeterBridgeLabelFillActive,"meterbridge label: fill active", "colorA", HSV(0,-1,-0.8,1)) /*0 */
+CANVAS_COLOR(MeterBridgeLabelLED,"meterbridge label: led", "colorA", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(MeterBridgeLabelLEDActive,"meterbridge label: led active", "colorA", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(MeterBridgeLabelText,"meterbridge label: text", "colorDdark", HSV(-1.05882,-0.921296,-0.152941,1)) /*1.05882 */
+CANVAS_COLOR(MeterBridgeLabelTextActive,"meterbridge label: text active", "colorA", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(MonitorSectionCutButtonFill,"monitor section cut: fill", "colorAB", HSV(-0.857143,-0.926316,-0.627451,1)) /*0.857143 */
+CANVAS_COLOR(MonitorSectionCutButtonFillActive,"monitor section cut: fill active", "colorABlight", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(MonitorSectionCutButtonLED,"monitor section cut: led", "colorABlight", HSV(0.226415,-0.253521,-0.721569,1)) /*0.226415 */
+CANVAS_COLOR(MonitorSectionCutButtonLEDActive,"monitor section cut: led active", "colorC", HSV(-18,-0.384236,-0.203922,1)) /*18 */
+CANVAS_COLOR(MonitorSectionCutButtonText,"monitor section cut: text", "colorDdark", HSV(-1.05882,-0.921296,-0.152941,1)) /*1.05882 */
+CANVAS_COLOR(MonitorSectionCutButtonTextActive,"monitor section cut: text active", "colorA", HSV(0,-1,-1,1)) /*0 */
+CANVAS_COLOR(MonitorSectionDimButtonFill,"monitor section dim: fill", "colorAB", HSV(-0.857143,-0.926316,-0.627451,1)) /*0.857143 */
+CANVAS_COLOR(MonitorSectionDimButtonFillActive,"monitor section dim: fill active", "colorABlight", HSV(-0.107143,-0.0218341,-0.101961,1)) /*0.107143 */
+CANVAS_COLOR(MonitorSectionDimButtonLED,"monitor section dim: led", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(MonitorSectionDimButtonLEDActive,"monitor section dim: led active", "colorC", HSV(-18,-0.384236,-0.203922,1)) /*18 */
+CANVAS_COLOR(MonitorSectionDimButtonText,"monitor section dim: text", "colorDdark", HSV(-1.05882,-0.921659,-0.14902,1)) /*1.05882 */
+CANVAS_COLOR(MonitorSectionDimButtonTextActive,"monitor section dim: text active", "colorDdark", HSV(-1.05882,-0.921659,-0.14902,1)) /*1.05882 */
+CANVAS_COLOR(MonitorSectionSoloButtonFill,"monitor section solo: fill", "colorAB", HSV(-0.857143,-0.926316,-0.627451,1)) /*0.857143 */
+CANVAS_COLOR(MonitorSectionSoloButtonFillActive,"monitor section solo: fill active", "colorClight", HSV(-0.160428,0,-0.266667,1)) /*0.160428 */
+CANVAS_COLOR(MonitorSectionSoloButtonLED,"monitor section solo: led", "colorABlight", HSV(0.226415,-0.253521,-0.721569,1)) /*0.226415 */
+CANVAS_COLOR(MonitorSectionSoloButtonLEDActive,"monitor section solo: led active", "colorABlight", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(MonitorSectionSoloButtonText,"monitor section solo: text", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(MonitorSectionSoloButtonTextActive,"monitor section solo: text active", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(MonitorSectionInvertButtonFill,"monitor section invert: fill", "colorAB", HSV(-0.857143,-0.926316,-0.627451,1)) /*0.857143 */
+CANVAS_COLOR(MonitorSectionInvertButtonFillActive,"monitor section invert: fill active", "colorDdark", HSV(0.084507,-0.317308,-0.184314,1)) /*0.084507 */
+CANVAS_COLOR(MonitorSectionInvertButtonLED,"monitor section invert: led", "colorABlight", HSV(0.226415,-0.253521,-0.721569,1)) /*0.226415 */
+CANVAS_COLOR(MonitorSectionInvertButtonLEDActive,"monitor section invert: led active", "colorC", HSV(-18,-0.384236,-0.203922,1)) /*18 */
+CANVAS_COLOR(MonitorSectionInvertButtonText,"monitor section invert: text", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(MonitorSectionInvertButtonTextActive,"monitor section invert: text active", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(MonitorSectionMonoButtonFill,"monitor section mono: fill", "colorAB", HSV(-0.857143,-0.926316,-0.627451,1)) /*0.857143 */
+CANVAS_COLOR(MonitorSectionMonoButtonFillActive,"monitor section mono: fill active", "colorDdark", HSV(0.084507,-0.260417,-0.247059,1)) /*0.084507 */
+CANVAS_COLOR(MonitorSectionMonoButtonLED,"monitor section mono: led", "colorABlight", HSV(0.226415,-0.253521,-0.721569,1)) /*0.226415 */
+CANVAS_COLOR(MonitorSectionMonoButtonLEDActive,"monitor section mono: led active", "colorC", HSV(-18,-0.384236,-0.203922,1)) /*18 */
+CANVAS_COLOR(MonitorSectionMonoButtonText,"monitor section mono: text", "colorDdark", HSV(-1.05882,-0.921296,-0.152941,1)) /*1.05882 */
+CANVAS_COLOR(MonitorSectionMonoButtonTextActive,"monitor section mono: text active", "colorDdark", HSV(-1.05882,-0.921659,-0.14902,1)) /*1.05882 */
+CANVAS_COLOR(MonitorSectionSoloModelButtonFill,"monitor section solo model: fill", "colorAB", HSV(-0.857143,-0.924731,-0.635294,1)) /*0.857143 */
+CANVAS_COLOR(MonitorSectionSoloModelButtonFillActive,"monitor section solo model: fill active", "colorAB", HSV(-0.857143,-0.837209,-0.662745,1)) /*0.857143 */
+CANVAS_COLOR(MonitorSectionSoloModelButtonLED,"monitor section solo model: led", "colorABlight", HSV(-0.303797,0,-0.690196,1)) /*0.303797 */
+CANVAS_COLOR(MonitorSectionSoloModelButtonLEDActive,"monitor section solo model: led active", "colorABlight", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(MonitorSectionSoloModelButtonText,"monitor section solo model: text", "colorDdark", HSV(-1.05882,-0.921296,-0.152941,1)) /*1.05882 */
+CANVAS_COLOR(MonitorSectionSoloModelButtonTextActive,"monitor section solo model: text active", "colorDdark", HSV(-1.05882,-0.921659,-0.14902,1)) /*1.05882 */
+CANVAS_COLOR(MonitorSectionSoloOverrideButtonFill,"monitor solo override: fill", "colorAB", HSV(-0.857143,-0.924731,-0.635294,1)) /*0.857143 */
+CANVAS_COLOR(MonitorSectionSoloOverrideButtonFillActive,"monitor solo override: fill active", "colorAB", HSV(-0.857143,-0.837209,-0.662745,1)) /*0.857143 */
+CANVAS_COLOR(MonitorSectionSoloOverrideButtonLED,"monitor solo override: led", "colorABlight", HSV(-0.303797,0,-0.690196,1)) /*0.303797 */
+CANVAS_COLOR(MonitorSectionSoloOverrideButtonLEDActive,"monitor solo override: led active", "colorABlight", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(MonitorSectionSoloOverrideButtonText,"monitor solo override: text", "colorDdark", HSV(-1.05882,-0.921296,-0.152941,1)) /*1.05882 */
+CANVAS_COLOR(MonitorSectionSoloOverrideButtonTextActive,"monitor solo override: text active", "colorDdark", HSV(-1.05882,-0.921659,-0.14902,1)) /*1.05882 */
+CANVAS_COLOR(MonitorSectionSoloExclusiveButtonFill,"monitor solo exclusive: fill", "colorAB", HSV(-0.857143,-0.924731,-0.635294,1)) /*0.857143 */
+CANVAS_COLOR(MonitorSectionSoloExclusiveButtonFillActive,"monitor solo exclusive: fill active", "colorAB", HSV(2,-0.825581,-0.662745,1)) /*2 */
+CANVAS_COLOR(MonitorSectionSoloExclusiveButtonLED,"monitor solo exclusive: led", "colorABlight", HSV(-0.303797,0,-0.690196,1)) /*0.303797 */
+CANVAS_COLOR(MonitorSectionSoloExclusiveButtonLEDActive,"monitor solo exclusive: led active", "colorABlight", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(MonitorSectionSoloExclusiveButtonText,"monitor solo exclusive: text", "colorDdark", HSV(-1.05882,-0.921296,-0.152941,1)) /*1.05882 */
+CANVAS_COLOR(MonitorSectionSoloExclusiveButtonTextActive,"monitor solo exclusive: text active", "colorDdark", HSV(-1.05882,-0.921659,-0.14902,1)) /*1.05882 */
+CANVAS_COLOR(RudeSoloFill,"rude solo: fill", "colorA", HSV(0,-0.740385,-0.592157,1)) /*0 */
+CANVAS_COLOR(RudeSoloFillActive,"rude solo: fill active", "colorA", HSV(0,-0.119469,-0.113725,1)) /*0 */
+CANVAS_COLOR(RudeSoloLED,"rude solo: led", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(RudeSoloLEDActive,"rude solo: led active", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(RudeSoloText,"rude solo: text", "colorA", HSV(0,-1,-0.411765,1)) /*0 */
+CANVAS_COLOR(RudeSoloTextActive,"rude solo: text active", "colorA", HSV(0,-1,-0.101961,1)) /*0 */
+CANVAS_COLOR(RudeIsolateFill,"rude isolate: fill", "colorDlight", HSV(0.26087,-0.417722,-0.690196,1)) /*0.26087 */
+CANVAS_COLOR(RudeIsolateFillActive,"rude isolate: fill active", "colorDlight", HSV(-0.253521,-0.719368,-0.00784314,1)) /*0.253521 */
+CANVAS_COLOR(RudeIsolateLED,"rude isolate: led", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(RudeIsolateLEDActive,"rude isolate: led active", "colorA", HSV(0,-1,-1,1)) /*0 */
+CANVAS_COLOR(RudeIsolateText,"rude isolate: text", "colorA", HSV(0,-1,-0.407843,1)) /*0 */
+CANVAS_COLOR(RudeIsolateTextActive,"rude isolate: text active", "colorA", HSV(0,-1,-1,1)) /*0 */
+CANVAS_COLOR(RudeAuditionFill,"rude audition: fill", "colorA", HSV(0,-0.740385,-0.592157,1)) /*0 */
+CANVAS_COLOR(RudeAuditionFillActive,"rude audition: fill active", "colorA", HSV(0,-0.119469,-0.113725,1)) /*0 */
+CANVAS_COLOR(RudeAuditionLED,"rude audition: led", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(RudeAuditionLEDActive,"rude audition: led active", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(RudeAuditionText,"rude audition: text", "colorA", HSV(0,-1,-0.407843,1)) /*0 */
+CANVAS_COLOR(RudeAuditionTextActive,"rude audition: text active", "colorA", HSV(0,-1,0,1)) /*0 */
+CANVAS_COLOR(FeedbackAlertFill,"feedback alert: fill", "colorA", HSV(0,-0.740385,-0.592157,1)) /*0 */
+CANVAS_COLOR(FeedbackAlertFillActive,"feedback alert: fill active", "colorA", HSV(0,-0.119469,-0.113725,1)) /*0 */
+CANVAS_COLOR(FeedbackAlertLED,"feedback alert: led", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(FeedbackAlertLEDActive,"feedback alert: led active", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(FeedbackAlertText,"feedback alert: text", "colorA", HSV(0,-1,-0.411765,1)) /*0 */
+CANVAS_COLOR(FeedbackAlertTextActive,"feedback alert: text active", "colorA", HSV(0,-1,-0.101961,1)) /*0 */
+CANVAS_COLOR(InvertButtonFill,"invert button: fill", "colorDdark", HSV(-2.57143,-0.932692,-0.592157,1)) /*2.57143 */
+CANVAS_COLOR(InvertButtonFillActive,"invert button: fill active", "colorDdark", HSV(0.084507,-0.317308,-0.184314,1)) /*0.084507 */
+CANVAS_COLOR(InvertButtonLED,"invert button: led", "colorABlight", HSV(0.226415,-0.253521,-0.721569,1)) /*0.226415 */
+CANVAS_COLOR(InvertButtonLEDActive,"invert button: led active", "colorC", HSV(-18,-0.384236,-0.203922,1)) /*18 */
+CANVAS_COLOR(InvertButtonText,"invert button: text", "colorDdark", HSV(-1.05882,-0.926724,-0.0901961,1)) /*1.05882 */
+CANVAS_COLOR(InvertButtonTextActive,"invert button: text active", "colorA", HSV(0,-1,-0.25098,1)) /*0 */
+CANVAS_COLOR(MuteButtonFill,"mute button: fill", "colorDdark", HSV(-2.57143,-0.932692,-0.592157,1)) /*2.57143 */
+CANVAS_COLOR(MuteButtonFillActive,"mute button: fill active", "colorB", HSV(-0.0962567,0,-0.266667,1)) /*0.0962567 */
+CANVAS_COLOR(MuteButtonLED,"mute button: led", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(MuteButtonLEDActive,"mute button: led active", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(MuteButtonText,"mute button: text", "colorDdark", HSV(-1.05882,-0.921296,-0.152941,1)) /*1.05882 */
+CANVAS_COLOR(MuteButtonTextActive,"mute button: text active", "colorA", HSV(0,-1,-0.901961,1)) /*0 */
+CANVAS_COLOR(SoloButtonFill,"solo button: fill", "colorDdark", HSV(-2.57143,-0.932692,-0.592157,1)) /*2.57143 */
+CANVAS_COLOR(SoloButtonFillActive,"solo button: fill active", "colorClight", HSV(-0.160428,0,-0.266667,1)) /*0.160428 */
+CANVAS_COLOR(SoloButtonLED,"solo button: led", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(SoloButtonLEDActive,"solo button: led active", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(SoloButtonText,"solo button: text", "colorDdark", HSV(-1.05882,-0.921296,-0.152941,1)) /*1.05882 */
+CANVAS_COLOR(SoloButtonTextActive,"solo button: text active", "colorA", HSV(0,-1,-0.901961,1)) /*0 */
+CANVAS_COLOR(RecEnableButtonFill,"record enable button: fill", "colorDdark", HSV(-2.57143,-0.932692,-0.592157,1)) /*2.57143 */
+CANVAS_COLOR(RecEnableButtonFillActive,"record enable button: fill active", "colorA", HSV(0,-0.0773481,-0.290196,1)) /*0 */
+CANVAS_COLOR(RecEnableButtonLED,"record enable button: led", "colorAlight", HSV(36,-0.430894,-0.517647,1)) /*36 */
+CANVAS_COLOR(RecEnableButtonLEDActive,"record enable button: led active", "colorAlight", HSV(35.7391,-0.639216,0,1)) /*35.7391 */
+CANVAS_COLOR(RecEnableButtonText,"record enable button: text", "colorA", HSV(0,-1,-0.352941,1)) /*0 */
+CANVAS_COLOR(RecEnableButtonTextActive,"record enable button: text active", "colorA", HSV(0,-1,-1,1)) /*0 */
+CANVAS_COLOR(SendButtonFill,"send alert button: fill", "colorClight", HSV(2,-0.825581,-0.662745,1)) /*2 */
+CANVAS_COLOR(SendButtonFillActive,"send alert button: fill active", "colorClight", HSV(0.15544,-0.157205,-0.101961,1)) /*0.15544 */
+CANVAS_COLOR(SendButtonLED,"send alert button: led", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(SendButtonLEDActive,"send alert button: led active", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(SendButtonText,"send alert button: text", "colorA", HSV(0,-1,-0.2,1)) /*0 */
+CANVAS_COLOR(SendButtonTextActive,"send alert button: text active", "colorA", HSV(0,-1,-1,1)) /*0 */
+CANVAS_COLOR(TransportButtonFill,"transport button: fill", "colorDdark", HSV(-2.57143,-0.932692,-0.592157,1)) /*2.57143 */
+CANVAS_COLOR(TransportButtonFillActive,"transport button: fill active", "colorC", HSV(-0.110429,0,-0.360784,1)) /*0.110429 */
+CANVAS_COLOR(TransportButtonLED,"transport button: led", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(TransportButtonLEDActive,"transport button: led active", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(TransportButtonText,"transport button: text", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(TransportButtonTextActive,"transport button: text active", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(TransportRecenableButtonFill,"transport recenable button: fill", "colorA", HSV(0,-0.663158,-0.627451,1)) /*0 */
+CANVAS_COLOR(TransportRecenableButtonFillActive,"transport recenable button: fill active", "colorA", HSV(0,-0.0773481,-0.290196,1)) /*0 */
+CANVAS_COLOR(TransportRecenableButtonLED,"transport recenable button: led", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(TransportRecenableButtonLEDActive,"transport recenable button: led active", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(TransportRecenableButtonText,"transport recenable button: text", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(TransportRecenableButtonTextActive,"transport recenable button: text active", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(TransportOptionButtonFill,"transport option button: fill", "colorDdark", HSV(-2.57143,-0.932692,-0.592157,1)) /*2.57143 */
+CANVAS_COLOR(TransportOptionButtonFillActive,"transport option button: fill active", "colorDdark", HSV(-2.57143,-0.91358,-0.682353,1)) /*2.57143 */
+CANVAS_COLOR(TransportOptionButtonLED,"transport option button: led", "colorABlight", HSV(-0.303797,0,-0.690196,1)) /*0.303797 */
+CANVAS_COLOR(TransportOptionButtonLEDActive,"transport option button: led active", "colorABlight", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(TransportOptionButtonText,"transport option button: text", "colorDdark", HSV(-1.05882,-0.926724,-0.0901961,1)) /*1.05882 */
+CANVAS_COLOR(TransportOptionButtonTextActive,"transport option button: text active", "colorDdark", HSV(-1.05882,-0.921659,-0.14902,1)) /*1.05882 */
+CANVAS_COLOR(TransportActiveOptionButtonFill,"transport active option button: fill", "colorDdark", HSV(-2.57143,-0.932692,-0.592157,1)) /*2.57143 */
+CANVAS_COLOR(TransportActiveOptionButtonFillActive,"transport active option button: fill active", "colorC", HSV(-0.110429,0,-0.360784,1)) /*0.110429 */
+CANVAS_COLOR(TransportActiveOptionButtonLED,"transport active option button: led", "colorABlight", HSV(-0.303797,0,-0.690196,1)) /*0.303797 */
+CANVAS_COLOR(TransportActiveOptionButtonLEDActive,"transport active option button: led active", "colorABlight", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(TransportActiveOptionButtonText,"transport active option button: text", "colorDdark", HSV(-1.05882,-0.926724,-0.0901961,1)) /*1.05882 */
+CANVAS_COLOR(TransportActiveOptionButtonTextActive,"transport active option button: text active", "colorA", HSV(0,-1,-1,1)) /*0 */
+CANVAS_COLOR(TrackNumberLabelFill,"tracknumber label: fill", "colorA", HSV(0,-1,-0.733333,1)) /*0 */
+CANVAS_COLOR(TrackNumberLabelFillActive,"tracknumber label: fill active", "colorA", HSV(0,-1,-0.8,1)) /*0 */
+CANVAS_COLOR(TrackNumberLabelLED,"tracknumber label: led", "colorA", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(TrackNumberLabelLEDActive,"tracknumber label: led active", "colorA", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(TrackNumberLabelText,"tracknumber label: text", "colorDdark", HSV(-1.05882,-0.921296,-0.152941,1)) /*1.05882 */
+CANVAS_COLOR(TrackNumberLabelTextActive,"tracknumber label: text active", "colorA", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(PluginBypassButtonFill,"plugin bypass button: fill", "colorAB", HSV(-0.857143,-0.924731,-0.635294,1)) /*0.857143 */
+CANVAS_COLOR(PluginBypassButtonFillActive,"plugin bypass button: fill active", "colorAB", HSV(-0.857143,-0.837209,-0.662745,1)) /*0.857143 */
+CANVAS_COLOR(PluginBypassButtonLED,"plugin bypass button: led", "colorA", HSV(0,0,-0.6,1)) /*0 */
+CANVAS_COLOR(PluginBypassButtonLEDActive,"plugin bypass button: led active", "colorA", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(PluginBypassButtonText,"plugin bypass button: text", "colorDdark", HSV(-1.05882,-0.921296,-0.152941,1)) /*1.05882 */
+CANVAS_COLOR(PluginBypassButtonTextActive,"plugin bypass button: text active", "colorDdark", HSV(-1.05882,-0.921659,-0.14902,1)) /*1.05882 */
+CANVAS_COLOR(PunchButtonFill,"punch button: fill", "colorA", HSV(0,-0.65625,-0.623529,1)) /*0 */
+CANVAS_COLOR(PunchButtonFillActive,"punch button: fill active", "colorA", HSV(0,-0.133333,-0.0588235,1)) /*0 */
+CANVAS_COLOR(PunchButtonLED,"punch button: led", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(PunchButtonLEDActive,"punch button: led active", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(PunchButtonText,"punch button: text", "colorA", HSV(0,-1,-0.352941,1)) /*0 */
+CANVAS_COLOR(PunchButtonTextActive,"punch button: text active", "colorA", HSV(0,-1,-0.152941,1)) /*0 */
+CANVAS_COLOR(MouseModeButtonFill,"mouse mode button: fill", "colorDdark", HSV(-2.57143,-0.932692,-0.592157,1)) /*2.57143 */
+CANVAS_COLOR(MouseModeButtonFillActive,"mouse mode button: fill active", "colorC", HSV(0.0674157,0,-0.301961,1)) /*0.0674157 */
+CANVAS_COLOR(MouseModeButtonLED,"mouse mode button: led", "colorABlight", HSV(-0.303797,0,-0.690196,1)) /*0.303797 */
+CANVAS_COLOR(MouseModeButtonLEDActive,"mouse mode button: led active", "colorABlight", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(MouseModeButtonText,"mouse mode button: text", "colorDdark", HSV(-1.05882,-0.926724,-0.0901961,1)) /*1.05882 */
+CANVAS_COLOR(MouseModeButtonTextActive,"mouse mode button: text active", "colorA", HSV(0,-1,-1,1)) /*0 */
+CANVAS_COLOR(NudgeButtonFill,"nudge button: fill", "colorA", HSV(0,-0.653846,-0.592157,1)) /*0 */
+CANVAS_COLOR(NudgeButtonFillActive,"nudge button: fill active", "colorDdark", HSV(6,-0.927536,-0.729412,1)) /*6 */
+CANVAS_COLOR(NudgeButtonLED,"nudge button: led", "colorABlight", HSV(-0.303797,0,-0.690196,1)) /*0.303797 */
+CANVAS_COLOR(NudgeButtonLEDActive,"nudge button: led active", "colorABlight", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(NudgeButtonText,"nudge button: text", "colorDdark", HSV(-1.05882,-0.921296,-0.152941,1)) /*1.05882 */
+CANVAS_COLOR(NudgeButtonTextActive,"nudge button: text active", "colorDdark", HSV(-1.05882,-0.921659,-0.14902,1)) /*1.05882 */
+CANVAS_COLOR(ZoomButtonFill,"zoom button: fill", "colorDdark", HSV(-2.57143,-0.932692,-0.592157,1)) /*2.57143 */
+CANVAS_COLOR(ZoomButtonFillActive,"zoom button: fill active", "colorC", HSV(-0.110429,0,-0.360784,1)) /*0.110429 */
+CANVAS_COLOR(ZoomButtonLED,"zoom button: led", "colorABlight", HSV(-0.303797,0,-0.690196,1)) /*0.303797 */
+CANVAS_COLOR(ZoomButtonLEDActive,"zoom button: led active", "colorABlight", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(ZoomButtonText,"zoom button: text", "colorDdark", HSV(-1.05882,-0.926724,-0.0901961,1)) /*1.05882 */
+CANVAS_COLOR(ZoomButtonTextActive,"zoom button: text active", "colorA", HSV(0,-1,-1,1)) /*0 */
+CANVAS_COLOR(ZoomMenuFill,"zoom menu: fill", "colorB", HSV(0.375,-0.79085,-0.4,0.313725)) /*0.375 */
+CANVAS_COLOR(ZoomMenuFillActive,"zoom menu: fill active", "colorDdark", HSV(6,-0.927536,-0.729412,1)) /*6 */
+CANVAS_COLOR(ZoomMenuLED,"zoom menu: led", "colorABlight", HSV(-0.303797,0,-0.690196,1)) /*0.303797 */
+CANVAS_COLOR(ZoomMenuLEDActive,"zoom menu: led active", "colorABlight", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(ZoomMenuText,"zoom menu: text", "colorDdark", HSV(-1.05882,-0.926724,-0.0901961,1)) /*1.05882 */
+CANVAS_COLOR(ZoomMenuTextActive,"zoom menu: text active", "colorDdark", HSV(-1.05882,-0.921659,-0.14902,1)) /*1.05882 */
+CANVAS_COLOR(RouteButtonFill,"route button: fill", "colorDdark", HSV(-2.57143,-0.932692,-0.592157,1)) /*2.57143 */
+CANVAS_COLOR(RouteButtonFillActive,"route button: fill active", "colorA", HSV(0,-1,-0.929412,1)) /*0 */
+CANVAS_COLOR(RouteButtonLED,"route button: led", "colorABlight", HSV(-0.303797,0,-0.690196,1)) /*0.303797 */
+CANVAS_COLOR(RouteButtonLEDActive,"route button: led active", "colorABlight", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(RouteButtonText,"route button: text", "colorDdark", HSV(-1.05882,-0.926724,-0.0901961,1)) /*1.05882 */
+CANVAS_COLOR(RouteButtonTextActive,"route button: text active", "colorA", HSV(0,-1,-0.901961,1)) /*0 */
+CANVAS_COLOR(MixerStripButtonFill,"mixer strip button: fill", "colorDdark", HSV(-2.57143,-0.932692,-0.592157,1)) /*2.57143 */
+CANVAS_COLOR(MixerStripButtonFillActive,"mixer strip button: fill active", "colorABlight", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(MixerStripButtonLED,"mixer strip button: led", "colorABlight", HSV(-0.303797,0,-0.690196,1)) /*0.303797 */
+CANVAS_COLOR(MixerStripButtonLEDActive,"mixer strip button: led active", "colorABlight", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(MixerStripButtonText,"mixer strip button: text", "colorDdark", HSV(-1.05882,-0.926724,-0.0901961,1)) /*1.05882 */
+CANVAS_COLOR(MixerStripButtonTextActive,"mixer strip button: text active", "colorA", HSV(0,-1,-1,1)) /*0 */
+CANVAS_COLOR(MixerStripNameButtonFill,"mixer strip name button: fill", "colorDdark", HSV(-2.57143,-0.932692,-0.592157,1)) /*2.57143 */
+CANVAS_COLOR(MixerStripNameButtonFillActive,"mixer strip name button: fill active", "colorA", HSV(0,-1,-0.929412,1)) /*0 */
+CANVAS_COLOR(MixerStripNameButtonLED,"mixer strip name button: led", "colorABlight", HSV(-0.303797,0,-0.690196,1)) /*0.303797 */
+CANVAS_COLOR(MixerStripNameButtonLEDActive,"mixer strip name button: led active", "colorABlight", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(MixerStripNameButtonText,"mixer strip name button: text", "colorDdark", HSV(-1.05882,-0.926724,-0.0901961,1)) /*1.05882 */
+CANVAS_COLOR(MixerStripNameButtonTextActive,"mixer strip name button: text active", "colorDdark", HSV(-1.05882,-0.921659,-0.14902,1)) /*1.05882 */
+CANVAS_COLOR(MidiInputButtonFill,"midi input button: fill", "colorCD", HSV(-2,-0.971154,-0.592157,1)) /*2 */
+CANVAS_COLOR(MidiInputButtonFillActive,"midi input button: fill active", "colorC", HSV(-0.110429,0,-0.360784,1)) /*0.110429 */
+CANVAS_COLOR(MidiInputButtonLED,"midi input button: led", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(MidiInputButtonLEDActive,"midi input button: led active", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(MidiInputButtonText,"midi input button: text", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(MidiInputButtonTextActive,"midi input button: text active", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(LockButtonFill,"lock button: fill", "colorDdark", HSV(-2.57143,-0.932692,-0.592157,1)) /*2.57143 */
+CANVAS_COLOR(LockButtonFillActive,"lock button: fill active", "colorDdark", HSV(6,-0.927536,-0.729412,1)) /*6 */
+CANVAS_COLOR(LockButtonLED,"lock button: led", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(LockButtonLEDActive,"lock button: led active", "colorA", HSV(0,-1,-1,0)) /*0 */
+CANVAS_COLOR(LockButtonText,"lock button: text", "colorDdark", HSV(-0.666667,0,-0.858824,1)) /*0.666667 */
+CANVAS_COLOR(LockButtonTextActive,"lock button: text active", "colorDdark", HSV(-1.05882,-0.921659,-0.14902,1)) /*1.05882 */
+CANVAS_COLOR(GenericButtonFill,"generic button: fill", "colorDdark", HSV(-2.57143,-0.932692,-0.592157,1)) /*2.57143 */
+CANVAS_COLOR(GenericButtonFillActive,"generic button: fill active", "colorA", HSV(0,0,-0.00784314,1)) /*0 */
+CANVAS_COLOR(GenericButtonLED,"generic button: led", "colorDdark", HSV(-0.666667,-0.43038,-0.690196,1)) /*0.666667 */
+CANVAS_COLOR(GenericButtonLEDActive,"generic button: led active", "colorDdark", HSV(0.0271493,-0.133333,0,1)) /*0.0271493 */
+CANVAS_COLOR(GenericButtonText,"generic button: text", "colorDdark", HSV(-1.05882,-0.921296,-0.152941,1)) /*1.05882 */
+CANVAS_COLOR(GenericButtonTextActive,"generic button: text active", "colorA", HSV(0,-1,-0.901961,1)) /*0 */
+CANVAS_COLOR(TransportClockBackground,"transport clock: background", "colorA", HSV(0,-1,-0.85098,1)) /*0 */
+CANVAS_COLOR(TransportClockText,"transport clock: text", "colorClight", HSV(-0.140845,-0.141129,-0.027451,1)) /*0.140845 */
+CANVAS_COLOR(TransportClockEditedText,"transport clock: edited text", "colorABlight", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(TransportClockCursor,"transport clock: cursor", "colorABlight", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(SecondaryClockBackground,"secondary clock: background", "colorA", HSV(0,-1,-0.85098,1)) /*0 */
+CANVAS_COLOR(SecondaryClockText,"secondary clock: text", "colorClight", HSV(-0.140845,-0.141129,-0.027451,1)) /*0.140845 */
+CANVAS_COLOR(SecondaryClockEditedText,"secondary clock: edited text", "colorABlight", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(SecondaryClockCursor,"secondary clock: cursor", "colorABlight", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(TransportDeltaClockBackground,"transport delta clock: background", "colorA", HSV(0,-1,-1,1)) /*0 */
+CANVAS_COLOR(TransportDeltaClockText,"transport delta clock: text", "colorDlight", HSV(-0.222222,-0.564516,-0.027451,1)) /*0.222222 */
+CANVAS_COLOR(TransportDeltaClockEditedText,"transport delta clock: edited text", "colorA", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(TransportDeltaClockCursor,"transport delta clock: cursor", "colorA", HSV(0,0,-0.054902,1)) /*0 */
+CANVAS_COLOR(SecondaryDeltaClockBackground,"secondary delta clock: background", "colorA", HSV(0,-1,-1,1)) /*0 */
+CANVAS_COLOR(SecondaryDeltaClockText,"secondary delta clock: text", "colorDlight", HSV(-0.222222,-0.564516,-0.027451,1)) /*0.222222 */
+CANVAS_COLOR(SecondaryDeltaClockEditedText,"secondary delta clock: edited text", "colorA", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(SecondaryDeltaClockCursor,"secondary delta clock: cursor", "colorA", HSV(0,0,-0.054902,1)) /*0 */
+CANVAS_COLOR(BigClockBackground,"big clock: background", "colorA", HSV(0,-1,-0.992157,1)) /*0 */
+CANVAS_COLOR(BigClockText,"big clock: text", "colorA", HSV(0,-1,-0.0588235,1)) /*0 */
+CANVAS_COLOR(BigClockEditedText,"big clock: edited text", "colorABlight", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(BigClockCursor,"big clock: cursor", "colorABlight", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(BigClockActiveBackground,"big clock active: background", "colorA", HSV(0,-1,-0.992157,1)) /*0 */
+CANVAS_COLOR(BigClockActiveText,"big clock active: text", "colorA", HSV(0,0,-0.054902,1)) /*0 */
+CANVAS_COLOR(BigClockActiveEditedText,"big clock active: edited text", "colorABlight", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(BigClockActiveCursor,"big clock active: cursor", "colorABlight", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(PunchClockBackground,"punch clock: background", "colorA", HSV(0,-1,-1,1)) /*0 */
+CANVAS_COLOR(PunchClockText,"punch clock: text", "colorClight", HSV(0,-0.175824,-0.286275,1)) /*0 */
+CANVAS_COLOR(PunchClockEditedText,"punch clock: edited text", "colorA", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(PunchClockCursor,"punch clock: cursor", "colorA", HSV(0,0,-0.054902,1)) /*0 */
+CANVAS_COLOR(SelectionClockBackground,"selection clock: background", "colorA", HSV(0,-1,-1,1)) /*0 */
+CANVAS_COLOR(SelectionClockText,"selection clock: text", "colorClight", HSV(0,-0.175824,-0.286275,1)) /*0 */
+CANVAS_COLOR(SelectionClockEditedText,"selection clock: edited text", "colorA", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(SelectionClockCursor,"selection clock: cursor", "colorA", HSV(0,0,-0.054902,1)) /*0 */
+CANVAS_COLOR(NudgeClockBackground,"nudge clock: background", "colorA", HSV(0,-1,-0.85098,1)) /*0 */
+CANVAS_COLOR(NudgeClockText,"nudge clock: text", "colorClight", HSV(0,-0.175824,-0.286275,1)) /*0 */
+CANVAS_COLOR(NudgeClockEditedText,"nudge clock: edited text", "colorABlight", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(NudgeClockCursor,"nudge clock: cursor", "colorABlight", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(GenericClockBackground,"clock: background", "colorA", HSV(0,-1,-1,1)) /*0 */
+CANVAS_COLOR(GenericClockText,"clock: text", "colorClight", HSV(0,-0.175824,-0.286275,1)) /*0 */
+CANVAS_COLOR(GenericClockEditedText,"clock: edited text", "colorABlight", HSV(0,0,0,1)) /*0 */
+CANVAS_COLOR(GenericClockCursor,"clock: cursor", "colorABlight", HSV(0,0,0,1)) /*0 */
diff --git a/gtk2_ardour/default_ui_config.in b/gtk2_ardour/default_ui_config.in
index 81bd773e9f..74fc202293 100644
--- a/gtk2_ardour/default_ui_config.in
+++ b/gtk2_ardour/default_ui_config.in
@@ -14,469 +14,6 @@
<Option name="draggable-playhead" value="1"/>
</UI>
<Canvas>
- <Option name="active crossfade" value="20b2af2e"/>
- <Option name="arrange base" value="595959ff"/>
- <Option name="audio bus base" value="73829968"/>
- <Option name="audio master bus base" value="00000000"/>
- <Option name="audio track base" value="9daac468"/>
- <Option name="automation line" value="44bc59ff"/>
- <Option name="automation track fill" value="a0a0ce68"/>
- <Option name="automation track outline" value="282828ff"/>
- <Option name="cd marker bar" value="9496a3cc"/>
- <Option name="crossfade editor base" value="282d49ff"/>
- <Option name="crossfade editor line" value="000000ff"/>
- <Option name="crossfade editor line shading" value="00a0d154"/>
- <Option name="crossfade editor point fill" value="00ff00ff"/>
- <Option name="crossfade editor point outline" value="0000ffff"/>
- <Option name="crossfade editor wave" value="ffffff28"/>
- <Option name="selected crossfade editor wave fill" value="00000000"/>
- <Option name="crossfade line" value="000000ff"/>
- <Option name="edit point" value="0000ffff"/>
- <Option name="entered automation line" value="dd6363ff"/>
- <Option name="control point fill" value="ffffff66"/>
- <Option name="control point outline" value="55ccccff"/>
- <Option name="control point selected" value="ff0000ee"/>
- <Option name="entered gain line" value="dd6363ff"/>
- <Option name="entered marker" value="dd6363ff"/>
- <Option name="frame handle" value="7c00ff96"/>
- <Option name="gain line" value="00bc20ff"/>
- <Option name="gain line inactive" value="9fbca4c5"/>
- <Option name="ghost track base" value="603e7cc6"/>
- <Option name="ghost track midi outline" value="00000000"/>
- <Option name="ghost track wave" value="202020d9"/>
- <Option name="ghost track wave fill" value="20202060"/>
- <Option name="ghost track wave clip" value="202020d9"/>
- <Option name="ghost track zero line" value="e500e566"/>
- <Option name="image track" value="ddddd8ff"/>
- <Option name="inactive crossfade" value="e8ed3d77"/>
- <Option name="inactive fade handle" value="bbbbbbaa"/>
- <Option name="inactive group tab" value="434343ff"/>
- <Option name="location cd marker" value="1ee8c4ff"/>
- <Option name="location loop" value="35964fff"/>
- <Option name="location marker" value="c4f411ff"/>
- <Option name="location punch" value="7c3a3aff"/>
- <Option name="location range" value="497a59ff"/>
- <Option name="marker bar" value="99a1adcc"/>
- <Option name="marker bar separator" value="555555ff"/>
- <Option name="marker drag line" value="004f00f9"/>
- <Option name="marker label" value="000000ff"/>
- <Option name="marker track" value="ddddd8ff"/>
- <Option name="measure line bar" value="ffffff9c"/>
- <Option name="measure line beat" value="a29e9e76"/>
- <Option name="meter bar" value="626470cc"/>
- <Option name="meter fill: 0" value="008800ff"/>
- <Option name="meter fill: 1" value="00aa00ff"/>
- <Option name="meter fill: 2" value="00ff00ff"/>
- <Option name="meter fill: 3" value="00ff00ff"/>
- <Option name="meter fill: 4" value="fff000ff"/>
- <Option name="meter fill: 5" value="fff000ff"/>
- <Option name="meter fill: 6" value="ff8000ff"/>
- <Option name="meter fill: 7" value="ff8000ff"/>
- <Option name="meter fill: 8" value="ff0000ff"/>
- <Option name="meter fill: 9" value="ff0000ff"/>
- <Option name="meter background: bottom" value="333333ff"/>
- <Option name="meter background: top" value="444444ff"/>
- <Option name="midi meter fill: 0" value="effaa1ff"/>
- <Option name="midi meter fill: 1" value="f2c97dff"/>
- <Option name="midi meter fill: 2" value="f2c97dff"/>
- <Option name="midi meter fill: 3" value="f48f52ff"/>
- <Option name="midi meter fill: 4" value="f48f52ff"/>
- <Option name="midi meter fill: 5" value="f83913ff"/>
- <Option name="midi meter fill: 6" value="f83913ff"/>
- <Option name="midi meter fill: 7" value="8fc78eff"/>
- <Option name="midi meter fill: 8" value="8fc78eff"/>
- <Option name="midi meter fill: 9" value="00f45600"/>
- <Option name="meterbridge peakindicator: fill" value="444444ff"/>
- <Option name="meterbridge peakindicator: fill active" value="ff0000ff"/>
- <Option name="meterbridge label: fill" value="444444ff"/>
- <Option name="meterbridge label: fill active" value="333333ff"/>
- <Option name="meterbridge label: text" value="c7c7d8ff"/>
- <Option name="meter marker" value="f2425bff"/>
- <Option name="midi bus base" value="00000000"/>
- <Option name="midi frame base" value="393d3766"/>
- <Option name="midi note inactive channel" value="00000000"/>
- <Option name="midi note color min" value="3f542aff"/>
- <Option name="midi note color mid" value="7ea854ff"/>
- <Option name="midi note color max" value="bfff80ff"/>
- <Option name="selected midi note color min" value="1e1e33ff"/>
- <Option name="selected midi note color mid" value="51518aff"/>
- <Option name="selected midi note color max" value="8383deff"/>
- <Option name="midi note selected" value="b2b2ffff"/>
- <Option name="midi note velocity text" value="f4f214bc"/>
- <Option name="midi patch change fill" value="50555aa0"/>
- <Option name="midi patch change outline" value="c0c5caff"/>
- <Option name="midi patch change inactive channel fill" value="50555ac0"/>
- <Option name="midi patch change inactive channel outline" value="20252ac0"/>
- <Option name="midi sysex fill" value="f1e139a0"/>
- <Option name="midi sysex outline" value="a7a7d4ff"/>
- <Option name="midi select rect fill" value="8888ff88"/>
- <Option name="midi select rect outline" value="5555ffff"/>
- <Option name="midi track base" value="b3cca35f"/>
- <Option name="name highlight fill" value="0000ffff"/>
- <Option name="name highlight outline" value="7c00ff96"/>
- <Option name="piano roll black outline" value="f4f4f476"/>
- <Option name="piano roll black" value="6c6e6a6b"/>
- <Option name="piano roll white" value="979b9565"/>
- <Option name="play head" value="ff0000ff"/>
- <Option name="processor automation line" value="7aa3f9ff"/>
- <Option name="punch line" value="a80000ff"/>
- <Option name="range drag bar rect" value="969696c6"/>
- <Option name="range drag rect" value="82c696c6"/>
- <Option name="range marker bar" value="7d7f8ccc"/>
- <Option name="recording rect" value="cc2828ff"/>
- <Option name="recorded waveform fill" value="ffffffd9"/>
- <Option name="recorded waveform outline" value="0f0f1fff"/>
- <Option name="rubber band rect" value="c6c6c659"/>
- <Option name="ruler base" value="2c2121ff"/>
- <Option name="ruler text" value="e5e5e5ff"/>
- <Option name="selected crossfade editor line" value="00dbdbff"/>
- <Option name="selected crossfade editor wave" value="f9ea14a0"/>
- <Option name="selected region base" value="585c61ff"/>
- <Option name="selected waveform fill" value="ffa500d9"/>
- <Option name="selected waveform outline" value="0f0f0fcc"/>
- <Option name="selection rect" value="e8f4d377"/>
- <Option name="selection" value="636363b2"/>
- <Option name="shuttle" value="6bb620ff"/>
- <Option name="silence" value="9efffd7a"/>
- <Option name="silence text" value="0e066cff"/>
- <Option name="mono panner outline" value="33445eff"/>
- <Option name="mono panner fill" value="7a9bccc9"/>
- <Option name="mono panner text" value="000000ff"/>
- <Option name="mono panner bg" value="2e2929ff"/>
- <Option name="mono panner position fill" value="7a89b3ff"/>
- <Option name="mono panner position outline" value="33445eff"/>
- <Option name="stereo panner outline" value="33445eff"/>
- <Option name="stereo panner fill" value="7a9accc9"/>
- <Option name="stereo panner text" value="000000ff"/>
- <Option name="stereo panner bg" value="2e2929ff"/>
- <Option name="stereo panner rule" value="455c7fff"/>
- <Option name="stereo panner mono outline" value="a05600ff"/>
- <Option name="stereo panner mono fill" value="e99668ca"/>
- <Option name="stereo panner mono text" value="000000ff"/>
- <Option name="stereo panner mono bg" value="2e2929ff"/>
- <Option name="stereo panner inverted outline" value="bf0a00ff"/>
- <Option name="stereo panner inverted fill" value="e4a19cc9"/>
- <Option name="stereo panner inverted text" value="000000ff"/>
- <Option name="stereo panner inverted bg" value="2e2929ff"/>
- <Option name="tempo bar" value="70727fcc"/>
- <Option name="tempo marker" value="f2425bff"/>
- <Option name="time axis frame" value="000000ff"/>
- <Option name="selected time axis frame" value="ee0000ff"/>
- <Option name="time stretch fill" value="e2b5b596"/>
- <Option name="time stretch outline" value="63636396"/>
- <Option name="tracknumber label: fill" value="444444ff"/>
- <Option name="tracknumber label: fill active" value="333333ff"/>
- <Option name="tracknumber label: text" value="c7c7d8ff"/>
- <Option name="transport drag rect" value="969696c6"/>
- <Option name="transport loop rect" value="1e7728f9"/>
- <Option name="transport marker bar" value="8c8e98cc"/>
- <Option name="transport punch rect" value="6d2828e5"/>
- <Option name="trim handle locked" value="ea0f0f28"/>
- <Option name="trim handle" value="1900ff44"/>
- <Option name="verbose canvas cursor" value="fffd2ebc"/>
- <Option name="vestigial frame" value="0000000f"/>
- <Option name="video timeline bar" value="303030ff"/>
- <Option name="region base" value="838890ff"/>
- <Option name="region area covered by another region" value="505050b0"/>
- <Option name="waveform outline" value="000000ff"/>
- <Option name="clipped waveform" value="ff0000e5"/>
- <Option name="waveform fill" value="ffffffd9"/>
- <Option name="zero line" value="7f7f7fe0"/>
- <Option name="zoom rect" value="c6d1b26d"/>
- <Option name="monitor knob" value="555050ff"/>
- <Option name="monitor knob: arc start" value="5d90b0ff"/>
- <Option name="monitor knob: arc end" value="154c6eff"/>
- <Option name="button border" value="000000f0"/>
- <Option name="border color" value="00000000"/>
- <Option name="processor prefader: fill" value="873c3cff"/>
- <Option name="processor prefader: fill active" value="603535ff"/>
- <Option name="processor prefader: led" value="26550eff"/>
- <Option name="processor prefader: led active" value="78cb4eff"/>
- <Option name="processor prefader: text" value="aaaaa3ff"/>
- <Option name="processor prefader: text active" value="eeeeecff"/>
- <Option name="processor fader: fill" value="5d90b0ff"/>
- <Option name="processor fader: fill active" value="256d8fff"/>
- <Option name="processor fader: led" value="26550eff"/>
- <Option name="processor fader: led active" value="78cb4eff"/>
- <Option name="processor fader: text" value="aaaaa3ff"/>
- <Option name="processor fader: text active" value="eeeeecff"/>
- <Option name="processor postfader: fill" value="455a3cff"/>
- <Option name="processor postfader: fill active" value="254528ff"/>
- <Option name="processor postfader: led" value="26550eff"/>
- <Option name="processor postfader: led active" value="78cb4eff"/>
- <Option name="processor postfader: text" value="aaaaa3ff"/>
- <Option name="processor postfader: text active" value="eeeeecff"/>
- <Option name="processor control button: fill" value="222222ff"/>
- <Option name="processor control button: fill active" value="333333ff"/>
- <Option name="processor control button: led" value="101010ff"/>
- <Option name="processor control button: led active" value="5d90b0ff"/>
- <Option name="processor control button: text" value="ffffffff"/>
- <Option name="processor control button: text active" value="ffffffff"/>
- <Option name="midi device: fill" value="54555dff"/>
- <Option name="midi device: fill active" value="45464cff"/>
- <Option name="midi device: led" value="006600ff"/>
- <Option name="midi device: led active" value="00ff00ff"/>
- <Option name="midi device: text" value="c7c7d8ff"/>
- <Option name="midi device: text active" value="eeeeecff"/>
- <Option name="monitor button: fill" value="616268ff"/>
- <Option name="monitor button: fill active" value="c56505ff"/>
- <Option name="monitor button: led" value="660000ff"/>
- <Option name="monitor button: led active" value="ff0000ff"/>
- <Option name="monitor button: text" value="c7c7d8ff"/>
- <Option name="monitor button: text active" value="1a1a1aff"/>
- <Option name="solo isolate: fill" value="616268ff"/>
- <Option name="solo isolate: fill active" value="564d48ff"/>
- <Option name="solo isolate: led" value="660000ff"/>
- <Option name="solo isolate: led active" value="ff0000ff"/>
- <Option name="solo isolate: text" value="c7c7d8ff"/>
- <Option name="solo isolate: text active" value="c8c8d9ff"/>
- <Option name="solo safe: fill" value="616268ff"/>
- <Option name="solo safe: fill active" value="564d48ff"/>
- <Option name="solo safe: led" value="660000ff"/>
- <Option name="solo safe: led active" value="ff0000ff"/>
- <Option name="solo safe: text" value="c7c7d8ff"/>
- <Option name="solo safe: text active" value="c8c8d9ff"/>
- <Option name="meterbridge peaklabel" value="ff1111ff"/>
- <Option name="meter color BBC" value="ffa500ff"/>
- <Option name="monitor section cut: fill" value="5f5a58ff"/>
- <Option name="monitor section cut: fill active" value="ffa500ff"/>
- <Option name="monitor section cut: led" value="473812ff"/>
- <Option name="monitor section cut: led active" value="78cb4eff"/>
- <Option name="monitor section cut: text" value="c7c7d8ff"/>
- <Option name="monitor section cut: text active" value="000000ff"/>
- <Option name="monitor section dim: fill" value="5f5a58ff"/>
- <Option name="monitor section dim: fill active" value="e58505ff"/>
- <Option name="monitor section dim: led" value="00000000"/>
- <Option name="monitor section dim: led active" value="78cb4eff"/>
- <Option name="monitor section dim: text" value="c8c8d9ff"/>
- <Option name="monitor section dim: text active" value="c8c8d9ff"/>
- <Option name="monitor section solo: fill" value="5f5a58ff"/>
- <Option name="monitor section solo: fill active" value="4dbb00ff"/>
- <Option name="monitor section solo: led" value="473812ff"/>
- <Option name="monitor section solo: led active" value="ffa500ff"/>
- <Option name="monitor section solo: text" value="00000000"/>
- <Option name="monitor section solo: text active" value="00000000"/>
- <Option name="monitor section invert: fill" value="5f5a58ff"/>
- <Option name="monitor section invert: fill active" value="4242d0ff"/>
- <Option name="monitor section invert: led" value="473812ff"/>
- <Option name="monitor section invert: led active" value="78cb4eff"/>
- <Option name="monitor section invert: text" value="00000000"/>
- <Option name="monitor section invert: text active" value="00000000"/>
- <Option name="monitor section mono: fill" value="5f5a58ff"/>
- <Option name="monitor section mono: fill active" value="3232c0ff"/>
- <Option name="monitor section mono: led" value="473812ff"/>
- <Option name="monitor section mono: led active" value="78cb4eff"/>
- <Option name="monitor section mono: text" value="c7c7d8ff"/>
- <Option name="monitor section mono: text active" value="c8c8d9ff"/>
- <Option name="monitor section solo model: fill" value="5d5856ff"/>
- <Option name="monitor section solo model: fill active" value="564d48ff"/>
- <Option name="monitor section solo model: led" value="4f3300ff"/>
- <Option name="monitor section solo model: led active" value="ffa500ff"/>
- <Option name="monitor section solo model: text" value="c7c7d8ff"/>
- <Option name="monitor section solo model: text active" value="c8c8d9ff"/>
- <Option name="monitor solo override: fill" value="5d5856ff"/>
- <Option name="monitor solo override: fill active" value="564d48ff"/>
- <Option name="monitor solo override: led" value="4f3300ff"/>
- <Option name="monitor solo override: led active" value="ffa500ff"/>
- <Option name="monitor solo override: text" value="c7c7d8ff"/>
- <Option name="monitor solo override: text active" value="c8c8d9ff"/>
- <Option name="monitor solo exclusive: fill" value="5d5856ff"/>
- <Option name="monitor solo exclusive: fill active" value="564c47ff"/>
- <Option name="monitor solo exclusive: led" value="4f3300ff"/>
- <Option name="monitor solo exclusive: led active" value="ffa500ff"/>
- <Option name="monitor solo exclusive: text" value="c7c7d8ff"/>
- <Option name="monitor solo exclusive: text active" value="c8c8d9ff"/>
- <Option name="rude solo: fill" value="684d4dff"/>
- <Option name="rude solo: fill active" value="e21b1bff"/>
- <Option name="rude solo: led" value="00000000"/>
- <Option name="rude solo: led active" value="00000000"/>
- <Option name="rude solo: text" value="969696ff"/>
- <Option name="rude solo: text active" value="e5e5e5ff"/>
- <Option name="rude isolate: fill" value="21414fff"/>
- <Option name="rude isolate: fill active" value="b6e5fdff"/>
- <Option name="rude isolate: led" value="00000000"/>
- <Option name="rude isolate: led active" value="000000ff"/>
- <Option name="rude isolate: text" value="979797ff"/>
- <Option name="rude isolate: text active" value="000000ff"/>
- <Option name="rude audition: fill" value="684d4dff"/>
- <Option name="rude audition: fill active" value="e21b1bff"/>
- <Option name="rude audition: led" value="00000000"/>
- <Option name="rude audition: led active" value="00000000"/>
- <Option name="rude audition: text" value="979797ff"/>
- <Option name="rude audition: text active" value="ffffffff"/>
- <Option name="feedback alert: fill" value="684d4dff"/>
- <Option name="feedback alert: fill active" value="e21b1bff"/>
- <Option name="feedback alert: led" value="00000000"/>
- <Option name="feedback alert: led active" value="00000000"/>
- <Option name="feedback alert: text" value="969696ff"/>
- <Option name="feedback alert: text active" value="e5e5e5ff"/>
- <Option name="mute button: fill" value="616268ff"/>
- <Option name="mute button: fill active" value="bbbb00ff"/>
- <Option name="mute button: led" value="00000000"/>
- <Option name="mute button: led active" value="00000000"/>
- <Option name="mute button: text" value="c7c7d8ff"/>
- <Option name="mute button: text active" value="191919ff"/>
- <Option name="solo button: fill" value="616268ff"/>
- <Option name="solo button: fill active" value="4dbb00ff"/>
- <Option name="solo button: led" value="00000000"/>
- <Option name="solo button: led active" value="00000000"/>
- <Option name="solo button: text" value="c7c7d8ff"/>
- <Option name="solo button: text active" value="191919ff"/>
- <Option name="invert button: fill" value="616268ff"/>
- <Option name="invert button: fill active" value="4242d0ff"/>
- <Option name="invert button: led" value="473812ff"/>
- <Option name="invert button: led active" value="78cb4eff"/>
- <Option name="invert button: text" value="d7d7e8ff"/>
- <Option name="invert button: text active" value="bfbfbfff"/>
- <Option name="record enable button: fill" value="616268ff"/>
- <Option name="record enable button: fill active" value="b50e0eff"/>
- <Option name="record enable button: led" value="7b3541ff"/>
- <Option name="record enable button: led active" value="ffa3b3ff"/>
- <Option name="record enable button: text" value="a5a5a5ff"/>
- <Option name="record enable button: text active" value="000000ff"/>
- <Option name="generic button: fill" value="616268ff"/>
- <Option name="generic button: fill active" value="fd0000ff"/>
- <Option name="generic button: led" value="22224fff"/>
- <Option name="generic button: led active" value="2222ffff"/>
- <Option name="generic button: text" value="c7c7d8ff"/>
- <Option name="generic button: text active" value="191919ff"/>
- <Option name="send alert button: fill" value="4e5647ff"/>
- <Option name="send alert button: fill active" value="85e524ff"/>
- <Option name="send alert button: led" value="00000000"/>
- <Option name="send alert button: led active" value="00000000"/>
- <Option name="send alert button: text" value="ccccccff"/>
- <Option name="send alert button: text active" value="000000ff"/>
- <Option name="transport button: fill" value="616268ff"/>
- <Option name="transport button: fill active" value="00a300ff"/>
- <Option name="transport button: led" value="00000000"/>
- <Option name="transport button: led active" value="00000000"/>
- <Option name="transport button: text" value="00000000"/>
- <Option name="transport button: text active" value="00000000"/>
- <Option name="transport recenable button: fill" value="5f3f3fff"/>
- <Option name="transport recenable button: fill active" value="b50e0eff"/>
- <Option name="transport recenable button: led" value="00000000"/>
- <Option name="transport recenable button: led active" value="00000000"/>
- <Option name="transport recenable button: text" value="00000000"/>
- <Option name="transport recenable button: text active" value="00000000"/>
- <Option name="transport option button: fill" value="616268ff"/>
- <Option name="transport option button: fill active" value="4a4b51ff"/>
- <Option name="transport option button: led" value="4f3300ff"/>
- <Option name="transport option button: led active" value="ffa500ff"/>
- <Option name="transport option button: text" value="d7d7e8ff"/>
- <Option name="transport option button: text active" value="c8c8d9ff"/>
- <Option name="transport active option button: fill" value="616268ff"/>
- <Option name="transport active option button: fill active" value="00a300ff"/>
- <Option name="transport active option button: led" value="4f3300ff"/>
- <Option name="transport active option button: led active" value="ffa500ff"/>
- <Option name="transport active option button: text" value="d7d7e8ff"/>
- <Option name="transport active option button: text active" value="000000ff"/>
- <Option name="plugin bypass button: fill" value="5d5856ff"/>
- <Option name="plugin bypass button: fill active" value="564d48ff"/>
- <Option name="plugin bypass button: led" value="660000ff"/>
- <Option name="plugin bypass button: led active" value="ff0000ff"/>
- <Option name="plugin bypass button: text" value="c7c7d8ff"/>
- <Option name="plugin bypass button: text active" value="c8c8d9ff"/>
- <Option name="punch button: fill" value="603f3fff"/>
- <Option name="punch button: fill active" value="f03020ff"/>
- <Option name="punch button: led" value="00000000"/>
- <Option name="punch button: led active" value="00000000"/>
- <Option name="punch button: text" value="a5a5a5ff"/>
- <Option name="punch button: text active" value="d8d8d8ff"/>
- <Option name="mouse mode button: fill" value="616268ff"/>
- <Option name="mouse mode button: fill active" value="00b200ff"/>
- <Option name="mouse mode button: led" value="4f3300ff"/>
- <Option name="mouse mode button: led active" value="ffa500ff"/>
- <Option name="mouse mode button: text" value="d7d7e8ff"/>
- <Option name="mouse mode button: text active" value="000000ff"/>
- <Option name="nudge button: fill" value="684744ff"/>
- <Option name="nudge button: fill active" value="404045ff"/>
- <Option name="nudge button: led" value="4f3300ff"/>
- <Option name="nudge button: led active" value="ffa500ff"/>
- <Option name="nudge button: text" value="c7c7d8ff"/>
- <Option name="nudge button: text active" value="c8c8d9ff"/>
- <Option name="zoom menu: fill" value="99997950"/>
- <Option name="zoom menu: fill active" value="404045ff"/>
- <Option name="zoom menu: led" value="4f3300ff"/>
- <Option name="zoom menu: led active" value="ffa500ff"/>
- <Option name="zoom menu: text" value="d7d7e8ff"/>
- <Option name="zoom menu: text active" value="c8c8d9ff"/>
- <Option name="zoom button: fill" value="616268ff"/>
- <Option name="zoom button: fill active" value="00a300ff"/>
- <Option name="zoom button: led" value="4f3300ff"/>
- <Option name="zoom button: led active" value="ffa500ff"/>
- <Option name="zoom button: text" value="d7d7e8ff"/>
- <Option name="zoom button: text active" value="000000ff"/>
- <Option name="route button: fill" value="616268ff"/>
- <Option name="route button: fill active" value="121212ff"/>
- <Option name="route button: led" value="4f3300ff"/>
- <Option name="route button: led active" value="ffa500ff"/>
- <Option name="route button: text" value="d7d7e8ff"/>
- <Option name="route button: text active" value="191919ff"/>
- <Option name="mixer strip button: fill" value="616268ff"/>
- <Option name="mixer strip button: fill active" value="ffa500ff"/>
- <Option name="mixer strip button: led" value="4f3300ff"/>
- <Option name="mixer strip button: led active" value="ffa500ff"/>
- <Option name="mixer strip button: text" value="d7d7e8ff"/>
- <Option name="mixer strip button: text active" value="000000ff"/>
- <Option name="mixer strip name button: fill" value="616268ff"/>
- <Option name="mixer strip name button: fill active" value="121212ff"/>
- <Option name="mixer strip name button: led" value="4f3300ff"/>
- <Option name="mixer strip name button: led active" value="ffa500ff"/>
- <Option name="mixer strip name button: text" value="d7d7e8ff"/>
- <Option name="mixer strip name button: text active" value="c8c8d9ff"/>
- <Option name="midi input button: fill" value="656867ff"/>
- <Option name="midi input button: fill active" value="00a300ff"/>
- <Option name="midi input button: led" value="00000000"/>
- <Option name="midi input button: led active" value="00000000"/>
- <Option name="midi input button: text" value="00000000"/>
- <Option name="midi input button: text active" value="00000000"/>
- <Option name="transport clock: background" value="262626ff"/>
- <Option name="transport clock: text" value="8df823ff"/>
- <Option name="transport clock: edited text" value="ffa500ff"/>
- <Option name="transport clock: cursor" value="ffa500ff"/>
- <Option name="secondary clock: background" value="262626ff"/>
- <Option name="secondary clock: text" value="8df823ff"/>
- <Option name="secondary clock: edited text" value="ffa500ff"/>
- <Option name="secondary clock: cursor" value="ffa500ff"/>
- <Option name="transport delta clock: background" value="000000ff"/>
- <Option name="transport delta clock: edited text" value="ff0000ff"/>
- <Option name="transport delta clock: cursor" value="f11000ff"/>
- <Option name="transport delta clock: text" value="8ce1f8ff"/>
- <Option name="secondary delta clock: edited text" value="ff0000ff"/>
- <Option name="secondary delta clock: cursor" value="f11000ff"/>
- <Option name="secondary delta clock: background" value="000000ff"/>
- <Option name="secondary delta clock: text" value="8ce1f8ff"/>
- <Option name="big clock: background" value="020202ff"/>
- <Option name="big clock: text" value="f0f0f0ff"/>
- <Option name="big clock: edited text" value="ffa500ff"/>
- <Option name="big clock: cursor" value="ffa500ff"/>
- <Option name="big clock active: background" value="020202ff"/>
- <Option name="big clock active: text" value="f11000ff"/>
- <Option name="big clock active: edited text" value="ffa500ff"/>
- <Option name="big clock active: cursor" value="ffa500ff"/>
- <Option name="punch clock: background" value="000000ff"/>
- <Option name="punch clock: text" value="6bb620ff"/>
- <Option name="punch clock: edited text" value="ff0000ff"/>
- <Option name="punch clock: cursor" value="f11000ff"/>
- <Option name="selection clock: background" value="000000ff"/>
- <Option name="selection clock: text" value="6bb620ff"/>
- <Option name="selection clock: edited text" value="ff0000ff"/>
- <Option name="selection clock: cursor" value="f11000ff"/>
- <Option name="nudge clock: background" value="262626ff"/>
- <Option name="nudge clock: text" value="6bb620ff"/>
- <Option name="nudge clock: edited text" value="ffa500ff"/>
- <Option name="nudge clock: cursor" value="ffa500ff"/>
- <Option name="clock: background" value="000000ff"/>
- <Option name="clock: text" value="6bb620ff"/>
- <Option name="clock: edited text" value="ffa500ff"/>
- <Option name="clock: cursor" value="ffa500ff"/>
- <Option name="lock button: fill" value="616268ff"/>
- <Option name="lock button: fill active" value="404045ff"/>
- <Option name="lock button: led" value="00000000"/>
- <Option name="lock button: led active" value="00000000"/>
- <Option name="lock button: text" value="000024ff"/>
- <Option name="lock button: text active" value="c8c8d9ff"/>
-
<Option name="small font" value="@FONT_SMALL@"/>
<Option name="smaller font" value="@FONT_SMALLER@"/>
<Option name="normal font" value="@FONT_NORMAL@"/>
diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc
index 1257c7a6b3..e7e16c8fc6 100644
--- a/gtk2_ardour/level_meter.cc
+++ b/gtk2_ardour/level_meter.cc
@@ -340,7 +340,7 @@ LevelMeterBase::setup_meters (int len, int initial_width, int thin_width)
break;
case MeterIEC2BBC:
c[0] = c[1] = c[2] = c[3] = c[4] = c[5] = c[6] = c[7] = c[8] = c[9] =
- ARDOUR_UI::config()->color_by_name ("meter color BBC");
+ ARDOUR_UI::config()->color ("meter color BBC");
stp[0] = stp[1] = stp[2] = stp[3] = 115.0;
break;
case MeterIEC2EBU:
diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc
index 16036ad83e..0158ff794c 100644
--- a/gtk2_ardour/meter_patterns.cc
+++ b/gtk2_ardour/meter_patterns.cc
@@ -328,7 +328,7 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> typ
cairo_fill (cr);
height = min(max_pattern_metric_size, height);
- uint32_t peakcolor = ARDOUR_UI::config()->color_by_name ("meterbridge peaklabel");
+ uint32_t peakcolor = ARDOUR_UI::config()->color ("meterbridge peaklabel");
for (vector<DataType>::const_iterator i = types.begin(); i != types.end(); ++i) {
@@ -650,7 +650,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
cairo_set_line_width (cr, 1.0);
height = min(max_pattern_metric_size, height);
- uint32_t peakcolor = ARDOUR_UI::config()->color_by_name ("meterbridge peaklabel");
+ uint32_t peakcolor = ARDOUR_UI::config()->color ("meterbridge peaklabel");
Gdk::Color c; // default text color
for (vector<DataType>::const_iterator i = types.begin(); i != types.end(); ++i) {
diff --git a/gtk2_ardour/monitor_section.cc b/gtk2_ardour/monitor_section.cc
index 483933ec5d..1a18c4bc47 100644
--- a/gtk2_ardour/monitor_section.cc
+++ b/gtk2_ardour/monitor_section.cc
@@ -853,9 +853,9 @@ void
MonitorSection::solo_use_pfl ()
{
/* this is driven by a toggle on a radio group, and so is invoked twice,
- once for the item that became inactive and once for the one that became
- active.
- */
+ once for the item that became inactive and once for the one that became
+ active.
+ */
Glib::RefPtr<Action> act = ActionManager::get_action (X_("Solo"), X_("solo-use-pfl"));
if (act) {
diff --git a/gtk2_ardour/stereo_panner.cc b/gtk2_ardour/stereo_panner.cc
index 4492c73cfc..a52e696e90 100644
--- a/gtk2_ardour/stereo_panner.cc
+++ b/gtk2_ardour/stereo_panner.cc
@@ -37,6 +37,8 @@
#include "ardour/panner.h"
#include "ardour/panner_shell.h"
+#include "canvas/colors.h"
+
#include "ardour_ui.h"
#include "global_signals.h"
#include "stereo_panner.h"
@@ -668,7 +670,8 @@ void
StereoPanner::set_colors ()
{
colors[Normal].fill = ARDOUR_UI::config()->get_StereoPannerFill();
- colors[Normal].outline = ARDOUR_UI::config()->get_StereoPannerOutline();
+ // colors[Normal].outline = ARDOUR_UI::config()->get_StereoPannerOutline();
+ colors[Normal].outline = ArdourCanvas::HSV (colors[Normal].fill).outline().color ();
colors[Normal].text = ARDOUR_UI::config()->get_StereoPannerText();
colors[Normal].background = ARDOUR_UI::config()->get_StereoPannerBackground();
colors[Normal].rule = ARDOUR_UI::config()->get_StereoPannerRule();
diff --git a/gtk2_ardour/styles.rc.in b/gtk2_ardour/styles.rc.in
index 7c7f5f9b05..329fdc92ea 100644
--- a/gtk2_ardour/styles.rc.in
+++ b/gtk2_ardour/styles.rc.in
@@ -22,12 +22,6 @@ style "default_button" = "small_text"
{
}
-style "mouse_mode_button" = "default_button"
-{
- bg[ACTIVE] = @@COLPREFIX@_contrasting_indicator
- fg[ACTIVE] = @@COLPREFIX@_darkest
-}
-
style "gain_fader"
{
bg[NORMAL] = shade (0.7, @@COLPREFIX@_bg)
@@ -39,10 +33,6 @@ style "gain_fader"
fg[ACTIVE] = shade(1.4, @@COLPREFIX@_bg)
}
-style "track_rec_enable_button" = "small_button"
-{
-}
-
style "default_menu" = "medium_text"
{
}
@@ -111,106 +101,11 @@ style "processor" = "small_text"
{
}
-style "mixer_invert_button" = "small_button"
-{
- bg[ACTIVE] = @@COLPREFIX@_not_so_bright_indicator
- fg[ACTIVE] = @@COLPREFIX@_darkest
-}
-
-style "monitor_mono_button" = "small_button"
-{
- bg[NORMAL] = mix(0.1,@@COLPREFIX@_mono,@@COLPREFIX@_bg)
- bg[ACTIVE] = @@COLPREFIX@_mono
- fg[ACTIVE] = @@COLPREFIX@_darkest
-}
-
-style "monitor_invert_button" = "small_button"
-{
- bg[NORMAL] = mix(0.1,@@COLPREFIX@_not_so_bright_indicator,@@COLPREFIX@_bg)
- bg[ACTIVE] = @@COLPREFIX@_not_so_bright_indicator
- fg[ACTIVE] = @@COLPREFIX@_darkest
-}
-
-style "monitor_mute_button" = "small_button"
-{
- bg[NORMAL] = mix(0.1,@@COLPREFIX@_mute,@@COLPREFIX@_bg)
- bg[ACTIVE] = @@COLPREFIX@_mute
- fg[ACTIVE] = @@COLPREFIX@_darkest
-}
-
-style "monitor_dim_button" = "small_button"
-{
- bg[NORMAL] = mix(0.1,lighter(@@COLPREFIX@_mute),@@COLPREFIX@_bg)
- bg[ACTIVE] = lighter(@@COLPREFIX@_mute)
- fg[ACTIVE] = @@COLPREFIX@_darkest
-}
-
-style "monitor_iso_button" = "small_button"
-{
- bg[NORMAL] = mix(0.1,@@COLPREFIX@_somewhat_bright_indicator,@@COLPREFIX@_bg)
- bg[ACTIVE] = @@COLPREFIX@_somewhat_bright_indicator
- fg[ACTIVE] = @@COLPREFIX@_darkest
-}
-
style "ruler_label" = "small_bold_text"
{
fg[NORMAL] = @@COLPREFIX@_light_text_on_dark
}
-style "transport_button"
-{
- bg[ACTIVE] = @@COLPREFIX@_contrasting_indicator
- fg[ACTIVE] = @@COLPREFIX@_darkest
-}
-
-style "transport_button_active"
-{
- bg[NORMAL] = @@COLPREFIX@_contrasting_indicator
- bg[ACTIVE] = @@COLPREFIX@_contrasting_indicator
- bg[SELECTED] = @@COLPREFIX@_contrasting_indicator
- bg[PRELIGHT] = @@COLPREFIX@_contrasting_indicator
-
- fg[NORMAL] = @@COLPREFIX@_darkest
- fg[PRELIGHT] = @@COLPREFIX@_darkest
- fg[SELECTED] = @@COLPREFIX@_darkest
- fg[ACTIVE] = @@COLPREFIX@_darkest
-}
-
-style "transport_button_alternate_two"
-{
- fg[SELECTED] = @@COLPREFIX@_darkest
- fg[ACTIVE] = @@COLPREFIX@_darkest
- fg[PRELIGHT] = @@COLPREFIX@_darkest
- fg[NORMAL] = @@COLPREFIX@_darkest
-
- bg[NORMAL] = shade(0.2,@@COLPREFIX@_bright_indicator)
- bg[ACTIVE] = shade(0.2,@@COLPREFIX@_bright_indicator)
- bg[SELECTED] = shade(0.2,@@COLPREFIX@_bright_indicator)
- bg[PRELIGHT] = shade(0.2,@@COLPREFIX@_bright_indicator)
-}
-
-style "transport_rec_button"
-{
- fg[ACTIVE] = @@COLPREFIX@_darkest
- bg[ACTIVE] = darker(@@COLPREFIX@_arm)
-}
-
-style "transport_rec_button_active"
-{
- bg[ACTIVE] = darker(@@COLPREFIX@_arm)
- bg[NORMAL] = darker(@@COLPREFIX@_arm)
- bg[SELECTED] = darker(@@COLPREFIX@_arm)
- bg[PRELIGHT] = darker(@@COLPREFIX@_arm)
-}
-
-style "transport_rec_button_alternate"
-{
- bg[PRELIGHT] = @@COLPREFIX@_arm
- bg[NORMAL] = @@COLPREFIX@_arm
- bg[SELECTED] = @@COLPREFIX@_arm
- bg[ACTIVE] = @@COLPREFIX@_arm
-}
-
style "midi_channel_selector_button"
{
bg[NORMAL] = @@COLPREFIX@_bg
diff --git a/gtk2_ardour/theme_manager.cc b/gtk2_ardour/theme_manager.cc
index 1a5aa0e7ce..9fdf7b24d2 100644
--- a/gtk2_ardour/theme_manager.cc
+++ b/gtk2_ardour/theme_manager.cc
@@ -398,7 +398,7 @@ ThemeManager::setup_theme ()
color_list->clear();
- for (std::map<std::string,ColorVariable<uint32_t> *>::iterator i = ARDOUR_UI::config()->canvas_colors.begin(); i != ARDOUR_UI::config()->canvas_colors.end(); i++) {
+ for (std::map<std::string,ColorVariable<uint32_t> *>::iterator i = ARDOUR_UI::config()->configurable_colors.begin(); i != ARDOUR_UI::config()->configurable_colors.end(); i++) {
ColorVariable<uint32_t>* var = i->second;
diff --git a/gtk2_ardour/time_axis_view_item.cc b/gtk2_ardour/time_axis_view_item.cc
index 5948cebddd..0d5f649a99 100644
--- a/gtk2_ardour/time_axis_view_item.cc
+++ b/gtk2_ardour/time_axis_view_item.cc
@@ -818,7 +818,7 @@ TimeAxisViewItem::set_frame_gradient ()
v = min (1.0, v * (1.0 - ARDOUR_UI::config()->get_timeline_item_gradient_depth()));
- ArdourCanvas::Color darker = ArdourCanvas::hsv_to_color (h, s, v, a);
+ ArdourCanvas::Color darker = ArdourCanvas::hsva_to_color (h, s, v, a);
stops.push_back (std::make_pair (1.0, darker));
frame->set_gradient (stops, true);
diff --git a/gtk2_ardour/ui_config.cc b/gtk2_ardour/ui_config.cc
index 86e08d7fa6..28d7fcc392 100644
--- a/gtk2_ardour/ui_config.cc
+++ b/gtk2_ardour/ui_config.cc
@@ -1,5 +1,5 @@
/*
- Copyright (C) 1999-2006 Paul Davis
+ Copyright (C) 1999-2014 Paul Davis
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -32,6 +32,8 @@
#include "ardour/filesystem_paths.h"
+#include "ardour_ui.h"
+#include "global_signals.h"
#include "ui_config.h"
#include "i18n.h"
@@ -39,33 +41,588 @@
using namespace std;
using namespace PBD;
using namespace ARDOUR;
+using namespace ArdourCanvas;
static const char* ui_config_file_name = "ui_config";
static const char* default_ui_config_file_name = "default_ui_config";
+UIConfiguration* UIConfiguration::_instance = 0;
+
+static std::map<std::string,HSV> full_palette;
+static const double hue_cnt = 18.0;
+
UIConfiguration::UIConfiguration ()
:
#undef UI_CONFIG_VARIABLE
-#undef CANVAS_VARIABLE
#define UI_CONFIG_VARIABLE(Type,var,name,val) var (name,val),
-#define CANVAS_VARIABLE(var,name) var (name),
#define CANVAS_STRING_VARIABLE(var,name) var (name),
#define CANVAS_FONT_VARIABLE(var,name) var (name),
#include "ui_config_vars.h"
#include "canvas_vars.h"
#undef UI_CONFIG_VARIABLE
-#undef CANVAS_VARIABLE
#undef CANVAS_STRING_VARIABLE
#undef CANVAS_FONT_VARIABLE
+
+ /* initialize all the base colors using default
+ colors for now. these will be reset when/if
+ we load the UI config file.
+ */
+
+#undef CANVAS_BASE_COLOR
+#define CANVAS_BASE_COLOR(var,name,val) var (name,val),
+#include "base_colors.h"
+#undef CANVAS_BASE_COLOR
+
+#undef CANVAS_COLOR
+#define CANVAS_COLOR(var,name,base,modifier) var (base,modifier),
+#include "colors.h"
+#undef CANVAS_COLOR
+
_dirty (false)
{
+ _instance = this;
+
+ /* pack all base colors into the configurable color map so that
+ derived colors can use them.
+ */
+
+#undef CANVAS_BASE_COLOR
+#define CANVAS_BASE_COLOR(var,name,color) configurable_colors.insert (make_pair (name,&var));
+#include "base_colors.h"
+#undef CANVAS_BASE_COLOR
+
+#undef CANVAS_COLOR
+#define CANVAS_COLOR(var,name,base,modifier) relative_colors.insert (make_pair (name,var));
+#include "colors.h"
+#undef CANVAS_COLOR
+
+ /* load up full palette with opposites */
+
+ map<string,ColorVariable<uint32_t>*>::iterator f;
+
+ for (f = configurable_colors.begin(); f != configurable_colors.end(); ++f) {
+ /* first the base tone */
+ full_palette.insert (make_pair (f->first, HSV (f->second->get())));
+ /* now its opposite */
+ // full_palette.insert (make_pair (f->first + " opposite", HSV (f->second->get()) + HSV(180.0, 0, 0)));
+ }
+
+ /* now quantize the hues */
+
+ for (map<string,HSV>::iterator fp = full_palette.begin(); fp != full_palette.end(); ++fp) {
+ fp->second.h = hue_cnt * (round (fp->second.h/hue_cnt));
+ }
+
load_state();
+
+ // original_colors ();
+
+ color_compute ();
+
+ ARDOUR_UI_UTILS::ColorsChanged.connect (boost::bind (&UIConfiguration::color_theme_changed, this));
}
UIConfiguration::~UIConfiguration ()
{
}
+void
+UIConfiguration::original_colors ()
+{
+ map<string,HSV> c;
+ c.insert (make_pair ("active crossfade", HSV (0x20b2af2e)));
+ c.insert (make_pair ("arrange base", HSV (0x595959ff)));
+ c.insert (make_pair ("audio bus base", HSV (0x73829968)));
+ c.insert (make_pair ("audio master bus base", HSV (0x00000000)));
+ c.insert (make_pair ("audio track base", HSV (0x9daac468)));
+ c.insert (make_pair ("automation line", HSV (0x44bc59ff)));
+ c.insert (make_pair ("automation track fill", HSV (0xa0a0ce68)));
+ c.insert (make_pair ("automation track outline", HSV (0x282828ff)));
+ c.insert (make_pair ("cd marker bar", HSV (0x9496a3cc)));
+ c.insert (make_pair ("crossfade editor base", HSV (0x282d49ff)));
+ c.insert (make_pair ("crossfade editor line", HSV (0x000000ff)));
+ c.insert (make_pair ("crossfade editor line shading", HSV (0x00a0d154)));
+ c.insert (make_pair ("crossfade editor point fill", HSV (0x00ff00ff)));
+ c.insert (make_pair ("crossfade editor point outline", HSV (0x0000ffff)));
+ c.insert (make_pair ("crossfade editor wave", HSV (0xffffff28)));
+ c.insert (make_pair ("selected crossfade editor wave fill", HSV (0x00000000)));
+ c.insert (make_pair ("crossfade line", HSV (0x000000ff)));
+ c.insert (make_pair ("edit point", HSV (0x0000ffff)));
+ c.insert (make_pair ("entered automation line", HSV (0xdd6363ff)));
+ c.insert (make_pair ("control point fill", HSV (0xffffff66)));
+ c.insert (make_pair ("control point outline", HSV (0xff0000ee)));
+ c.insert (make_pair ("control point selected", HSV (0x55ccccff)));
+ c.insert (make_pair ("entered gain line", HSV (0xdd6363ff)));
+ c.insert (make_pair ("entered marker", HSV (0xdd6363ff)));
+ c.insert (make_pair ("frame handle", HSV (0x7c00ff96)));
+ c.insert (make_pair ("gain line", HSV (0x00bc20ff)));
+ c.insert (make_pair ("gain line inactive", HSV (0x9fbca4c5)));
+ c.insert (make_pair ("ghost track base", HSV (0x603e7cc6)));
+ c.insert (make_pair ("ghost track midi outline", HSV (0x00000000)));
+ c.insert (make_pair ("ghost track wave", HSV (0x202020d9)));
+ c.insert (make_pair ("ghost track wave fill", HSV (0x20202060)));
+ c.insert (make_pair ("ghost track wave clip", HSV (0x202020d9)));
+ c.insert (make_pair ("ghost track zero line", HSV (0xe500e566)));
+ c.insert (make_pair ("image track", HSV (0xddddd8ff)));
+ c.insert (make_pair ("inactive crossfade", HSV (0xe8ed3d77)));
+ c.insert (make_pair ("inactive fade handle", HSV (0xbbbbbbaa)));
+ c.insert (make_pair ("inactive group tab", HSV (0x434343ff)));
+ c.insert (make_pair ("location cd marker", HSV (0x1ee8c4ff)));
+ c.insert (make_pair ("location loop", HSV (0x35964fff)));
+ c.insert (make_pair ("location marker", HSV (0xc4f411ff)));
+ c.insert (make_pair ("location punch", HSV (0x7c3a3aff)));
+ c.insert (make_pair ("location range", HSV (0x497a59ff)));
+ c.insert (make_pair ("marker bar", HSV (0x99a1adcc)));
+ c.insert (make_pair ("marker bar separator", HSV (0x555555ff)));
+ c.insert (make_pair ("marker drag line", HSV (0x004f00f9)));
+ c.insert (make_pair ("marker label", HSV (0x000000ff)));
+ c.insert (make_pair ("marker track", HSV (0xddddd8ff)));
+ c.insert (make_pair ("measure line bar", HSV (0xffffff9c)));
+ c.insert (make_pair ("measure line beat", HSV (0xa29e9e76)));
+ c.insert (make_pair ("meter bar", HSV (0x626470cc)));
+ c.insert (make_pair ("meter fill: 0", HSV (0x008800ff)));
+ c.insert (make_pair ("meter fill: 1", HSV (0x00aa00ff)));
+ c.insert (make_pair ("meter fill: 2", HSV (0x00ff00ff)));
+ c.insert (make_pair ("meter fill: 3", HSV (0x00ff00ff)));
+ c.insert (make_pair ("meter fill: 4", HSV (0xfff000ff)));
+ c.insert (make_pair ("meter fill: 5", HSV (0xfff000ff)));
+ c.insert (make_pair ("meter fill: 6", HSV (0xff8000ff)));
+ c.insert (make_pair ("meter fill: 7", HSV (0xff8000ff)));
+ c.insert (make_pair ("meter fill: 8", HSV (0xff0000ff)));
+ c.insert (make_pair ("meter fill: 9", HSV (0xff0000ff)));
+ c.insert (make_pair ("meter background: bottom", HSV (0x333333ff)));
+ c.insert (make_pair ("meter background: top", HSV (0x444444ff)));
+ c.insert (make_pair ("midi meter fill: 0", HSV (0xeffaa1ff)));
+ c.insert (make_pair ("midi meter fill: 1", HSV (0xf2c97dff)));
+ c.insert (make_pair ("midi meter fill: 2", HSV (0xf2c97dff)));
+ c.insert (make_pair ("midi meter fill: 3", HSV (0xf48f52ff)));
+ c.insert (make_pair ("midi meter fill: 4", HSV (0xf48f52ff)));
+ c.insert (make_pair ("midi meter fill: 5", HSV (0xf83913ff)));
+ c.insert (make_pair ("midi meter fill: 6", HSV (0xf83913ff)));
+ c.insert (make_pair ("midi meter fill: 7", HSV (0x8fc78eff)));
+ c.insert (make_pair ("midi meter fill: 8", HSV (0x8fc78eff)));
+ c.insert (make_pair ("midi meter fill: 9", HSV (0x00f45600)));
+ c.insert (make_pair ("meterbridge peakindicator: fill", HSV (0x444444ff)));
+ c.insert (make_pair ("meterbridge peakindicator: fill active", HSV (0xff0000ff)));
+ c.insert (make_pair ("meterbridge label: fill", HSV (0x444444ff)));
+ c.insert (make_pair ("meterbridge label: fill active", HSV (0x333333ff)));
+ c.insert (make_pair ("meterbridge label: text", HSV (0xc7c7d8ff)));
+ c.insert (make_pair ("meter marker", HSV (0xf2425bff)));
+ c.insert (make_pair ("midi bus base", HSV (0x00000000)));
+ c.insert (make_pair ("midi frame base", HSV (0x393d3766)));
+ c.insert (make_pair ("midi note inactive channel", HSV (0x00000000)));
+ c.insert (make_pair ("midi note color min", HSV (0x3f542aff)));
+ c.insert (make_pair ("midi note color mid", HSV (0x7ea854ff)));
+ c.insert (make_pair ("midi note color max", HSV (0xbfff80ff)));
+ c.insert (make_pair ("selected midi note color min", HSV (0x1e1e33ff)));
+ c.insert (make_pair ("selected midi note color mid", HSV (0x51518aff)));
+ c.insert (make_pair ("selected midi note color max", HSV (0x8383deff)));
+ c.insert (make_pair ("midi note selected", HSV (0xb2b2ffff)));
+ c.insert (make_pair ("midi note velocity text", HSV (0xf4f214bc)));
+ c.insert (make_pair ("midi patch change fill", HSV (0x50555aa0)));
+ c.insert (make_pair ("midi patch change outline", HSV (0xc0c5caff)));
+ c.insert (make_pair ("midi patch change inactive channel fill", HSV (0x50555ac0)));
+ c.insert (make_pair ("midi patch change inactive channel outline", HSV (0x20252ac0)));
+ c.insert (make_pair ("midi sysex fill", HSV (0xf1e139a0)));
+ c.insert (make_pair ("midi sysex outline", HSV (0xa7a7d4ff)));
+ c.insert (make_pair ("midi select rect fill", HSV (0x8888ff88)));
+ c.insert (make_pair ("midi select rect outline", HSV (0x5555ffff)));
+ c.insert (make_pair ("midi track base", HSV (0xb3cca35f)));
+ c.insert (make_pair ("name highlight fill", HSV (0x0000ffff)));
+ c.insert (make_pair ("name highlight outline", HSV (0x7c00ff96)));
+ c.insert (make_pair ("piano roll black outline", HSV (0xf4f4f476)));
+ c.insert (make_pair ("piano roll black", HSV (0x6c6e6a6b)));
+ c.insert (make_pair ("piano roll white", HSV (0x979b9565)));
+ c.insert (make_pair ("play head", HSV (0xff0000ff)));
+ c.insert (make_pair ("processor automation line", HSV (0x7aa3f9ff)));
+ c.insert (make_pair ("punch line", HSV (0xa80000ff)));
+ c.insert (make_pair ("range drag bar rect", HSV (0x969696c6)));
+ c.insert (make_pair ("range drag rect", HSV (0x82c696c6)));
+ c.insert (make_pair ("range marker bar", HSV (0x7d7f8ccc)));
+ c.insert (make_pair ("recording rect", HSV (0xcc2828ff)));
+ c.insert (make_pair ("recorded waveform fill", HSV (0xffffffd9)));
+ c.insert (make_pair ("recorded waveform outline", HSV (0x0f0f1fff)));
+ c.insert (make_pair ("rubber band rect", HSV (0xc6c6c659)));
+ c.insert (make_pair ("ruler base", HSV (0x2c2121ff)));
+ c.insert (make_pair ("ruler text", HSV (0xe5e5e5ff)));
+ c.insert (make_pair ("selected crossfade editor line", HSV (0x00dbdbff)));
+ c.insert (make_pair ("selected crossfade editor wave", HSV (0xf9ea14a0)));
+ c.insert (make_pair ("selected region base", HSV (0x585c61ff)));
+ c.insert (make_pair ("selected waveform fill", HSV (0xffa500d9)));
+ c.insert (make_pair ("selected waveform outline", HSV (0x0f0f0fcc)));
+ c.insert (make_pair ("selection rect", HSV (0xe8f4d377)));
+ c.insert (make_pair ("selection", HSV (0x636363b2)));
+ c.insert (make_pair ("shuttle", HSV (0x6bb620ff)));
+ c.insert (make_pair ("silence", HSV (0x9efffd7a)));
+ c.insert (make_pair ("silence text", HSV (0x0e066cff)));
+ c.insert (make_pair ("mono panner outline", HSV (0x33445eff)));
+ c.insert (make_pair ("mono panner fill", HSV (0x7a9bccc9)));
+ c.insert (make_pair ("mono panner text", HSV (0x000000ff)));
+ c.insert (make_pair ("mono panner bg", HSV (0x2e2929ff)));
+ c.insert (make_pair ("mono panner position fill", HSV (0x7a89b3ff)));
+ c.insert (make_pair ("mono panner position outline", HSV (0x33445eff)));
+ c.insert (make_pair ("stereo panner outline", HSV (0x33445eff)));
+ c.insert (make_pair ("stereo panner fill", HSV (0x7a9accc9)));
+ c.insert (make_pair ("stereo panner text", HSV (0x000000ff)));
+ c.insert (make_pair ("stereo panner bg", HSV (0x2e2929ff)));
+ c.insert (make_pair ("stereo panner rule", HSV (0x455c7fff)));
+ c.insert (make_pair ("stereo panner mono outline", HSV (0xa05600ff)));
+ c.insert (make_pair ("stereo panner mono fill", HSV (0xe99668ca)));
+ c.insert (make_pair ("stereo panner mono text", HSV (0x000000ff)));
+ c.insert (make_pair ("stereo panner mono bg", HSV (0x2e2929ff)));
+ c.insert (make_pair ("stereo panner inverted outline", HSV (0xbf0a00ff)));
+ c.insert (make_pair ("stereo panner inverted fill", HSV (0xe4a19cc9)));
+ c.insert (make_pair ("stereo panner inverted text", HSV (0x000000ff)));
+ c.insert (make_pair ("stereo panner inverted bg", HSV (0x2e2929ff)));
+ c.insert (make_pair ("tempo bar", HSV (0x70727fcc)));
+ c.insert (make_pair ("tempo marker", HSV (0xf2425bff)));
+ c.insert (make_pair ("time axis frame", HSV (0x000000ff)));
+ c.insert (make_pair ("selected time axis frame", HSV (0xee0000ff)));
+ c.insert (make_pair ("time stretch fill", HSV (0xe2b5b596)));
+ c.insert (make_pair ("time stretch outline", HSV (0x63636396)));
+ c.insert (make_pair ("tracknumber label: fill", HSV (0x444444ff)));
+ c.insert (make_pair ("tracknumber label: fill active", HSV (0x333333ff)));
+ c.insert (make_pair ("tracknumber label: text", HSV (0xc7c7d8ff)));
+ c.insert (make_pair ("transport drag rect", HSV (0x969696c6)));
+ c.insert (make_pair ("transport loop rect", HSV (0x1e7728f9)));
+ c.insert (make_pair ("transport marker bar", HSV (0x8c8e98cc)));
+ c.insert (make_pair ("transport punch rect", HSV (0x6d2828e5)));
+ c.insert (make_pair ("trim handle locked", HSV (0xea0f0f28)));
+ c.insert (make_pair ("trim handle", HSV (0x1900ff44)));
+ c.insert (make_pair ("verbose canvas cursor", HSV (0xfffd2ebc)));
+ c.insert (make_pair ("vestigial frame", HSV (0x0000000f)));
+ c.insert (make_pair ("video timeline bar", HSV (0x303030ff)));
+ c.insert (make_pair ("region base", HSV (0x838890ff)));
+ c.insert (make_pair ("region area covered by another region", HSV (0x505050b0)));
+ c.insert (make_pair ("waveform outline", HSV (0x000000ff)));
+ c.insert (make_pair ("clipped waveform", HSV (0xff0000e5)));
+ c.insert (make_pair ("waveform fill", HSV (0xffffffd9)));
+ c.insert (make_pair ("zero line", HSV (0x7f7f7fe0)));
+ c.insert (make_pair ("zoom rect", HSV (0xc6d1b26d)));
+ c.insert (make_pair ("monitor knob", HSV (0x555050ff)));
+ c.insert (make_pair ("monitor knob: arc start", HSV (0x5d90b0ff)));
+ c.insert (make_pair ("monitor knob: arc end", HSV (0x154c6eff)));
+ c.insert (make_pair ("button border", HSV (0x000000f0)));
+ c.insert (make_pair ("border color", HSV (0x00000000)));
+ c.insert (make_pair ("processor prefader: fill", HSV (0x873c3cff)));
+ c.insert (make_pair ("processor prefader: fill active", HSV (0x603535ff)));
+ c.insert (make_pair ("processor prefader: led", HSV (0x26550eff)));
+ c.insert (make_pair ("processor prefader: led active", HSV (0x78cb4eff)));
+ c.insert (make_pair ("processor prefader: text", HSV (0xaaaaa3ff)));
+ c.insert (make_pair ("processor prefader: text active", HSV (0xeeeeecff)));
+ c.insert (make_pair ("processor fader: fill", HSV (0x5d90b0ff)));
+ c.insert (make_pair ("processor fader: fill active", HSV (0x256d8fff)));
+ c.insert (make_pair ("processor fader: led", HSV (0x26550eff)));
+ c.insert (make_pair ("processor fader: led active", HSV (0x78cb4eff)));
+ c.insert (make_pair ("processor fader: text", HSV (0xaaaaa3ff)));
+ c.insert (make_pair ("processor fader: text active", HSV (0xeeeeecff)));
+ c.insert (make_pair ("processor postfader: fill", HSV (0x455a3cff)));
+ c.insert (make_pair ("processor postfader: fill active", HSV (0x254528ff)));
+ c.insert (make_pair ("processor postfader: led", HSV (0x26550eff)));
+ c.insert (make_pair ("processor postfader: led active", HSV (0x78cb4eff)));
+ c.insert (make_pair ("processor postfader: text", HSV (0xaaaaa3ff)));
+ c.insert (make_pair ("processor postfader: text active", HSV (0xeeeeecff)));
+ c.insert (make_pair ("processor control button: fill", HSV (0x222222ff)));
+ c.insert (make_pair ("processor control button: fill active", HSV (0x333333ff)));
+ c.insert (make_pair ("processor control button: led", HSV (0x101010ff)));
+ c.insert (make_pair ("processor control button: led active", HSV (0x5d90b0ff)));
+ c.insert (make_pair ("processor control button: text", HSV (0xffffffff)));
+ c.insert (make_pair ("processor control button: text active", HSV (0xffffffff)));
+ c.insert (make_pair ("midi device: fill", HSV (0x54555dff)));
+ c.insert (make_pair ("midi device: fill active", HSV (0x45464cff)));
+ c.insert (make_pair ("midi device: led", HSV (0x006600ff)));
+ c.insert (make_pair ("midi device: led active", HSV (0x00ff00ff)));
+ c.insert (make_pair ("midi device: text", HSV (0xc7c7d8ff)));
+ c.insert (make_pair ("midi device: text active", HSV (0xeeeeecff)));
+ c.insert (make_pair ("monitor button: fill", HSV (0x616268ff)));
+ c.insert (make_pair ("monitor button: fill active", HSV (0xc56505ff)));
+ c.insert (make_pair ("monitor button: led", HSV (0x660000ff)));
+ c.insert (make_pair ("monitor button: led active", HSV (0xff0000ff)));
+ c.insert (make_pair ("monitor button: text", HSV (0xc7c7d8ff)));
+ c.insert (make_pair ("monitor button: text active", HSV (0x1a1a1aff)));
+ c.insert (make_pair ("solo isolate: fill", HSV (0x616268ff)));
+ c.insert (make_pair ("solo isolate: fill active", HSV (0x564d48ff)));
+ c.insert (make_pair ("solo isolate: led", HSV (0x660000ff)));
+ c.insert (make_pair ("solo isolate: led active", HSV (0xff0000ff)));
+ c.insert (make_pair ("solo isolate: text", HSV (0xc7c7d8ff)));
+ c.insert (make_pair ("solo isolate: text active", HSV (0xc8c8d9ff)));
+ c.insert (make_pair ("solo safe: fill", HSV (0x616268ff)));
+ c.insert (make_pair ("solo safe: fill active", HSV (0x564d48ff)));
+ c.insert (make_pair ("solo safe: led", HSV (0x660000ff)));
+ c.insert (make_pair ("solo safe: led active", HSV (0xff0000ff)));
+ c.insert (make_pair ("solo safe: text", HSV (0xc7c7d8ff)));
+ c.insert (make_pair ("solo safe: text active", HSV (0xc8c8d9ff)));
+ c.insert (make_pair ("meterbridge peaklabel", HSV (0xff1111ff)));
+ c.insert (make_pair ("meter color BBC", HSV (0xffa500ff)));
+ c.insert (make_pair ("monitor section cut: fill", HSV (0x5f5a58ff)));
+ c.insert (make_pair ("monitor section cut: fill active", HSV (0xffa500ff)));
+ c.insert (make_pair ("monitor section cut: led", HSV (0x473812ff)));
+ c.insert (make_pair ("monitor section cut: led active", HSV (0x78cb4eff)));
+ c.insert (make_pair ("monitor section cut: text", HSV (0xc7c7d8ff)));
+ c.insert (make_pair ("monitor section cut: text active", HSV (0x000000ff)));
+ c.insert (make_pair ("monitor section dim: fill", HSV (0x5f5a58ff)));
+ c.insert (make_pair ("monitor section dim: fill active", HSV (0xe58505ff)));
+ c.insert (make_pair ("monitor section dim: led", HSV (0x00000000)));
+ c.insert (make_pair ("monitor section dim: led active", HSV (0x78cb4eff)));
+ c.insert (make_pair ("monitor section dim: text", HSV (0xc8c8d9ff)));
+ c.insert (make_pair ("monitor section dim: text active", HSV (0xc8c8d9ff)));
+ c.insert (make_pair ("monitor section solo: fill", HSV (0x5f5a58ff)));
+ c.insert (make_pair ("monitor section solo: fill active", HSV (0x4dbb00ff)));
+ c.insert (make_pair ("monitor section solo: led", HSV (0x473812ff)));
+ c.insert (make_pair ("monitor section solo: led active", HSV (0xffa500ff)));
+ c.insert (make_pair ("monitor section solo: text", HSV (0x00000000)));
+ c.insert (make_pair ("monitor section solo: text active", HSV (0x00000000)));
+ c.insert (make_pair ("monitor section invert: fill", HSV (0x5f5a58ff)));
+ c.insert (make_pair ("monitor section invert: fill active", HSV (0x4242d0ff)));
+ c.insert (make_pair ("monitor section invert: led", HSV (0x473812ff)));
+ c.insert (make_pair ("monitor section invert: led active", HSV (0x78cb4eff)));
+ c.insert (make_pair ("monitor section invert: text", HSV (0x00000000)));
+ c.insert (make_pair ("monitor section invert: text active", HSV (0x00000000)));
+ c.insert (make_pair ("monitor section mono: fill", HSV (0x5f5a58ff)));
+ c.insert (make_pair ("monitor section mono: fill active", HSV (0x3232c0ff)));
+ c.insert (make_pair ("monitor section mono: led", HSV (0x473812ff)));
+ c.insert (make_pair ("monitor section mono: led active", HSV (0x78cb4eff)));
+ c.insert (make_pair ("monitor section mono: text", HSV (0xc7c7d8ff)));
+ c.insert (make_pair ("monitor section mono: text active", HSV (0xc8c8d9ff)));
+ c.insert (make_pair ("monitor section solo model: fill", HSV (0x5d5856ff)));
+ c.insert (make_pair ("monitor section solo model: fill active", HSV (0x564d48ff)));
+ c.insert (make_pair ("monitor section solo model: led", HSV (0x4f3300ff)));
+ c.insert (make_pair ("monitor section solo model: led active", HSV (0xffa500ff)));
+ c.insert (make_pair ("monitor section solo model: text", HSV (0xc7c7d8ff)));
+ c.insert (make_pair ("monitor section solo model: text active", HSV (0xc8c8d9ff)));
+ c.insert (make_pair ("monitor solo override: fill", HSV (0x5d5856ff)));
+ c.insert (make_pair ("monitor solo override: fill active", HSV (0x564d48ff)));
+ c.insert (make_pair ("monitor solo override: led", HSV (0x4f3300ff)));
+ c.insert (make_pair ("monitor solo override: led active", HSV (0xffa500ff)));
+ c.insert (make_pair ("monitor solo override: text", HSV (0xc7c7d8ff)));
+ c.insert (make_pair ("monitor solo override: text active", HSV (0xc8c8d9ff)));
+ c.insert (make_pair ("monitor solo exclusive: fill", HSV (0x5d5856ff)));
+ c.insert (make_pair ("monitor solo exclusive: fill active", HSV (0x564c47ff)));
+ c.insert (make_pair ("monitor solo exclusive: led", HSV (0x4f3300ff)));
+ c.insert (make_pair ("monitor solo exclusive: led active", HSV (0xffa500ff)));
+ c.insert (make_pair ("monitor solo exclusive: text", HSV (0xc7c7d8ff)));
+ c.insert (make_pair ("monitor solo exclusive: text active", HSV (0xc8c8d9ff)));
+ c.insert (make_pair ("rude solo: fill", HSV (0x684d4dff)));
+ c.insert (make_pair ("rude solo: fill active", HSV (0xe21b1bff)));
+ c.insert (make_pair ("rude solo: led", HSV (0x00000000)));
+ c.insert (make_pair ("rude solo: led active", HSV (0x00000000)));
+ c.insert (make_pair ("rude solo: text", HSV (0x969696ff)));
+ c.insert (make_pair ("rude solo: text active", HSV (0xe5e5e5ff)));
+ c.insert (make_pair ("rude isolate: fill", HSV (0x21414fff)));
+ c.insert (make_pair ("rude isolate: fill active", HSV (0xb6e5fdff)));
+ c.insert (make_pair ("rude isolate: led", HSV (0x00000000)));
+ c.insert (make_pair ("rude isolate: led active", HSV (0x000000ff)));
+ c.insert (make_pair ("rude isolate: text", HSV (0x979797ff)));
+ c.insert (make_pair ("rude isolate: text active", HSV (0x000000ff)));
+ c.insert (make_pair ("rude audition: fill", HSV (0x684d4dff)));
+ c.insert (make_pair ("rude audition: fill active", HSV (0xe21b1bff)));
+ c.insert (make_pair ("rude audition: led", HSV (0x00000000)));
+ c.insert (make_pair ("rude audition: led active", HSV (0x00000000)));
+ c.insert (make_pair ("rude audition: text", HSV (0x979797ff)));
+ c.insert (make_pair ("rude audition: text active", HSV (0xffffffff)));
+ c.insert (make_pair ("feedback alert: fill", HSV (0x684d4dff)));
+ c.insert (make_pair ("feedback alert: fill active", HSV (0xe21b1bff)));
+ c.insert (make_pair ("feedback alert: led", HSV (0x00000000)));
+ c.insert (make_pair ("feedback alert: led active", HSV (0x00000000)));
+ c.insert (make_pair ("feedback alert: text", HSV (0x969696ff)));
+ c.insert (make_pair ("feedback alert: text active", HSV (0xe5e5e5ff)));
+ c.insert (make_pair ("mute button: fill", HSV (0x616268ff)));
+ c.insert (make_pair ("mute button: fill active", HSV (0xbbbb00ff)));
+ c.insert (make_pair ("mute button: led", HSV (0x00000000)));
+ c.insert (make_pair ("mute button: led active", HSV (0x00000000)));
+ c.insert (make_pair ("mute button: text", HSV (0xc7c7d8ff)));
+ c.insert (make_pair ("mute button: text active", HSV (0x191919ff)));
+ c.insert (make_pair ("solo button: fill", HSV (0x616268ff)));
+ c.insert (make_pair ("solo button: fill active", HSV (0x4dbb00ff)));
+ c.insert (make_pair ("solo button: led", HSV (0x00000000)));
+ c.insert (make_pair ("solo button: led active", HSV (0x00000000)));
+ c.insert (make_pair ("solo button: text", HSV (0xc7c7d8ff)));
+ c.insert (make_pair ("solo button: text active", HSV (0x191919ff)));
+ c.insert (make_pair ("invert button: fill", HSV (0x616268ff)));
+ c.insert (make_pair ("invert button: fill active", HSV (0x4242d0ff)));
+ c.insert (make_pair ("invert button: led", HSV (0x473812ff)));
+ c.insert (make_pair ("invert button: led active", HSV (0x78cb4eff)));
+ c.insert (make_pair ("invert button: text", HSV (0xd7d7e8ff)));
+ c.insert (make_pair ("invert button: text active", HSV (0xbfbfbfff)));
+ c.insert (make_pair ("record enable button: fill", HSV (0x616268ff)));
+ c.insert (make_pair ("record enable button: fill active", HSV (0xb50e0eff)));
+ c.insert (make_pair ("record enable button: led", HSV (0x7b3541ff)));
+ c.insert (make_pair ("record enable button: led active", HSV (0xffa3b3ff)));
+ c.insert (make_pair ("record enable button: text", HSV (0xa5a5a5ff)));
+ c.insert (make_pair ("record enable button: text active", HSV (0x000000ff)));
+ c.insert (make_pair ("generic button: fill", HSV (0x616268ff)));
+ c.insert (make_pair ("generic button: fill active", HSV (0xfd0000ff)));
+ c.insert (make_pair ("generic button: led", HSV (0x22224fff)));
+ c.insert (make_pair ("generic button: led active", HSV (0x2222ffff)));
+ c.insert (make_pair ("generic button: text", HSV (0xc7c7d8ff)));
+ c.insert (make_pair ("generic button: text active", HSV (0x191919ff)));
+ c.insert (make_pair ("send alert button: fill", HSV (0x4e5647ff)));
+ c.insert (make_pair ("send alert button: fill active", HSV (0x85e524ff)));
+ c.insert (make_pair ("send alert button: led", HSV (0x00000000)));
+ c.insert (make_pair ("send alert button: led active", HSV (0x00000000)));
+ c.insert (make_pair ("send alert button: text", HSV (0xccccccff)));
+ c.insert (make_pair ("send alert button: text active", HSV (0x000000ff)));
+ c.insert (make_pair ("transport button: fill", HSV (0x616268ff)));
+ c.insert (make_pair ("transport button: fill active", HSV (0x00a300ff)));
+ c.insert (make_pair ("transport button: led", HSV (0x00000000)));
+ c.insert (make_pair ("transport button: led active", HSV (0x00000000)));
+ c.insert (make_pair ("transport button: text", HSV (0x00000000)));
+ c.insert (make_pair ("transport button: text active", HSV (0x00000000)));
+ c.insert (make_pair ("transport recenable button: fill", HSV (0x5f3f3fff)));
+ c.insert (make_pair ("transport recenable button: fill active", HSV (0xb50e0eff)));
+ c.insert (make_pair ("transport recenable button: led", HSV (0x00000000)));
+ c.insert (make_pair ("transport recenable button: led active", HSV (0x00000000)));
+ c.insert (make_pair ("transport recenable button: text", HSV (0x00000000)));
+ c.insert (make_pair ("transport recenable button: text active", HSV (0x00000000)));
+ c.insert (make_pair ("transport option button: fill", HSV (0x616268ff)));
+ c.insert (make_pair ("transport option button: fill active", HSV (0x4a4b51ff)));
+ c.insert (make_pair ("transport option button: led", HSV (0x4f3300ff)));
+ c.insert (make_pair ("transport option button: led active", HSV (0xffa500ff)));
+ c.insert (make_pair ("transport option button: text", HSV (0xd7d7e8ff)));
+ c.insert (make_pair ("transport option button: text active", HSV (0xc8c8d9ff)));
+ c.insert (make_pair ("transport active option button: fill", HSV (0x616268ff)));
+ c.insert (make_pair ("transport active option button: fill active", HSV (0x00a300ff)));
+ c.insert (make_pair ("transport active option button: led", HSV (0x4f3300ff)));
+ c.insert (make_pair ("transport active option button: led active", HSV (0xffa500ff)));
+ c.insert (make_pair ("transport active option button: text", HSV (0xd7d7e8ff)));
+ c.insert (make_pair ("transport active option button: text active", HSV (0x000000ff)));
+ c.insert (make_pair ("plugin bypass button: fill", HSV (0x5d5856ff)));
+ c.insert (make_pair ("plugin bypass button: fill active", HSV (0x564d48ff)));
+ c.insert (make_pair ("plugin bypass button: led", HSV (0x660000ff)));
+ c.insert (make_pair ("plugin bypass button: led active", HSV (0xff0000ff)));
+ c.insert (make_pair ("plugin bypass button: text", HSV (0xc7c7d8ff)));
+ c.insert (make_pair ("plugin bypass button: text active", HSV (0xc8c8d9ff)));
+ c.insert (make_pair ("punch button: fill", HSV (0x603f3fff)));
+ c.insert (make_pair ("punch button: fill active", HSV (0xf03020ff)));
+ c.insert (make_pair ("punch button: led", HSV (0x00000000)));
+ c.insert (make_pair ("punch button: led active", HSV (0x00000000)));
+ c.insert (make_pair ("punch button: text", HSV (0xa5a5a5ff)));
+ c.insert (make_pair ("punch button: text active", HSV (0xd8d8d8ff)));
+ c.insert (make_pair ("mouse mode button: fill", HSV (0x616268ff)));
+ c.insert (make_pair ("mouse mode button: fill active", HSV (0x00b200ff)));
+ c.insert (make_pair ("mouse mode button: led", HSV (0x4f3300ff)));
+ c.insert (make_pair ("mouse mode button: led active", HSV (0xffa500ff)));
+ c.insert (make_pair ("mouse mode button: text", HSV (0xd7d7e8ff)));
+ c.insert (make_pair ("mouse mode button: text active", HSV (0x000000ff)));
+ c.insert (make_pair ("nudge button: fill", HSV (0x684744ff)));
+ c.insert (make_pair ("nudge button: fill active", HSV (0x404045ff)));
+ c.insert (make_pair ("nudge button: led", HSV (0x4f3300ff)));
+ c.insert (make_pair ("nudge button: led active", HSV (0xffa500ff)));
+ c.insert (make_pair ("nudge button: text", HSV (0xc7c7d8ff)));
+ c.insert (make_pair ("nudge button: text active", HSV (0xc8c8d9ff)));
+ c.insert (make_pair ("zoom menu: fill", HSV (0x99997950)));
+ c.insert (make_pair ("zoom menu: fill active", HSV (0x404045ff)));
+ c.insert (make_pair ("zoom menu: led", HSV (0x4f3300ff)));
+ c.insert (make_pair ("zoom menu: led active", HSV (0xffa500ff)));
+ c.insert (make_pair ("zoom menu: text", HSV (0xd7d7e8ff)));
+ c.insert (make_pair ("zoom menu: text active", HSV (0xc8c8d9ff)));
+ c.insert (make_pair ("zoom button: fill", HSV (0x616268ff)));
+ c.insert (make_pair ("zoom button: fill active", HSV (0x00a300ff)));
+ c.insert (make_pair ("zoom button: led", HSV (0x4f3300ff)));
+ c.insert (make_pair ("zoom button: led active", HSV (0xffa500ff)));
+ c.insert (make_pair ("zoom button: text", HSV (0xd7d7e8ff)));
+ c.insert (make_pair ("zoom button: text active", HSV (0x000000ff)));
+ c.insert (make_pair ("route button: fill", HSV (0x616268ff)));
+ c.insert (make_pair ("route button: fill active", HSV (0x121212ff)));
+ c.insert (make_pair ("route button: led", HSV (0x4f3300ff)));
+ c.insert (make_pair ("route button: led active", HSV (0xffa500ff)));
+ c.insert (make_pair ("route button: text", HSV (0xd7d7e8ff)));
+ c.insert (make_pair ("route button: text active", HSV (0x191919ff)));
+ c.insert (make_pair ("mixer strip button: fill", HSV (0x616268ff)));
+ c.insert (make_pair ("mixer strip button: fill active", HSV (0xffa500ff)));
+ c.insert (make_pair ("mixer strip button: led", HSV (0x4f3300ff)));
+ c.insert (make_pair ("mixer strip button: led active", HSV (0xffa500ff)));
+ c.insert (make_pair ("mixer strip button: text", HSV (0xd7d7e8ff)));
+ c.insert (make_pair ("mixer strip button: text active", HSV (0x000000ff)));
+ c.insert (make_pair ("mixer strip name button: fill", HSV (0x616268ff)));
+ c.insert (make_pair ("mixer strip name button: fill active", HSV (0x121212ff)));
+ c.insert (make_pair ("mixer strip name button: led", HSV (0x4f3300ff)));
+ c.insert (make_pair ("mixer strip name button: led active", HSV (0xffa500ff)));
+ c.insert (make_pair ("mixer strip name button: text", HSV (0xd7d7e8ff)));
+ c.insert (make_pair ("mixer strip name button: text active", HSV (0xc8c8d9ff)));
+ c.insert (make_pair ("midi input button: fill", HSV (0x656867ff)));
+ c.insert (make_pair ("midi input button: fill active", HSV (0x00a300ff)));
+ c.insert (make_pair ("midi input button: led", HSV (0x00000000)));
+ c.insert (make_pair ("midi input button: led active", HSV (0x00000000)));
+ c.insert (make_pair ("midi input button: text", HSV (0x00000000)));
+ c.insert (make_pair ("midi input button: text active", HSV (0x00000000)));
+ c.insert (make_pair ("transport clock: background", HSV (0x262626ff)));
+ c.insert (make_pair ("transport clock: text", HSV (0x8df823ff)));
+ c.insert (make_pair ("transport clock: edited text", HSV (0xffa500ff)));
+ c.insert (make_pair ("transport clock: cursor", HSV (0xffa500ff)));
+ c.insert (make_pair ("secondary clock: background", HSV (0x262626ff)));
+ c.insert (make_pair ("secondary clock: text", HSV (0x8df823ff)));
+ c.insert (make_pair ("secondary clock: edited text", HSV (0xffa500ff)));
+ c.insert (make_pair ("secondary clock: cursor", HSV (0xffa500ff)));
+ c.insert (make_pair ("transport delta clock: background", HSV (0x000000ff)));
+ c.insert (make_pair ("transport delta clock: edited text", HSV (0xff0000ff)));
+ c.insert (make_pair ("transport delta clock: cursor", HSV (0xf11000ff)));
+ c.insert (make_pair ("transport delta clock: text", HSV (0x8ce1f8ff)));
+ c.insert (make_pair ("secondary delta clock: edited text", HSV (0xff0000ff)));
+ c.insert (make_pair ("secondary delta clock: cursor", HSV (0xf11000ff)));
+ c.insert (make_pair ("secondary delta clock: background", HSV (0x000000ff)));
+ c.insert (make_pair ("secondary delta clock: text", HSV (0x8ce1f8ff)));
+ c.insert (make_pair ("big clock: background", HSV (0x020202ff)));
+ c.insert (make_pair ("big clock: text", HSV (0xf0f0f0ff)));
+ c.insert (make_pair ("big clock: edited text", HSV (0xffa500ff)));
+ c.insert (make_pair ("big clock: cursor", HSV (0xffa500ff)));
+ c.insert (make_pair ("big clock active: background", HSV (0x020202ff)));
+ c.insert (make_pair ("big clock active: text", HSV (0xf11000ff)));
+ c.insert (make_pair ("big clock active: edited text", HSV (0xffa500ff)));
+ c.insert (make_pair ("big clock active: cursor", HSV (0xffa500ff)));
+ c.insert (make_pair ("punch clock: background", HSV (0x000000ff)));
+ c.insert (make_pair ("punch clock: text", HSV (0x6bb620ff)));
+ c.insert (make_pair ("punch clock: edited text", HSV (0xff0000ff)));
+ c.insert (make_pair ("punch clock: cursor", HSV (0xf11000ff)));
+ c.insert (make_pair ("selection clock: background", HSV (0x000000ff)));
+ c.insert (make_pair ("selection clock: text", HSV (0x6bb620ff)));
+ c.insert (make_pair ("selection clock: edited text", HSV (0xff0000ff)));
+ c.insert (make_pair ("selection clock: cursor", HSV (0xf11000ff)));
+ c.insert (make_pair ("nudge clock: background", HSV (0x262626ff)));
+ c.insert (make_pair ("nudge clock: text", HSV (0x6bb620ff)));
+ c.insert (make_pair ("nudge clock: edited text", HSV (0xffa500ff)));
+ c.insert (make_pair ("nudge clock: cursor", HSV (0xffa500ff)));
+ c.insert (make_pair ("clock: background", HSV (0x000000ff)));
+ c.insert (make_pair ("clock: text", HSV (0x6bb620ff)));
+ c.insert (make_pair ("clock: edited text", HSV (0xffa500ff)));
+ c.insert (make_pair ("clock: cursor", HSV (0xffa500ff)));
+ c.insert (make_pair ("lock button: fill", HSV (0x616268ff)));
+ c.insert (make_pair ("lock button: fill active", HSV (0x404045ff)));
+ c.insert (make_pair ("lock button: led", HSV (0x00000000)));
+ c.insert (make_pair ("lock button: led active", HSV (0x00000000)));
+ c.insert (make_pair ("lock button: text", HSV (0x000024ff)));
+ c.insert (make_pair ("lock button: text active", HSV (0xc8c8d9ff)));
+
+ for (map<string,HSV>::iterator fp = c.begin(); fp != c.end(); ++fp) {
+ const double hue_cnt = 18.0;
+
+ fp->second.h = hue_cnt * (round (fp->second.h/hue_cnt));
+ }
+
+#undef CANVAS_COLOR
+#define CANVAS_COLOR(var,name,base,modifier) print_relative_def (#var,name,c[name]);
+#include "colors.h"
+#undef CANVAS_COLOR
+}
+
+void
+UIConfiguration::color_theme_changed ()
+{
+ map<std::string,RelativeHSV>::iterator current_color;
+
+ /* we need to reset the quantized hues before we start, because
+ * otherwise when we call RelativeHSV::get() in color_compute()
+ * we don't get an answer based on the new base colors, but instead
+ * based on any existing hue quantization.
+ */
+
+ for (current_color = relative_colors.begin(); current_color != relative_colors.end(); ++current_color) {
+ current_color->second.quantized_hue = -1;
+ }
+
+ color_compute ();
+}
+
void
UIConfiguration::map_parameters (boost::function<void (std::string)>& functor)
{
@@ -146,10 +703,9 @@ UIConfiguration::load_state ()
_dirty = false;
}
- if (!found)
+ if (!found) {
error << _("could not find any ui configuration file, canvas will look broken.") << endmsg;
-
- pack_canvasvars();
+ }
return 0;
}
@@ -203,15 +759,12 @@ UIConfiguration::get_variables (std::string which_node)
node = new XMLNode(which_node);
#undef UI_CONFIG_VARIABLE
-#undef CANVAS_VARIABLE
#define UI_CONFIG_VARIABLE(Type,var,Name,value) if (node->name() == "UI") { var.add_to_node (*node); }
-#define CANVAS_VARIABLE(var,Name) if (node->name() == "Canvas") { var.add_to_node (*node); }
#define CANVAS_STRING_VARIABLE(var,Name) if (node->name() == "Canvas") { var.add_to_node (*node); }
#define CANVAS_FONT_VARIABLE(var,Name) if (node->name() == "Canvas") { var.add_to_node (*node); }
#include "ui_config_vars.h"
#include "canvas_vars.h"
#undef UI_CONFIG_VARIABLE
-#undef CANVAS_VARIABLE
#undef CANVAS_STRING_VARIABLE
#undef CANVAS_FONT_VARIABLE
@@ -245,18 +798,51 @@ UIConfiguration::set_state (const XMLNode& root, int /*version*/)
}
void
+UIConfiguration::print_relative_def (string camelcase, string name, Color c)
+{
+ HSV variable (c);
+ HSV closest;
+ double shortest_distance = DBL_MAX;
+ string closest_name;
+
+ for (map<string,HSV>::iterator f = full_palette.begin(); f != full_palette.end(); ++f) {
+
+ double d;
+ HSV fixed (f->second);
+
+ // d = variable.distance (fixed);
+
+ d = fabs (variable.h - fixed.h);
+
+ if (d < shortest_distance) {
+ closest = fixed;
+ closest_name = f->first;
+ shortest_distance = d;
+ }
+ }
+
+ /* we now know the closest color of the fixed colors to
+ this variable color. Compute the HSV diff and
+ use it to redefine the variable color in terms of the
+ fixed one.
+ */
+
+ HSV delta = variable.delta (closest);
+
+ cerr << "CANVAS_COLOR(" << camelcase << ",\"" << name << "\", \"" << closest_name << "\", HSV("
+ << delta.h << ',' << delta.s << ',' << delta.v << ',' << variable.a << ")) /*"
+ << shortest_distance << " */" << endl;
+}
+
+
+void
UIConfiguration::set_variables (const XMLNode& node)
{
#undef UI_CONFIG_VARIABLE
-#undef CANVAS_VARIABLE
#define UI_CONFIG_VARIABLE(Type,var,name,val) \
if (var.set_from_node (node)) { \
ParameterChanged (name); \
}
-#define CANVAS_VARIABLE(var,name) \
- if (var.set_from_node (node)) { \
- ParameterChanged (name); \
- }
#define CANVAS_STRING_VARIABLE(var,name) \
if (var.set_from_node (node)) { \
ParameterChanged (name); \
@@ -268,32 +854,51 @@ UIConfiguration::set_variables (const XMLNode& node)
#include "ui_config_vars.h"
#include "canvas_vars.h"
#undef UI_CONFIG_VARIABLE
-#undef CANVAS_VARIABLE
#undef CANVAS_STRING_VARIABLE
#undef CANVAS_FONT_VARIABLE
+
+ /* Reset base colors */
+
+#undef CANVAS_BASE_COLOR
+#define CANVAS_BASE_COLOR(var,name,val) \
+ var.set_from_node (node);
+#include "base_colors.h"
+#undef CANVAS_BASE_COLOR
+
}
void
-UIConfiguration::pack_canvasvars ()
+UIConfiguration::set_dirty ()
{
-#undef CANVAS_VARIABLE
-#define CANVAS_VARIABLE(var,name) canvas_colors.insert (std::pair<std::string,ColorVariable<uint32_t>* >(name,&var));
-#define CANVAS_STRING_VARIABLE(var,name)
-#define CANVAS_FONT_VARIABLE(var,name)
-#include "canvas_vars.h"
-#undef CANVAS_VARIABLE
-#undef CANVAS_STRING_VARIABLE
-#undef CANVAS_FONT_VARIABLE
+ _dirty = true;
+}
+
+bool
+UIConfiguration::dirty () const
+{
+ return _dirty;
}
-uint32_t
-UIConfiguration::color_by_name (const std::string& name)
+ArdourCanvas::Color
+UIConfiguration::base_color_by_name (const std::string& name) const
{
- map<std::string,ColorVariable<uint32_t>* >::iterator i = canvas_colors.find (name);
+ map<std::string,ColorVariable<uint32_t>* >::const_iterator i = configurable_colors.find (name);
- if (i != canvas_colors.end()) {
+ if (i != configurable_colors.end()) {
return i->second->get();
}
+
+ string::size_type opp;
+
+ if ((opp = name.find (X_(" opposite"))) != string::npos) {
+ string base = name.substr (0, opp);
+ i = configurable_colors.find (base);
+ if (i != configurable_colors.end()) {
+ HSV hsv (i->second->get());
+ return hsv.opposite().color ();
+ }
+ }
+
#if 0 // yet unsed experimental style postfix
/* Idea: use identical colors but different font/sizes
* for variants of the same 'widget'.
@@ -314,7 +919,7 @@ UIConfiguration::color_by_name (const std::string& name)
*/
const size_t name_len = name.size();
const size_t name_sep = name.find(':');
- for (i = canvas_colors.begin(); i != canvas_colors.end(), name_sep != string::npos; ++i) {
+ for (i = configurable_colors.begin(); i != configurable_colors.end(), name_sep != string::npos; ++i) {
const size_t cmp_len = i->first.size();
const size_t cmp_sep = i->first.find(':');
if (cmp_len >= name_len || cmp_sep == string::npos) continue;
@@ -324,18 +929,134 @@ UIConfiguration::color_by_name (const std::string& name)
}
#endif
- // cerr << string_compose (_("Color %1 not found"), name) << endl;
+ cerr << string_compose (_("Color %1 not found"), name) << endl;
return RGBA_TO_UINT (g_random_int()%256,g_random_int()%256,g_random_int()%256,0xff);
}
-void
-UIConfiguration::set_dirty ()
+ArdourCanvas::Color
+UIConfiguration::color (const std::string& name) const
{
- _dirty = true;
+ map<string,string>::const_iterator e = color_aliases.find (name);
+
+ if (e != color_aliases.end ()) {
+ map<string,HSV>::const_iterator ac = actual_colors.find (e->second);
+ if (ac != actual_colors.end()) {
+ return ac->second;
+ }
+ }
+
+ cerr << string_compose (_("Color %1 not found"), name) << endl;
+
+ return rgba_to_color ((g_random_int()%256)/255.0,
+ (g_random_int()%256)/255.0,
+ (g_random_int()%256)/255.0,
+ 0xff);
}
-bool
-UIConfiguration::dirty () const
+ArdourCanvas::HSV
+UIConfiguration::RelativeHSV::get() const
{
- return _dirty;
+ HSV base (UIConfiguration::instance()->base_color_by_name (base_color));
+
+ /* this operation is a little wierd. because of the way we originally
+ * computed the alpha specification for the modifiers used here
+ * we need to reset base's alpha to zero before adding the modifier.
+ */
+
+ base.a = 0.0;
+
+ HSV self (base + modifier);
+
+ if (quantized_hue >= 0.0) {
+ self.h = quantized_hue;
+ }
+
+ return self;
+}
+
+void
+UIConfiguration::color_compute ()
+{
+ using namespace ArdourCanvas;
+
+ map<std::string,ColorVariable<uint32_t>* >::iterator f;
+ map<std::string,HSV*>::iterator v;
+
+ /* now compute distances */
+
+ cerr << "Attempt to reduce " << relative_colors.size() << endl;
+
+ map<std::string,RelativeHSV>::iterator current_color;
+
+ color_aliases.clear ();
+
+ /* First quantize the hues.
+
+ This ought to use a perceptual model such as CIE94 or CIEDE2000 that
+ takes into account non-uniformity in human wavelength
+ discrimination.
+
+ For now (November 2014) simply divide the hue space (360 degrees)
+ into small pieces.
+ */
+
+ /* quantize all current relative color definitions */
+
+ for (current_color = relative_colors.begin(); current_color != relative_colors.end(); ++current_color) {
+
+ HSV hsv (current_color->second.get());
+
+ if (hsv.is_gray ()) {
+ continue;
+ }
+
+ current_color->second.quantized_hue = hue_cnt * (round (hsv.h/hue_cnt));
+ }
+
+ actual_colors.clear ();
+
+ for (current_color = relative_colors.begin(); current_color != relative_colors.end(); ++current_color) {
+
+ map<std::string,HSV>::iterator possible_match;
+ std::string equivalent_name;
+ bool matched;
+
+ matched = false;
+
+ for (possible_match = actual_colors.begin(); possible_match != actual_colors.end(); ++possible_match) {
+
+ HSV a (current_color->second.get());
+ HSV b (possible_match->second);
+
+ /* This uses perceptual distance to find visually
+ * similar colors.
+ */
+
+ if (a.distance (b) < 6.0) {
+ matched = true;
+ break;
+ }
+ }
+
+ if (!matched) {
+
+ /* color does not match any other, generate a generic
+ * name and store two aliases.
+ */
+
+ string alias = string_compose ("color %1", actual_colors.size() + 1);
+ actual_colors.insert (make_pair (alias, current_color->second.get()));
+ color_aliases.insert (make_pair (current_color->first, alias));
+
+ } else {
+
+ /* this color was within the JND CIE76 distance of
+ * another, so throw it away.
+ */
+
+ color_aliases.insert (make_pair (current_color->first, possible_match->first));
+ }
+ }
+
+ cerr << "Ended with " << actual_colors.size() << " colors" << endl;
}
diff --git a/gtk2_ardour/ui_config.h b/gtk2_ardour/ui_config.h
index 0000eb63f5..0754425c27 100644
--- a/gtk2_ardour/ui_config.h
+++ b/gtk2_ardour/ui_config.h
@@ -28,6 +28,8 @@
#include "pbd/xml++.h"
#include "ardour/configuration_variable.h"
+#include "canvas/colors.h"
+
#include "utils.h"
/* This is very similar to ARDOUR::ConfigVariable but expects numeric values to
@@ -81,7 +83,9 @@ class UIConfiguration : public PBD::Stateful
UIConfiguration();
~UIConfiguration();
- std::map<std::string,ColorVariable<uint32_t> *> canvas_colors;
+ static UIConfiguration* instance() { return _instance; }
+
+ std::map<std::string,ColorVariable<uint32_t> *> configurable_colors;
bool dirty () const;
void set_dirty ();
@@ -95,8 +99,11 @@ class UIConfiguration : public PBD::Stateful
XMLNode& get_variables (std::string);
void set_variables (const XMLNode&);
void pack_canvasvars ();
+ void reset_derived_colors ();
- uint32_t color_by_name (const std::string&);
+ ArdourCanvas::Color base_color_by_name (const std::string&) const;
+ ArdourCanvas::Color color (const std::string&) const;
+ ArdourCanvas::HSV color_hsv (const std::string&) const;
sigc::signal<void,std::string> ParameterChanged;
void map_parameters (boost::function<void (std::string)>&);
@@ -107,11 +114,7 @@ class UIConfiguration : public PBD::Stateful
bool set_##var (Type val) { bool ret = var.set (val); if (ret) { ParameterChanged (name); } return ret; }
#include "ui_config_vars.h"
#undef UI_CONFIG_VARIABLE
-#undef CANVAS_VARIABLE
#undef CANVAS_STRING_VARIABLE
-#define CANVAS_VARIABLE(var,name) \
- uint32_t get_##var () const { return var.get(); } \
- bool set_##var (uint32_t val) { bool ret = var.set (val); if (ret) { ParameterChanged (name); } return ret; }
#define CANVAS_STRING_VARIABLE(var,name) \
std::string get_##var () const { return var.get(); } \
bool set_##var (const std::string& val) { bool ret = var.set (val); if (ret) { ParameterChanged (name); } return ret; }
@@ -119,12 +122,43 @@ class UIConfiguration : public PBD::Stateful
Pango::FontDescription get_##var () const { return ARDOUR_UI_UTILS::sanitized_font (var.get()); } \
bool set_##var (const std::string& val) { bool ret = var.set (val); if (ret) { ParameterChanged (name); } return ret; }
#include "canvas_vars.h"
-#undef CANVAS_VARIABLE
#undef CANVAS_STRING_VARIABLE
#undef CANVAS_FONT_VARIABLE
+#undef CANVAS_BASE_COLOR
+#define CANVAS_BASE_COLOR(var,name,val) \
+ ArdourCanvas::Color get_##var() const { return var.get(); } \
+ bool set_##var (ArdourCanvas::Color v) { bool ret = var.set (v); if (ret) { ParameterChanged (#var); } return ret; } \
+ bool set_##var(const ArdourCanvas::HSV& v) const { return set_##var (v.color()); }
+#include "base_colors.h"
+#undef CANVAS_BASE_COLOR
+
+#undef CANVAS_COLOR
+#define CANVAS_COLOR(var,name,base,modifier) ArdourCanvas::Color get_##var() const { return var.get().color(); }
+#include "colors.h"
+#undef CANVAS_COLOR
+
private:
+ struct RelativeHSV {
+ RelativeHSV (const std::string& b, const ArdourCanvas::HSV& mod)
+ : base_color (b)
+ , modifier (mod)
+ , quantized_hue (-1.0) {}
+ std::string base_color;
+ ArdourCanvas::HSV modifier;
+ double quantized_hue;
+
+ ArdourCanvas::HSV get() const;
+ };
+
+ /* these are loaded from serialized state (e.g. XML) */
+ std::map<std::string,RelativeHSV> relative_colors;
+ /* these are computed during color_compute()*/
+ std::map<std::string,ArdourCanvas::HSV> actual_colors;
+ /* these map from the name/key of relative colors to the color/value of actual colors */
+ std::map<std::string,std::string> color_aliases;
+
/* declare variables */
#undef UI_CONFIG_VARIABLE
@@ -132,17 +166,34 @@ class UIConfiguration : public PBD::Stateful
#include "ui_config_vars.h"
#undef UI_CONFIG_VARIABLE
-#undef CANVAS_VARIABLE
-#define CANVAS_VARIABLE(var,name) ColorVariable<uint32_t> var;
#define CANVAS_STRING_VARIABLE(var,name) ARDOUR::ConfigVariable<std::string> var;
#define CANVAS_FONT_VARIABLE(var,name) ARDOUR::ConfigVariable<std::string> var;
#include "canvas_vars.h"
-#undef CANVAS_VARIABLE
#undef CANVAS_STRING_VARIABLE
#undef CANVAS_FONT_VARIABLE
+ /* declare base color variables (these are modifiable by the user) */
+
+#undef CANVAS_BASE_COLOR
+#define CANVAS_BASE_COLOR(var,name,val) ColorVariable<uint32_t> var;
+#include "base_colors.h"
+#undef CANVAS_BASE_COLOR
+
+ /* declare relative color variables (not directly modifiable) */
+
+#undef CANVAS_COLOR
+#define CANVAS_COLOR(var,name,base,modifier) RelativeHSV var;
+#include "colors.h"
+#undef CANVAS_COLOR
+
XMLNode& state ();
bool _dirty;
+ static UIConfiguration* _instance;
+
+ void color_compute ();
+ void print_relative_def (std::string camelcase, std::string name, ArdourCanvas::Color c);
+ void color_theme_changed ();
+ void original_colors ();
};
#endif /* __ardour_ui_configuration_h__ */
diff --git a/gtk2_ardour/widget_list.rc b/gtk2_ardour/widget_list.rc
index 689bd7096a..2739eab9bf 100644
--- a/gtk2_ardour/widget_list.rc
+++ b/gtk2_ardour/widget_list.rc
@@ -128,12 +128,6 @@ widget "*MixerStripPeakDisplay*" style:highest "red_active_small_entry"
widget "*MixerStripPeakDisplayPeak*" style:highest "peak_display_peaked_entry"
widget "*MixerStripSelectedFrame" style:highest "selected_strip_frame"
widget "*MixerStripFrame" style:highest "base_frame"
-widget "*monitor section invert" style:highest "monitor_invert_button"
-widget "*monitor section cut" style:highest "monitor_mute_button"
-widget "*monitor section dim" style:highest "monitor_dim_button"
-widget "*monitor section mono" style:highest "monitor_mono_button"
-widget "*monitor solo exclusive" style:highest "monitor_mono_button"
-widget "*monitor solo override" style:highest "monitor_mono_button"
widget "*FadeCurve" style:highest "medium_bold_entry"
widget "*FadeCurve*" style:highest "medium_bold_entry"
widget "*RouteParamsListDisplay" style:highest "inspector_track_list_display"
diff --git a/libs/canvas/canvas/colors.h b/libs/canvas/canvas/colors.h
index 17e93cf128..5e13c5ca96 100644
--- a/libs/canvas/canvas/colors.h
+++ b/libs/canvas/canvas/colors.h
@@ -31,34 +31,40 @@ namespace ArdourCanvas
struct LIBCANVAS_API HSV;
struct LIBCANVAS_API HSVA;
-extern LIBCANVAS_API Color hsv_to_color (double h, double s, double v, double a = 1.0);
-extern LIBCANVAS_API Color hsv_to_color (const HSV&, double a = 1.0);
-extern LIBCANVAS_API Color hsva_to_color (const HSVA&);
+extern LIBCANVAS_API Color hsva_to_color (double h, double s, double v, double a = 1.0);
+extern LIBCANVAS_API void color_to_hsva (Color color, double& h, double& s, double& v, double& a);
extern LIBCANVAS_API void color_to_hsv (Color color, double& h, double& s, double& v);
-
extern LIBCANVAS_API void color_to_rgba (Color, double& r, double& g, double& b, double& a);
extern LIBCANVAS_API Color rgba_to_color (double r, double g, double b, double a);
uint32_t LIBCANVAS_API contrasting_text_color (uint32_t c);
-struct LIBCANVAS_API HSV
+struct LIBCANVAS_API HSV
{
HSV ();
- HSV (double h, double s, double v);
+ HSV (double h, double s, double v, double a = 1.0);
HSV (Color);
- virtual ~HSV() {}
double h;
double s;
double v;
+ double a;
- bool is_gray() const { return s == 0; }
-
- operator Color() const { return hsv_to_color (*this); }
+ bool is_gray() const;
+
+ Color color() const { return hsva_to_color (h,s, v, a); }
+ operator Color() const { return color(); }
HSV operator+ (const HSV&) const;
HSV operator- (const HSV&) const;
- HSV operator* (double) const;
+
+ HSV& operator=(Color);
+ HSV& operator=(const std::string&);
+
+ bool operator== (const HSV& other);
+
+ double distance (const HSV& other) const;
+ HSV delta (const HSV& other) const;
HSV darker (double factor = 1.3) const { return shade (factor); }
HSV lighter (double factor = 0.7) const { return shade (factor); }
@@ -66,26 +72,13 @@ struct LIBCANVAS_API HSV
HSV shade (double factor) const;
HSV mix (const HSV& other, double amt) const;
- void print (std::ostream&) const;
-
- protected:
- virtual void clamp();
-};
-
-
-
-struct LIBCANVAS_API HSVA : public HSV
-{
- HSVA ();
- HSVA (double h, double s, double v, double a);
- HSVA (Color);
-
- double a;
-
- operator Color() const { return hsva_to_color (*this); }
+ HSV opposite() const;
+ HSV complement() const { return opposite(); }
- HSVA operator+ (const HSVA&) const;
- HSVA operator- (const HSVA&) const;
+ HSV bw_text () const;
+ HSV text() const;
+ HSV selected () const;
+ HSV outline() const;
void print (std::ostream&) const;
@@ -96,6 +89,5 @@ struct LIBCANVAS_API HSVA : public HSV
}
std::ostream& operator<<(std::ostream& o, const ArdourCanvas::HSV& hsv);
-std::ostream& operator<<(std::ostream& o, const ArdourCanvas::HSVA& hsva);
#endif /* __ardour_canvas_colors_h__ */
diff --git a/libs/canvas/canvas/colorspace.h b/libs/canvas/canvas/colorspace.h
new file mode 100644
index 0000000000..445b7e2c63
--- /dev/null
+++ b/libs/canvas/canvas/colorspace.h
@@ -0,0 +1,54 @@
+/**
+ * @file colorspace.h
+ * @author Pascal Getreuer 2005-2010 <getreuer@gmail.com>
+ */
+
+#ifndef _ARDOURCANVAS_COLORSPACE_H_
+#define _ARDOURCANVAS_COLORSPACE_H_
+
+/** @brief XYZ color of the D65 white point */
+#define WHITEPOINT_X 0.950456
+#define WHITEPOINT_Y 1.0
+#define WHITEPOINT_Z 1.088754
+
+void Rgb2Yuv(double *Y, double *U, double *V, double R, double G, double B);
+void Yuv2Rgb(double *R, double *G, double *B, double Y, double U, double V);
+void Rgb2Ycbcr(double *Y, double *Cb, double *Cr, double R, double G, double B);
+void Ycbcr2Rgb(double *R, double *G, double *B, double Y, double Cb, double Cr);
+void Rgb2Jpegycbcr(double *R, double *G, double *B, double Y, double Cb, double Cr);
+void Jpegycbcr2Rgb(double *R, double *G, double *B, double Y, double Cb, double Cr);
+void Rgb2Ypbpr(double *Y, double *Pb, double *Pr, double R, double G, double B);
+void Ypbpr2Rgb(double *R, double *G, double *B, double Y, double Pb, double Pr);
+void Rgb2Ydbdr(double *Y, double *Db, double *Dr, double R, double G, double B);
+void Ydbdr2Rgb(double *R, double *G, double *B, double Y, double Db, double Dr);
+void Rgb2Yiq(double *Y, double *I, double *Q, double R, double G, double B);
+void Yiq2Rgb(double *R, double *G, double *B, double Y, double I, double Q);
+
+void Rgb2Hsv(double *H, double *S, double *V, double R, double G, double B);
+void Hsv2Rgb(double *R, double *G, double *B, double H, double S, double V);
+void Rgb2Hsl(double *H, double *S, double *L, double R, double G, double B);
+void Hsl2Rgb(double *R, double *G, double *B, double H, double S, double L);
+void Rgb2Hsi(double *H, double *S, double *I, double R, double G, double B);
+void Hsi2Rgb(double *R, double *G, double *B, double H, double S, double I);
+
+void Rgb2Xyz(double *X, double *Y, double *Z, double R, double G, double B);
+void Xyz2Rgb(double *R, double *G, double *B, double X, double Y, double Z);
+void Xyz2Lab(double *L, double *a, double *b, double X, double Y, double Z);
+void Lab2Xyz(double *X, double *Y, double *Z, double L, double a, double b);
+void Xyz2Luv(double *L, double *u, double *v, double X, double Y, double Z);
+void Luv2Xyz(double *X, double *Y, double *Z, double L, double u, double v);
+void Xyz2Lch(double *L, double *C, double *H, double X, double Y, double Z);
+void Lch2Xyz(double *X, double *Y, double *Z, double L, double C, double H);
+void Xyz2Cat02lms(double *L, double *M, double *S, double X, double Y, double Z);
+void Cat02lms2Xyz(double *X, double *Y, double *Z, double L, double M, double S);
+
+void Rgb2Lab(double *L, double *a, double *b, double R, double G, double B);
+void Lab2Rgb(double *R, double *G, double *B, double L, double a, double b);
+void Rgb2Luv(double *L, double *u, double *v, double R, double G, double B);
+void Luv2Rgb(double *R, double *G, double *B, double L, double u, double v);
+void Rgb2Lch(double *L, double *C, double *H, double R, double G, double B);
+void Lch2Rgb(double *R, double *G, double *B, double L, double C, double H);
+void Rgb2Cat02lms(double *L, double *M, double *S, double R, double G, double B);
+void Cat02lms2Rgb(double *R, double *G, double *B, double L, double M, double S);
+
+#endif /* _ARDOURCANVAS_COLORSPACE_H_ */
diff --git a/libs/canvas/colors.cc b/libs/canvas/colors.cc
index a3a7565fc8..7be91c1c6f 100644
--- a/libs/canvas/colors.cc
+++ b/libs/canvas/colors.cc
@@ -21,6 +21,7 @@
#include <stdint.h>
#include "canvas/colors.h"
+#include "canvas/colorspace.h"
using namespace std;
using namespace ArdourCanvas;
@@ -31,7 +32,14 @@ using std::min;
void
ArdourCanvas::color_to_hsv (Color color, double& h, double& s, double& v)
{
- double r, g, b, a;
+ double a;
+ color_to_hsva (color, h, s, v, a);
+}
+
+void
+ArdourCanvas::color_to_hsva (Color color, double& h, double& s, double& v, double& a)
+{
+ double r, g, b;
double cmax;
double cmin;
double delta;
@@ -57,7 +65,8 @@ ArdourCanvas::color_to_hsv (Color color, double& h, double& s, double& v)
if (cmax == 0) {
// r = g = b == 0 ... v is undefined, s = 0
s = 0.0;
- h = -1.0;
+ h = 0.0;
+ return;
}
if (delta != 0.0) {
@@ -70,6 +79,13 @@ ArdourCanvas::color_to_hsv (Color color, double& h, double& s, double& v)
}
h *= 60.0;
+
+ if (h < 0.0) {
+ /* negative values are legal but confusing, because
+ they alias positive values.
+ */
+ h = 360 + h;
+ }
}
if (delta == 0 || cmax == 0) {
@@ -80,23 +96,16 @@ ArdourCanvas::color_to_hsv (Color color, double& h, double& s, double& v)
}
ArdourCanvas::Color
-ArdourCanvas::hsv_to_color (const HSV& hsv, double a)
-{
- return hsv_to_color (hsv.h, hsv.s, hsv.v, a);
-}
-
-ArdourCanvas::Color
-ArdourCanvas::hsv_to_color (double h, double s, double v, double a)
+ArdourCanvas::hsva_to_color (double h, double s, double v, double a)
{
s = min (1.0, max (0.0, s));
v = min (1.0, max (0.0, v));
if (s == 0) {
- // achromatic (grey)
return rgba_to_color (v, v, v, a);
}
- h = min (360.0, max (0.0, h));
+ h = fmod (h + 360.0, 360.0);
double c = v * s;
double x = c * (1.0 - fabs(fmod(h / 60.0, 2) - 1.0));
@@ -197,31 +206,50 @@ ArdourCanvas::contrasting_text_color (uint32_t c)
return (luminance (c) < 0.50) ? white : black;
}
+
+
HSV::HSV ()
- : h (1.0)
+ : h (0.0)
, s (1.0)
, v (1.0)
+ , a (1.0)
{
}
-HSV::HSV (double hh, double ss, double vv)
+HSV::HSV (double hh, double ss, double vv, double aa)
: h (hh)
, s (ss)
, v (vv)
+ , a (aa)
{
+ if (h < 0.0) {
+ /* normalize negative hue values into positive range */
+ h = 360.0 + h;
+ }
}
HSV::HSV (Color c)
{
- color_to_hsv (c, h, s, v);
+ color_to_hsva (c, h, s, v, a);
+}
+
+bool
+HSV::is_gray () const
+{
+ return s == 0;
}
void
HSV::clamp ()
{
- s = min (s, 1.0);
- v = min (v, 1.0);
- h = min (255.0, h);
+ h = fmod (h, 360.0);
+ if (h < 0.0) {
+ /* normalize negative hue values into positive range */
+ h = 360.0 + h;
+ }
+ s = min (1.0, s);
+ v = min (1.0, v);
+ a = min (1.0, a);
}
HSV
@@ -231,7 +259,8 @@ HSV::operator+ (const HSV& operand) const
hsv.h = h + operand.h;
hsv.s = s + operand.s;
hsv.v = v + operand.v;
- hsv.clamp();
+ hsv.a = a + operand.a;
+ hsv.clamp ();
return hsv;
}
@@ -241,20 +270,37 @@ HSV::operator- (const HSV& operand) const
HSV hsv;
hsv.h = h - operand.h;
hsv.s = s - operand.s;
- hsv.v = v - operand.v;
- hsv.clamp();
+ hsv.v = s - operand.v;
+ hsv.a = a - operand.a;
+ hsv.clamp ();
return hsv;
}
-HSV
-HSV::operator* (double d) const
+HSV&
+HSV::operator=(Color c)
{
- HSV hsv;
- hsv.h = h * d;
- hsv.s = s * d;
- hsv.v = v * d;
- hsv.clamp();
- return hsv;
+ color_to_hsva (c, h, s, v, a);
+ clamp ();
+ return *this;
+}
+
+HSV&
+HSV::operator=(const std::string& str)
+{
+ uint32_t c;
+ c = strtol (str.c_str(), 0, 16);
+ color_to_hsva (c, h, s, v, a);
+ clamp ();
+ return *this;
+}
+
+bool
+HSV::operator== (const HSV& other)
+{
+ return h == other.h &&
+ s == other.s &&
+ v == other.v &&
+ a == other.a;
}
HSV
@@ -274,16 +320,14 @@ HSV::shade (double factor) const
if (factor > 1.0) {
if (s < 88) {
- hsv.v *= 1.0/(factor/10.0);
- } else {
- hsv.s *= factor;
- }
+ hsv.v += (hsv.v * (factor * 10.0));
+ }
+ hsv.s *= factor;
} else {
if (s < 88) {
- hsv.v *= 1.0/factor;
- } else {
- hsv.s *= factor;
- }
+ hsv.v -= (hsv.v * (factor * 10.0));
+ }
+ hsv.s *= factor;
}
hsv.clamp();
@@ -292,6 +336,18 @@ HSV::shade (double factor) const
}
HSV
+HSV::outline () const
+{
+ if (luminance (color()) < 0.50) {
+ /* light color, darker outline: black with 15% opacity */
+ return HSV (0.0, 0.0, 0.0, 0.15);
+ } else {
+ /* dark color, lighter outline: white with 15% opacity */
+ return HSV (0.0, 0.0, 1.0, 0.15);
+ }
+}
+
+HSV
HSV::mix (const HSV& other, double amount) const
{
HSV hsv;
@@ -305,77 +361,104 @@ HSV::mix (const HSV& other, double amount) const
return hsv;
}
-void
-HSV::print (std::ostream& o) const
+HSV
+HSV::delta (const HSV& other) const
{
- if (!is_gray()) {
- o << "hsv " << h << '|' << s << '|' << v;
- } else {
- o << "hsv gray";
- }
+ HSV d;
+ d.h = h - other.h;
+ d.s = s - other.s;
+ d.v = v - other.v;
+ /* do not clamp - we are returning a delta */
+ return d;
}
-HSVA::HSVA ()
- : a (1.0)
+double
+HSV::distance (const HSV& other) const
{
-}
+ /* Use CIE94 definition for now */
-HSVA::HSVA (double hh, double ss, double vv, double aa)
- : HSV (hh, ss, vv)
- , a (aa)
-{
+ double sL, sA, sB;
+ double oL, oA, oB;
+ double r, g, b, a;
+ Color c;
+
+ c = hsva_to_color (h, s, v, a);
+ color_to_rgba (c, r, g, b, a);
+ Rgb2Lab (&sL, &sA, &sB, r, g, b);
+
+ c = hsva_to_color (other.h, other.s, other.v, other.a);
+ color_to_rgba (c, r, g, b, a);
+ Rgb2Lab (&oL, &oA, &oB, r, g, b);
+
+ // Weighting factors depending on the application (1 = default)
+
+ const double whtL = 1.0;
+ const double whtC = 1.0;
+ const double whtH = 1.0;
+
+ const double xC1 = sqrt ((sA * sA) + (sB * oB));
+ const double xC2 = sqrt ((oA * oA) + (oB * oB));
+ double xDL = oL - sL;
+ double xDC = xC2 - xC1;
+ const double xDE = sqrt (((sL - oL) * (sL - oL))
+ + ((sA - oA) * (sA - oA))
+ + ((sB - oB) * (sB - oB)));
+
+ double xDH;
+
+ if (sqrt (xDE) > (sqrt (abs (xDL)) + sqrt (abs (xDC)))) {
+ xDH = sqrt ((xDE * xDE) - (xDL * xDL) - (xDC * xDC));
+ } else {
+ xDH = 0;
+ }
+
+ const double xSC = 1 + (0.045 * xC1);
+ const double xSH = 1 + (0.015 * xC1);
+
+ xDL /= whtL;
+ xDC /= whtC * xSC;
+ xDH /= whtH * xSH;
+
+ return sqrt ((xDL * xDL) + (xDC * xDC) + (xDH * xDH));
}
-HSVA::HSVA (Color c)
+HSV
+HSV::opposite () const
{
- color_to_hsv (c, h, s, v);
- a = c & 0xff;
+ HSV hsv (*this);
+ hsv.h = fmod (h + 180.0, 360.0);
+ return hsv;
}
-void
-HSVA::clamp ()
+HSV
+HSV::bw_text () const
{
- HSV::clamp ();
- a = min (1.0, a);
+ return HSV (contrasting_text_color (color()));
}
-HSVA
-HSVA::operator+ (const HSVA& operand) const
+HSV
+HSV::text () const
{
- HSVA hsv;
- hsv.h = h + operand.h;
- hsv.s = s + operand.s;
- hsv.v = v + operand.v;
- hsv.a = a + operand.a;
- return hsv;
+ return opposite ();
}
-HSVA
-HSVA::operator- (const HSVA& operand) const
+HSV
+HSV::selected () const
{
- HSVA hsv;
- hsv.h = h - operand.h;
- hsv.s = s - operand.s;
- hsv.a = a - operand.a;
- return hsv;
+ /* XXX hack */
+ return HSV (Color (0xff0000));
}
+
void
-HSVA::print (std::ostream& o) const
+HSV::print (std::ostream& o) const
{
if (!is_gray()) {
- o << "hsva " << h << '|' << s << '|' << v << '|' << a;
+ o << '(' << s << ',' << v << ',' << a << ')';
} else {
- o << "hsva gray";
+ o << "gray(" << v << ')';
}
}
-ArdourCanvas::Color
-ArdourCanvas::hsva_to_color (const HSVA& hsva)
-{
- return hsv_to_color (hsva.h, hsva.s, hsva.v, hsva.a);
-}
-
std::ostream& operator<<(std::ostream& o, const ArdourCanvas::HSV& hsv) { hsv.print (o); return o; }
-std::ostream& operator<<(std::ostream& o, const ArdourCanvas::HSVA& hsva) { hsva.print (o); return o; }
diff --git a/libs/canvas/colorspace.cc b/libs/canvas/colorspace.cc
new file mode 100644
index 0000000000..5a71b715be
--- /dev/null
+++ b/libs/canvas/colorspace.cc
@@ -0,0 +1,940 @@
+/**
+ * @file colorspace.c
+ * @author Pascal Getreuer 2005-2010 <getreuer@gmail.com>
+ *
+ * == Summary ==
+ * This file implements routines for color transformations between the spaces
+ * sRGB, Y'UV, Y'CbCr, Y'PbPr, Y'DbDr, Y'IQ, HSV, HSL, HSI, CIEXYZ, CIELAB,
+ * CIELUV, CIELCH, and CIECAT02 LMS.
+ *
+ * == Usage ==
+ * First call GetColorTransform, specifying the source and destination color
+ * spaces as "dest<-src" or "src->dest". Then call ApplyColorTransform to
+ * perform the transform:
+@code
+ double S[3] = {173, 0.8, 0.5};
+ double D[3];
+ colortransform Trans;
+
+ if(!(GetColorTransform(&Trans, "HSI -> Lab")))
+ {
+ printf("Invalid syntax or unknown color space\n");
+ return;
+ }
+
+ ApplyColorTransform(Trans, &D[0], &D[1], &D[2], S[0], S[1], S[2]);
+@endcode
+ * "num" is a typedef defined at the beginning of colorspace.h that may be set
+ * to either double or float, depending on the application.
+ *
+ * Specific transformation routines can also be called directly. The following
+ * converts an sRGB color to CIELAB and then back to sRGB:
+@code
+ double R = 0.85, G = 0.32, B = 0.5;
+ double L, a, b;
+ Rgb2Lab(&L, &a, &b, R, G, B);
+ Lab2Rgb(&R, &G, &B, L, a, b);
+@endcode
+ * Generally, the calling syntax is
+@code
+ Foo2Bar(&B0, &B1, &B2, F0, F1, F2);
+@endcode
+ * where (F0,F1,F2) are the coordinates of a color in space "Foo" and
+ * (B0,B1,B2) are the transformed coordinates in space "Bar." For any
+ * transformation routine, its inverse has the sytax
+@code
+ Bar2Foo(&F0, &F1, &F2, B0, B1, B2);
+@endcode
+ *
+ * The conversion routines are consistently named with the first letter of a
+ * color space capitalized with following letters in lower case and omitting
+ * prime symbols. For example, "Rgb2Ydbdr" converts sRGB to Y'DbDr. For
+ * any transformation routine Foo2Bar, its inverse is Bar2Foo.
+ *
+ * All transformations assume a two degree observer angle and a D65 illuminant.
+ * The white point can be changed by modifying the WHITEPOINT_X, WHITEPOINT_Y,
+ * WHITEPOINT_Z definitions at the beginning of colorspace.h.
+ *
+ * == List of transformation routines ==
+ * - Rgb2Yuv(double *Y, double *U, double *V, double R, double G, double B)
+ * - Rgb2Ycbcr(double *Y, double *Cb, double *Cr, double R, double G, double B)
+ * - Rgb2Jpegycbcr(double *Y, double *Cb, double *Cr, double R, double G, double B)
+ * - Rgb2Ypbpr(double *Y, double *Pb, double *Pr, double R, double G, double B)
+ * - Rgb2Ydbdr(double *Y, double *Db, double *Dr, double R, double G, double B)
+ * - Rgb2Yiq(double *Y, double *I, double *Q, double R, double G, double B)
+ * - Rgb2Hsv(double *H, double *S, double *V, double R, double G, double B)
+ * - Rgb2Hsl(double *H, double *S, double *L, double R, double G, double B)
+ * - Rgb2Hsi(double *H, double *S, double *I, double R, double G, double B)
+ * - Rgb2Xyz(double *X, double *Y, double *Z, double R, double G, double B)
+ * - Xyz2Lab(double *L, double *a, double *b, double X, double Y, double Z)
+ * - Xyz2Luv(double *L, double *u, double *v, double X, double Y, double Z)
+ * - Xyz2Lch(double *L, double *C, double *h, double X, double Y, double Z)
+ * - Xyz2Cat02lms(double *L, double *M, double *S, double X, double Y, double Z)
+ * - Rgb2Lab(double *L, double *a, double *b, double R, double G, double B)
+ * - Rgb2Luv(double *L, double *u, double *v, double R, double G, double B)
+ * - Rgb2Lch(double *L, double *C, double *h, double R, double G, double B)
+ * - Rgb2Cat02lms(double *L, double *M, double *S, double R, double G, double B)
+ * (Similarly for the inverse transformations.)
+ *
+ * It is possible to transform between two arbitrary color spaces by first
+ * transforming from the source space to sRGB and then transforming from
+ * sRGB to the desired destination space. For transformations between CIE
+ * color spaces, it is convenient to use XYZ as the intermediate space. This
+ * is the strategy used by GetColorTransform and ApplyColorTransform.
+ *
+ * == References ==
+ * The definitions of these spaces and the many of the transformation formulas
+ * can be found in
+ *
+ * Poynton, "Frequently Asked Questions About Gamma"
+ * http://www.poynton.com/notes/colour_and_gamma/GammaFAQ.html
+ *
+ * Poynton, "Frequently Asked Questions About Color"
+ * http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html
+ *
+ * and Wikipedia articles
+ * http://en.wikipedia.org/wiki/SRGB
+ * http://en.wikipedia.org/wiki/YUV
+ * http://en.wikipedia.org/wiki/YCbCr
+ * http://en.wikipedia.org/wiki/YPbPr
+ * http://en.wikipedia.org/wiki/YDbDr
+ * http://en.wikipedia.org/wiki/YIQ
+ * http://en.wikipedia.org/wiki/HSL_and_HSV
+ * http://en.wikipedia.org/wiki/CIE_1931_color_space
+ * http://en.wikipedia.org/wiki/Lab_color_space
+ * http://en.wikipedia.org/wiki/CIELUV_color_space
+ * http://en.wikipedia.org/wiki/LMS_color_space
+ *
+ * == License (BSD) ==
+ * Copyright (c) 2005-2010, Pascal Getreuer
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#include <math.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "canvas/colorspace.h"
+
+/** @brief Min of A and B */
+#define MIN(A,B) (((A) <= (B)) ? (A) : (B))
+
+/** @brief Max of A and B */
+#define MAX(A,B) (((A) >= (B)) ? (A) : (B))
+
+/** @brief Min of A, B, and C */
+#define MIN3(A,B,C) (((A) <= (B)) ? MIN(A,C) : MIN(B,C))
+
+/** @brief Max of A, B, and C */
+#define MAX3(A,B,C) (((A) >= (B)) ? MAX(A,C) : MAX(B,C))
+
+#ifndef M_PI
+/** @brief The constant pi */
+#define M_PI 3.14159265358979323846264338327950288
+#endif
+
+/**
+ * @brief sRGB gamma correction, transforms R to R'
+ * http://en.wikipedia.org/wiki/SRGB
+ */
+#define GAMMACORRECTION(t) \
+ (((t) <= 0.0031306684425005883) ? \
+ (12.92*(t)) : (1.055*pow((t), 0.416666666666666667) - 0.055))
+
+/**
+ * @brief Inverse sRGB gamma correction, transforms R' to R
+ */
+#define INVGAMMACORRECTION(t) \
+ (((t) <= 0.0404482362771076) ? \
+ ((t)/12.92) : pow(((t) + 0.055)/1.055, 2.4))
+
+/**
+ * @brief CIE L*a*b* f function (used to convert XYZ to L*a*b*)
+ * http://en.wikipedia.org/wiki/Lab_color_space
+ */
+#define LABF(t) \
+ ((t >= 8.85645167903563082e-3) ? \
+ pow(t,0.333333333333333) : (841.0/108.0)*(t) + (4.0/29.0))
+
+/**
+ * @brief CIE L*a*b* inverse f function
+ * http://en.wikipedia.org/wiki/Lab_color_space
+ */
+#define LABINVF(t) \
+ ((t >= 0.206896551724137931) ? \
+ ((t)*(t)*(t)) : (108.0/841.0)*((t) - (4.0/29.0)))
+
+/** @brief u'v' coordinates of the white point for CIE Lu*v* */
+#define WHITEPOINT_U ((4*WHITEPOINT_X) \
+ /(WHITEPOINT_X + 15*WHITEPOINT_Y + 3*WHITEPOINT_Z))
+#define WHITEPOINT_V ((9*WHITEPOINT_Y) \
+ /(WHITEPOINT_X + 15*WHITEPOINT_Y + 3*WHITEPOINT_Z))
+
+/** @brief Enumeration of the supported color spaces */
+#define UNKNOWN_SPACE 0
+#define RGB_SPACE 1
+#define YUV_SPACE 2
+#define YCBCR_SPACE 3
+#define JPEGYCBCR_SPACE 4
+#define YPBPR_SPACE 5
+#define YDBDR_SPACE 6
+#define YIQ_SPACE 7
+#define HSV_SPACE 8
+#define HSL_SPACE 9
+#define HSI_SPACE 10
+#define XYZ_SPACE 11
+#define LAB_SPACE 12
+#define LUV_SPACE 13
+#define LCH_SPACE 14
+#define CAT02LMS_SPACE 15
+
+#define NUM_TRANSFORM_PAIRS 18
+
+
+
+/*
+ * == Linear color transformations ==
+ *
+ * The following routines implement transformations between sRGB and
+ * the linearly-related color spaces Y'UV, Y'PbPr, Y'DbDr, and Y'IQ.
+ */
+
+
+/**
+ * @brief Convert sRGB to NTSC/PAL Y'UV Luma + Chroma
+ *
+ * @param Y, U, V pointers to hold the result
+ * @param R, G, B the input sRGB values
+ *
+ * Wikipedia: http://en.wikipedia.org/wiki/YUV
+ */
+void Rgb2Yuv(double *Y, double *U, double *V, double R, double G, double B)
+{
+ *Y = (double)( 0.299*R + 0.587*G + 0.114*B);
+ *U = (double)(-0.147*R - 0.289*G + 0.436*B);
+ *V = (double)( 0.615*R - 0.515*G - 0.100*B);
+}
+
+
+/**
+ * @brief Convert NTSC/PAL Y'UV to sRGB
+ *
+ * @param R, G, B pointers to hold the result
+ * @param Y, U, V the input YUV values
+ */
+void Yuv2Rgb(double *R, double *G, double *B, double Y, double U, double V)
+{
+ *R = (double)(Y - 3.945707070708279e-05*U + 1.1398279671717170825*V);
+ *G = (double)(Y - 0.3946101641414141437*U - 0.5805003156565656797*V);
+ *B = (double)(Y + 2.0319996843434342537*U - 4.813762626262513e-04*V);
+}
+
+
+/** @brief sRGB to Y'CbCr Luma + Chroma */
+void Rgb2Ycbcr(double *Y, double *Cb, double *Cr, double R, double G, double B)
+{
+ *Y = (double)( 65.481*R + 128.553*G + 24.966*B + 16);
+ *Cb = (double)(-37.797*R - 74.203*G + 112.0 *B + 128);
+ *Cr = (double)(112.0 *R - 93.786*G - 18.214*B + 128);
+}
+
+
+/** @brief Y'CbCr to sRGB */
+void Ycbcr2Rgb(double *R, double *G, double *B, double Y, double Cr, double Cb)
+{
+ Y -= 16;
+ Cb -= 128;
+ Cr -= 128;
+ *R = (double)(0.00456621004566210107*Y + 1.1808799897946415e-09*Cr + 0.00625892896994393634*Cb);
+ *G = (double)(0.00456621004566210107*Y - 0.00153632368604490212*Cr - 0.00318811094965570701*Cb);
+ *B = (double)(0.00456621004566210107*Y + 0.00791071623355474145*Cr + 1.1977497040190077e-08*Cb);
+}
+
+
+/** @brief sRGB to JPEG-Y'CbCr Luma + Chroma */
+void Rgb2Jpegycbcr(double *Y, double *Cb, double *Cr, double R, double G, double B)
+{
+ Rgb2Ypbpr(Y, Cb, Cr, R, G, B);
+ *Cb += (double)0.5;
+ *Cr += (double)0.5;
+}
+
+/** @brief JPEG-Y'CbCr to sRGB */
+void Jpegycbcr2Rgb(double *R, double *G, double *B, double Y, double Cb, double Cr)
+{
+ Cb -= (double)0.5;
+ Cr -= (double)0.5;
+ Ypbpr2Rgb(R, G, B, Y, Cb, Cr);
+}
+
+
+/** @brief sRGB to Y'PbPr Luma (ITU-R BT.601) + Chroma */
+void Rgb2Ypbpr(double *Y, double *Pb, double *Pr, double R, double G, double B)
+{
+ *Y = (double)( 0.299 *R + 0.587 *G + 0.114 *B);
+ *Pb = (double)(-0.1687367*R - 0.331264*G + 0.5 *B);
+ *Pr = (double)( 0.5 *R - 0.418688*G - 0.081312*B);
+}
+
+
+/** @brief Y'PbPr to sRGB */
+void Ypbpr2Rgb(double *R, double *G, double *B, double Y, double Pb, double Pr)
+{
+ *R = (double)(0.99999999999914679361*Y - 1.2188941887145875e-06*Pb + 1.4019995886561440468*Pr);
+ *G = (double)(0.99999975910502514331*Y - 0.34413567816504303521*Pb - 0.71413649331646789076*Pr);
+ *B = (double)(1.00000124040004623180*Y + 1.77200006607230409200*Pb + 2.1453384174593273e-06*Pr);
+}
+
+
+/** @brief sRGB to SECAM Y'DbDr Luma + Chroma */
+void Rgb2Ydbdr(double *Y, double *Db, double *Dr, double R, double G, double B)
+{
+ *Y = (double)( 0.299*R + 0.587*G + 0.114*B);
+ *Db = (double)(-0.450*R - 0.883*G + 1.333*B);
+ *Dr = (double)(-1.333*R + 1.116*G + 0.217*B);
+}
+
+
+/** @brief SECAM Y'DbDr to sRGB */
+void Ydbdr2Rgb(double *R, double *G, double *B, double Y, double Db, double Dr)
+{
+ *R = (double)(Y + 9.2303716147657e-05*Db - 0.52591263066186533*Dr);
+ *G = (double)(Y - 0.12913289889050927*Db + 0.26789932820759876*Dr);
+ *B = (double)(Y + 0.66467905997895482*Db - 7.9202543533108e-05*Dr);
+}
+
+
+/** @brief sRGB to NTSC YIQ */
+void Rgb2Yiq(double *Y, double *I, double *Q, double R, double G, double B)
+{
+ *Y = (double)(0.299 *R + 0.587 *G + 0.114 *B);
+ *I = (double)(0.595716*R - 0.274453*G - 0.321263*B);
+ *Q = (double)(0.211456*R - 0.522591*G + 0.311135*B);
+}
+
+
+/** @brief Convert NTSC YIQ to sRGB */
+void Yiq2Rgb(double *R, double *G, double *B, double Y, double I, double Q)
+{
+ *R = (double)(Y + 0.9562957197589482261*I + 0.6210244164652610754*Q);
+ *G = (double)(Y - 0.2721220993185104464*I - 0.6473805968256950427*Q);
+ *B = (double)(Y - 1.1069890167364901945*I + 1.7046149983646481374*Q);
+}
+
+
+
+/*
+ * == Hue Saturation Value/Lightness/Intensity color transformations ==
+ *
+ * The following routines implement transformations between sRGB and
+ * color spaces HSV, HSL, and HSI.
+ */
+
+
+/**
+ * @brief Convert an sRGB color to Hue-Saturation-Value (HSV)
+ *
+ * @param H, S, V pointers to hold the result
+ * @param R, G, B the input sRGB values scaled in [0,1]
+ *
+ * This routine transforms from sRGB to the hexcone HSV color space. The
+ * sRGB values are assumed to be between 0 and 1. The output values are
+ * H = hexagonal hue angle (0 <= H < 360),
+ * S = C/V (0 <= S <= 1),
+ * V = max(R',G',B') (0 <= V <= 1),
+ * where C = max(R',G',B') - min(R',G',B'). The inverse color transformation
+ * is given by Hsv2Rgb.
+ *
+ * Wikipedia: http://en.wikipedia.org/wiki/HSL_and_HSV
+ */
+void Rgb2Hsv(double *H, double *S, double *V, double R, double G, double B)
+{
+ double Max = MAX3(R, G, B);
+ double Min = MIN3(R, G, B);
+ double C = Max - Min;
+
+
+ *V = Max;
+
+ if(C > 0)
+ {
+ if(Max == R)
+ {
+ *H = (G - B) / C;
+
+ if(G < B)
+ *H += 6;
+ }
+ else if(Max == G)
+ *H = 2 + (B - R) / C;
+ else
+ *H = 4 + (R - G) / C;
+
+ *H *= 60;
+ *S = C / Max;
+ }
+ else
+ *H = *S = 0;
+}
+
+
+/**
+ * @brief Convert a Hue-Saturation-Value (HSV) color to sRGB
+ *
+ * @param R, G, B pointers to hold the result
+ * @param H, S, V the input HSV values
+ *
+ * The input values are assumed to be scaled as
+ * 0 <= H < 360,
+ * 0 <= S <= 1,
+ * 0 <= V <= 1.
+ * The output sRGB values are scaled between 0 and 1. This is the inverse
+ * transformation of Rgb2Hsv.
+ *
+ * Wikipedia: http://en.wikipedia.org/wiki/HSL_and_HSV
+ */
+void Hsv2Rgb(double *R, double *G, double *B, double H, double S, double V)
+{
+ double C = S * V;
+ double Min = V - C;
+ double X;
+
+
+ H -= 360*floor(H/360);
+ H /= 60;
+ X = C*(1 - fabs(H - 2*floor(H/2) - 1));
+
+ switch((int)H)
+ {
+ case 0:
+ *R = Min + C;
+ *G = Min + X;
+ *B = Min;
+ break;
+ case 1:
+ *R = Min + X;
+ *G = Min + C;
+ *B = Min;
+ break;
+ case 2:
+ *R = Min;
+ *G = Min + C;
+ *B = Min + X;
+ break;
+ case 3:
+ *R = Min;
+ *G = Min + X;
+ *B = Min + C;
+ break;
+ case 4:
+ *R = Min + X;
+ *G = Min;
+ *B = Min + C;
+ break;
+ case 5:
+ *R = Min + C;
+ *G = Min;
+ *B = Min + X;
+ break;
+ default:
+ *R = *G = *B = 0;
+ }
+}
+
+
+/**
+ * @brief Convert an sRGB color to Hue-Saturation-Lightness (HSL)
+ *
+ * @param H, S, L pointers to hold the result
+ * @param R, G, B the input sRGB values scaled in [0,1]
+ *
+ * This routine transforms from sRGB to the double hexcone HSL color space
+ * The sRGB values are assumed to be between 0 and 1. The outputs are
+ * H = hexagonal hue angle (0 <= H < 360),
+ * S = { C/(2L) if L <= 1/2 (0 <= S <= 1),
+ * { C/(2 - 2L) if L > 1/2
+ * L = (max(R',G',B') + min(R',G',B'))/2 (0 <= L <= 1),
+ * where C = max(R',G',B') - min(R',G',B'). The inverse color transformation
+ * is given by Hsl2Rgb.
+ *
+ * Wikipedia: http://en.wikipedia.org/wiki/HSL_and_HSV
+ */
+void Rgb2Hsl(double *H, double *S, double *L, double R, double G, double B)
+{
+ double Max = MAX3(R, G, B);
+ double Min = MIN3(R, G, B);
+ double C = Max - Min;
+
+
+ *L = (Max + Min)/2;
+
+ if(C > 0)
+ {
+ if(Max == R)
+ {
+ *H = (G - B) / C;
+
+ if(G < B)
+ *H += 6;
+ }
+ else if(Max == G)
+ *H = 2 + (B - R) / C;
+ else
+ *H = 4 + (R - G) / C;
+
+ *H *= 60;
+ *S = (*L <= 0.5) ? (C/(2*(*L))) : (C/(2 - 2*(*L)));
+ }
+ else
+ *H = *S = 0;
+}
+
+
+/**
+ * @brief Convert a Hue-Saturation-Lightness (HSL) color to sRGB
+ *
+ * @param R, G, B pointers to hold the result
+ * @param H, S, L the input HSL values
+ *
+ * The input values are assumed to be scaled as
+ * 0 <= H < 360,
+ * 0 <= S <= 1,
+ * 0 <= L <= 1.
+ * The output sRGB values are scaled between 0 and 1. This is the inverse
+ * transformation of Rgb2Hsl.
+ *
+ * Wikipedia: http://en.wikipedia.org/wiki/HSL_and_HSV
+ */
+void Hsl2Rgb(double *R, double *G, double *B, double H, double S, double L)
+{
+ double C = (L <= 0.5) ? (2*L*S) : ((2 - 2*L)*S);
+ double Min = L - 0.5*C;
+ double X;
+
+
+ H -= 360*floor(H/360);
+ H /= 60;
+ X = C*(1 - fabs(H - 2*floor(H/2) - 1));
+
+ switch((int)H)
+ {
+ case 0:
+ *R = Min + C;
+ *G = Min + X;
+ *B = Min;
+ break;
+ case 1:
+ *R = Min + X;
+ *G = Min + C;
+ *B = Min;
+ break;
+ case 2:
+ *R = Min;
+ *G = Min + C;
+ *B = Min + X;
+ break;
+ case 3:
+ *R = Min;
+ *G = Min + X;
+ *B = Min + C;
+ break;
+ case 4:
+ *R = Min + X;
+ *G = Min;
+ *B = Min + C;
+ break;
+ case 5:
+ *R = Min + C;
+ *G = Min;
+ *B = Min + X;
+ break;
+ default:
+ *R = *G = *B = 0;
+ }
+}
+
+
+/**
+ * @brief Convert an sRGB color to Hue-Saturation-Intensity (HSI)
+ *
+ * @param H, S, I pointers to hold the result
+ * @param R, G, B the input sRGB values scaled in [0,1]
+ *
+ * This routine transforms from sRGB to the cylindrical HSI color space. The
+ * sRGB values are assumed to be between 0 and 1. The output values are
+ * H = polar hue angle (0 <= H < 360),
+ * S = 1 - min(R',G',B')/I (0 <= S <= 1),
+ * I = (R'+G'+B')/3 (0 <= I <= 1).
+ * The inverse color transformation is given by Hsi2Rgb.
+ *
+ * Wikipedia: http://en.wikipedia.org/wiki/HSL_and_HSV
+ */
+void Rgb2Hsi(double *H, double *S, double *I, double R, double G, double B)
+{
+ double alpha = 0.5*(2*R - G - B);
+ double beta = 0.866025403784439*(G - B);
+
+
+ *I = (R + G + B)/3;
+
+ if(*I > 0)
+ {
+ *S = 1 - MIN3(R,G,B) / *I;
+ *H = atan2(beta, alpha)*(180/M_PI);
+
+ if(*H < 0)
+ *H += 360;
+ }
+ else
+ *H = *S = 0;
+}
+
+
+/**
+ * @brief Convert a Hue-Saturation-Intesity (HSI) color to sRGB
+ *
+ * @param R, G, B pointers to hold the result
+ * @param H, S, I the input HSI values
+ *
+ * The input values are assumed to be scaled as
+ * 0 <= H < 360,
+ * 0 <= S <= 1,
+ * 0 <= I <= 1.
+ * The output sRGB values are scaled between 0 and 1. This is the inverse
+ * transformation of Rgb2Hsi.
+ *
+ * Wikipedia: http://en.wikipedia.org/wiki/HSL_and_HSV
+ */
+void Hsi2Rgb(double *R, double *G, double *B, double H, double S, double I)
+{
+ H -= 360*floor(H/360);
+
+ if(H < 120)
+ {
+ *B = I*(1 - S);
+ *R = I*(1 + S*cos(H*(M_PI/180))/cos((60 - H)*(M_PI/180)));
+ *G = 3*I - *R - *B;
+ }
+ else if(H < 240)
+ {
+ H -= 120;
+ *R = I*(1 - S);
+ *G = I*(1 + S*cos(H*(M_PI/180))/cos((60 - H)*(M_PI/180)));
+ *B = 3*I - *R - *G;
+ }
+ else
+ {
+ H -= 240;
+ *G = I*(1 - S);
+ *B = I*(1 + S*cos(H*(M_PI/180))/cos((60 - H)*(M_PI/180)));
+ *R = 3*I - *G - *B;
+ }
+}
+
+
+/*
+ * == CIE color transformations ==
+ *
+ * The following routines implement transformations between sRGB and
+ * the CIE color spaces XYZ, L*a*b, L*u*v*, and L*C*H*. These
+ * transforms assume a 2 degree observer angle and a D65 illuminant.
+ */
+
+
+/**
+ * @brief Transform sRGB to CIE XYZ with the D65 white point
+ *
+ * @param X, Y, Z pointers to hold the result
+ * @param R, G, B the input sRGB values
+ *
+ * Poynton, "Frequently Asked Questions About Color," page 10
+ * Wikipedia: http://en.wikipedia.org/wiki/SRGB
+ * Wikipedia: http://en.wikipedia.org/wiki/CIE_1931_color_space
+ */
+void Rgb2Xyz(double *X, double *Y, double *Z, double R, double G, double B)
+{
+ R = INVGAMMACORRECTION(R);
+ G = INVGAMMACORRECTION(G);
+ B = INVGAMMACORRECTION(B);
+ *X = (double)(0.4123955889674142161*R + 0.3575834307637148171*G + 0.1804926473817015735*B);
+ *Y = (double)(0.2125862307855955516*R + 0.7151703037034108499*G + 0.07220049864333622685*B);
+ *Z = (double)(0.01929721549174694484*R + 0.1191838645808485318*G + 0.9504971251315797660*B);
+}
+
+
+/**
+ * @brief Transform CIE XYZ to sRGB with the D65 white point
+ *
+ * @param R, G, B pointers to hold the result
+ * @param X, Y, Z the input XYZ values
+ *
+ * Official sRGB specification (IEC 61966-2-1:1999)
+ * Poynton, "Frequently Asked Questions About Color," page 10
+ * Wikipedia: http://en.wikipedia.org/wiki/SRGB
+ * Wikipedia: http://en.wikipedia.org/wiki/CIE_1931_color_space
+ */
+void Xyz2Rgb(double *R, double *G, double *B, double X, double Y, double Z)
+{
+ double R1, B1, G1, Min;
+
+
+ R1 = (double)( 3.2406*X - 1.5372*Y - 0.4986*Z);
+ G1 = (double)(-0.9689*X + 1.8758*Y + 0.0415*Z);
+ B1 = (double)( 0.0557*X - 0.2040*Y + 1.0570*Z);
+
+ Min = MIN3(R1, G1, B1);
+
+ /* Force nonnegative values so that gamma correction is well-defined. */
+ if(Min < 0)
+ {
+ R1 -= Min;
+ G1 -= Min;
+ B1 -= Min;
+ }
+
+ /* Transform from RGB to R'G'B' */
+ *R = GAMMACORRECTION(R1);
+ *G = GAMMACORRECTION(G1);
+ *B = GAMMACORRECTION(B1);
+}
+
+
+/**
+ * Convert CIE XYZ to CIE L*a*b* (CIELAB) with the D65 white point
+ *
+ * @param L, a, b pointers to hold the result
+ * @param X, Y, Z the input XYZ values
+ *
+ * Wikipedia: http://en.wikipedia.org/wiki/Lab_color_space
+ */
+void Xyz2Lab(double *L, double *a, double *b, double X, double Y, double Z)
+{
+ X /= WHITEPOINT_X;
+ Y /= WHITEPOINT_Y;
+ Z /= WHITEPOINT_Z;
+ X = LABF(X);
+ Y = LABF(Y);
+ Z = LABF(Z);
+ *L = 116*Y - 16;
+ *a = 500*(X - Y);
+ *b = 200*(Y - Z);
+}
+
+
+/**
+ * Convert CIE L*a*b* (CIELAB) to CIE XYZ with the D65 white point
+ *
+ * @param X, Y, Z pointers to hold the result
+ * @param L, a, b the input L*a*b* values
+ *
+ * Wikipedia: http://en.wikipedia.org/wiki/Lab_color_space
+ */
+void Lab2Xyz(double *X, double *Y, double *Z, double L, double a, double b)
+{
+ L = (L + 16)/116;
+ a = L + a/500;
+ b = L - b/200;
+ *X = WHITEPOINT_X*LABINVF(a);
+ *Y = WHITEPOINT_Y*LABINVF(L);
+ *Z = WHITEPOINT_Z*LABINVF(b);
+}
+
+
+/**
+ * Convert CIE XYZ to CIE L*u*v* (CIELUV) with the D65 white point
+ *
+ * @param L, u, v pointers to hold the result
+ * @param X, Y, Z the input XYZ values
+ *
+ * Wikipedia: http://en.wikipedia.org/wiki/CIELUV_color_space
+ */
+void Xyz2Luv(double *L, double *u, double *v, double X, double Y, double Z)
+{
+ double u1, v1, Denom;
+
+
+ if((Denom = X + 15*Y + 3*Z) > 0)
+ {
+ u1 = (4*X) / Denom;
+ v1 = (9*Y) / Denom;
+ }
+ else
+ u1 = v1 = 0;
+
+ Y /= WHITEPOINT_Y;
+ Y = LABF(Y);
+ *L = 116*Y - 16;
+ *u = 13*(*L)*(u1 - WHITEPOINT_U);
+ *v = 13*(*L)*(v1 - WHITEPOINT_V);
+}
+
+
+/**
+ * Convert CIE L*u*v* (CIELUV) to CIE XYZ with the D65 white point
+ *
+ * @param X, Y, Z pointers to hold the result
+ * @param L, u, v the input L*u*v* values
+ *
+ * Wikipedia: http://en.wikipedia.org/wiki/CIELUV_color_space
+ */
+void Luv2Xyz(double *X, double *Y, double *Z, double L, double u, double v)
+{
+ *Y = (L + 16)/116;
+ *Y = WHITEPOINT_Y*LABINVF(*Y);
+
+ if(L != 0)
+ {
+ u /= L;
+ v /= L;
+ }
+
+ u = u/13 + WHITEPOINT_U;
+ v = v/13 + WHITEPOINT_V;
+ *X = (*Y) * ((9*u)/(4*v));
+ *Z = (*Y) * ((3 - 0.75*u)/v - 5);
+}
+
+
+/**
+ * Convert CIE XYZ to CIE L*C*H* with the D65 white point
+ *
+ * @param L, C, H pointers to hold the result
+ * @param X, Y, Z the input XYZ values
+ *
+ * CIE L*C*H* is related to CIE L*a*b* by
+ * a* = C* cos(H* pi/180),
+ * b* = C* sin(H* pi/180).
+ */
+void Xyz2Lch(double *L, double *C, double *H, double X, double Y, double Z)
+{
+ double a, b;
+
+
+ Xyz2Lab(L, &a, &b, X, Y, Z);
+ *C = sqrt(a*a + b*b);
+ *H = atan2(b, a)*180.0/M_PI;
+
+ if(*H < 0)
+ *H += 360;
+}
+
+/**
+ * Convert CIE L*C*H* to CIE XYZ with the D65 white point
+ *
+ * @param X, Y, Z pointers to hold the result
+ * @param L, C, H the input L*C*H* values
+ */
+void Lch2Xyz(double *X, double *Y, double *Z, double L, double C, double H)
+{
+ double a = C * cos(H*(M_PI/180.0));
+ double b = C * sin(H*(M_PI/180.0));
+
+
+ Lab2Xyz(X, Y, Z, L, a, b);
+}
+
+
+/** @brief XYZ to CAT02 LMS */
+void Xyz2Cat02lms(double *L, double *M, double *S, double X, double Y, double Z)
+{
+ *L = (double)( 0.7328*X + 0.4296*Y - 0.1624*Z);
+ *M = (double)(-0.7036*X + 1.6975*Y + 0.0061*Z);
+ *S = (double)( 0.0030*X + 0.0136*Y + 0.9834*Z);
+}
+
+
+/** @brief CAT02 LMS to XYZ */
+void Cat02lms2Xyz(double *X, double *Y, double *Z, double L, double M, double S)
+{
+ *X = (double)( 1.096123820835514*L - 0.278869000218287*M + 0.182745179382773*S);
+ *Y = (double)( 0.454369041975359*L + 0.473533154307412*M + 0.072097803717229*S);
+ *Z = (double)(-0.009627608738429*L - 0.005698031216113*M + 1.015325639954543*S);
+}
+
+
+/*
+ * == Glue functions for multi-stage transforms ==
+ */
+
+void Rgb2Lab(double *L, double *a, double *b, double R, double G, double B)
+{
+ double X, Y, Z;
+ Rgb2Xyz(&X, &Y, &Z, R, G, B);
+ Xyz2Lab(L, a, b, X, Y, Z);
+}
+
+
+void Lab2Rgb(double *R, double *G, double *B, double L, double a, double b)
+{
+ double X, Y, Z;
+ Lab2Xyz(&X, &Y, &Z, L, a, b);
+ Xyz2Rgb(R, G, B, X, Y, Z);
+}
+
+
+void Rgb2Luv(double *L, double *u, double *v, double R, double G, double B)
+{
+ double X, Y, Z;
+ Rgb2Xyz(&X, &Y, &Z, R, G, B);
+ Xyz2Luv(L, u, v, X, Y, Z);
+}
+
+
+void Luv2Rgb(double *R, double *G, double *B, double L, double u, double v)
+{
+ double X, Y, Z;
+ Luv2Xyz(&X, &Y, &Z, L, u, v);
+ Xyz2Rgb(R, G, B, X, Y, Z);
+}
+
+void Rgb2Lch(double *L, double *C, double *H, double R, double G, double B)
+{
+ double X, Y, Z;
+ Rgb2Xyz(&X, &Y, &Z, R, G, B);
+ Xyz2Lch(L, C, H, X, Y, Z);
+}
+
+
+void Lch2Rgb(double *R, double *G, double *B, double L, double C, double H)
+{
+ double X, Y, Z;
+ Lch2Xyz(&X, &Y, &Z, L, C, H);
+ Xyz2Rgb(R, G, B, X, Y, Z);
+}
+
+
+void Rgb2Cat02lms(double *L, double *M, double *S, double R, double G, double B)
+{
+ double X, Y, Z;
+ Rgb2Xyz(&X, &Y, &Z, R, G, B);
+ Xyz2Cat02lms(L, M, S, X, Y, Z);
+}
+
+
+void Cat02lms2Rgb(double *R, double *G, double *B, double L, double M, double S)
+{
+ double X, Y, Z;
+ Cat02lms2Xyz(&X, &Y, &Z, L, M, S);
+ Xyz2Rgb(R, G, B, X, Y, Z);
+}
diff --git a/libs/canvas/wave_view.cc b/libs/canvas/wave_view.cc
index b5538a834a..553bcdf5d3 100644
--- a/libs/canvas/wave_view.cc
+++ b/libs/canvas/wave_view.cc
@@ -683,7 +683,7 @@ WaveView::draw_image (Cairo::RefPtr<Cairo::ImageSurface>& image, PeakData* _peak
color_to_hsv (_fill_color, h, s, v);
/* change v towards white */
v *= 1.0 - gradient_depth();
- Color center = hsv_to_color (h, s, v, a);
+ Color center = hsva_to_color (h, s, v, a);
color_to_rgba (center, r, g, b, a);
gradient->add_color_stop_rgba (stops[0], r, g, b, a);
diff --git a/libs/canvas/wscript b/libs/canvas/wscript
index 684871e54f..468c5ea28e 100644
--- a/libs/canvas/wscript
+++ b/libs/canvas/wscript
@@ -33,6 +33,7 @@ canvas_sources = [
'canvas.cc',
'circle.cc',
'colors.cc',
+ 'colorspace.cc',
'container.cc',
'curve.cc',
'debug.cc',