continue tweaks on the color road

This commit is contained in:
Paul Davis 2014-11-20 14:01:12 -05:00
parent 7fc1152d31
commit 137425faf1
2 changed files with 90 additions and 99 deletions

View File

@ -47,10 +47,8 @@ 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
@ -69,7 +67,7 @@ UIConfiguration::UIConfiguration ()
*/
#undef CANVAS_BASE_COLOR
#define CANVAS_BASE_COLOR(var,name,val) var (name,val),
#define CANVAS_BASE_COLOR(var,name,val) var (name,quantized (val)),
#include "base_colors.h"
#undef CANVAS_BASE_COLOR
@ -96,26 +94,9 @@ UIConfiguration::UIConfiguration ()
#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 ();
// regenerate_relative_definitions ();
color_compute ();
@ -126,9 +107,86 @@ UIConfiguration::~UIConfiguration ()
{
}
void
UIConfiguration::original_colors ()
Color
UIConfiguration::quantized (Color c)
{
HSV hsv (c);
hsv.h = hue_cnt * (round (hsv.h/hue_cnt));
return hsv.color ();
}
void
UIConfiguration::print_relative_def (string camelcase, string name, Color c)
{
HSV variable (c);
HSV closest;
double shortest_distance = DBL_MAX;
string closest_name;
map<string,ColorVariable<Color>*>::iterator f;
std::map<std::string,HSV> palette;
for (f = configurable_colors.begin(); f != configurable_colors.end(); ++f) {
palette.insert (make_pair (f->first, HSV (f->second->get())));
}
for (map<string,HSV>::iterator f = palette.begin(); f != palette.end(); ++f) {
double d;
HSV fixed (f->second);
if (fixed.is_gray() || variable.is_gray()) {
/* at least one is achromatic; HSV::distance() will do
* the right thing
*/
d = fixed.distance (variable);
} else {
/* chromatic: compare ONLY hue because our task is
to pick the HUE closest and then compute
a modifier. We want to keep the number of
hues low, and by computing perceptual distance
we end up finding colors that are to each
other without necessarily be close in hue.
*/
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);
/* quantize hue delta so we don't end up with many subtle hues caused
* by original color choices
*/
delta.h = hue_cnt * (round (delta.h/hue_cnt));
cerr << "CANVAS_COLOR(" << camelcase << ",\"" << name << "\", \"" << closest_name << "\", HSV("
<< delta.h << ',' << delta.s << ',' << delta.v << ',' << variable.a << ")) /*"
<< shortest_distance << " */" << endl;
}
void
UIConfiguration::regenerate_relative_definitions ()
{
/* this takes the color definitions from around ardour 3.5.3600,
quantizes their hues, then prints out macros to be used
when defining these colors relative to the current
base palette. It doesn't need to be called unless
we change the base palette defaults.
*/
map<string,HSV> c;
c.insert (make_pair ("active crossfade", HSV (0x20b2af2e)));
c.insert (make_pair ("arrange base", HSV (0x595959ff)));
@ -803,43 +861,6 @@ UIConfiguration::set_state (const XMLNode& root, int /*version*/)
return 0;
}
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)
@ -888,23 +909,12 @@ UIConfiguration::dirty () const
ArdourCanvas::Color
UIConfiguration::base_color_by_name (const std::string& name) const
{
map<std::string,ColorVariable<uint32_t>* >::const_iterator i = configurable_colors.find (name);
map<std::string,ColorVariable<Color>* >::const_iterator i = configurable_colors.find (name);
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'.
@ -985,7 +995,7 @@ UIConfiguration::color_compute ()
{
using namespace ArdourCanvas;
map<std::string,ColorVariable<uint32_t>* >::iterator f;
map<std::string,ColorVariable<Color>* >::iterator f;
map<std::string,HSV*>::iterator v;
/* now compute distances */
@ -996,29 +1006,6 @@ UIConfiguration::color_compute ()
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) {
@ -1051,6 +1038,9 @@ UIConfiguration::color_compute ()
*/
string alias = string_compose ("color %1", actual_colors.size() + 1);
//cerr << alias << " == " << current_color->second.base_color
// << " [ " << HSV (base_color_by_name (current_color->second.base_color)) << "] + "
// << current_color->second.modifier << endl;
actual_colors.insert (make_pair (alias, current_color->second.get()));
color_aliases.insert (make_pair (current_color->first, alias));

View File

@ -85,7 +85,7 @@ class UIConfiguration : public PBD::Stateful
static UIConfiguration* instance() { return _instance; }
std::map<std::string,ColorVariable<uint32_t> *> configurable_colors;
std::map<std::string,ColorVariable<ArdourCanvas::Color> *> configurable_colors;
bool dirty () const;
void set_dirty ();
@ -175,7 +175,7 @@ class UIConfiguration : public PBD::Stateful
/* 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;
#define CANVAS_BASE_COLOR(var,name,val) ColorVariable<ArdourCanvas::Color> var;
#include "base_colors.h"
#undef CANVAS_BASE_COLOR
@ -193,7 +193,8 @@ class UIConfiguration : public PBD::Stateful
void color_compute ();
void print_relative_def (std::string camelcase, std::string name, ArdourCanvas::Color c);
void color_theme_changed ();
void original_colors ();
void regenerate_relative_definitions ();
ArdourCanvas::Color quantized (ArdourCanvas::Color);
};
#endif /* __ardour_ui_configuration_h__ */