Module:Color convert

-- -- --

local p = {}

-- -- RGB to HSL functions -- Converts rgb(x,y,z) to HSL -- x, y, and z are all in the range [0,255] -- H is in the range [0,360] -- S and L are in the range [0,100] -- function p._rgb_to_hsl(frame) local red = tonumber(frame.args[1]) local green = tonumber(frame.args[2]) local blue = tonumber(frame.args[3]) return to_text(rgb_to_hsl(red,green,blue),'hsl') end

function rgb_to_hsl(red,green,blue) local hue local sat local lum local r_prime = red/255 local g_prime = green/255 local b_prime = blue/255 local c_max = math.max(r_prime,g_prime,b_prime) local c_min = math.min(r_prime,g_prime,b_prime) local c_dif = c_max - c_min

-- Calculate hue if c_max == r_prime then hue = 60 * math.fmod((g_prime - b_prime)/c_dif,6) elseif c_max == g_prime then hue = 60 * (((b_prime - r_prime)/c_dif)+2) elseif c_max == b_prime then hue = 60 * (((r_prime - g_prime)/c_dif)+4) end

-- Calculate lightness/luminosity lum = (c_max + c_min)/2

-- Calculate saturation -- Requires lum to be calculated if c_dif == 0 then sat = 0 else sat = c_dif/(1 - math.abs(2 * lum - 1)) end

hue = math.fmod(math.floor(hue)+3600,360) sat = math.floor(sat*1000)/10 lum = math.floor(lum*1000)/10 return {hue,sat,lum} end

-- -- RGB to Jagex's HSL functions -- Converts rgb(x,y,z) to jHSL -- x, y, and z are all in the range [0,255] -- H is in the range [0,63] -- S is in the range [0,7] -- L in in the range [0,127] -- Piggy backs on the standard rgb to HSL functions --

function p._rgb_to_jagex(frame) local red = tonumber(frame.args[1]) local green = tonumber(frame.args[2]) local blue = tonumber(frame.args[3]) return to_text(rgb_to_jagex(red,green,blue),'jagex') end

function rgb_to_jagex(red,green,blue) local args = rgb_to_hsl(red,green,blue) local hue = math.floor((args[1] / 360) * 64) local sat = math.floor((args[2] / 100) * 7) local lum = math.floor((args[3] / 100) * 170) return {hue,sat,lum} end

function p._jagex_to_rgb(frame) local hue = tonumber(frame.args[1]) local sat = tonumber(frame.args[2]) local lum = tonumber(frame.args[3]) return to_text(jagex_to_rgb(hue,sat,lum),'rgb') end

function jagex_to_rgb(hue,sat,lum) hue = (hue/64)*360 sat = (sat/7)*100 lum = (lum/170)*100 return hsl_to_rgb(hue,sat,lum) end

-- -- HSL to rgb funcions -- Converts HSL to rgb(x,y,z) -- x, y, and z are all in the range [0,255] -- H is in the range [0,63] -- S is in the range [0,7] -- L in in the range [0,127] --

function p._hsl_to_rgb(frame) local hue = tonumber(frame.args[1]) local sat = tonumber(frame.args[2]) local lum = tonumber(frame.args[3]) return to_text(hsl_to_rgb(hue,sat,lum),'rgb') end

function hsl_to_rgb(hue,sat,lum) sat = sat/100 lum = lum/100 local a = sat * (1 - math.abs(2 * lum - 1)) local b = a * (1 - math.abs(math.fmod(hue / 60,2) - 1)) local c = lum - (a/2) local ab_args local form = { [1] = {a,b,0}, -- 0 <= H < 60 [2] = {b,a,0}, -- 60 <= H < 120 [3] = {0,a,b}, -- 120 <= H < 180 [4] = {0,b,a}, -- 180 <= H < 240 [5] = {b,0,a}, -- 240 <= H < 300 [6] = {a,0,b} -- 300 >= H < 360 }	if hue >= 0 and hue < 60 then ab_args = form[1] elseif hue >= 60 and hue < 120 then ab_args = form[2] elseif hue >= 120 and hue < 180 then ab_args = form[3] elseif hue >= 180 and hue < 240 then ab_args = form[4] elseif hue >= 240 and hue < 300 then ab_args = form[5] elseif hue >= 300 then ab_args = form[6] end local r = math.floor(255*(ab_args[1]+c)) local g = math.floor(255*(ab_args[2]+c)) local b = math.floor(255*(ab_args[3]+c)) return {r,g,b} end

