<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.runerealm.org/index.php?action=history&amp;feed=atom&amp;title=Module%3ARgba</id>
	<title>Module:Rgba - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.runerealm.org/index.php?action=history&amp;feed=atom&amp;title=Module%3ARgba"/>
	<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Rgba&amp;action=history"/>
	<updated>2026-05-01T08:38:30Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://wiki.runerealm.org/index.php?title=Module:Rgba&amp;diff=34043&amp;oldid=prev</id>
		<title>Alex: Created page with &quot;-- &lt;nowiki&gt; ---@class rgba local rgba = {} local libraryUtil = require( &#039;Module:libraryUtil&#039; ) local max = math.max local min = math.min local floor = math.floor local abs = math.abs  local checkRgbaClass = libraryUtil.makeCheckClassFunction( &#039;Module:Rgba&#039; , &#039;rgba&#039;, rgba, &#039;rgba object&#039; )  local function clip( val, lower, upper )     return min( upper, max( lower, val ) ) end  local function round( num, d )     d = 10^( d or 0 )     return floor( num*d + 0.5 ) / d end  lo...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Rgba&amp;diff=34043&amp;oldid=prev"/>
		<updated>2024-10-15T17:23:19Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;-- &amp;lt;nowiki&amp;gt; ---@class rgba local rgba = {} local libraryUtil = require( &amp;#039;Module:libraryUtil&amp;#039; ) local max = math.max local min = math.min local floor = math.floor local abs = math.abs  local checkRgbaClass = libraryUtil.makeCheckClassFunction( &amp;#039;Module:Rgba&amp;#039; , &amp;#039;rgba&amp;#039;, rgba, &amp;#039;rgba object&amp;#039; )  local function clip( val, lower, upper )     return min( upper, max( lower, val ) ) end  local function round( num, d )     d = 10^( d or 0 )     return floor( num*d + 0.5 ) / d end  lo...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- &amp;lt;nowiki&amp;gt;&lt;br /&gt;
---@class rgba&lt;br /&gt;
local rgba = {}&lt;br /&gt;
local libraryUtil = require( &amp;#039;Module:libraryUtil&amp;#039; )&lt;br /&gt;
local max = math.max&lt;br /&gt;
local min = math.min&lt;br /&gt;
local floor = math.floor&lt;br /&gt;
local abs = math.abs&lt;br /&gt;
&lt;br /&gt;
local checkRgbaClass = libraryUtil.makeCheckClassFunction( &amp;#039;Module:Rgba&amp;#039; , &amp;#039;rgba&amp;#039;, rgba, &amp;#039;rgba object&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
local function clip( val, lower, upper )&lt;br /&gt;
    return min( upper, max( lower, val ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function round( num, d )&lt;br /&gt;
    d = 10^( d or 0 )&lt;br /&gt;
    return floor( num*d + 0.5 ) / d&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function RGBtoHSL( r, g, b )&lt;br /&gt;
    local M = max( r, g, b )&lt;br /&gt;
    local m = min( r, g, b )&lt;br /&gt;
    local C = M - m&lt;br /&gt;
    local L = (M + m) / 2 / 255&lt;br /&gt;
    local H, S&lt;br /&gt;
&lt;br /&gt;
    if M == m then&lt;br /&gt;
        H = 0&lt;br /&gt;
    elseif M == r then&lt;br /&gt;
        H = 60 * (g - b)/C&lt;br /&gt;
    elseif M == g then&lt;br /&gt;
        H = 60 * (2 + (b - r)/C)&lt;br /&gt;
    elseif M == b then&lt;br /&gt;
        H = 60 * (4 + (r - g)/C)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    H = H % 360&lt;br /&gt;
&lt;br /&gt;
    if M == m then&lt;br /&gt;
        S = 0&lt;br /&gt;
    else&lt;br /&gt;
        S = C / (255 - abs( M + m - 255 ))&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return H, S, L&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function HSLtoRGB( H, S, L )&lt;br /&gt;
    local C = (1 - abs( 2*L - 1 )) * S&lt;br /&gt;
    local bin = H / 60&lt;br /&gt;
    local X = C * (1 - abs( (bin % 2) - 1 ))&lt;br /&gt;
    local r, g, b, m&lt;br /&gt;
&lt;br /&gt;
    if 0 &amp;lt;= bin and bin &amp;lt;= 1 then&lt;br /&gt;
        r = C&lt;br /&gt;
        g = X&lt;br /&gt;
        b = 0&lt;br /&gt;
    elseif 1 &amp;lt;= bin and bin &amp;lt; 2 then&lt;br /&gt;
        r = X&lt;br /&gt;
        g = C&lt;br /&gt;
        b = 0&lt;br /&gt;
    elseif 2 &amp;lt;= bin and bin &amp;lt; 3 then&lt;br /&gt;
        r = 0&lt;br /&gt;
        g = C&lt;br /&gt;
        b = X&lt;br /&gt;
    elseif 3 &amp;lt;= bin and bin &amp;lt; 4 then&lt;br /&gt;
        r = 0&lt;br /&gt;
        g = X&lt;br /&gt;
        b = C&lt;br /&gt;
    elseif 4 &amp;lt;= bin and bin &amp;lt; 5 then&lt;br /&gt;
        r = X&lt;br /&gt;
        g = 0&lt;br /&gt;
        b = C&lt;br /&gt;
    elseif 5 &amp;lt;= bin and bin &amp;lt; 6 then&lt;br /&gt;
        r = C&lt;br /&gt;
        g = 0&lt;br /&gt;
        b = X&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    m = L - C/2&lt;br /&gt;
&lt;br /&gt;
    r = (r + m) * 255&lt;br /&gt;
    g = (g + m) * 255&lt;br /&gt;
    b = (b + m) * 255&lt;br /&gt;
&lt;br /&gt;
    return r, g, b&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---@param red number | string&lt;br /&gt;
---@param green number&lt;br /&gt;
---@param blue number&lt;br /&gt;
---@param alpha number&lt;br /&gt;
---@return rgba&lt;br /&gt;
function rgba.new( red, green, blue, alpha )&lt;br /&gt;
    libraryUtil.checkTypeMulti( &amp;#039;Module:Rgba.new&amp;#039;, 1, red, {&amp;#039;number&amp;#039;, &amp;#039;string&amp;#039;} )&lt;br /&gt;
    libraryUtil.checkType( &amp;#039;Module:Rgba.new&amp;#039;, 2, green, &amp;#039;number&amp;#039;, true )&lt;br /&gt;
    libraryUtil.checkType( &amp;#039;Module:Rgba.new&amp;#039;, 3, blue, &amp;#039;number&amp;#039;, true )&lt;br /&gt;
    libraryUtil.checkType( &amp;#039;Module:Rgba.new&amp;#039;, 4, alpha, &amp;#039;number&amp;#039;, true )&lt;br /&gt;
&lt;br /&gt;
    if type( red ) == &amp;#039;string&amp;#039; then&lt;br /&gt;
        red, green, blue, alpha = red:match( &amp;#039;#(%x%x)(%x%x)(%x%x)(%x?%x?)&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
        if red == nil then&lt;br /&gt;
            error( &amp;#039;Malformed rgba hex code&amp;#039;, 2 )&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        red = tonumber( red, 16 )&lt;br /&gt;
        green = tonumber( green, 16 )&lt;br /&gt;
        blue = tonumber( blue, 16 )&lt;br /&gt;
        alpha = tonumber( alpha or &amp;#039;ff&amp;#039;, 16 ) / 255&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local obj = {&lt;br /&gt;
        red = clip( round( red or 0 ), 0, 255 ),&lt;br /&gt;
        green = clip( round( green or 0 ), 0, 255 ),&lt;br /&gt;
        blue = clip( round( blue or 0 ), 0, 255 ),&lt;br /&gt;
        alpha = clip( alpha or 1, 0, 1 )&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return setmetatable( obj, rgba )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---@param alpha number&lt;br /&gt;
---@return rgba&lt;br /&gt;
function rgba:fade( alpha )&lt;br /&gt;
    checkRgbaClass( self, &amp;#039;fade&amp;#039; )&lt;br /&gt;
    libraryUtil.checkType( &amp;#039;rgab.fade&amp;#039;, 1, alpha, &amp;#039;number&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
    return rgba.new( self.red, self.green, self.blue, alpha )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---@param val number&lt;br /&gt;
---@return rgba&lt;br /&gt;
function rgba:lighten( val )&lt;br /&gt;
    checkRgbaClass( self, &amp;#039;lighten&amp;#039; )&lt;br /&gt;
    libraryUtil.checkType( &amp;#039;rgab.lighten&amp;#039;, 1, val, &amp;#039;number&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
    val = clip( val, 0, 1e99 )&lt;br /&gt;
&lt;br /&gt;
    local H, S, L = RGBtoHSL( self.red, self.green, self.blue )&lt;br /&gt;
    L = clip( L * val, 0, 1 )&lt;br /&gt;
    local r, g, b = HSLtoRGB( H, S, L )&lt;br /&gt;
&lt;br /&gt;
    return rgba.new( r, g, b, self.a )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---@param val number&lt;br /&gt;
---@return rgba&lt;br /&gt;
function rgba:darken( val )&lt;br /&gt;
    checkRgbaClass( self, &amp;#039;darken&amp;#039; )&lt;br /&gt;
    libraryUtil.checkType( &amp;#039;rgab.darken&amp;#039;, 1, val, &amp;#039;number&amp;#039; )&lt;br /&gt;
    return self:lighten( 1/val )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---@param deg number&lt;br /&gt;
---@return rgba&lt;br /&gt;
function rgba:hueRotate( deg )&lt;br /&gt;
    checkRgbaClass( self, &amp;#039;hueRotate&amp;#039; )&lt;br /&gt;
    libraryUtil.checkType( &amp;#039;rgab.hueRotate&amp;#039;, 1, deg, &amp;#039;number&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
    local H, S, L = RGBtoHSL( self.red, self.green, self.blue )&lt;br /&gt;
    H = (H + deg) % 360&lt;br /&gt;
    local r, g, b = HSLtoRGB( H, S, L )&lt;br /&gt;
&lt;br /&gt;
    return rgba.new( r, g, b, self.a )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---@param val number&lt;br /&gt;
---@return rgba&lt;br /&gt;
function rgba:saturate( val )&lt;br /&gt;
    checkRgbaClass( self, &amp;#039;saturate&amp;#039; )&lt;br /&gt;
    libraryUtil.checkType( &amp;#039;rgab.saturate&amp;#039;, 1, val, &amp;#039;number&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
    local H, S, L = RGBtoHSL( self.red, self.green, self.blue )&lt;br /&gt;
    S = clip( S * val, 0, 1 )&lt;br /&gt;
    local r, g, b = HSLtoRGB( H, S, L )&lt;br /&gt;
&lt;br /&gt;
    return rgba.new( r, g, b, self.a )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---@return rgba&lt;br /&gt;
function rgba:clone()&lt;br /&gt;
    checkRgbaClass( self, &amp;#039;clone&amp;#039; )&lt;br /&gt;
    return rgba.new( self.red, self.green, self.blue, self.alpha )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
rgba.__index = rgba&lt;br /&gt;
rgba.__tostring = function( self )&lt;br /&gt;
    return string.format( &amp;#039;rgba(%s,%s,%s,%s)&amp;#039;, self.red, self.green, self.blue, self.alpha )&lt;br /&gt;
end&lt;br /&gt;
rgba.__concat = function( x, y )&lt;br /&gt;
    return tostring( x ) .. tostring( y )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return rgba&lt;br /&gt;
-- &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alex</name></author>
	</entry>
</feed>