To randomize the colors a bit, I have this measure in the skin:
Code: Select all
[MeasureColorizerRandom]
Measure=Calc
Formula=Random
UpdateRandom=1
LowBound=0
HighBound=100
UpdateDivider=-1
Code: Select all
function Initialize()
-- Constants
ColorGranularity = 1 -- digits after decimal
-- Fix Constants :)
ColorGranularity = math.pow(10, 1)
end
function Update()
local Config = " * "
-- Rainmeter Data
ColorMain = tostring(SKIN:GetVariable('ColorMain', '262524'))
WinBG = SKIN:GetMeasure('MeasureSplitPaletteBG'):GetStringValue()
WinAcc = SKIN:GetMeasure('MeasureSplitSysColor'):GetStringValue()
RandomHue = SKIN:GetMeasure('MeasureColorizerRandom'):GetValue()
if WinBG == '' then return end
-- Reticulating Splines
ColorBG = string.sub(WinBG, 1,6)
ColorMain = ContrastColor(ColorBG) .. ""
ColorMainAcc = WinAcc
ColorMainShd = ShadeColor(ColorMain, 0.5)
ColorMainTnT = TintColor(ColorMain, 0.5)
ColorMainAcc = TintColor(WinAcc, 0.5)
ColorMainAlt = ColorCpl(ColorMain)
-- Save Data
SKIN:Bang('!WriteKeyValue Variables ColorBG "' .. string.upper(ColorBG) .. '" ' .. SKIN:ReplaceVariables(' #IncFile# '))
SKIN:Bang('!WriteKeyValue Variables ColorMain "' .. string.upper(ColorMain) .. '" ' .. SKIN:ReplaceVariables(' #IncFile# '))
SKIN:Bang('!WriteKeyValue Variables ColorCplA "' .. string.upper(ColorMainAcc) .. '" ' .. SKIN:ReplaceVariables(' #IncFile# '))
SKIN:Bang('!WriteKeyValue Variables ColorCplB "' .. string.upper(ColorMainAlt) .. '" ' .. SKIN:ReplaceVariables(' #IncFile# '))
SKIN:Bang('!WriteKeyValue Variables ColorShade "' .. string.upper(ColorMainShd) .. '" ' .. SKIN:ReplaceVariables(' #IncFile# '))
SKIN:Bang('!WriteKeyValue Variables ColorTint "' .. string.upper(ColorMainTnT) .. '" ' .. SKIN:ReplaceVariables(' #IncFile# '))
SKIN:Bang('!SetVariable ColorBG "' .. string.upper(ColorBG) .. '" ' .. Config)
SKIN:Bang('!SetVariable ColorMain "' .. string.upper(ColorMain) .. '" ' .. Config)
SKIN:Bang('!SetVariable ColorCplA "' .. string.upper(ColorMainAcc) .. '" ' .. Config)
SKIN:Bang('!SetVariable ColorCplB "' .. string.upper(ColorMainAlt) .. '" ' .. Config)
SKIN:Bang('!SetVariable ColorShade "' .. string.upper(ColorMainShd) .. '" ' .. Config)
SKIN:Bang('!SetVariable ColorTint "' .. string.upper(ColorMainTnT) .. '" ' .. Config)
return
end
function ContrastColor(ColorInputString)
-- Hex to RGB
local R, G, B = HexToRGB(ColorInputString)
-- RGB to HSL
local H, S, L = RGBToHSL(R, G, B)
-- Contrast Calc
--print("preHSL: " .. H .. " " .. S .. " " .. L)
if H == 0 then H = RandomHue * 3.6
else
H = (360 + (H - 15 + (RandomHue * 3 / 10))) % 360
end
S = 1 - (S * 0.4)
L = 0.75 - (L * 0.5)
--print("postHSL: " .. H .. " " .. S .. " " .. L)
-- HSL to RGB
R, G, B = HSLToRGB(H, S, L)
-- And back
local HexColor = RGBToHex(R, G, B)
return HexColor
end
function ColorCpl(ColorInputString)
-- Hex to RGB
local R, G, B = HexToRGB(ColorInputString)
-- RGB to HSL
local H, S, L = RGBToHSL(R, G, B)
-- Contrast Calc
--print("preHSL: " .. H .. " " .. S .. " " .. L)
local AltHue = 50 - RandomHue
if AltHue > 0 then H = (360 + H + (135 + (AltHue * 30 / 50))) % 360
elseif AltHue < 0 then H = (360 + H + (225 + (AltHue * 30 / 50))) % 360
else H = (180 + (H - 15 + (RandomHue * 3 / 10))) % 360
end
S = S
L = L
--print("postHSL: " .. H .. " " .. S .. " " .. L)
-- HSL to RGB
R, G, B = HSLToRGB(H, S, L)
-- And back
local HexColor = RGBToHex(R, G, B)
return HexColor
end
function ShadeColor(ColorInputString, Factor)
-- Hex to RGB
local R, G, B = HexToRGB(ColorInputString)
-- RGB to HSL
local H, S, L = RGBToHSL(R, G, B)
-- Contrast Calc
--print("preHSL: " .. H .. " " .. S .. " " .. L)
H = H
S = S
L = L - (L * Factor)
--print("postHSL: " .. H .. " " .. S .. " " .. L)
-- HSL to RGB
R, G, B = HSLToRGB(H, S, L)
-- And back
local HexColor = RGBToHex(R, G, B)
return HexColor
end
function TintColor(ColorInputString, Factor)
-- Hex to RGB
local R, G, B = HexToRGB(ColorInputString)
-- RGB to HSL
local H, S, L = RGBToHSL(R, G, B)
-- Contrast Calc
--print("preHSL: " .. H .. " " .. S .. " " .. L)
H = H
S = S
L = L + ((1 - L) * Factor)
--print("postHSL: " .. H .. " " .. S .. " " .. L)
-- HSL to RGB
R, G, B = HSLToRGB(H, S, L)
-- And back
local HexColor = RGBToHex(R, G, B)
return HexColor
end
function HexToRGB(HexString)
local R = tonumber( "0x" .. string.sub(HexString, 1,2) ) / 255
local G = tonumber( "0x" .. string.sub(HexString, 3,4) ) / 255
local B = tonumber( "0x" .. string.sub(HexString, 5,6) ) / 255
return R, G, B
end
function RGBToHex(R, G, B)
local R = math.max(math.min(math.floor(R * 255), 255), 0)
local G = math.max(math.min(math.floor(G * 255), 255), 0)
local B = math.max(math.min(math.floor(B * 255), 255), 0)
local HexR = string.format("%02X", R) .. ""
local HexG = string.format("%02X", G) .. ""
local HexB = string.format("%02X", B) .. ""
return HexR .. HexG .. HexB
end
function RGBToHSV(R, G, B)
local H, S, V, Delta
local MAX = math.max(R, G, B)
local MIN = math.min(R, G, B)
V = MAX
Delta = MAX - MIN
if MAX ~= 0 then S = Delta / MAX
else S = 0
end
if Delta == 0 then
H = 0
else
if MAX == R then H = ((G - B) / Delta) % 6
elseif MAX == G then H = 2 + (B - R) / Delta
else H = 4 + (R - G) / Delta
end
end
H = H * 60
if H < 0 then H = H + 360 end
-- Granularity
H = math.floor( H * (ColorGranularity) ) / (ColorGranularity)
S = math.floor( S * (ColorGranularity) * 100 ) / (ColorGranularity * 100)
V = math.floor( V * (ColorGranularity) * 100 ) / (ColorGranularity * 100)
return H, S, V
end
function HSVToRGB(H, S, V)
local R, G, B
local C = V * S
local X = C * (1 - math.abs(((H / 60) % 2) - 1))
local m = V - C
local Hi = math.floor(H / 60)
if Hi == 0 then R, G, B = C, X, 0
elseif Hi == 1 then R, G, B = X, C, 0
elseif Hi == 2 then R, G, B = 0, C, X
elseif Hi == 3 then R, G, B = 0, X, C
elseif Hi == 4 then R, G, B = X, 0, C
elseif Hi == 5 then R, G, B = C, 0, X
end
R, G, B = R + m, G + m, B + m
-- Granularity
R = math.floor( R * (ColorGranularity) * 100 ) / (ColorGranularity * 100)
G = math.floor( G * (ColorGranularity) * 100 ) / (ColorGranularity * 100)
B = math.floor( B * (ColorGranularity) * 100 ) / (ColorGranularity * 100)
return R, G, B
end
function RGBToHSL(R, G, B)
local H, S, L, Delta
local MAX = math.max(R, G, B)
local MIN = math.min(R, G, B)
Delta = MAX - MIN
L = (MAX + MIN) / 2
if Delta == 0 then
H, S = 0, 0
else
S = Delta / (1 - math.abs((L * 2) - 1))
if MAX == R then H = ((G - B) / Delta) % 6
elseif MAX == G then H = 2 + (B - R) / Delta
else H = 4 + (R - G) / Delta
end
end
H = H * 60
if H < 0 then H = H + 360 end
-- Granularity
H = math.floor( H * (ColorGranularity) ) / (ColorGranularity)
S = math.floor( S * (ColorGranularity) * 100 ) / (ColorGranularity * 100)
L = math.floor( L * (ColorGranularity) * 100 ) / (ColorGranularity * 100)
return H, S, L
end
function HSLToRGB(H, S, L)
local R, G, B
local C = (1 - math.abs((L * 2) - 1)) * S
local X = C * (1 - math.abs(((H / 60) % 2) - 1))
local m = L - C / 2
local Hi = math.floor(H / 60)
if Hi == 0 then R, G, B = C, X, 0
elseif Hi == 1 then R, G, B = X, C, 0
elseif Hi == 2 then R, G, B = 0, C, X
elseif Hi == 3 then R, G, B = 0, X, C
elseif Hi == 4 then R, G, B = X, 0, C
elseif Hi == 5 then R, G, B = C, 0, X
end
R, G, B = R + m, G + m, B + m
-- Granularity
R = math.floor( R * (ColorGranularity) * 100 ) / (ColorGranularity * 100)
G = math.floor( G * (ColorGranularity) * 100 ) / (ColorGranularity * 100)
B = math.floor( B * (ColorGranularity) * 100 ) / (ColorGranularity * 100)
return R, G, B
end