import { isPlainObject } from "../../is" // range:[0,255] , alpha:[0,1] export interface IRGBANomral { /** range:[0,255] */ r: number /** range:[0,255] */ g: number /** range:[0,255] */ b: number /** range:[0,1] */ alpha?: number } import { COLOR_NAMES } from "../color-data/color-names" const ALPHA_P = 2 /** * 读取颜色 */ export function readColor(data: any, options?: { alphaFirst?: boolean; isRange01?: boolean }): IRGBANomral | void { let rgba = {} if (typeof data == "string") { if (data[0] == "#") { // #rgb if (data.length === 4) { let _hex3 = Number.parseInt(data.slice(1), 16) rgba.r = ((_hex3 >> 8) & 0xf) | ((_hex3 >> 4) & 0x0f0) rgba.g = ((_hex3 >> 4) & 0xf) | (_hex3 & 0xf0) rgba.b = ((_hex3 & 0xf) << 4) | (_hex3 & 0xf) return rgba } // #argb , #rgba if (data.length === 5) { // #argb if (options?.alphaFirst) { var _alpha = Number.parseInt(data.slice(1, 2), 16) _alpha = (((_alpha & 0xf) << 4) | (_alpha & 0xf)) / 255 rgba.alpha = +_alpha.toFixed(ALPHA_P) var _hex3 = Number.parseInt(data.slice(2), 16) rgba.r = ((_hex3 >> 8) & 0xf) | ((_hex3 >> 4) & 0x0f0) rgba.g = ((_hex3 >> 4) & 0xf) | (_hex3 & 0xf0) rgba.b = ((_hex3 & 0xf) << 4) | (_hex3 & 0xf) return rgba } // #rgba else { var _alpha = Number.parseInt(data.slice(4, 5), 16) _alpha = (((_alpha & 0xf) << 4) | (_alpha & 0xf)) / 255 rgba.alpha = +_alpha.toFixed(ALPHA_P) var _hex3 = Number.parseInt(data.slice(1, 4), 16) rgba.r = ((_hex3 >> 8) & 0xf) | ((_hex3 >> 4) & 0x0f0) rgba.g = ((_hex3 >> 4) & 0xf) | (_hex3 & 0xf0) rgba.b = ((_hex3 & 0xf) << 4) | (_hex3 & 0xf) return rgba } } let rrggbb!: number // #rrggbb if (data.length === 7) { rrggbb = Number.parseInt(data.slice(1), 16) } if (data.length === 9) { // #aarrggbb if (options?.alphaFirst) { rrggbb = Number.parseInt(data.slice(3), 16) let _alpha = Number.parseInt(data.slice(1, 3), 16) rgba.alpha = +(_alpha / 255).toFixed(ALPHA_P) } // #rrggbbaa else { rrggbb = Number.parseInt(data.slice(1, 7), 16) let _alpha = Number.parseInt(data.slice(7, 9), 16) rgba.alpha = +(_alpha / 255).toFixed(ALPHA_P) } } rgba.r = rrggbb >> 16 rgba.g = (rrggbb >> 8) & 0xff rgba.b = rrggbb & 0xff return rgba } else { // rgba(r, g, b, alpha) if (data.slice(0, 4).toLowerCase() == "rgba") { let tokens = data .trim() .split(/\s*[,\/()]\s*|\s+/) .filter((x) => x != "") rgba.r = Number.parseInt(tokens[1]) rgba.g = Number.parseInt(tokens[2]) rgba.b = Number.parseInt(tokens[3]) rgba.alpha = Number.parseFloat(tokens[4]) return rgba } // rgb(r, g, b) if (data.slice(0, 3).toLowerCase() == "rgb") { let tokens = data .trim() .split(/\s*[,\/()]\s*|\s+/) .filter((x) => x != "") // console.log("tokens", tokens) rgba.r = Number.parseInt(tokens[1]) rgba.g = Number.parseInt(tokens[2]) rgba.b = Number.parseInt(tokens[3]) if (tokens.length == 5) { rgba.alpha = Number.parseFloat(tokens[4]) / 100 } return rgba } // transparent if (data.toLowerCase() == "transparent") { return { r: 0, g: 0, b: 0, alpha: 0 } } if ((COLOR_NAMES)[data]) { return readColor((COLOR_NAMES)[data]) } } } else if (Array.isArray(data) && data.length == 3) { rgba.r = data[0] rgba.g = data[1] rgba.b = data[2] return rgba } else if (data) { let r = data.r let g = data.g let b = data.b let a = data.a ?? data.alpha if (r !== undefined && g !== undefined && b !== undefined) { if (options?.isRange01) { rgba.r = r * 255 rgba.g = g * 255 rgba.b = b * 255 } else { rgba.r = r rgba.g = g rgba.b = b } } if (a !== undefined) { rgba.alpha = a } return rgba } }