40 lines
1.2 KiB
Lua
40 lines
1.2 KiB
Lua
local M = {}
|
|
|
|
local bit = require("bit")
|
|
local rshift, band = bit.rshift, bit.band
|
|
|
|
--- Returns a table containing the RGB values encoded inside 24 least
|
|
--- significant bits of the number @rgb_24bit
|
|
---
|
|
--@param rgb_24bit (number) 24-bit RGB value
|
|
--@returns (table) with keys 'r', 'g', 'b' in [0,255]
|
|
local function decode_24bit_rgb(rgb_24bit)
|
|
vim.validate({ rgb_24bit = { rgb_24bit, "n", true } })
|
|
local r = band(rshift(rgb_24bit, 16), 255)
|
|
local g = band(rshift(rgb_24bit, 8), 255)
|
|
local b = band(rgb_24bit, 255)
|
|
return { r = r, g = g, b = b }
|
|
end
|
|
|
|
local function alter(attr, percent)
|
|
return math.floor(attr * (100 + percent) / 100)
|
|
end
|
|
|
|
---@source https://stackoverflow.com/q/5560248
|
|
---@see: https://stackoverflow.com/a/37797380
|
|
---Darken a specified hex color
|
|
---@param color string
|
|
---@param percent number
|
|
---@return string
|
|
function M.shade_color(color, percent)
|
|
local rgb = decode_24bit_rgb(color)
|
|
if not rgb.r or not rgb.g or not rgb.b then
|
|
return "NONE"
|
|
end
|
|
local r, g, b = alter(rgb.r, percent), alter(rgb.g, percent), alter(rgb.b, percent)
|
|
r, g, b = math.min(r, 255), math.min(g, 255), math.min(b, 255)
|
|
return string.format("#%02x%02x%02x", r, g, b)
|
|
end
|
|
|
|
return M
|