WoWInterface SVN SoopUI

[/] [trunk/] [3.0.0rc1/] [SoopUI/] [Libs/] [oUF/] [colors.lua] - Rev 7

Compare with Previous | Blame | View Log

local parent, ns = ...
local oUF = ns.oUF
local Private = oUF.Private

local frame_metatable = Private.frame_metatable

local colors = {
        smooth = {
                1, 0, 0,
                1, 1, 0,
                0, 1, 0
        },
        disconnected = {.6, .6, .6},
        tapped = {.6,.6,.6},
        class = {},
        reaction = {},
}

-- We do this because people edit the vars directly, and changing the default
-- globals makes SPICE FLOW!
local customClassColors = function()
        if(CUSTOM_CLASS_COLORS) then
                local updateColors = function()
                        for eclass, color in next, CUSTOM_CLASS_COLORS do
                                colors.class[eclass] = {color.r, color.g, color.b}
                        end

                        for _, obj in next, oUF.objects do
                                obj:UpdateAllElements("CUSTOM_CLASS_COLORS")
                        end
                end

                updateColors()
                CUSTOM_CLASS_COLORS:RegisterCallback(updateColors)

                return true
        end
end
if not customClassColors() then
        for eclass, color in next, RAID_CLASS_COLORS do
                colors.class[eclass] = {color.r, color.g, color.b}
        end

        local f = CreateFrame("Frame")
        f:RegisterEvent("ADDON_LOADED")
        f:SetScript("OnEvent", function()
                if customClassColors() then
                        f:UnregisterEvent("ADDON_LOADED")
                        f:SetScript("OnEvent", nil)
                end
        end)
end

for eclass, color in next, FACTION_BAR_COLORS do
        colors.reaction[eclass] = {color.r, color.g, color.b}
end

local function ColorsAndPercent(a, b, ...)
        if a <= 0 or b == 0 then
                return nil, ...
        elseif a >= b then
                return nil, select(select('#', ...) - 2, ...)
        end

        local num = select('#', ...) / 3
        local segment, relperc = math.modf((a/b)*(num-1))
        return relperc, select((segment*3)+1, ...)
end

-- http://www.wowwiki.com/ColorGradient
local RGBColorGradient = function(...)
        local relperc, r1, g1, b1, r2, g2, b2 = ColorsAndPercent(...)
        if relperc then
                return r1 + (r2-r1)*relperc, g1 + (g2-g1)*relperc, b1 + (b2-b1)*relperc
        else
                return r1, g1, b1
        end
end


local function GetY(r, g, b)
        return 0.3 * r + 0.59 * g + 0.11 * b
end

local function RGBToHCY(r, g, b)
        local min, max = min(r, g, b), max(r, g, b)
        local chroma = max - min
        local hue
        if chroma > 0 then
                if r == max then
                        hue = ((g - b) / chroma) % 6
                elseif g == max then
                        hue = (b - r) / chroma + 2
                elseif b == max then
                        hue = (r - g) / chroma + 4
                end
                hue = hue / 6
        end
        return hue, chroma, GetY(r, g, b)
end

local abs = math.abs
local function HCYtoRGB(hue, chroma, luma)
        local r, g, b = 0, 0, 0
        if hue then
                local h2 = hue * 6
                local x = chroma * (1 - abs(h2 % 2 - 1))
                if h2 < 1 then
                        r, g, b = chroma, x, 0
                elseif h2 < 2 then
                        r, g, b = x, chroma, 0
                elseif h2 < 3 then
                        r, g, b = 0, chroma, x
                elseif h2 < 4 then
                        r, g, b = 0, x, chroma
                elseif h2 < 5 then
                        r, g, b = x, 0, chroma
                else
                        r, g, b = chroma, 0, x
                end
        end
        local m = luma - GetY(r, g, b)
        return r + m, g + m, b + m
end

local HCYColorGradient = function(...)
        local relperc, r1, g1, b1, r2, g2, b2 = ColorsAndPercent(...)
        if not relperc then return r1, g1, b1 end
        local h1, c1, y1 = RGBToHCY(r1, g1, b1)
        local h2, c2, y2 = RGBToHCY(r2, g2, b2)
        local c = c1 + (c2-c1) * relperc
        local y = y1 + (y2-y1) * relperc
        if h1 and h2 then
                local dh = h2 - h1
                if dh < -0.5  then
                        dh = dh + 1
                elseif dh > 0.5 then
                        dh = dh - 1
                end
                return HCYtoRGB((h1 + dh * relperc) % 1, c, y)
        else
                return HCYtoRGB(h1 or h2, c, y)
        end

end

local ColorGradient = function(...)
        return (oUF.useHCYColorGradient and HCYColorGradient or RGBColorGradient)(...)
end

Private.colors = colors

oUF.colors = colors
oUF.ColorGradient = ColorGradient
oUF.RGBColorGradient = RGBColorGradient
oUF.HCYColorGradient = HCYColorGradient
oUF.useHCYColorGradient = false

frame_metatable.__index.colors = colors
frame_metatable.__index.ColorGradient = ColorGradient

Compare with Previous | Blame