Rewrite choose_line_colour() to work with a dark background
Use HSL with fixed saturation/lightness, and a hue based on the sink index.
This commit is contained in:
@@ -14,64 +14,42 @@ static const double dash[] = { 4 };
|
|||||||
// top/bottom?
|
// top/bottom?
|
||||||
#define IS_MIXER(x) ((x) == PC_MIX || (x) == PC_DSP)
|
#define IS_MIXER(x) ((x) == PC_MIX || (x) == PC_DSP)
|
||||||
|
|
||||||
|
static void hsl_to_rgb(
|
||||||
|
double h, double s, double l,
|
||||||
|
double *r, double *g, double *b
|
||||||
|
) {
|
||||||
|
double c = (1 - fabs(2 * l - 1)) * s;
|
||||||
|
double hp = h / 60;
|
||||||
|
double x = c * (1 - fabs(fmod(hp, 2) - 1));
|
||||||
|
double m = l - c / 2;
|
||||||
|
|
||||||
|
if (hp < 1) { *r = c; *g = x; *b = 0; }
|
||||||
|
else if (hp < 2) { *r = x; *g = c; *b = 0; }
|
||||||
|
else if (hp < 3) { *r = 0; *g = c; *b = x; }
|
||||||
|
else if (hp < 4) { *r = 0; *g = x; *b = c; }
|
||||||
|
else if (hp < 5) { *r = x; *g = 0; *b = c; }
|
||||||
|
else { *r = c; *g = 0; *b = x; }
|
||||||
|
|
||||||
|
*r += m;
|
||||||
|
*g += m;
|
||||||
|
*b += m;
|
||||||
|
}
|
||||||
|
|
||||||
static void choose_line_colour(
|
static void choose_line_colour(
|
||||||
struct routing_src *r_src,
|
int i,
|
||||||
struct routing_snk *r_snk,
|
int count,
|
||||||
double *r,
|
double *r,
|
||||||
double *g,
|
double *g,
|
||||||
double *b
|
double *b
|
||||||
) {
|
) {
|
||||||
// left channels have odd numbers
|
if (count % 2)
|
||||||
// right channels have even numbers
|
count++;
|
||||||
int odd_src = r_src->lr_num & 1;
|
hsl_to_rgb(
|
||||||
int odd_snk = r_snk->elem->lr_num & 1;
|
((i / (count / 2) * 360 + i * 720) / count) % 360,
|
||||||
|
0.75,
|
||||||
// for colouring, pair channels up
|
0.5,
|
||||||
// 0 for odd pairs, 1 for even pairs
|
r, g, b
|
||||||
int src2 = ((r_src->lr_num - 1) / 2 & 1);
|
);
|
||||||
int snk2 = ((r_snk->elem->lr_num - 1) / 2 & 1);
|
|
||||||
|
|
||||||
// left -> left, black
|
|
||||||
if (odd_src && odd_snk) {
|
|
||||||
*r = 0;
|
|
||||||
*g = 0;
|
|
||||||
*b = 0;
|
|
||||||
|
|
||||||
// right -> right, red
|
|
||||||
} else if (!odd_src && !odd_snk) {
|
|
||||||
*r = 1;
|
|
||||||
*g = 0;
|
|
||||||
*b = 0;
|
|
||||||
|
|
||||||
// left -> right, dark green
|
|
||||||
} else if (odd_src) {
|
|
||||||
*r = 0;
|
|
||||||
*g = 0.25;
|
|
||||||
*b = 0;
|
|
||||||
|
|
||||||
// right -> left, dark brown/olive
|
|
||||||
} else {
|
|
||||||
*r = 0.25;
|
|
||||||
*g = 0.25;
|
|
||||||
*b = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// mix <-> non-mix, add blue
|
|
||||||
if (IS_MIXER(r_src->port_category) !=
|
|
||||||
IS_MIXER(r_snk->port_category)) {
|
|
||||||
*b = 0.5;
|
|
||||||
}
|
|
||||||
|
|
||||||
// even input pairs, lighten red and green components
|
|
||||||
if (src2) {
|
|
||||||
*r = (*r + 1) / 2;
|
|
||||||
*g = (*g + 1) / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
// even output pairs, lighten blue component
|
|
||||||
if (snk2) {
|
|
||||||
*b = (*b + 1) / 2;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// draw a bezier curve given the end and control points
|
// draw a bezier curve given the end and control points
|
||||||
@@ -309,7 +287,7 @@ void draw_routing_lines(
|
|||||||
|
|
||||||
// pick a colour
|
// pick a colour
|
||||||
double r, g, b;
|
double r, g, b;
|
||||||
choose_line_colour(r_src, r_snk, &r, &g, &b);
|
choose_line_colour(i, card->routing_snks->len, &r, &g, &b);
|
||||||
|
|
||||||
// make the colour lighter if it's being shown dotted
|
// make the colour lighter if it's being shown dotted
|
||||||
if (dragging_this) {
|
if (dragging_this) {
|
||||||
@@ -385,14 +363,14 @@ void draw_drag_line(
|
|||||||
cr,
|
cr,
|
||||||
x1, y1, card->src_drag->port_category,
|
x1, y1, card->src_drag->port_category,
|
||||||
x2, y2, card->snk_drag->port_category,
|
x2, y2, card->snk_drag->port_category,
|
||||||
0, 0, 0, 2
|
1, 1, 1, 2
|
||||||
);
|
);
|
||||||
|
|
||||||
// otherwise draw a straight line
|
// otherwise draw a straight line
|
||||||
} else {
|
} else {
|
||||||
cairo_set_dash(cr, dash, 1, 0);
|
cairo_set_dash(cr, dash, 1, 0);
|
||||||
|
|
||||||
cairo_set_source_rgb(cr, 0, 0, 0);
|
cairo_set_source_rgb(cr, 1, 1, 1);
|
||||||
cairo_set_line_width(cr, 2);
|
cairo_set_line_width(cr, 2);
|
||||||
cairo_move_to(cr, x1, y1);
|
cairo_move_to(cr, x1, y1);
|
||||||
cairo_line_to(cr, x2, y2);
|
cairo_line_to(cr, x2, y2);
|
||||||
|
|||||||
Reference in New Issue
Block a user