-- -- RGB to/from HEX functions -- Converts HSL to rgb(x,y,z) -- x, y, and z are all in the range [0,255] -- HEX values are all in the range [0x00,0xFF] --

function p._rgb_to_hex(frame) local red = tonumber(frame.args[1]) local green = tonumber(frame.args[2]) local blue = tonumber(frame.args[3]) return to_text(rgb_to_hex(red,green,blue),'hex') end

function rgb_to_hex(red,green,blue) red = dec_to_hex(red) green = dec_to_hex(green) blue = dec_to_hex(blue) return {red,green,blue} end

function p._hex_to_rgb(frame) local color = frame.args[1] local red = string.sub(color,1,2) local green = string.sub(color,3,4) local blue = string.sub(color,5,6) return to_text(hex_to_rgb(red,green,blue),'rgb') end

function hex_to_rgb(red,green,blue) red = hex_to_dec(red) green = hex_to_dec(green) blue = hex_to_dec(blue) return {red,green,blue} end

-- -- Base conversion -- -- Short and nonspecific for efficiency -- local nums = '0123456789ABCDEF'

function hex_to_dec(hex) hex = hex:upper local d1 = nums:find(string.sub(hex,1,1),1,true) - 1 local d2 = nums:find(string.sub(hex,-1),1,true) - 1 local dec = d1 * 16 + d2	return dec end

function dec_to_hex(dec) local d1 = math.floor(dec/16) + 1 local d2 = math.fmod(dec,16) + 1 return string.sub(nums,d1,d1)..string.sub(nums,d2,d2) end

-- -- HEX to and from HSL -- Piggybacks on the HEX/RGB and RGB/HEX functions --

function p._hex_to_hsl(frame) local color = frame.args[1] local red = string.sub(color,1,2) local green = string.sub(color,3,4) local blue = string.sub(color,5,6) local rgbcolor = hex_to_rgb(red,green,blue) red = rgbcolor[1] green = rgbcolor[2] blue = rgbcolor[3] return to_text(rgb_to_hsl(red,green,blue),'hsl') end

function p._hsl_to_hex(frame) local hue = tonumber(frame.args[1]) local sat = tonumber(frame.args[2]) local lum = tonumber(frame.args[3]) local rgbcolor = hsl_to_rgb(hue,sat,lum) local red = rgbcolor[1] local green = rgbcolor[2] local blue = rgbcolor[3] return to_text(rgb_to_hex(red,green,blue),'hex') end

function p._hex_to_jagex(frame) local color = frame.args[1] local red = string.sub(color,1,2) local green = string.sub(color,3,4) local blue = string.sub(color,5,6) local rgbcolor = hex_to_rgb(red,green,blue) red = rgbcolor[1] green = rgbcolor[2] blue = rgbcolor[3] return to_text(rgb_to_jagex(red,green,blue),'jagex') end

function p._jagex_to_hex(frame) local hue = tonumber(frame.args[1]) local sat = tonumber(frame.args[2]) local lum = tonumber(frame.args[3]) local rgbcolor = jagex_to_rgb(hue,sat,lum) local red = rgbcolor[1] local green = rgbcolor[2] local blue = rgbcolor[3] return to_text(rgb_to_hex(red,green,blue),'hex') end

-- -- Standardizes return values as a string -- function to_text(c_args,form) local format = { ['hsl'] = 'Hue: '..c_args[1]..' Saturation: '..c_args[2]..' Luminosity: '..c_args[3], ['rgb'] = 'Red: '..c_args[1]..' Green: '..c_args[2]..' Blue: '..c_args[3], ['jagex'] = 'Hue: '..c_args[1]..' Saturation: '..c_args[2]..' Luminosity: '..c_args[3], ['hex'] = c_args[1]..c_args[2]..c_args[3] }	return format[form] end

return p