Skip to content

Instantly share code, notes, and snippets.

@ZwerOxotnik
Last active September 13, 2022 10:27
Show Gist options
  • Save ZwerOxotnik/8856e1a0f3b89425ce1669158528d41a to your computer and use it in GitHub Desktop.
Save ZwerOxotnik/8856e1a0f3b89425ce1669158528d41a to your computer and use it in GitHub Desktop.
Converts HEX code to numbers in RGB for Lua 5.x
do
local match = string.match
local cashedHEX = {["00"] = 0, ["0A"] = 10, ["0B"] = 11, ["0C"] = 12, ["0E"] = 14, ["0F"] = 15, ["0a"] = 10, ["0b"] = 11, ["0c"] = 12, ["0f"] = 15, ["01"] = 1, ["1A"] = 26, ["1B"] = 27, ["1C"] = 28, ["1E"] = 30, ["1F"] = 31, ["1a"] = 26, ["1b"] = 27, ["1c"] = 28, ["1f"] = 31, ["02"] = 2, ["2A"] = 42, ["2B"] = 43, ["2C"] = 44, ["2E"] = 46, ["2F"] = 47, ["2a"] = 42, ["2b"] = 43, ["2c"] = 44, ["2f"] = 47, ["03"] = 3, ["3A"] = 58, ["3B"] = 59, ["3C"] = 60, ["3E"] = 62, ["3F"] = 63, ["3a"] = 58, ["3b"] = 59, ["3c"] = 60, ["3f"] = 63, ["04"] = 4, ["4A"] = 74, ["4B"] = 75, ["4C"] = 76, ["4E"] = 78, ["4F"] = 79, ["4a"] = 74, ["4b"] = 75, ["4c"] = 76, ["4f"] = 79, ["05"] = 5, ["5A"] = 90, ["5B"] = 91, ["5C"] = 92, ["5E"] = 94, ["5F"] = 95, ["5a"] = 90, ["5b"] = 91, ["5c"] = 92, ["5f"] = 95, ["06"] = 6, ["6A"] = 106, ["6B"] = 107, ["6C"] = 108, ["6E"] = 110, ["6F"] = 111, ["6a"] = 106, ["6b"] = 107, ["6c"] = 108, ["6f"] = 111, ["07"] = 7, ["7A"] = 122, ["7B"] = 123, ["7C"] = 124, ["7E"] = 126, ["7F"] = 127, ["7a"] = 122, ["7b"] = 123, ["7c"] = 124, ["7f"] = 127, ["08"] = 8, ["8A"] = 138, ["8B"] = 139, ["8C"] = 140, ["8E"] = 142, ["8F"] = 143, ["8a"] = 138, ["8b"] = 139, ["8c"] = 140, ["8f"] = 143, ["09"] = 9, ["9A"] = 154, ["9B"] = 155, ["9C"] = 156, ["9E"] = 158, ["9F"] = 159, ["9a"] = 154, ["9b"] = 155, ["9c"] = 156, ["9f"] = 159, ["10"] = 16, ["11"] = 17, ["12"] = 18, ["13"] = 19, ["14"] = 20, ["15"] = 21, ["16"] = 22, ["17"] = 23, ["18"] = 24, ["19"] = 25, ["20"] = 32, ["21"] = 33, ["22"] = 34, ["23"] = 35, ["24"] = 36, ["25"] = 37, ["26"] = 38, ["27"] = 39, ["28"] = 40, ["29"] = 41, ["30"] = 48, ["31"] = 49, ["32"] = 50, ["33"] = 51, ["34"] = 52, ["35"] = 53, ["36"] = 54, ["37"] = 55, ["38"] = 56, ["39"] = 57, ["40"] = 64, ["41"] = 65, ["42"] = 66, ["43"] = 67, ["44"] = 68, ["45"] = 69, ["46"] = 70, ["47"] = 71, ["48"] = 72, ["49"] = 73, ["50"] = 80, ["51"] = 81, ["52"] = 82, ["53"] = 83, ["54"] = 84, ["55"] = 85, ["56"] = 86, ["57"] = 87, ["58"] = 88, ["59"] = 89, ["60"] = 96, ["61"] = 97, ["62"] = 98, ["63"] = 99, ["64"] = 100, ["65"] = 101, ["66"] = 102, ["67"] = 103, ["68"] = 104, ["69"] = 105, ["70"] = 112, ["71"] = 113, ["72"] = 114, ["73"] = 115, ["74"] = 116, ["75"] = 117, ["76"] = 118, ["77"] = 119, ["78"] = 120, ["79"] = 121, ["80"] = 128, ["81"] = 129, ["82"] = 130, ["83"] = 131, ["84"] = 132, ["85"] = 133, ["86"] = 134, ["87"] = 135, ["88"] = 136, ["89"] = 137, ["90"] = 144, ["91"] = 145, ["92"] = 146, ["93"] = 147, ["94"] = 148, ["95"] = 149, ["96"] = 150, ["97"] = 151, ["98"] = 152, ["99"] = 153, A0 = 160, A1 = 161, A2 = 162, A3 = 163, A4 = 164, A5 = 165, A6 = 166, A7 = 167, A8 = 168, A9 = 169, AA = 170, AB = 171, AC = 172, AE = 174, AF = 175, Aa = 170, Ab = 171, Ac = 172, Af = 175, B0 = 176, B1 = 177, B2 = 178, B3 = 179, B4 = 180, B5 = 181, B6 = 182, B7 = 183, B8 = 184, B9 = 185, BA = 186, BB = 187, BC = 188, BE = 190, BF = 191, Ba = 186, Bb = 187, Bc = 188, Bf = 191, C0 = 192, C1 = 193, C2 = 194, C3 = 195, C4 = 196, C5 = 197, C6 = 198, C7 = 199, C8 = 200, C9 = 201, CA = 202, CB = 203, CC = 204, CE = 206, CF = 207, Ca = 202, Cb = 203, Cc = 204, Cf = 207, E0 = 224, E1 = 225, E2 = 226, E3 = 227, E4 = 228, E5 = 229, E6 = 230, E7 = 231, E8 = 232, E9 = 233, EA = 234, EB = 235, EC = 236, EE = 238, EF = 239, Ea = 234, Eb = 235, Ec = 236, Ef = 239, F0 = 240, F1 = 241, F2 = 242, F3 = 243, F4 = 244, F5 = 245, F6 = 246, F7 = 247, F8 = 248, F9 = 249, FA = 250, FB = 251, FC = 252, FE = 254, FF = 255, Fa = 250, Fb = 251, Fc = 252, Ff = 255, a0 = 160, a1 = 161, a2 = 162, a3 = 163, a4 = 164, a5 = 165, a6 = 166, a7 = 167, a8 = 168, a9 = 169, aA = 170, aB = 171, aC = 172, aE = 174, aF = 175, aa = 170, ab = 171, ac = 172, af = 175, b0 = 176, b1 = 177, b2 = 178, b3 = 179, b4 = 180, b5 = 181, b6 = 182, b7 = 183, b8 = 184, b9 = 185, bA = 186, bB = 187, bC = 188, bE = 190, bF = 191, ba = 186, bb = 187, bc = 188, bf = 191, c0 = 192, c1 = 193, c2 = 194, c3 = 195, c4 = 196, c5 = 197, c6 = 198, c7 = 199, c8 = 200, c9 = 201, cA = 202, cB = 203, cC = 204, cE = 206, cF = 207, ca = 202, cb = 203, cc = 204, cf = 207, f0 = 240, f1 = 241, f2 = 242, f3 = 243, f4 = 244, f5 = 245, f6 = 246, f7 = 247, f8 = 248, f9 = 249, fA = 250, fB = 251, fC = 252, fE = 254, fF = 255, fa = 250, fb = 251, fc = 252, ff = 255}
local cashedShortHEX = {["0"] = 0, ["1"] = 17, ["2"] = 34, ["3"] = 51, ["4"] = 68, ["5"] = 85, ["6"] = 102, ["7"] = 119, ["8"] = 136, ["9"] = 153, A = 170, B = 187, C = 204, E = 238, F = 255, a = 170, b = 187, c = 204, f = 255}
-- Converts HEX code to numbers in RGB
---@param hex string
---@return number red, number green, number blue
function hex2rgb(hex)
local length = #hex
if length == 7 then
local r, g, b = match(hex, '.(..)(..)(..)')
return cashedHEX[r], cashedHEX[g], cashedHEX[b]
elseif length == 6 then
local r, g, b = match(hex, '(..)(..)(..)')
return cashedHEX[r], cashedHEX[g], cashedHEX[b]
elseif length == 4 then
local r, g, b = match(hex, '.(.)(.)(.)')
return cashedShortHEX[r], cashedShortHEX[g], cashedShortHEX[b]
elseif length == 3 then
local r, g, b = match(hex, '(.)(.)(.)')
return cashedShortHEX[r], cashedShortHEX[g], cashedShortHEX[b]
end
end
end
do
local match = string.match
-- Converts HEX code to numbers in RGB
---@param hex string
---@return number red, number green, number blue
function hex2rgb(hex)
local length = #hex
if length == 7 then
local r, g, b = match(hex, '.(..)(..)(..)')
return tonumber(r, 16), tonumber(g, 16), tonumber(b, 16)
elseif length == 6 then
local r, g, b = match(hex, '(..)(..)(..)')
return tonumber(r, 16), tonumber(g, 16), tonumber(b, 16)
elseif length == 4 then
local r, g, b = match(hex, '.(.)(.)(.)')
return tonumber(r..r, 16), tonumber(g..g, 16), tonumber(b..b, 16)
elseif length == 3 then
local r, g, b = match(hex, '(.)(.)(.)')
return tonumber(r..r, 16), tonumber(g..g, 16), tonumber(b..b, 16)
end
end
end
do
local match = string.match
local cashedShortHEX = {["0"] = 0, ["1"] = 17, ["2"] = 34, ["3"] = 51, ["4"] = 68, ["5"] = 85, ["6"] = 102, ["7"] = 119, ["8"] = 136, ["9"] = 153, A = 170, B = 187, C = 204, E = 238, F = 255, a = 170, b = 187, c = 204, f = 255}
-- Converts HEX code to numbers in RGB
---@param hex string
---@return number red, number green, number blue
function hex2rgb(hex)
local length = #hex
if length == 7 then
local r, g, b = match(hex, '.(..)(..)(..)')
return tonumber(r, 16), tonumber(g, 16), tonumber(b, 16)
elseif length == 6 then
local r, g, b = match(hex, '(..)(..)(..)')
return tonumber(r, 16), tonumber(g, 16), tonumber(b, 16)
elseif length == 4 then
local r, g, b = match(hex, '.(.)(.)(.)')
return cashedShortHEX[r], cashedShortHEX[g], cashedShortHEX[b]
elseif length == 3 then
local r, g, b = match(hex, '(.)(.)(.)')
return cashedShortHEX[r], cashedShortHEX[g], cashedShortHEX[b]
end
end
end
@ZwerOxotnik
Copy link
Author

ZwerOxotnik commented Sep 8, 2022

That cashed variant should be faster for short strings, from 1.3 times to 1.7 times on some devices. Checked it in Lua 5.4.3. In Lua 5.3.4 it's slightly faster. (Don't really rely on those numbers, because performance can be very different in some cases and on some devices)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment