Last active
September 5, 2022 20:00
-
-
Save sfaut/7d56e181c4f317f0203996fe7e4b92bf to your computer and use it in GitHub Desktop.
HSL management with MySQL
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- HSL functions, manage HSL CSS colors | |
-- Author : sfaut <https://github.com/sfaut> | |
-- Publication date : 2022-09-05 | |
-- Tested with MySQL 8.0.30 (@@sql_mode='ANSI,TRADITIONAL') | |
/* | |
Summary : | |
hsl() Create a CSS HSL representation of a color | |
hsl_as_json() Extract CSS HSL color components in a JSON object { hue, lightness, saturation } | |
hsl_get_hue() Extract hue component from CSS HSL color | |
hsl_get_saturation() Extract saturation component from CSS HSL color | |
hsl_get_lightness() Extract lightness component from CSS HSL color | |
hsl_set_hue() Set a new hue to a CSS HSL color | |
hsl_set_saturation() Set a new saturation to a CSS HSL color | |
hsl_set_lightness() Set a new lightness to a CSS HSL color | |
hsl_rotate() Apply a rotation to the hue from a CSS HSL color | |
hsl_saturate() Apply a saturation to the CSS HSL color | |
hsl_desaturate() Apply a desaturation to the CSS HSL color | |
hsl_lighten() Lighten a CSS HSL color | |
hsl_darken() Darken a CSS HSL color | |
*/ | |
DELILITER ;; | |
SET @@sql_mode = 'ANSI,TRADITIONAL';; | |
CREATE FUNCTION hsl(hue SMALLINT, saturation TINYINT UNSIGNED, lightness TINYINT UNSIGNED) | |
RETURNS TINYTEXT DETERMINISTIC | |
COMMENT 'Create a CSS HSL representation of a color' | |
RETURN CONCAT('hsl(', hue, 'deg ', saturation, '% ', lightness, '%)');; | |
CREATE FUNCTION hsl_as_json(hsl TINYTEXT) | |
RETURNS JSON DETERMINISTIC | |
COMMENT 'Extract CSS HSL color components in a JSON object { hue, lightness, saturation }' | |
RETURN JSON_OBJECT( | |
'hue', hsl_get_hue(hsl), | |
'saturation', hsl_get_saturation(hsl), | |
'lightness', hsl_get_lightness(hsl) | |
);; | |
CREATE FUNCTION hsl_get_hue(hsl TINYTEXT) | |
RETURNS SMALLINT DETERMINISTIC | |
COMMENT 'Extract hue component from CSS HSL color' | |
RETURN REGEXP_SUBSTR(hsl, '\\d+', 1, 1);; | |
CREATE FUNCTION hsl_get_saturation(hsl TINYTEXT) | |
RETURNS TINYINT UNSIGNED DETERMINISTIC | |
COMMENT 'Extract saturation component from CSS HSL color' | |
RETURN REGEXP_SUBSTR(hsl, '\\d+', 1, 2);; | |
CREATE FUNCTION hsl_get_lightness(hsl TINYTEXT) | |
RETURNS TINYINT UNSIGNED DETERMINISTIC | |
COMMENT 'Extract lightness component from CSS HSL color' | |
RETURN REGEXP_SUBSTR(hsl, '\\d+', 1, 3);; | |
CREATE FUNCTION hsl_set_hue(hsl TINYTEXT, new_hue SMALLINT) | |
RETURNS TINYTEXT DETERMINISTIC | |
COMMENT 'Set a new hue to a CSS HSL color' | |
BEGIN | |
IF new_hue <= -360 OR new_hue >= 360 THEN | |
SET new_hue = hue MOD 360; | |
END IF; | |
IF new_hue < 0 THEN | |
SET new_hue = 360 + new_hue; | |
END IF; | |
RETURN hsl(new_hue, hsl_get_saturation(hsl), hsl_get_lightness(hsl));; | |
END;; | |
CREATE FUNCTION hsl_set_saturation(hsl TINYTEXT, new_saturation TINYINT) | |
RETURNS TINYTEXT DETERMINISTIC | |
COMMENT 'Set a new saturation to a CSS HSL color' | |
BEGIN | |
IF new_saturation < 0 THEN | |
SET new_saturation = 0; | |
ELSEIF new_saturation > 100 THEN | |
SET new_saturation = 100; | |
END IF; | |
RETURN hsl(hsl_get_hue(hsl), new_saturation, hsl_get_lightness(hsl)); | |
END;; | |
CREATE FUNCTION hsl_set_lightness(hsl TINYTEXT, new_lightness TINYINT) | |
RETURNS TINYTEXT DETERMINISTIC | |
COMMENT 'Set a new lightness to a CSS HSL color' | |
BEGIN | |
IF new_lightness < 0 THEN | |
SET new_lightness = 0; | |
ELSEIF new_lightness > 100 THEN | |
SET new_lightness = 100; | |
END IF; | |
RETURN hsl(hsl_get_hue(hsl), hsl_get_saturation(hsl), new_lightness); | |
END;; | |
CREATE FUNCTION hsl_rotate(hsl TINYTEXT, rotation SMALLINT) | |
RETURNS TINYTEXT DETERMINISTIC | |
COMMENT 'Apply a hue to a CSS HSL color' | |
BEGIN | |
DECLARE new_hue SMALLINT DEFAULT hsl_get_hue(hsl) + rotation; | |
IF new_hue <= -360 OR new_hue >= 360 THEN | |
SET new_hue = new_hue MOD 360; | |
END IF; | |
IF new_hue < 0 THEN | |
SET new_hue = 360 + new_hue; | |
END IF; | |
RETURN hsl_set_hue(hsl, new_hue); | |
END;; | |
CREATE FUNCTION hsl_saturate(hsl TINYTEXT, amount TINYINT) | |
RETURNS TINYTEXT DETERMINISTIC | |
COMMENT 'Apply a saturation to the CSS HSL color' | |
BEGIN | |
DECLARE new_saturation TINYINT DEFAULT hsl_get_saturation(hsl) + amount; | |
IF new_saturation < 0 THEN | |
SET new_saturation = 0; | |
ELSEIF new_saturation > 100 THEN | |
SET new_saturation = 100; | |
END IF; | |
RETURN hsl_set_saturation(hsl, new_saturation); | |
END;; | |
CREATE FUNCTION hsl_desaturate(hsl TINYTEXT, amount TINYINT) | |
RETURNS TINYTEXT DETERMINISTIC | |
COMMENT 'Apply a desaturation to the CSS HSL color' | |
RETURN hsl_saturate(hsl, -amount);; | |
CREATE FUNCTION hsl_lighten(hsl TINYTEXT, amount TINYINT) | |
RETURNS TINYTEXT DETERMINISTIC | |
COMMENT 'Lighten a CSS HSL color' | |
BEGIN | |
DECLARE new_lightness TINYINT DEFAULT hsl_get_lightness(hsl) + amount; | |
IF new_lightness < 0 THEN | |
SET new_lightness = 0; | |
ELSEIF new_lightness > 100 THEN | |
SET new_lightness = 100; | |
END IF; | |
RETURN hsl_set_lightness(hsl, new_lightness); | |
END;; | |
CREATE FUNCTION hsl_darken(hsl TINYTEXT, amount TINYINT) | |
RETURNS TINYTEXT DETERMINISTIC | |
COMMENT 'Darken a CSS HSL color' | |
RETURN hsl_lighten(hsl, -amount);; | |
DELIMITER ; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment