Module:Rgba
		
		
		
		Jump to navigation
		Jump to search
		
Module documentation
This documentation is transcluded from Module:Rgba/doc. [edit] [history] [purge]
Module:Rgba requires Module:LibraryUtil.
Module:Rgba is required by Module:Chart data.
This module is a helper module to be used by other modules; it may not designed to be invoked directly. See RuneScape:Lua/Helper modules for a full list and more information. For a full list of modules using this helper click here
| Function | Type | Use | 
|---|---|---|
| new( red, [green|0], [blue|0], [alpha|1] )new( hex ) | number/string, number/nil, number/nil, number/nil | Returns a new rgba object. Values red,greenandblueare in the range 0-255;alphais 0-1. It is also possible to give a hex string e.g.#112233or#11223344. 
When converted to a string withtostring( rgba )it will return a string in the formrgba(r,b,g,a)where r, g, b and a are filled in with numbers. | 
| rgba:lighten( val ) | number | Returns a new rgba object with its brightness changed. 1 is no change, 0 is complete black, 2 is double brightness, 1.1 is 10% more, 0.5 is halve, etc. | 
| rgba:darken( val ) | number | Returns a new rgba object with its brightness changed. 1 is no change, 0 is complete white, 2 is halve brightness, 1.1 is 10% darker, 0.5 is double brightness, etc. | 
| rgba:hueRotate( num ) | number | Returns a new rgba object with its hue numdegrees rotated. Decimal values are allowed. | 
| rgba:saturate( val ) | number | Returns a new rgba object with its saturation changed. 1 is no change, 0 is greyscale, 2 is double saturation, 1.5 is 50% more, etc. | 
| rgba:fade( val ) | number | Returns a new rgba object with its alpha value set to val.valis clipped to the range 0-1. | 
| rgba:clone() | N/A | Returns a copy with the same values. | 
local rgba = require( 'Module:Rgba' )
local color1 = rgba.new( 126, 20, 6 )
mw.log( color1 ) --> 'rgba(126,20,6,1)'
mw.log( color1:lighten( 1.3 ) ) --> 'rgba(164,26,8,1)'
mw.log( color1:darken( 1.3 ) ) --> 'rgba(97,15,5,1)'
mw.log( color1:hueRotate( 50 ) ) --> 'rgba(126,120,6,1)'
mw.log( color1:saturate( 1.1 ) ) --> 'rgba(132,15,0,1)'
mw.log( color1:fade( 0.3 ) ) --> 'rgba(126,20,6,0.3)'
local color2 = color1:lighten( 1.3 ):saturate( 1.1 ) -- Operations can be chained
mw.log( color2 ) --> 'rgba(172,20,0,1)'
mw.log( color1 ) --> 'rgba(126,20,6,1)' color1 is unchanged
-- <nowiki>
---@class rgba
local rgba = {}
local libraryUtil = require( 'Module:libraryUtil' )
local max = math.max
local min = math.min
local floor = math.floor
local abs = math.abs
local checkRgbaClass = libraryUtil.makeCheckClassFunction( 'Module:Rgba' , 'rgba', rgba, 'rgba object' )
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
local function RGBtoHSL( r, g, b )
    local M = max( r, g, b )
    local m = min( r, g, b )
    local C = M - m
    local L = (M + m) / 2 / 255
    local H, S
    if M == m then
        H = 0
    elseif M == r then
        H = 60 * (g - b)/C
    elseif M == g then
        H = 60 * (2 + (b - r)/C)
    elseif M == b then
        H = 60 * (4 + (r - g)/C)
    end
    H = H % 360
    if M == m then
        S = 0
    else
        S = C / (255 - abs( M + m - 255 ))
    end
    return H, S, L
