Added (more helpful) error on first use rather than on require when missing bitops library for colour.pack/unpack methods

fixes https://github.com/1bardesign/batteries/issues/35
This commit is contained in:
Max Cahill 2021-10-19 11:48:16 +11:00
parent 5b49cbdc17
commit c10338fa5d

View File

@ -4,9 +4,6 @@
local path = (...):gsub("colour", "") local path = (...):gsub("colour", "")
local bit = require("bit")
local band, bor = bit.band, bit.bor
local lshift, rshift = bit.lshift, bit.rshift
local math = require(path.."mathx") local math = require(path.."mathx")
@ -16,6 +13,27 @@ local colour = {}
-- hex handling routines -- hex handling routines
-- pack and unpack into 24 or 32 bit hex numbers -- pack and unpack into 24 or 32 bit hex numbers
local ok, bit = pcall(require, "bit")
if not ok then
for _, v in ipairs{
"pack_rgb",
"unpack_rgb",
"pack_argb",
"unpack_argb",
"pack_rgba",
"unpack_rgba",
} do
colour[v] = function()
error(
"batteries.colour requires the bit operations module for pack/unpack functionality.\n"
.."\tsee https://bitop.luajit.org/\n\n"
.."error from require(\"bit\"):\n\n"..bit)
end
end
else
local band, bor = bit.band, bit.bor
local lshift, rshift = bit.lshift, bit.rshift
--rgb only (no alpha) --rgb only (no alpha)
function colour.pack_rgb(r, g, b) function colour.pack_rgb(r, g, b)
@ -26,9 +44,9 @@ function colour.pack_rgb(r, g, b)
end end
function colour.unpack_rgb(rgb) function colour.unpack_rgb(rgb)
local r = rshift(band(rgb, 0x00ff0000), 16) / 255.0 local r = rshift(band(rgb, 0x00ff0000), 16) / 255
local g = rshift(band(rgb, 0x0000ff00), 8) / 255.0 local g = rshift(band(rgb, 0x0000ff00), 8) / 255
local b = rshift(band(rgb, 0x000000ff), 0) / 255.0 local b = rshift(band(rgb, 0x000000ff), 0) / 255
return r, g, b return r, g, b
end end
@ -43,10 +61,10 @@ function colour.pack_argb(r, g, b, a)
end end
function colour.unpack_argb(argb) function colour.unpack_argb(argb)
local r = rshift(band(argb, 0x00ff0000), 16) / 255.0 local r = rshift(band(argb, 0x00ff0000), 16) / 255
local g = rshift(band(argb, 0x0000ff00), 8) / 255.0 local g = rshift(band(argb, 0x0000ff00), 8) / 255
local b = rshift(band(argb, 0x000000ff), 0) / 255.0 local b = rshift(band(argb, 0x000000ff), 0) / 255
local a = rshift(band(argb, 0xff000000), 24) / 255.0 local a = rshift(band(argb, 0xff000000), 24) / 255
return r, g, b, a return r, g, b, a
end end
@ -61,12 +79,14 @@ function colour.pack_rgba(r, g, b, a)
end end
function colour.unpack_rgba(rgba) function colour.unpack_rgba(rgba)
local r = rshift(band(rgba, 0xff000000), 24) / 255.0 local r = rshift(band(rgba, 0xff000000), 24) / 255
local g = rshift(band(rgba, 0x00ff0000), 16) / 255.0 local g = rshift(band(rgba, 0x00ff0000), 16) / 255
local b = rshift(band(rgba, 0x0000ff00), 8) / 255.0 local b = rshift(band(rgba, 0x0000ff00), 8) / 255
local a = rshift(band(rgba, 0x000000ff), 0) / 255.0 local a = rshift(band(rgba, 0x000000ff), 0) / 255
return r, g, b, a return r, g, b, a
end end
end
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
-- colour space conversion -- colour space conversion