UNPKG

proglib

Version:

Многофункциональная библиотека

1,263 lines (975 loc) 62.2 kB
'use strict'; const KnownColor = require('./knownColor'); const ARGBAlphaShift = 24; const ARGBRedShift = 16; const ARGBGreenShift = 8; const ARGBBlueShift = 0; const Win32RedShift = 0; const Win32GreenShift = 8; const Win32BlueShift = 16; /** * Предоставляет методы и свойства для работы с цветовыми моделями. */ class Color { /** * Инициализирует новый экземпляр класса `Color`. * Принимает Имя предопределённого цвета либо значения соответсвующие цветовой модели Rgb (Rgba). * @param {String} Name Имя предопределённого цвета. * @param {Number} Red Красный: { 0 ... 255 }. * @param {Number} Green Зелёный: { 0 ... 255 }. * @param {Number} Blue Синий: { 0 ... 255 }. * @param {Number} Alpha Прозрачность: { 0 ... 1 }. */ constructor() { switch (arguments.length) { case 0: this.Name = "Black"; this.R = 0; this.G = 0; this.B = 0; this.A = 1; break; case 1: if (typeof arguments[0] === 'string') { let _color = KnownColor.Search(arguments[0]); if (_color != "") { this.Name = _color.name; this.R = _color.r; this.G = _color.g; this.B = _color.b; this.A = 1; } else { this.Name = "Black"; this.R = 0; this.G = 0; this.B = 0; this.A = 1; } } else { throw "Входные параметры заданы неверно."; } break; case 3: if (typeof arguments[0] === 'number' && typeof arguments[1] === 'number' && typeof arguments[2] === 'number') { let _color = KnownColor.Search(arguments[0], arguments[1], arguments[2]); this.Name = (_color != "") ? _color.name : ""; this.R = arguments[0]; this.G = arguments[1]; this.B = arguments[2]; this.A = 1; } else { throw "Входные параметры заданы неверно."; } break; case 4: if (typeof arguments[0] === 'number' && typeof arguments[1] === 'number' && typeof arguments[2] === 'number' && typeof arguments[3] === 'number') { let _color = KnownColor.Search(arguments[0], arguments[1], arguments[2]); this.Name = (_color != "") ? _color.Name : ""; this.R = arguments[0]; this.G = arguments[1]; this.B = arguments[2]; this.A = arguments[3]; } else { throw "Входные параметры заданы неверно."; } break; default: throw "Входные параметры заданы неверно."; } } /** Получает определенный системой цвет, имеющий значение `#FF9370DB`. */ static get MediumPurple() { return new Color("MediumPurple"); } /** Получает определенный системой цвет, имеющий значение `#FF3CB371`. */ static get MediumSeaGreen() { return new Color("MediumSeaGreen"); } /** Получает определенный системой цвет, имеющий значение `#FF7B68EE`. */ static get MediumSlateBlue() { return new Color("MediumSlateBlue"); } /** Получает определенный системой цвет, имеющий значение `#FF00FA9A`. */ static get MediumSpringGreen() { return new Color("MediumSpringGreen"); } /** Получает определенный системой цвет, имеющий значение `#FF48D1CC`. */ static get MediumTurquoise() { return new Color("MediumTurquoise"); } /** Получает определенный системой цвет, имеющий значение `#FFC71585`. */ static get MediumVioletRed() { return new Color("MediumVioletRed"); } /** Получает определенный системой цвет, имеющий значение `#FF191970`. */ static get MidnightBlue() { return new Color("MidnightBlue"); } /** Получает определенный системой цвет, имеющий значение `#FFBA55D3`. */ static get MediumOrchid() { return new Color("MediumOrchid"); } /** Получает определенный системой цвет, имеющий значение `#FFF5FFFA`. */ static get MintCream() { return new Color("MintCream"); } /** Получает определенный системой цвет, имеющий значение `#FFFFE4B5`. */ static get Moccasin() { return new Color("Moccasin"); } /** Получает определенный системой цвет, имеющий значение `#FFFFDEAD`. */ static get NavajoWhite() { return new Color("NavajoWhite"); } /** Получает определенный системой цвет, имеющий значение `#FF000080`. */ static get Navy() { return new Color("Navy"); } /** Получает определенный системой цвет, имеющий значение `#FFFDF5E6`. */ static get OldLace() { return new Color("OldLace"); } /** Получает определенный системой цвет, имеющий значение `#FF808000`. */ static get Olive() { return new Color("Olive"); } /** Получает определенный системой цвет, имеющий значение `#FF6B8E23`. */ static get OliveDrab() { return new Color("OliveDrab"); } /** Получает определенный системой цвет, имеющий значение `#FFFFA500`. */ static get Orange() { return new Color("Orange"); } /** Получает определенный системой цвет, имеющий значение `#FFFFE4E1`. */ static get MistyRose() { return new Color("MistyRose"); } /** Получает определенный системой цвет, имеющий значение `#FFFF4500`. */ static get OrangeRed() { return new Color("OrangeRed"); } /** Получает определенный системой цвет, имеющий значение `#FF0000CD`. */ static get MediumBlue() { return new Color("MediumBlue"); } /** Получает определенный системой цвет, имеющий значение `#FF800000`. */ static get Maroon() { return new Color("Maroon"); } /** Получает определенный системой цвет, имеющий значение `#FFADD8E6`. */ static get LightBlue() { return new Color("LightBlue"); } /** Получает определенный системой цвет, имеющий значение `#FFF08080`. */ static get LightCoral() { return new Color("LightCoral"); } /** Получает определенный системой цвет, имеющий значение `#FFFAFAD2`. */ static get LightGoldenrodYellow() { return new Color("LightGoldenrodYellow"); } /** Получает определенный системой цвет, имеющий значение `#FF90EE90`. */ static get LightGreen() { return new Color("LightGreen"); } /** Получает определенный системой цвет, имеющий значение `#FFD3D3D3`. */ static get LightGray() { return new Color("LightGray"); } /** Получает определенный системой цвет, имеющий значение `#FFFFB6C1`. */ static get LightPink() { return new Color("LightPink"); } /** Получает определенный системой цвет, имеющий значение `#FFFFA07A`. */ static get LightSalmon() { return new Color("LightSalmon"); } /** Получает определенный системой цвет, имеющий значение `#FF66CDAA`. */ static get MediumAquamarine() { return new Color("MediumAquamarine"); } /** Получает определенный системой цвет, имеющий значение `#FF20B2AA`. */ static get LightSeaGreen() { return new Color("LightSeaGreen"); } /** Получает определенный системой цвет, имеющий значение `#FF778899`. */ static get LightSlateGray() { return new Color("LightSlateGray"); } /** Получает определенный системой цвет, имеющий значение `#FFB0C4DE`. */ static get LightSteelBlue() { return new Color("LightSteelBlue"); } /** Получает определенный системой цвет, имеющий значение `#FFFFFFE0`. */ static get LightYellow() { return new Color("LightYellow"); } /** Получает определенный системой цвет, имеющий значение `#FF00FF00`. */ static get Lime() { return new Color("Lime"); } /** Получает определенный системой цвет, имеющий значение `#FF32CD32`. */ static get LimeGreen() { return new Color("LimeGreen"); } /** Получает определенный системой цвет, имеющий значение `#FFFAF0E6`. */ static get Linen() { return new Color("Linen"); } /** Получает определенный системой цвет, имеющий значение `#FFFF00FF`. */ static get Magenta() { return new Color("Magenta"); } /** Получает определенный системой цвет, имеющий значение `#FF87CEFA`. */ static get LightSkyBlue() { return new Color("LightSkyBlue"); } /** Получает определенный системой цвет, имеющий значение `#FFFFFACD`. */ static get LemonChiffon() { return new Color("LemonChiffon"); } /** Получает определенный системой цвет, имеющий значение `#FFDA70D6`. */ static get Orchid() { return new Color("Orchid"); } /** Получает определенный системой цвет, имеющий значение `#FF98FB98`. */ static get PaleGreen() { return new Color("PaleGreen"); } /** Получает определенный системой цвет, имеющий значение `#FF6A5ACD`. */ static get SlateBlue() { return new Color("SlateBlue"); } /** Получает определенный системой цвет, имеющий значение `#FF708090`. */ static get SlateGray() { return new Color("SlateGray"); } /** Получает определенный системой цвет, имеющий значение `#FFFFFAFA`. */ static get Snow() { return new Color("Snow"); } /** Получает определенный системой цвет, имеющий значение `#FF00FF7F`. */ static get SpringGreen() { return new Color("SpringGreen"); } /** Получает определенный системой цвет, имеющий значение `#FF4682B4`. */ static get SteelBlue() { return new Color("SteelBlue"); } /** Получает определенный системой цвет, имеющий значение `#FFD2B48C`. */ static get Tan() { return new Color("Tan"); } /** Получает определенный системой цвет, имеющий значение `#FF008080`. */ static get Teal() { return new Color("Teal"); } /** Получает определенный системой цвет, имеющий значение `#FF87CEEB`. */ static get SkyBlue() { return new Color("SkyBlue"); } /** Получает определенный системой цвет, имеющий значение `#FFD8BFD8`. */ static get Thistle() { return new Color("Thistle"); } /** Получает определенный системой цвет, имеющий значение `#FF40E0D0`. */ static get Turquoise() { return new Color("Turquoise"); } /** Получает определенный системой цвет, имеющий значение `#FFEE82EE`. */ static get Violet() { return new Color("Violet"); } /** Получает определенный системой цвет, имеющий значение `#FFF5DEB3`. */ static get Wheat() { return new Color("Wheat"); } /** Получает определенный системой цвет, имеющий значение `#FFFFFFFF`. */ static get White() { return new Color("White"); } /** Получает определенный системой цвет, имеющий значение `#FFF5F5F5`. */ static get WhiteSmoke() { return new Color("WhiteSmoke"); } /** Получает определенный системой цвет, имеющий значение `#FFFFFF00`. */ static get Yellow() { return new Color("Yellow"); } /** Получает определенный системой цвет, имеющий значение `#FF9ACD32`. */ static get YellowGreen() { return new Color("YellowGreen"); } /** Получает определенный системой цвет, имеющий значение `#FFFF6347`. */ static get Tomato() { return new Color("Tomato"); } /** Получает определенный системой цвет, имеющий значение `#FFEEE8AA`. */ static get PaleGoldenrod() { return new Color("PaleGoldenrod"); } /** Получает определенный системой цвет, имеющий значение `#FFC0C0C0`. */ static get Silver() { return new Color("Silver"); } /** Получает определенный системой цвет, имеющий значение `#FFFFF5EE`. */ static get SeaShell() { return new Color("SeaShell"); } /** Получает определенный системой цвет, имеющий значение `#FFAFEEEE`. */ static get PaleTurquoise() { return new Color("PaleTurquoise"); } /** Получает определенный системой цвет, имеющий значение `#FFDB7093`. */ static get PaleVioletRed() { return new Color("PaleVioletRed"); } /** Получает определенный системой цвет, имеющий значение `#FFFFEFD5`. */ static get PapayaWhip() { return new Color("PapayaWhip"); } /** Получает определенный системой цвет, имеющий значение `#FFFFDAB9`. */ static get PeachPuff() { return new Color("PeachPuff"); } /** Получает определенный системой цвет, имеющий значение `#FFCD853F`. */ static get Peru() { return new Color("Peru"); } /** Получает определенный системой цвет, имеющий значение `#FFFFC0CB`. */ static get Pink() { return new Color("Pink"); } /** Получает определенный системой цвет, имеющий значение `#FFDDA0DD`. */ static get Plum() { return new Color("Plum"); } /** Получает определенный системой цвет, имеющий значение `#FFA0522D`. */ static get Sienna() { return new Color("Sienna"); } /** Получает определенный системой цвет, имеющий значение `#FFB0E0E6`. */ static get PowderBlue() { return new Color("PowderBlue"); } /** Получает определенный системой цвет, имеющий значение `#FFFF0000`. */ static get Red() { return new Color("Red"); } /** Получает определенный системой цвет, имеющий значение `#FFBC8F8F`. */ static get RosyBrown() { return new Color("RosyBrown"); } /** Получает определенный системой цвет, имеющий значение `#FF4169E1`. */ static get RoyalBlue() { return new Color("RoyalBlue"); } /** Получает определенный системой цвет, имеющий значение `#FF8B4513`. */ static get SaddleBrown() { return new Color("SaddleBrown"); } /** Получает определенный системой цвет, имеющий значение `#FFFA8072`. */ static get Salmon() { return new Color("Salmon"); } /** Получает определенный системой цвет, имеющий значение `#FFF4A460`. */ static get SandyBrown() { return new Color("SandyBrown"); } /** Получает определенный системой цвет, имеющий значение `#FF2E8B57`. */ static get SeaGreen() { return new Color("SeaGreen"); } /** Получает определенный системой цвет, имеющий значение `#FF800080`. */ static get Purple() { return new Color("Purple"); } /** Получает определенный системой цвет, имеющий значение `#FF7CFC00`. */ static get LawnGreen() { return new Color("LawnGreen"); } /** Получает определенный системой цвет, имеющий значение `#FFE0FFFF`. */ static get LightCyan() { return new Color("LightCyan"); } /** Получает определенный системой цвет, имеющий значение `#FFE6E6FA`. */ static get Lavender() { return new Color("Lavender"); } /** Получает определенный системой цвет, имеющий значение `#FFBDB76B`. */ static get DarkKhaki() { return new Color("DarkKhaki"); } /** Получает определенный системой цвет, имеющий значение `#FF006400`. */ static get DarkGreen() { return new Color("DarkGreen"); } /** Получает определенный системой цвет, имеющий значение `#FFA9A9A9`. */ static get DarkGray() { return new Color("DarkGray"); } /** Получает определенный системой цвет, имеющий значение `#FFB8860B`. */ static get DarkGoldenrod() { return new Color("DarkGoldenrod"); } /** Получает определенный системой цвет, имеющий значение `#FF008B8B`. */ static get DarkCyan() { return new Color("DarkCyan"); } /** Получает определенный системой цвет, имеющий значение `#FF00008B`. */ static get DarkBlue() { return new Color("DarkBlue"); } /** Получает определенный системой цвет, имеющий значение `#FF00FFFF`. */ static get Cyan() { return new Color("Cyan"); } /** Получает определенный системой цвет, имеющий значение `#FFDC143C`. */ static get Crimson() { return new Color("Crimson"); } /** Получает определенный системой цвет, имеющий значение `#FFFFF8DC`. */ static get Cornsilk() { return new Color("Cornsilk"); } /** Получает определенный системой цвет, имеющий значение `#FFFFF0F5`. */ static get LavenderBlush() { return new Color("LavenderBlush"); } /** Получает определенный системой цвет, имеющий значение `#FFFF7F50`. */ static get Coral() { return new Color("Coral"); } /** Получает определенный системой цвет, имеющий значение `#FFD2691E`. */ static get Chocolate() { return new Color("Chocolate"); } /** Получает определенный системой цвет, имеющий значение `#FF7FFF00`. */ static get Chartreuse() { return new Color("Chartreuse"); } /** Получает определенный системой цвет, имеющий значение `#FF8B008B`. */ static get DarkMagenta() { return new Color("DarkMagenta"); } /** Получает определенный системой цвет, имеющий значение `#FF5F9EA0`. */ static get CadetBlue() { return new Color("CadetBlue"); } /** Получает определенный системой цвет, имеющий значение `#FFA52A2A`. */ static get Brown() { return new Color("Brown"); } /** Получает определенный системой цвет, имеющий значение `#FF8A2BE2`. */ static get BlueViolet() { return new Color("BlueViolet"); } /** Получает определенный системой цвет, имеющий значение `#FF0000FF`. */ static get Blue() { return new Color("Blue"); } /** Получает определенный системой цвет, имеющий значение `#FFFFEBCD`. */ static get BlanchedAlmond() { return new Color("BlanchedAlmond"); } /** Получает определенный системой цвет, имеющий значение `#FF000000`. */ static get Black() { return new Color("Black"); } /** Получает определенный системой цвет, имеющий значение `#FFFFE4C4`. */ static get Bisque() { return new Color("Bisque"); } /** Получает определенный системой цвет, имеющий значение `#FFF5F5DC`. */ static get Beige() { return new Color("Beige"); } /** Получает определенный системой цвет, имеющий значение `#FFF0FFFF`. */ static get Azure() { return new Color("Azure"); } /** Получает определенный системой цвет, имеющий значение `#FF7FFFD4`. */ static get Aquamarine() { return new Color("Aquamarine"); } /** Получает определенный системой цвет, имеющий значение `#FF00FFFF`. */ static get Aqua() { return new Color("Aqua"); } /** Получает определенный системой цвет, имеющий значение `#FFFAEBD7`. */ static get AntiqueWhite() { return new Color("AntiqueWhite"); } /** Получает определенный системой цвет, имеющий значение `#FFF0F8FF`. */ static get AliceBlue() { return new Color("AliceBlue"); } /** Получает определенный системой цвет, имеющий значение `#FFDEB887`. */ static get BurlyWood() { return new Color("BurlyWood"); } /** Получает определенный системой цвет, имеющий значение `#FF556B2F`. */ static get DarkOliveGreen() { return new Color("DarkOliveGreen"); } /** Получает определенный системой цвет, имеющий значение `#FF6495ED`. */ static get CornflowerBlue() { return new Color("CornflowerBlue"); } /** Получает определенный системой цвет, имеющий значение `#FF9932CC`. */ static get DarkOrchid() { return new Color("DarkOrchid"); } /** Получает определенный системой цвет, имеющий значение `#FFF0E68C`. */ static get Khaki() { return new Color("Khaki"); } /** Получает определенный системой цвет, имеющий значение `#FFFFFFF0`. */ static get Ivory() { return new Color("Ivory"); } /** Получает определенный системой цвет, имеющий значение `#FFFF8C00`. */ static get DarkOrange() { return new Color("DarkOrange"); } /** Получает определенный системой цвет, имеющий значение `#FF4B0082`. */ static get Indigo() { return new Color("Indigo"); } /** Получает определенный системой цвет, имеющий значение `#FFCD5C5C`. */ static get IndianRed() { return new Color("IndianRed"); } /** Получает определенный системой цвет, имеющий значение `#FFFF69B4`. */ static get HotPink() { return new Color("HotPink"); } /** Получает определенный системой цвет, имеющий значение `#FFF0FFF0`. */ static get Honeydew() { return new Color("Honeydew"); } /** Получает определенный системой цвет, имеющий значение `#FFADFF2F`. */ static get GreenYellow() { return new Color("GreenYellow"); } /** Получает определенный системой цвет, имеющий значение `#FF008000`. */ static get Green() { return new Color("Green"); } /** Получает определенный системой цвет, имеющий значение `#FF808080`. */ static get Gray() { return new Color("Gray"); } /** Получает определенный системой цвет, имеющий значение `#FFDAA520`. */ static get Goldenrod() { return new Color("Goldenrod"); } /** Получает определенный системой цвет, имеющий значение `#FFF8F8FF`. */ static get GhostWhite() { return new Color("GhostWhite"); } /** Получает определенный системой цвет, имеющий значение `#FFDCDCDC`. */ static get Gainsboro() { return new Color("Gainsboro"); } /** Получает определенный системой цвет, имеющий значение `#FFFF00FF`. */ static get Fuchsia() { return new Color("Fuchsia"); } /** Получает определенный системой цвет, имеющий значение `#FFFFD700`. */ static get Gold() { return new Color("Gold"); } /** Получает определенный системой цвет, имеющий значение `#FFFFFAF0`. */ static get FloralWhite() { return new Color("FloralWhite"); } /** Получает определенный системой цвет, имеющий значение `#FF8B0000`. */ static get DarkRed() { return new Color("DarkRed"); } /** Получает определенный системой цвет, имеющий значение `#FFE9967A`. */ static get DarkSalmon() { return new Color("DarkSalmon"); } /** Получает определенный системой цвет, имеющий значение `#FF8FBC8F`. */ static get DarkSeaGreen() { return new Color("DarkSeaGreen"); } /** Получает определенный системой цвет, имеющий значение `#FF228B22`. */ static get ForestGreen() { return new Color("ForestGreen"); } /** Получает определенный системой цвет, имеющий значение `#FF2F4F4F`. */ static get DarkSlateGray() { return new Color("DarkSlateGray"); } /** Получает определенный системой цвет, имеющий значение `#FF00CED1`. */ static get DarkTurquoise() { return new Color("DarkTurquoise"); } /** Получает определенный системой цвет, имеющий значение `#FF483D8B`. */ static get DarkSlateBlue() { return new Color("DarkSlateBlue"); } /** Получает определенный системой цвет, имеющий значение `#FFFF1493`. */ static get DeepPink() { return new Color("DeepPink"); } /** Получает определенный системой цвет, имеющий значение `#FF00BFFF`. */ static get DeepSkyBlue() { return new Color("DeepSkyBlue"); } /** Получает определенный системой цвет, имеющий значение `#FF696969`. */ static get DimGray() { return new Color("DimGray"); } /** Получает определенный системой цвет, имеющий значение `#FF1E90FF`. */ static get DodgerBlue() { return new Color("DodgerBlue"); } /** Получает определенный системой цвет, имеющий значение `#FFB22222`. */ static get Firebrick() { return new Color("Firebrick"); } /** Получает определенный системой цвет, имеющий значение `#FF9400D3`. */ static get DarkViolet() { return new Color("DarkViolet"); } /** * Создает объект `Color` из 32-рязрядного значения RGBA. * @param {Number} Rgba 32-рязрядное значение RGBA. */ static From32bit(RgbaColor) { return new Color( (RgbaColor >> ARGBRedShift ) & 0xFF, (RgbaColor >> ARGBGreenShift) & 0xFF, (RgbaColor >> ARGBBlueShift ) & 0xFF, Math.round(((RgbaColor >> ARGBAlphaShift) & 0xFF) / 255, 2) ); } /** * Создает объект `Color` из значения цвета технологии Ole. * @param {Number} OleColor Переводимый цвет в формате Ole. */ static FromOle(OleColor) { return new Color((OleColor >> Win32RedShift) & 0xFF, (OleColor >> Win32GreenShift) & 0xFF, (OleColor >> Win32BlueShift) & 0xFF); } /** * Создает объект `Color` из значения цвета Windows. * @param {Number} Win32Color Переводимый цвет в Windows. */ static FromWin32(Win32Color) { return Color.FromOle(Win32Color); } /** * Создает объект `Color` из указанного имени предопределенного цвета. * @param {String} Name Строка, которая является именем предопределенного цвета. */ static FromName(Name) { return new Color(Name); } /** * Создает объект `Color` из представления цвета Hex. * @param {String} HtmlColor */ static FromHex(HtmlColor) { if (!HtmlColor || HtmlColor == null || HtmlColor.Length == 0) return undefined; // #RRGGBB or #RGB if (HtmlColor[0] == '#' && ((HtmlColor.length == 7) || (HtmlColor.length == 4))) { return (HtmlColor.length == 7) ? new Color(Number.parseInt(HtmlColor.substring(1, 3), 16), Number.parseInt(HtmlColor.substring(3, 5), 16), Number.parseInt(HtmlColor.substring(5, 7), 16)) : new Color(Number.parseInt(HtmlColor[1] + HtmlColor[1], 16), Number.parseInt(HtmlColor[2] + HtmlColor[2], 16), Number.parseInt(HtmlColor[3] + HtmlColor[3], 16)); } return undefined; } /** * Создает объект `Color` из четырех значений компонентов RGBA (Красный, Зеленый, Синий и Прозрачность). * @param {Number} Red Красный: { 0 ... 255 }. * @param {Number} Green Зелёный: { 0 ... 255 }. * @param {Number} Blue Синий: { 0 ... 255 }. * @param {Number} Alpha Прозрачность: { 0 ... 1 }. */ static FromRgba(Red, Green, Blue, Alpha = 1) { return new Color(Red, Green, Blue, Alpha); } /** * Создает объект `Color` из трёх значений компонентов HSB / HSV (Оттенок, Насыщенность и Яркость). * @param {Number} Hue Оттенок: { 0 ... 360 }. * @param {Number} Saturation Насыщенность: { 0 ... 1 }. * @param {Number} Brightness Яркость: { 0 ... 1 }. */ static FromHsb(Hue, Saturation, Brightness) { let C = Brightness * Saturation; let X = C * (1 - Math.abs((Hue / 60) % 2 - 1)); let m = Brightness - C; let R = 0, G = 0, B = 0; if (Hue >= 0 && Hue < 60) { R = C; G = X; B = 0; } else if (Hue >= 60 && Hue < 120) { R = X; G = C; B = 0; } else if (Hue >= 120 && Hue < 180) { R = 0; G = C; B = X; } else if (Hue >= 180 && Hue < 240) { R = 0; G = X; B = C; } else if (Hue >= 240 && Hue < 300) { R = X; G = 0; B = C; } else if (Hue >= 300 && Hue <= 360) { R = C; G = 0; B = X; } return new Color(Math.round((R + m) * 255), Math.round((G + m) * 255), Math.round((B + m) * 255)); } /** * Создает объект `Color` из трёх значений компонентов HSL (Оттенок, Насыщенность и Светлота). * @param {Number} Hue Оттенок: { 0 ... 360 }. * @param {Number} Saturation Насыщенность: { 0 ... 1 }. * @param {Number} Lightness Светлота: { 0 ... 1 }. */ static FromHsla(Hue, Saturation, Lightness, Alpha = 1) { function HueToRgba(v1, v2, vH) { if (vH < 0) vH += 1; if (vH > 1) vH -= 1; if ((6 * vH) < 1) return (v1 + (v2 - v1) * 6 * vH); if ((2 * vH) < 1) return v2; if ((3 * vH) < 2) return (v1 + (v2 - v1) * ((2.0 / 3) - vH) * 6); return v1; } let Red = 0, Green = 0, Blue = 0; if (Saturation != 0) { let v1, v2; let hue = Hue / 360; v2 = (Lightness < 0.5) ? (Lightness * (1 + Saturation)) : ((Lightness + Saturation) - (Lightness * Saturation)); v1 = 2 * Lightness - v2; Red = Math.round((255 * HueToRgba(v1, v2, hue + (1.0 / 3)))); Green = Math.round((255 * HueToRgba(v1, v2, hue))); Blue = Math.round((255 * HueToRgba(v1, v2, hue - (1.0 / 3)))); } else { Red = Green = Blue = (Lightness * 255); } return new Color(Red, Green, Blue, Alpha); } /** * Создает объект `Color` из трёх значений компонентов HWB (Оттенок, Белизна и Чернота). * @param {Number} H Оттенок: { 0 ... 360 }. * @param {Number} W Белизна: { 0 ... 1 }. * @param {Number} B Чернота: { 0 ... 1 }. */ static FromHwb(H, W, B) { let h = H / 360, wh = W, bl = B; const ratio = wh + bl; let f; // Wh + bl cant be > 1 if (ratio > 1) { wh /= ratio; bl /= ratio; } const i = Math.floor(6 * h); const v = 1 - bl; f = 6 * h - i; if ((i & 0x01) !== 0) { f = 1 - f; } const n = wh + f * (v - wh); // Linear interpolation let Red = 0, Green = 0, Blue = 0; /* eslint-disable max-statements-per-line,no-multi-spaces */ switch (i) { default: case 6: case 0: Red = v; Green = n; Blue = wh; break; case 1: Red = n; Green = v; Blue = wh; break; case 2: Red = wh; Green = v; Blue = n; break; case 3: Red = wh; Green = n; Blue = v; break; case 4: Red = n; Green = wh; Blue = v; break; case 5: Red = v; Green = wh; Blue = n; break; } /* eslint-enable max-statements-per-line,no-multi-spaces */ return new Color(Math.round(Red * 255), Math.round(Green * 255), Math.round(Blue * 255)); } /** * Создает объект `Color` из трёх значений компонентов CMYK (Голубой, Пурпурный, Жёлтый и Ключ). * @param {Number} Cyan Голубой: { 0 ... 1 }. * @param {Number} Magenta Пурпурный: { 0 ... 1 }. * @param {Number} Yellow Жёлтый: { 0 ... 1 }. * @param {Number} Key Ключ: { 0 ... 1 }. */ static FromCmyk(Cyan, Magenta, Yellow, Key) { return new Color(Math.round((255 * (1 - Cyan) * (1 - Key))), Math.round((255 * (1 - Magenta) * (1 - Key))), Math.round((255 * (1 - Yellow) * (1 - Key)))); } /** * Создает объект `Color` из трёх значений компонентов XYZ. * @param {Number} X { 0 ... 95 }. * @param {Number} Y { 0 ... 100 }. * @param {Number} Z { 0 ... 109 }. */ static FromXYZ(X, Y, Z) { X = X / 100; Y = Y / 100; Z = Z / 100; let Red = 0, Green = 0, Blue = 0; Red = (X * 3.2406) + (Y * -1.5372) + (Z * -0.4986); Green = (X * -0.9689) + (Y * 1.8758) + (Z * 0.0415); Blue = (X * 0.0557) + (Y * -0.2040) + (Z * 1.0570); // Assume sRGB Red = Red > 0.0031308 ? ((1.055 * (Red ** (1.0 / 2.4))) - 0.055) : Red * 12.92; Green = Green > 0.0031308 ? ((1.055 * (Green ** (1.0 / 2.4))) - 0.055) : Green * 12.92; Blue = Blue > 0.0031308 ? ((1.055 * (Blue ** (1.0 / 2.4))) - 0.055) : Blue * 12.92; Red = Math.min(Math.max(0, Red), 1); Green = Math.min(Math.max(0, Green), 1); Blue = Math.min(Math.max(0, Blue), 1); return new Color(Math.round(Red * 255), Math.round(Green * 255), Math.round(Blue * 255)); } /** * Создает объект `Color` из трёх значений компонентов LAB. * @param {Number} L { 0 ... 100 }. * @param {Number} A { -128 ... 127}. * @param {Number} B { -128 ... 127}. */ static FromLab(L, A, B) { let Y = (L + 16) / 116; let X = A / 500 + Y; let Z = Y - B / 200; const y2 = Y ** 3; const x2 = X ** 3; const z2 = Z ** 3; Y = y2 > 0.008856 ? y2 : (Y - 16 / 116) / 7.787; X = x2 > 0.008856 ? x2 : (X - 16 / 116) / 7.787; Z = z2 > 0.008856 ? z2 : (Z - 16 / 116) / 7.787; X *= 95.047; Y *= 100; Z *= 108.883; return Color.FromXYZ(Math.round(X), Math.round(Y), Math.round(Z)); } /** * Создает объект `Color` из трёх значений компонентов Apple. * @param {Number} AppleR { 0 ... 65535 }. * @param {Number} AppleG { 0 ... 65535 }. * @param {Number} AppleB { 0 ... 65535 }. */ static FromApple(AppleR, AppleG, AppleB) { return new Color((AppleR / 65535) * 255, (AppleG / 65535) * 255, (AppleB / 65535) * 255); } /** * * @param {Number} Ansi16Color { 30 ... 97 }. */ static FromAnsi16(Ansi16Color) { let color = Ansi16Color % 10; // Handle greyscale if (color === 0 || color === 7) { if (Ansi16Color > 50) { color += 3.5; } color = color / 10.5 * 255; return [color, color, color]; } const mult = (~~(Ansi16Color > 50) + 1) * 0.5; const Red = ((color & 1) * mult) * 255; const Green = (((color >> 1) & 1) * mult) * 255; const Blue = (((color >> 2) & 1) * mult) * 255; return new Color(Red, Green, Blue); } /** * * @param {Number} Ansi256Color { 16 ... 231 }. */ static FromAnsi256(Ansi256Color) { // Handle greyscale if (Ansi256Color >= 232) { const c = (Ansi256Color - 232) * 10 + 8; return [c, c, c]; } Ansi256Color -= 16; let rem; const Red = Math.floor(Ansi256Color / 36) / 5 * 255; const Green = Math.floor((rem = Ansi256Color % 36) / 6) / 5 * 255; const Blue = (rem % 6) / 5 * 255; return new Color(Red, Green, Blue); } /** * Преобразует объект `Color` в 32-рязрядное значение RGBA. */ To32bit() { return (this.R << ARGBRedShift | this.G << ARGBGreenShift | this.B << ARGBBlueShift | Math.round(this.A * 255) << ARGBAlphaShift) & 0xFFFFFFFF; } /** * Преобразует объект `Color` в Ole. */ ToOle() { return this.ToWin32(this); } /** * Преобразует объект `Color` в значение цвета Windows. */ ToWin32() { return this.R << Win32RedShift | this.G << Win32GreenShift | this.B << Win32BlueShift; } /** * Преобразует объект `Color` в Hex. */ ToHex() { const integer = ((Math.round(this.R) & 0xFF) << 16) + ((Math.round(this.G) & 0xFF) << 8) + (Math.round(this.B) & 0xFF); const string = integer.toString(16).toUpperCase(); return "#" + "000000".substring(string.length) + string; } /** * Преобразует объект `Color` в цветовое пространство RGBA. */ ToRgba() { return { R: this.R, G: this.G, B: this.B, A: this.A } } /** * Преобразует объект `Color` в цветовое пространство HSB. */ ToHsb(Round = true) { let rdif, gdif, bdif, h, s; const r = this.R / 255; const g = this.G / 255; const b = this.B / 255; const v = Math.max(r, g, b); const diff = v - Math.min(r, g, b); const diffc = function (c) { return (v - c) / 6 / diff + 1 / 2; }; if (diff === 0) { h = 0; s = 0; } else { s = diff / v; rdif = diffc(r); gdif = diffc(g); bdif = diffc(b); if (r === v) { h = bdif - gdif; } else if (g === v) { h = (1 / 3) + rdif - bdif; } else if (b === v) { h = (2 / 3) + gdif - rdif; } if (h < 0) { h += 1; } else if (h > 1) { h -= 1; } } return (Round) ? { H: Math.round(h * 360), S: Math.round(s * 100) / 100, B: Math.round(v * 100) / 100 } : { H: h * 360, S: s, B: v }; } /** * Преобразует объект `Color` в цветовое пространство HSLA. * @param {Boolean} Round Значение указывающее, будет ли округляться результат. */ ToHsla(Round = true) { const r = this.R / 255; const g = this.G / 255; const b = this.B / 255; const min = Math.min(r, g, b); const max = Math.max(r, g, b); const delta = max - min; let h, s; if (max === min) { h = 0; } else if (r === max) { h = (g - b) / delta; } else if (g === max) { h = 2 + (b - r) / delta; } else if (b === max) { h = 4 + (r - g) / delta; } h = Math.min(h * 60, 360); if (h < 0) { h += 360; } const l = (min + max) / 2; if (max === min) { s = 0; } else if (l <= 0.5) { s = delta / (max + min); } else { s = delta / (2 - max - min); } return (Round) ? { H: Math.round(h), S: Math.round(s * 100) / 100, L: Math.round(l * 100) / 100, A: this.A } : { H: h, S: s, L: l, A: this.A }; } /** * Преобразует объект `Color` в цветовое пространство HWB. * @param {Boolean} Round Значение указывающее, будет ли округляться результат. */ ToHwb(Round = true) { let r = this.R, g = this.G, b = this.B; const h = this.ToHsla().H; const w = 1 / 255 * Math.min(r, Math.min(g, b)); b = 1 - 1 / 255 * Math.max(r, Math.max(g, b)); return (Round) ? { H: Math.round(h), W : Math.round(w * 100) / 100, B: Math.round(b * 100) / 100 } : { H: h, W: w, B: b }; } /** * Преобразует объект `Color` в цветовое пространство CMYK. * @param {Boolean} Round Значение указывающее, будет ли округляться результат. */ ToCmyk(Round = true) { let r = this.R / 255, g = this.G / 255, b = this.B / 255; const k = Math.min(1 - r, 1 - g, 1 - b); const c = (1 - r - k) / (1 - k) || 0; const m = (1 - g - k) / (1 - k) || 0; const y = (1 - b - k) / (1 - k) || 0; return (Round) ? { C: Math.round(c * 100) / 100, M: Math.round(m * 100) / 100, Y: Math.round(y * 100) / 100, K: Math.round(k * 100) / 100 } : { C: c, M: m, Y: y, K: k }; } /** * Преобразует объект `Color` в цветовое пространство XYZ. * @param {Boolean} Round Значение указывающее, будет ли округляться результат. */ ToXYZ(Round = true) { let r = this.R / 255, g = this.G / 255, b = this.B / 255; // Assume sRGB r = r > 0.04045 ? (((r + 0.055) / 1.055) ** 2.4) : (r / 12.92); g = g > 0.04045 ? (((g + 0.055) / 1.055) ** 2.4) : (g / 12.92); b = b > 0.04045 ? (((b + 0.055) / 1.055) ** 2.4) : (b / 12.92); const x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); const y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); const z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); return (Round) ? { X: Math.round(x * 100), Y: Math.round(y * 100), Z: Math.round(z * 100) } : { X: x * 100, Y: y * 100, Z: z * 100 }; } /** * Преобразует объект `Color` в цветовое пространство LAB. * @param {Boolean} Round Значение указывающее, будет ли округляться результат. */ ToLab(Round = true) { const _color = this.ToXYZ(); let x = _color.X, y = _color.Y, z = _color.Z; x /= 95.047; y /= 100; z /= 108.883; x = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116); y = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116); z = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116); const l = (116 * y) - 16; const a = 500 * (x - y); const b = 200 * (y - z); return (Round) ? { L: Math.round(l), A: Math.round(a), B: Math.round(b) } : { L: l, A: a, B: b }; } /** * Преобразует объект `Color` в Apple. * @param {Boolean} Round Значение указывающее, будет ли округляться результат. */ ToApple() { return { appleR: (this.R / 255) * 65535, appleG: (this.G / 255) * 65535, appleB: (this.B / 255) * 65535 }; } /** * Преобразует объект `Color` в Ansi16. * @param {Boolean} Round Значение указывающее, будет ли округляться результат. */ ToAnsi16(Round = true) { const r = this.R, g = this.G, b = this.B; let value = this.ToHsb(false).B * 100; // Hsv -> ansi16 optimization value = Math.round(value / 50); if (value === 0) { return 30; } let ansi = 30 + ((Math.round(b / 255) << 2) | (Math.round(g / 255) << 1) | Math.round(r / 255)); if (value === 2) { ansi += 60; } return ansi; } /** * Преобразует объект `Color` в Ansi256. * @param {Boolean} Round Значение указывающее, будет ли округляться результат. */ ToAnsi256() { let r = this.R, g = this.G, b = this.B; // We use the extended greyscale palette here, with the exception of // black and white. normal palette only has 4 greyscale shades. if (r === g && g === b) { if (r < 8) { return 16; } if (r > 248) { return 231; } return Math.round(((r - 8) / 247) * 24) + 232; } const ansi = 16 + (36 * Math.round(r / 255 * 5)) + (6 * Math.round(g / 255 * 5)) + Math.round(b / 255 * 5); return ansi; } /** * Получает значение, указывающее, является ли объект `Color` именованным цветом. */ get IsNamedColor() { return KnownColor.IsKnownColor(this.Name); } /** * Возвращает значение, показывающее, является ли объект `Color` системным цветом. * Системным является цвет, который используется в элементе отображения Windows. */ get IsSystemColor() { return KnownColor.IsSystemColor(this.Name); } /** * Преобразует данные в объект Json. * @param {String} Model Цветовая модель. */ toObject(Model = "rgba") { let _percent = (Model.indexOf("%") > -1); Model = (_percent) ? Model.replace(" ", "").replace("%", "") : Model.replace(" ", ""); switch (Model) { case "32bit": return { value: this.To32bit() }; case "ole": return { value: this.ToOle() }; case "win32": return { value: this.ToWin32() }; case "name": return { value: (this.IsNamedColor) ? this.Name : this.ToHex() }; case "hex": return { value: this.ToHex() }; case "rgb": return (_percent) ? { R: Math.round((this.R / 255) * 100), G: Math.round((this.G / 255) * 100), B: Math.round((this.B / 255) * 100) } : { R: this.R, G: this.G, B: this.B }; case "rgba": return (_percent) ? { R: Math.round((this.R / 255) * 100), G: Math.round((this.G / 255) * 100), B: Math.round((this.B / 255) * 100), A: this.A } : { R: this.R, G: this.G, B: this.B, A: this.A }; case "hsb": return (_percent) ? { H: this.ToHsb().H, S: this.ToHsb().S * 100, B: this.ToHsb().B * 100 } : { H: this.ToHsb().H, S: this.ToHsb().S, B: this.ToHsb().B }; case "hsl": return (_percent) ? { H: this.ToHsla().H, S: this.ToHsla().S * 100, L: this.ToHsla().L * 100 } : { H: this.ToHsla().H, S: this.ToHsla().S, L: this.ToHsla().L }; case "hsla": return (_percent) ? { H: this.ToHsla().H, S: this.ToHsla().S * 100, L: this.ToHsla().L * 100, A: this.ToHsla().A } : { H: this.ToHsla().H, S: this.ToHsla().S, L: this.ToHsla().L, A: this.ToHsla().A }; case "hwb": return (_percent) ? { H: Math.round(this.ToHwb().H), W: Math.round(this.ToHwb().W * 100), B: Math.round(this.ToHwb().B * 100) } : { H: this.ToHwb().H, W: this.ToHwb().W, B: this.ToHwb().B }; case "cmyk": return (_percent) ? { C: Math.round(this.ToCmyk().C), M: Math.round(this.ToCmyk().M * 100), Y: Math.round(this.ToCmyk().Y * 100), K: Math.round(this.ToCmyk().K * 100) } : { C: this.ToCmyk().C, M: this.ToCmyk().M, Y: this.ToCmyk().Y, K: this.ToCmyk().K }; case "xyz": return { X: Math.round(this.ToXYZ().X), Y: Math.round(this.ToXYZ().Y), Z: Math.round(this.ToXYZ().Z) }; case "lab": return { L: Math.round(this.ToLab().L), A: Math.round(this.ToLab().A), B: Math.round(this.ToLab().B) }; case "apple": return { appleR: Math.round(this.ToApple().appleR), appleG: Math.round(this.ToApple().appleG), appleB: Math.round(this.ToApple().appleB) }; case "ansi16": return { value: this.ToAnsi16() }; case "ansi256": return { value: this.ToAnsi256() }; default: return this.toObject("rgba"); } } /** * Преобразует данные в массив. * @param {String} Model Цветовая модель. */ toArray(Model = "rgba") { let _percent = (Model.indexOf("%") > -1); Model = (_percent) ? Model.replace(" ", "").replace("%", "") : Model.replace(" ", ""); switch (Model.toLowerCase()) { case "32bit": return [ this.To32bit() ]; case "ole": return [ this.ToOle() ]; case "win32": return [ this.ToWin32() ]; case "name": return [ (this.IsNamedColor) ? this.Name : this.ToHex() ]; case "hex": return [ this.ToHex() ]; case "rgb": return (_percent) ? [ Math.round((this.R / 255) * 100), Math.round((this.G / 255) * 100), Math.round((this.B / 255) * 100) ] : [ this.R, this.G, this.B ]; case "rgba": return (_percent) ? [ Math.round((this.R / 255) * 100), Math.round((this.G / 255) * 100), Math.round((this.B / 255) * 100), this.A ] : [ this.R, this.G, this.B, this.A ]; case "hsb": return (_percent) ? [ this.ToHsb().H, this.ToHsb().S * 100, this.ToHsb().B * 100 ] : [ this.ToHsb().H, this.ToHsb().S, this.ToHsb().B ]; case "hsl": return (_percent) ? [ this.ToHsla().H, this.ToHsla().S * 100, this.ToHsla().L * 100 ] : [ this.ToHsla().H, this.ToHsla().S, this.ToHsla().L ]; case "hsla": return (_percent) ? [ this.ToHsla().H, this.ToHsla().S * 100, this.ToHsla().L * 100, this.ToHsla().A ] : [ this.ToHsla().H, this.ToHsla().S, this.ToHsla().L, this.ToHsla().A ]; case "hwb": return (_percent) ? [ Math.round(this.ToHwb().H), Math.round(this.ToHwb().W * 100), Math.round(this.ToHwb().B * 100) ] : [ this.ToHwb().H, this.ToHwb().W, this.ToHwb().B ]; case "cmyk": return (_percent) ? [ Math.round(this.ToCmyk().C), Math.round(this.ToCmyk().M * 100), Math.round(this.ToCmyk().Y * 100), Math.round(this.ToCmyk().K * 100) ] : [ this.ToCmyk().C, this.ToCmyk().M, this.ToCmyk().Y, this.ToCmyk().K ]; case "xyz": return [ Math.round(this.ToXYZ().X), Math.round(this.ToXYZ().Y), Math.round(this.ToXYZ().Z) ]; case "lab": return [ Math.round(this.ToLab().L), Math.round(this.ToLab().A), Math.round(this.ToLab().B) ]; case "apple": return [ Math.round(this.ToApple().appleR), Math.round(this.ToApple().appleG), Math.round(this.ToApple().appleB) ]; case "ansi16": return [ this.ToAnsi16() ]; case "ansi256": return [ this.ToAnsi256() ]; default: return this.toArray("rgba"); } } /** * Преобразует данные в строчное представление. * @param {String} Model Цветовая модель. * @param {Boolean} CSS Значение, указывающее будет ли отображаться CSS код. */ toString(Model = "rgba", CSS = true) { let _percent = (Model.indexOf("%") > -1); Model = (_percent) ? Model.replace(" ", "").replace("%", "") : Model.replace(" ", ""); switch (Model.toLowerCase()) { case "32bit": return this.To32bit().toString(); case "ole": return this.ToOle().toString(); case "win32": return this.ToWin32().toString(); case "name": return (this.IsNamedColor) ? this.Name : this.ToHex(); case "hex": return this.ToHex(); case "rgb": if (_percent) { return (CSS) ? `rgb(${Math.round((this.R / 255) * 100)}%, ${Math.round((this.G / 255) * 100)}%, ${Math.round((this.B / 255) * 100)}%)` : `${Math.round((this.R / 255) * 100)}%, ${Ma