chromaticity-color-utilities
Version:
Color utilities for Node.js
512 lines (511 loc) • 20.1 kB
JavaScript
"use strict";
// chromaticity-color-utilities
// Copyright (C) 2022 Emma Litwa-Vulcu
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
var Colors = __importStar(require("./Colors"));
var Modify = /** @class */ (function () {
function Modify() {
}
/**
* Rotate $hue by $angle degrees
* Degrees can be more than 360 or less than -360 and will loop around
*
* @param {number} hue degrees
* @param {number} angle degrees
* @return {number} rotated hue
*/
Modify.hueShift = function (hue, angle) {
hue += angle;
while (hue >= 360)
hue -= 360;
while (hue < 0)
hue += 360;
return hue;
};
/**
* Darken RGB color by amount
*
* @param {Colors.rgb} rgb
* @param {number} [amount=0.5] amount to darken, 0-1
* @return {Colors.rgb}
*/
Modify.rgbDarken = function (rgb, amount) {
if (amount === void 0) { amount = 0.5; }
var realAmount = 1 - Math.min(Math.max(amount, 0), 1);
var rd = rgb.getR() * realAmount;
var gd = rgb.getG() * realAmount;
var bd = rgb.getB() * realAmount;
return new Colors.rgb(rd, gd, bd, rgb.getA());
};
/**
* Lighten RGB color by amount
*
* @param {Colors.rgb} rgb
* @param {number} [amount=0.5] amount to lighten, 0-1
* @return {Colors.rgb}
*/
Modify.rgbLighten = function (rgb, amount) {
if (amount === void 0) { amount = 0.5; }
var realAmount = Math.min(Math.max(amount, 0), 1);
var rl = rgb.getR() + (rgb.getMax() - rgb.getR()) * realAmount;
var gl = rgb.getG() + (rgb.getMax() - rgb.getG()) * realAmount;
var bl = rgb.getB() + (rgb.getMax() - rgb.getB()) * realAmount;
return new Colors.rgb(rl, gl, bl, rgb.getA());
};
/**
* Darken RGB color by amount (alt method)
*
* @param {Colors.rgb} rgb
* @param {number} [amount=0.5] amount to darken, 0-1
* @return {Colors.rgb}
*/
Modify.rgb2Darken = function (rgb, amount) {
if (amount === void 0) { amount = 0.5; }
var realAmount = Math.min(Math.max(amount, 0), 1);
var distanceLeft = Math.max(rgb.getR(), rgb.getG(), rgb.getB());
var changeValue = distanceLeft * realAmount;
var rd = Math.max(0, rgb.getR() - changeValue);
var gd = Math.max(0, rgb.getG() - changeValue);
var bd = Math.max(0, rgb.getB() - changeValue);
return new Colors.rgb(rd, gd, bd, rgb.getA());
};
/**
* Lighten RGB color by amount (alt method)
*
* @param {Colors.rgb} rgb
* @param {number} [amount=0.5] amount to lighten, 0-1
* @return {Colors.rgb}
*/
Modify.rgb2Lighten = function (rgb, amount) {
if (amount === void 0) { amount = 0.5; }
var realAmount = Math.min(Math.max(amount, 0), 1);
var distanceLeft = rgb.getMax() - Math.min(rgb.getR(), rgb.getG(), rgb.getB());
var changeValue = distanceLeft * realAmount;
var rl = Math.min(rgb.getR() + changeValue, rgb.getMax());
var gl = Math.min(rgb.getG() + changeValue, rgb.getMax());
var bl = Math.min(rgb.getB() + changeValue, rgb.getMax());
return new Colors.rgb(rl, gl, bl, rgb.getA());
};
/**
* Darken CMYK color by amount
*
* @param {Colors.cmyk} cmyk
* @param {number} [amount=0.5] amount to darken, 0-1
* @return {Colors.cmyk}
*/
Modify.cmykDarken = function (cmyk, amount) {
if (amount === void 0) { amount = 0.5; }
var realAmount = Math.min(Math.max(amount, 0), 1);
var c2 = cmyk.getC() + (100 - cmyk.getC()) * realAmount;
var m2 = cmyk.getM() + (100 - cmyk.getM()) * realAmount;
var y2 = cmyk.getY() + (100 - cmyk.getY()) * realAmount;
var k2 = cmyk.getK() + (100 - cmyk.getK()) * realAmount;
return new Colors.cmyk(c2, m2, y2, k2);
};
/**
* Lighten CMYK color by amount
*
* @param {Colors.cmyk} cmyk
* @param {number} [amount=0.5] amount to lighten, 0-1
* @return {Colors.cmyk}
*/
Modify.cmykLighten = function (cmyk, amount) {
if (amount === void 0) { amount = 0.5; }
var realAmount = 1 - Math.min(Math.max(amount, 0), 1);
var c2 = cmyk.getC() * realAmount;
var m2 = cmyk.getM() * realAmount;
var y2 = cmyk.getY() * realAmount;
var k2 = cmyk.getK() * realAmount;
return new Colors.cmyk(c2, m2, y2, k2);
};
/**
* Darken CMYK color by amount (alt method)
*
* @param {Colors.cmyk} cmyk
* @param {number} [amount=0.5] amount to darken, 0-1
* @return {Colors.cmyk}
*/
Modify.cmyk2Darken = function (cmyk, amount) {
if (amount === void 0) { amount = 0.5; }
var realAmount = Math.min(Math.max(amount, 0), 1);
var k2 = cmyk.getK() + (100 - cmyk.getK()) * realAmount;
return new Colors.cmyk(cmyk.getC(), cmyk.getM(), cmyk.getY(), k2);
};
/**
* Lighten CMYK color by amount (alt method)
*
* @param {Colors.cmyk} cmyk
* @param {number} [amount=0.5] amount to lighten, 0-1
* @return {Colors.cmyk}
*/
Modify.cmyk2Lighten = function (cmyk, amount) {
if (amount === void 0) { amount = 0.5; }
var realAmount = 1 - Math.min(Math.max(amount, 0), 1);
var k2 = cmyk.getK() * realAmount;
return new Colors.cmyk(cmyk.getC(), cmyk.getM(), cmyk.getY(), k2);
};
/**
* Darken HSL color by amount
*
* @param {Colors.hsl} hsl
* @param {number} [amount=0.5] amount to darken, 0-1
* @return {Colors.hsl}
*/
Modify.hslDarken = function (hsl, amount) {
if (amount === void 0) { amount = 0.5; }
var realAmount = 1 - Math.min(Math.max(amount, 0), 1);
var vDarker = hsl.getL() * realAmount;
return new Colors.hsl(hsl.getH(), hsl.getS(), vDarker, hsl.getA());
};
/**
* Lighten HSL color by amount
*
* @param {Colors.hsl} hsl
* @param {number} [amount=0.5] amount to lighten, 0-1
* @return {Colors.hsl}
*/
Modify.hslLighten = function (hsl, amount) {
if (amount === void 0) { amount = 0.5; }
var realAmount = Math.min(Math.max(amount, 0), 1);
var vLighter = hsl.getL() + (100 - hsl.getL()) * realAmount;
return new Colors.hsl(hsl.getH(), hsl.getS(), vLighter, hsl.getA());
};
/**
* Darken HSV color by amount
*
* @param {Colors.hsv} hsv
* @param {number} [amount=0.5] amount to darken, 0-1
* @return {Colors.hsv}
*/
Modify.hsvDarken = function (hsv, amount) {
if (amount === void 0) { amount = 0.5; }
var realAmount = 1 - Math.min(Math.max(amount, 0), 1);
var vDarker = hsv.getV() * realAmount;
return new Colors.hsv(hsv.getH(), hsv.getS(), vDarker, hsv.getA());
};
/**
* Lighten HSV color by amount
*
* @param {Colors.hsv} hsv
* @param {number} [amount=0.5] amount to lighten, 0-1
* @return {Colors.hsv}
*/
Modify.hsvLighten = function (hsv, amount) {
if (amount === void 0) { amount = 0.5; }
var realAmount = Math.min(Math.max(amount, 0), 1);
var vLighter = hsv.getV() + (100 - hsv.getV()) * realAmount;
var sLighter = hsv.getS() - realAmount * hsv.getS();
return new Colors.hsv(hsv.getH(), sLighter, vLighter, hsv.getA());
};
/**
* Darken HSI color by amount
*
* @param {Colors.hsi} hsi
* @param {number} [amount=0.5] amount to darken, 0-1
* @return {Colors.hsi}
*/
Modify.hsiDarken = function (hsi, amount) {
if (amount === void 0) { amount = 0.5; }
var realAmount = 1 - Math.min(Math.max(amount, 0), 1);
var vDarker = hsi.getI() * realAmount;
return new Colors.hsi(hsi.getH(), hsi.getS(), vDarker, hsi.getA());
};
/**
* Lighten HSI color by amount
*
* @param {Colors.hsi} hsi
* @param {number} [amount=0.5] amount to lighten, 0-1
* @return {Colors.hsi}
*/
Modify.hsiLighten = function (hsi, amount) {
if (amount === void 0) { amount = 0.5; }
var realAmount = Math.min(Math.max(amount, 0), 1);
var vLighter = hsi.getI() + (100 - hsi.getI()) * realAmount;
var sLighter = hsi.getS() - realAmount * hsi.getS();
return new Colors.hsi(hsi.getH(), sLighter, vLighter, hsi.getA());
};
/**
* Darken HSP color by amount
*
* @param {Colors.hsp} hsp
* @param {number} [amount=0.5] amount to darken, 0-1
* @return {Colors.hsp}
*/
Modify.hspDarken = function (hsp, amount) {
if (amount === void 0) { amount = 0.5; }
var realAmount = 1 - Math.min(Math.max(amount, 0), 1);
var pDarker = hsp.getP() * realAmount;
return new Colors.hsp(hsp.getH(), hsp.getS(), pDarker, hsp.getA(), hsp.getPb(), hsp.getPr());
};
/**
* Lighten HSP color by amount
*
* @param {Colors.hsp} hsp
* @param {number} [amount=0.5] amount to lighten, 0-1
* @return {Colors.hsp}
*/
Modify.hspLighten = function (hsp, amount) {
if (amount === void 0) { amount = 0.5; }
var realAmount = Math.min(Math.max(amount, 0), 1);
var pLighter = hsp.getP() + (100 - hsp.getP()) * realAmount;
var sLighter = hsp.getS() - realAmount * hsp.getS();
return new Colors.hsp(hsp.getH(), sLighter, pLighter, hsp.getA(), hsp.getPb(), hsp.getPr());
};
/**
* Darken Lab color by amount
*
* @param {Colors.lab} lab
* @param {number} [amount=0.5] amount to darken, 0-1
* @return {Colors.lab}
*/
Modify.labDarken = function (lab, amount) {
if (amount === void 0) { amount = 0.5; }
var realAmount = 1 - Math.min(Math.max(amount, 0), 1);
var lDarker = lab.getL() * realAmount;
var aDarker = lab.getA() * realAmount;
var bDarker = lab.getB() * realAmount;
return new Colors.lab(lDarker, aDarker, bDarker);
};
/**
* Lighten Lab color by amount
*
* @param {Colors.lab} lab
* @param {number} [amount=0.5] amount to lighten, 0-1
* @return {Colors.lab}
*/
Modify.labLighten = function (lab, amount) {
if (amount === void 0) { amount = 0.5; }
var realAmount = Math.min(Math.max(amount, 0), 1);
var realAmountAB = 1 - Math.min(Math.max(amount, 0), 1);
var lLighter = lab.getL() + (100 - lab.getL()) * realAmount;
var aLighter = lab.getA() * realAmountAB;
var bLighter = lab.getB() * realAmountAB;
return new Colors.lab(lLighter, aLighter, bLighter);
};
/**
* Darken Lab color by amount (alt method)
*
* @param {Colors.lab} lab
* @param {number} [amount=0.5] amount to darken, 0-1
* @return {Colors.lab}
*/
Modify.lab2Darken = function (lab, amount) {
if (amount === void 0) { amount = 0.5; }
var realAmount = 1 - Math.min(Math.max(amount, 0), 1);
var lDarker = lab.getL() * realAmount;
return new Colors.lab(lDarker, lab.getA(), lab.getB());
};
/**
* Lighten Lab color by amount (alt method)
*
* @param {Colors.lab} lab
* @param {number} [amount=0.5] amount to lighten, 0-1
* @return {Colors.lab}
*/
Modify.lab2Lighten = function (lab, amount) {
if (amount === void 0) { amount = 0.5; }
var realAmount = Math.min(Math.max(amount, 0), 1);
var lLighter = lab.getL() + (100 - lab.getL()) * realAmount;
return new Colors.lab(lLighter, lab.getA(), lab.getB());
};
/**
* Darken Luv color by amount
*
* @param {Colors.luv} luv
* @param {number} [amount=0.5] amount to darken, 0-1
* @return {Colors.luv}
*/
Modify.luvDarken = function (luv, amount) {
if (amount === void 0) { amount = 0.5; }
var realAmount = 1 - Math.min(Math.max(amount, 0), 1);
var lDarker = luv.getL() * realAmount;
var uDarker = luv.getU() * realAmount;
var vDarker = luv.getV() * realAmount;
return new Colors.luv(lDarker, uDarker, vDarker);
};
/**
* Lighten Luv color by amount
*
* @param {Colors.luv} luv
* @param {number} [amount=0.5] amount to lighten, 0-1
* @return {Colors.luv}
*/
Modify.luvLighten = function (luv, amount) {
if (amount === void 0) { amount = 0.5; }
var realAmount = Math.min(Math.max(amount, 0), 1);
var realAmountAB = 1 - Math.min(Math.max(amount, 0), 1);
var lLighter = luv.getL() + (100 - luv.getL()) * realAmount;
var uLighter = luv.getU() * realAmountAB;
var vLighter = luv.getV() * realAmountAB;
return new Colors.luv(lLighter, uLighter, vLighter);
};
/**
* Darken Luv color by amount (alt method)
* Breaks as L* approaches 0
*
* @param {Colors.luv} luv
* @param {number} [amount=0.5] amount to darken, 0-1
* @return {Colors.luv}
*/
Modify.luv2Darken = function (luv, amount) {
if (amount === void 0) { amount = 0.5; }
var realAmount = 1 - Math.min(Math.max(amount, 0), 1);
var lDarker = luv.getL() * realAmount;
return new Colors.luv(lDarker, luv.getU(), luv.getV());
};
/**
* Lighten Luv color by amount (alt method)
*
* @param {Colors.luv} luv
* @param {number} [amount=0.5] amount to lighten, 0-1
* @return {Colors.luv}
*/
Modify.luv2Lighten = function (luv, amount) {
if (amount === void 0) { amount = 0.5; }
var realAmount = Math.min(Math.max(amount, 0), 1);
var lLighter = luv.getL() + (100 - luv.getL()) * realAmount;
return new Colors.luv(lLighter, luv.getU(), luv.getV());
};
/**
* Desaturate HSL color by amount
*
* @param {Colors.hsl} hsl
* @param {number} [amount=0.5] amount to lighten, 0-1
* @return {Colors.hsl}
*/
Modify.hslDesaturate = function (hsl, amount) {
if (amount === void 0) { amount = 0.5; }
var realAmount = 1 - Math.min(Math.max(amount, 0), 1);
var sLess = hsl.getS() * realAmount;
return new Colors.hsl(hsl.getH(), sLess, hsl.getL(), hsl.getA());
};
/**
* Saturate HSL color by amount
*
* @param {Colors.hsl} hsl
* @param {number} [amount=0.5] amount to lighten, 0-1
* @return {Colors.hsl}
*/
Modify.hslSaturate = function (hsl, amount) {
if (amount === void 0) { amount = 0.5; }
var realAmount = Math.min(Math.max(amount, 0), 1);
var sMore = hsl.getS() + (100 - hsl.getS()) * realAmount;
return new Colors.hsl(hsl.getH(), sMore, hsl.getL(), hsl.getA());
};
/**
* Desaturate HSV color by amount
*
* @param {Colors.hsv} hsv
* @param {number} [amount=0.5] amount to lighten, 0-1
* @return {Colors.hsv}
*/
Modify.hsvDesaturate = function (hsv, amount) {
if (amount === void 0) { amount = 0.5; }
var realAmount = 1 - Math.min(Math.max(amount, 0), 1);
var sLess = hsv.getS() * realAmount;
return new Colors.hsv(hsv.getH(), sLess, hsv.getV(), hsv.getA());
};
/**
* Saturate HSV color by amount
*
* @param {Colors.hsv} hsv
* @param {number} [amount=0.5] amount to lighten, 0-1
* @return {Colors.hsv}
*/
Modify.hsvSaturate = function (hsv, amount) {
if (amount === void 0) { amount = 0.5; }
var realAmount = Math.min(Math.max(amount, 0), 1);
var sMore = hsv.getS() + (100 - hsv.getS()) * realAmount;
return new Colors.hsv(hsv.getH(), sMore, hsv.getV(), hsv.getA());
};
/**
* Desaturate HSI color by amount
*
* @param {Colors.hsi} hsi
* @param {number} [amount=0.5] amount to lighten, 0-1
* @return {Colors.hsi}
*/
Modify.hsiDesaturate = function (hsi, amount) {
if (amount === void 0) { amount = 0.5; }
var realAmount = 1 - Math.min(Math.max(amount, 0), 1);
var sLess = hsi.getS() * realAmount;
return new Colors.hsi(hsi.getH(), sLess, hsi.getI(), hsi.getA());
};
/**
* Saturate HSI color by amount
*
* @param {Colors.hsi} hsi
* @param {number} [amount=0.5] amount to lighten, 0-1
* @return {Colors.hsi}
*/
Modify.hsiSaturate = function (hsi, amount) {
if (amount === void 0) { amount = 0.5; }
var realAmount = Math.min(Math.max(amount, 0), 1);
var sMore = hsi.getS() + (100 - hsi.getS()) * realAmount;
return new Colors.hsi(hsi.getH(), sMore, hsi.getI(), hsi.getA());
};
/**
* Desaturate HSP color by amount
*
* @param {Colors.hsp} hsp
* @param {number} [amount=0.5] amount to lighten, 0-1
* @return {Colors.hsp}
*/
Modify.hspDesaturate = function (hsp, amount) {
if (amount === void 0) { amount = 0.5; }
var realAmount = 1 - Math.min(Math.max(amount, 0), 1);
var sLess = hsp.getS() * realAmount;
return new Colors.hsp(hsp.getH(), sLess, hsp.getP(), hsp.getA());
};
/**
* Saturate HSP color by amount
*
* @param {Colors.hsp} hsp
* @param {number} [amount=0.5] amount to lighten, 0-1
* @return {Colors.hsp}
*/
Modify.hspSaturate = function (hsp, amount) {
if (amount === void 0) { amount = 0.5; }
var realAmount = Math.min(Math.max(amount, 0), 1);
var sMore = hsp.getS() + (100 - hsp.getS()) * realAmount;
return new Colors.hsp(hsp.getH(), sMore, hsp.getP(), hsp.getA());
};
return Modify;
}());
exports.default = Modify;