aboutsummaryrefslogtreecommitdiff
path: root/lua/colorizer/parser/argb_hex.lua
diff options
context:
space:
mode:
authorakianonymus <anonymus.aki@gmail.com>2023-02-27 14:30:10 +0530
committerakianonymus <anonymus.aki@gmail.com>2023-02-27 16:01:48 +0530
commitdde3084106a70b9a79d48f426f6d6fec6fd203f7 (patch)
treef1b06f0921e9eaf98bcc94f4d86d9f4d7226cb54 /lua/colorizer/parser/argb_hex.lua
parentfix: virtualtext on nonfocused window update | #41 (diff)
Separate parsers into individual files
Diffstat (limited to 'lua/colorizer/parser/argb_hex.lua')
-rw-r--r--lua/colorizer/parser/argb_hex.lua58
1 files changed, 58 insertions, 0 deletions
diff --git a/lua/colorizer/parser/argb_hex.lua b/lua/colorizer/parser/argb_hex.lua
new file mode 100644
index 0000000..f664dc3
--- /dev/null
+++ b/lua/colorizer/parser/argb_hex.lua
@@ -0,0 +1,58 @@
+---Helper function to parse argb
+
+local bit = require "bit"
+local floor, min = math.floor, math.min
+local band, rshift, lshift = bit.band, bit.rshift, bit.lshift
+
+local utils = require "colorizer.utils"
+local byte_is_alphanumeric = utils.byte_is_alphanumeric
+local byte_is_hex = utils.byte_is_hex
+local parse_hex = utils.parse_hex
+
+local parser = {}
+
+local ARGB_MINIMUM_LENGTH = #"0xAARRGGBB" - 1
+---parse for 0xaarrggbb and return rgb hex.
+-- a format used in android apps
+---@param line string: line to parse
+---@param i number: index of line from where to start parsing
+---@return number|nil: index of line where the hex value ended
+---@return string|nil: rgb hex value
+function parser.argb_hex_parser(line, i)
+ if #line < i + ARGB_MINIMUM_LENGTH then
+ return
+ end
+
+ local j = i + 2
+
+ local n = j + 8
+ local alpha
+ local v = 0
+ while j <= min(n, #line) do
+ local b = line:byte(j)
+ if not byte_is_hex(b) then
+ break
+ end
+ if j - i <= 3 then
+ alpha = parse_hex(b) + lshift(alpha or 0, 4)
+ else
+ v = parse_hex(b) + lshift(v, 4)
+ end
+ j = j + 1
+ end
+ if #line >= j and byte_is_alphanumeric(line:byte(j)) then
+ return
+ end
+ local length = j - i
+ if length ~= 10 then
+ return
+ end
+ alpha = tonumber(alpha) / 255
+ local r = floor(band(rshift(v, 16), 0xFF) * alpha)
+ local g = floor(band(rshift(v, 8), 0xFF) * alpha)
+ local b = floor(band(v, 0xFF) * alpha)
+ local rgb_hex = string.format("%02x%02x%02x", r, g, b)
+ return length, rgb_hex
+end
+
+return parser.argb_hex_parser