MediaWiki:Common.js: различия между версиями

мНет описания правки
мНет описания правки
Строка 285: Строка 285:
// Функция для увеличения яркости цвета
// Функция для увеличения яркости цвета
function brightenColor(color, factor) {
function brightenColor(color, factor) {
function getBrightness(r, g, b) {
    function getBrightness(r, g, b) {
return 0.2126 * r + 0.7152 * g + 0.0722 * b;
        return 0.2126 * r + 0.7152 * g + 0.0722 * b;
}
    }


function isGray(r, g, b) {
    function isGray(r, g, b) {
var maxDiff = 20; // Максимальное допустимое отклонение между RGB для серого
        const maxDiff = 20;  
return Math.abs(r - g) < maxDiff && Math.abs(g - b) < maxDiff && Math.abs(r - b) < maxDiff;
        return Math.abs(r - g) < maxDiff
}
            && Math.abs(g - b) < maxDiff
            && Math.abs(r - b) < maxDiff;
    }


var rgbValues = color.match(/\d+(\.\d+)?/g);
    const vals = color.match(/-?\d+(\.\d+)?/g).map(parseFloat);
var r = parseInt(rgbValues[0], 10);
    let [r, g, b, a = 1] = vals;
var g = parseInt(rgbValues[1], 10);
var b = parseInt(rgbValues[2], 10);
var a = rgbValues.length === 4 ? parseFloat(rgbValues[3]) : 1;


var brightness = getBrightness(r, g, b);
    if (r <= 1 && g <= 1 && b <= 1) {
        r *= 255;
        g *= 255;
        b *= 255;
    }


if (factor === undefined) {
    r = Math.round(r);
if (brightness <= 40) {
    g = Math.round(g);
factor = 6;
    b = Math.round(b);
} else if (brightness <= 180) {
factor = 4;
} else {
factor = 0;
}
}


// Если цвет серый, уменьшаем фактор
    const brightness = getBrightness(r, g, b);
if (isGray(r, g, b)) {
factor = Math.max(1, factor * 0.50);
}


// Добавляем фактор вместо умножения
    if (factor === undefined) {
r = Math.min(255, r + factor);
        if (brightness <= 40) {
g = Math.min(255, g + factor);
            factor = 6;
b = Math.min(255, b + factor);
        } else if (brightness <= 180) {
            factor = 4;
        } else {
            factor = 0;
        }
    }


return a < 1 ? 'rgba(' + r + ', ' + g + ', ' + b + ', ' + a + ')' : 'rgb(' + r + ', ' + g + ', ' + b + ')';
    if (isGray(r, g, b)) {
        factor = Math.max(1, factor * 0.5);
    }
 
    r = Math.min(255, r + factor);
    g = Math.min(255, g + factor);
    b = Math.min(255, b + factor);
 
    if (a < 1) {
        return `rgba(${r}, ${g}, ${b}, ${a})`;
    } else {
        return `rgb(${r}, ${g}, ${b})`;
    }
}
}