]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/shared/color-util.c
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
5 #include "color-util.h"
8 void rgb_to_hsv(double r
, double g
, double b
,
9 double *ret_h
, double *ret_s
, double *ret_v
) {
11 assert(r
>= 0 && r
<= 1);
12 assert(g
>= 0 && g
<= 1);
13 assert(b
>= 0 && b
<= 1);
18 double max_color
= fmax(r
, fmax(g
, b
));
19 double min_color
= fmin(r
, fmin(g
, b
));
20 double delta
= max_color
- min_color
;
22 *ret_v
= max_color
* 100.0;
25 *ret_s
= delta
/ max_color
* 100.0;
34 *ret_h
= 60 * fmod((g
- b
) / delta
, 6);
35 else if (g
>= max_color
)
36 *ret_h
= 60 * (((b
- r
) / delta
) + 2);
37 else if (b
>= max_color
)
38 *ret_h
= 60 * (((r
- g
) / delta
) + 4);
40 *ret_h
= fmod(*ret_h
, 360);
45 void hsv_to_rgb(double h
, double s
, double v
,
46 uint8_t* ret_r
, uint8_t *ret_g
, uint8_t *ret_b
) {
48 double c
, x
, m
, r
, g
, b
;
50 assert(s
>= 0 && s
<= 100);
51 assert(v
>= 0 && v
<= 100);
57 c
= (s
/ 100.0) * (v
/ 100.0);
58 x
= c
* (1 - fabs(fmod(h
/ 60.0, 2) - 1));
62 r
= c
, g
= x
, b
= 0.0;
63 else if (h
>= 60 && h
< 120)
64 r
= x
, g
= c
, b
= 0.0;
65 else if (h
>= 120 && h
< 180)
66 r
= 0.0, g
= c
, b
= x
;
67 else if (h
>= 180 && h
< 240)
68 r
= 0.0, g
= x
, b
= c
;
69 else if (h
>= 240 && h
< 300)
70 r
= x
, g
= 0.0, b
= c
;
72 r
= c
, g
= 0.0, b
= x
;
74 *ret_r
= (uint8_t) ((r
+ m
) * 255);
75 *ret_g
= (uint8_t) ((g
+ m
) * 255);
76 *ret_b
= (uint8_t) ((b
+ m
) * 255);