From c10338fa5d126d95ea975eb23b147d25a2fbb98d Mon Sep 17 00:00:00 2001 From: Max Cahill <1bardesign@gmail.com> Date: Tue, 19 Oct 2021 11:48:16 +1100 Subject: [PATCH] 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 --- colour.lua | 122 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 71 insertions(+), 51 deletions(-) diff --git a/colour.lua b/colour.lua index 2e5c55c..cd5592f 100644 --- a/colour.lua +++ b/colour.lua @@ -4,9 +4,6 @@ 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") @@ -16,57 +13,80 @@ local colour = {} -- hex handling routines -- pack and unpack into 24 or 32 bit hex numbers ---rgb only (no alpha) +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 -function colour.pack_rgb(r, g, b) - local br = lshift(band(0xff, r * 255), 16) - local bg = lshift(band(0xff, g * 255), 8) - local bb = lshift(band(0xff, b * 255), 0) - return bor( br, bg, bb ) + --rgb only (no alpha) + + function colour.pack_rgb(r, g, b) + local br = lshift(band(0xff, r * 255), 16) + local bg = lshift(band(0xff, g * 255), 8) + local bb = lshift(band(0xff, b * 255), 0) + return bor( br, bg, bb ) + end + + function colour.unpack_rgb(rgb) + local r = rshift(band(rgb, 0x00ff0000), 16) / 255 + local g = rshift(band(rgb, 0x0000ff00), 8) / 255 + local b = rshift(band(rgb, 0x000000ff), 0) / 255 + return r, g, b + end + + --argb format (common for shared hex) + + function colour.pack_argb(r, g, b, a) + local ba = lshift(band(0xff, a * 255), 24) + local br = lshift(band(0xff, r * 255), 16) + local bg = lshift(band(0xff, g * 255), 8) + local bb = lshift(band(0xff, b * 255), 0) + return bor( br, bg, bb, ba ) + end + + function colour.unpack_argb(argb) + local r = rshift(band(argb, 0x00ff0000), 16) / 255 + local g = rshift(band(argb, 0x0000ff00), 8) / 255 + local b = rshift(band(argb, 0x000000ff), 0) / 255 + local a = rshift(band(argb, 0xff000000), 24) / 255 + return r, g, b, a + end + + --rgba format + + function colour.pack_rgba(r, g, b, a) + local br = lshift(band(0xff, r * 255), 24) + local bg = lshift(band(0xff, g * 255), 16) + local bb = lshift(band(0xff, b * 255), 8) + local ba = lshift(band(0xff, a * 255), 0) + return bor( br, bg, bb, ba ) + end + + function colour.unpack_rgba(rgba) + local r = rshift(band(rgba, 0xff000000), 24) / 255 + local g = rshift(band(rgba, 0x00ff0000), 16) / 255 + local b = rshift(band(rgba, 0x0000ff00), 8) / 255 + local a = rshift(band(rgba, 0x000000ff), 0) / 255 + return r, g, b, a + end end -function colour.unpack_rgb(rgb) - local r = rshift(band(rgb, 0x00ff0000), 16) / 255.0 - local g = rshift(band(rgb, 0x0000ff00), 8) / 255.0 - local b = rshift(band(rgb, 0x000000ff), 0) / 255.0 - return r, g, b -end - ---argb format (common for shared hex) - -function colour.pack_argb(r, g, b, a) - local ba = lshift(band(0xff, a * 255), 24) - local br = lshift(band(0xff, r * 255), 16) - local bg = lshift(band(0xff, g * 255), 8) - local bb = lshift(band(0xff, b * 255), 0) - return bor( br, bg, bb, ba ) -end - -function colour.unpack_argb(argb) - local r = rshift(band(argb, 0x00ff0000), 16) / 255.0 - local g = rshift(band(argb, 0x0000ff00), 8) / 255.0 - local b = rshift(band(argb, 0x000000ff), 0) / 255.0 - local a = rshift(band(argb, 0xff000000), 24) / 255.0 - return r, g, b, a -end - ---rgba format - -function colour.pack_rgba(r, g, b, a) - local br = lshift(band(0xff, r * 255), 24) - local bg = lshift(band(0xff, g * 255), 16) - local bb = lshift(band(0xff, b * 255), 8) - local ba = lshift(band(0xff, a * 255), 0) - return bor( br, bg, bb, ba ) -end - -function colour.unpack_rgba(rgba) - local r = rshift(band(rgba, 0xff000000), 24) / 255.0 - local g = rshift(band(rgba, 0x00ff0000), 16) / 255.0 - local b = rshift(band(rgba, 0x0000ff00), 8) / 255.0 - local a = rshift(band(rgba, 0x000000ff), 0) / 255.0 - return r, g, b, a -end ------------------------------------------------------------------------------- -- colour space conversion