end
local function HSLtoRGB( H, S, L )
    local C = (1 - abs( 2*L - 1 )) * S
    local bin = H / 60
    local X = C * (1 - abs( (bin % 2) - 1 ))
    local r, g, b, m
    if 0 <= bin and bin <= 1 then
        r = C
        g = X
        b = 0
    elseif 1 <= bin and bin < 2 then
        r = X
        g = C
        b = 0
    elseif 2 <= bin and bin < 3 then
        r = 0
        g = C
        b = X
    elseif 3 <= bin and bin < 4 then
        r = 0
        g = X
        b = C
    elseif 4 <= bin and bin < 5 then
        r = X
        g = 0
        b = C
    elseif 5 <= bin and bin < 6 then
        r = C
        g = 0
        b = X
    end
    m = L - C/2
    r = (r + m) * 255
    g = (g + m) * 255
    b = (b + m) * 255
    return r, g, b
end
---@param red number | string
---@param green number
---@param blue number
---@param alpha number
---@return rgba
function rgba.new( red, green, blue, alpha )
    libraryUtil.checkTypeMulti( 'Module:Rgba.new', 1, red, {'number', 'string'} )
    libraryUtil.checkType( 'Module:Rgba.new', 2, green, 'number', true )
    libraryUtil.checkType( 'Module:Rgba.new', 3, blue, 'number', true )
    libraryUtil.checkType( 'Module:Rgba.new', 4, alpha, 'number', true )
    if type( red ) == 'string' then
        red, green, blue, alpha = red:match( '#(%x%x)(%x%x)(%x%x)(%x?%x?)' )
        if red == nil then
            error( 'Malformed rgba hex code', 2 )
        end
        red = tonumber( red, 16 )
        green = tonumber( green, 16 )
        blue = tonumber( blue, 16 )
        alpha = tonumber( alpha or 'ff', 16 ) / 255
    end
    local obj = {
        red = clip( round( red or 0 ), 0, 255 ),
        green = clip( round( green or 0 ), 0, 255 ),
        blue = clip( round( blue or 0 ), 0, 255 ),
        alpha = clip( alpha or 1, 0, 1 )
    }
    return setmetatable( obj, rgba )
end
---@param alpha number
---@return rgba
function rgba:fade( alpha )
    checkRgbaClass( self, 'fade' )
    libraryUtil.checkType( 'rgab.fade', 1, alpha, 'number' )
    return rgba.new( self.red, self.green, self.blue, alpha )
end
---@param val number
---@return rgba
function rgba:lighten( val )
    checkRgbaClass( self, 'lighten' )
    libraryUtil.checkType( 'rgab.lighten', 1, val, 'number' )
    val = clip( val, 0, 1e99 )
    local H, S, L = RGBtoHSL( self.red, self.green, self.blue )
    L = clip( L * val, 0, 1 )
    local r, g, b = HSLtoRGB( H, S, L )
    return rgba.new( r, g, b, self.a )
end
---@param val number
---@return rgba
function rgba:darken( val )
    checkRgbaClass( self, 'darken' )
    libraryUtil.checkType( 'rgab.darken', 1, val, 'number' )
    return self:lighten( 1/val )
end
---@param deg number
---@return rgba
function rgba:hueRotate( deg )
    checkRgbaClass( self, 'hueRotate' )
    libraryUtil.checkType( 'rgab.hueRotate', 1, deg, 'number' )
    local H, S, L = RGBtoHSL( self.red, self.green, self.blue )
    H = (H + deg) % 360
    local r, g, b = HSLtoRGB( H, S, L )
    return rgba.new( r, g, b, self.a )
end
---@param val number
---@return rgba
function rgba:saturate( val )
    checkRgbaClass( self, 'saturate' )
    libraryUtil.checkType( 'rgab.saturate', 1, val, 'number' )
    local H, S, L = RGBtoHSL( self.red, self.green, self.blue )
    S = clip( S * val, 0, 1 )
    local r, g, b = HSLtoRGB( H, S, L )
    return rgba.new( r, g, b, self.a )
end
---@return rgba
function rgba:clone()
    checkRgbaClass( self, 'clone' )
    return rgba.new( self.red, self.green, self.blue, self.alpha )
end
rgba.__index = rgba
rgba.__tostring = function( self )
    return string.format( 'rgba(%s,%s,%s,%s)', self.red, self.green, self.blue, self.alpha )
end
rgba.__concat = function( x, y )
    return tostring( x ) .. tostring( y )
end
return rgba
-- </nowiki>