From: Vsevolod Stakhov Date: Thu, 4 Mar 2021 20:34:58 +0000 (+0000) Subject: [Project] Css: Fix HSL conversion X-Git-Tag: 3.0~614 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=956aa233ad9536a5d2ca8b1ed6924b15cd5fee10;p=rspamd.git [Project] Css: Fix HSL conversion --- diff --git a/src/libserver/css/css_value.cxx b/src/libserver/css/css_value.cxx index f00543615..c0ed9242c 100644 --- a/src/libserver/css/css_value.cxx +++ b/src/libserver/css/css_value.cxx @@ -158,17 +158,11 @@ constexpr static inline auto h_component_convert(const css_parser_token &tok) else if (dbl < 0) { dbl = 0; } - ret = (dbl / 100.0) * 360.0; + ret = (dbl / 100.0); } else { - if (dbl > 360) { - dbl = 360; - } - else if (dbl < 0) { - dbl = 0; - } - - ret = dbl; + dbl = ((((int)dbl % 360) + 360) % 360); /* Deal with rotations */ + ret = dbl / 360.0; /* Normalize to 0..1 */ } } @@ -210,6 +204,8 @@ constexpr static inline auto sl_component_convert(const css_parser_token &tok) static inline auto hsl_to_rgb(double h, double s, double l) -> css_color { + css_color ret; + constexpr auto hue2rgb = [](auto p, auto q, auto t) -> auto { if (t < 0.0) { t += 1.0; @@ -217,25 +213,33 @@ static inline auto hsl_to_rgb(double h, double s, double l) if (t > 1.0) { t -= 1.0; } - if (t < 1.0/6.0) { + if (t * 6. < 1.0) { return p + (q - p) * 6.0 * t; } - if (t < 0.5) { + if (t * 2. < 1) { return q; } - if (t < 2.0/3.0) { + if (t * 3. < 2.) { return p + (q - p) * (2.0/3.0 - t) * 6.0; } - return p * 255.0; + return p; }; - css_color ret; + if (s == 0) { + /* Achromatic */ + ret.r = l; + ret.g = l; + ret.b = l; + } + else { + auto q = l <= 0.5 ? l * (1.0 + s) : l + s - l * s; + auto p = 2.0 * l - q; + ret.r = (std::uint8_t) (hue2rgb(p, q, h + 1.0 / 3.0) * 255); + ret.g = (std::uint8_t) (hue2rgb(p, q, h) * 255); + ret.b = (std::uint8_t) (hue2rgb(p, q, h - 1.0 / 3.0) * 255); + } - auto q = l < 0.5 ? l * (1.0 + s) : l + s - l * s; - auto p = 2.0 * l - q; - ret.r = (std::uint8_t)hue2rgb(p, q, h + 1.0/3.0); - ret.g = (std::uint8_t)hue2rgb(p, q, h); - ret.b = (std::uint8_t)hue2rgb(p, q, h - 1.0/3.0); + ret.alpha = 255; return ret; } diff --git a/src/libserver/css/css_value.hxx b/src/libserver/css/css_value.hxx index a8152ed10..5f9fa0cee 100644 --- a/src/libserver/css/css_value.hxx +++ b/src/libserver/css/css_value.hxx @@ -36,7 +36,7 @@ struct alignas(int) css_color { std::uint8_t alpha; - constexpr css_color(std::uint8_t _r, std::uint8_t _g, std::uint8_t _b, std::uint8_t _alpha = 255) : + css_color(std::uint8_t _r, std::uint8_t _g, std::uint8_t _b, std::uint8_t _alpha = 255) : r(_r), g(_g), b(_b), alpha(_alpha) {} css_color() = default; };