From aa303442f7f217779ee443c9faabb0095f536065 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Sat, 29 Dec 2018 15:51:14 +0000 Subject: [PATCH] feat(color): add convert() fallback, minor other updates --- packages/color/src/api.ts | 5 +++ packages/color/src/convert.ts | 43 +++++++++++++++----------- packages/color/src/cosine-gradients.ts | 7 +++++ packages/color/src/parse-css.ts | 2 +- packages/color/src/rgba-xyza.ts | 6 ++-- packages/color/src/xyza-rgba.ts | 2 +- 6 files changed, 42 insertions(+), 23 deletions(-) diff --git a/packages/color/src/api.ts b/packages/color/src/api.ts index 227b2d663b..6149319205 100644 --- a/packages/color/src/api.ts +++ b/packages/color/src/api.ts @@ -29,6 +29,11 @@ export const enum ColorMode { YCBCRA } +/** + * Reverse lookup for `ColorMode` enums + */ +export const __ColorMode = (exports).ColorMode; + export interface IColor { readonly mode: ColorMode; } diff --git a/packages/color/src/convert.ts b/packages/color/src/convert.ts index 7825cf098e..45d7bd10b5 100644 --- a/packages/color/src/convert.ts +++ b/packages/color/src/convert.ts @@ -1,12 +1,19 @@ -import { defmulti, Implementation3, MultiFn2O } from "@thi.ng/defmulti"; +import { + DEFAULT, + defmulti, + Implementation3, + MultiFn2O +} from "@thi.ng/defmulti"; import { illegalArgs } from "@thi.ng/errors/illegal-arguments"; import { + __ColorMode, Color, ColorConversion, ColorMode, IColor, ReadonlyColor } from "./api"; +import { hcyaRgba } from "./hcya-rgba"; import { hsiaRgba } from "./hsia-rgba"; import { hslaCss } from "./hsla-css"; import { hslaHsva } from "./hsla-hsva"; @@ -16,7 +23,7 @@ import { hsvaHsla } from "./hsva-hsla"; import { hsvaRgba } from "./hsva-rgba"; import { int32Css } from "./int-css"; import { int32Rgba } from "./int-rgba"; -import { parseCss } from "./parse-css"; +import { parseCSS } from "./parse-css"; import { rgbaCss } from "./rgba-css"; import { rgbaHcya } from "./rgba-hcya"; import { rgbaHsia } from "./rgba-hsia"; @@ -27,21 +34,27 @@ import { rgbaXyza } from "./rgba-xyza"; import { rgbaYcbcra } from "./rgba-ycbcra"; import { xyzaRgba } from "./xyza-rgba"; import { ycbcraRgba } from "./ycbcra-rgba"; -import { hcyaRgba } from "./hcya-rgba"; export const convert: MultiFn2O = defmulti( - (col, mdest, msrc) => - (col).mode !== undefined ? - `${mdest}-${(col).mode}` : + (col: any, mdest, msrc) => + col.mode !== undefined ? + `${mdest}-${col.mode}` : msrc !== undefined ? `${mdest}-${msrc}` : illegalArgs(`missing src color mode`) ); +convert.add( + DEFAULT, + (col: any, mdest, msrc) => + (col.mode !== undefined && col.mode === mdest) || (mdest === msrc) ? + col : + illegalArgs(`missing conversion for ${__ColorMode[msrc]} -> ${__ColorMode[mdest]}`) +); -export function asCss(col: IColor): string; -export function asCss(col: string | number | ReadonlyColor, mode: ColorMode): string; -export function asCss(col: any, mode?: ColorMode) { +export function asCSS(col: IColor): string; +export function asCSS(col: string | number | ReadonlyColor, mode: ColorMode): string; +export function asCSS(col: any, mode?: ColorMode) { return convert(col, ColorMode.CSS, mode); } @@ -92,20 +105,14 @@ const defConversion = ( src: ColorMode, impl: Implementation3 ) => - convert.add( - `${dest}-${src}`, - impl - ); + convert.add(`${dest}-${src}`, impl); const defConversions = ( src: ColorMode, toRGBA: ColorConversion, ...dest: ColorMode[] ) => { - defConversion( - ColorMode.RGBA, src, - (x: any) => toRGBA([], x) - ); + defConversion(ColorMode.RGBA, src, (x: any) => toRGBA([], x)); dest.forEach( (id) => defConversion( id, src, @@ -128,7 +135,7 @@ const defConversions = ( ].forEach( (id) => defConversion( id, ColorMode.CSS, - (x: string) => parseCss(x, id) + (x: string) => parseCSS(x, id) ) ); diff --git a/packages/color/src/cosine-gradients.ts b/packages/color/src/cosine-gradients.ts index 8107cbc240..2fb3f35a64 100644 --- a/packages/color/src/cosine-gradients.ts +++ b/packages/color/src/cosine-gradients.ts @@ -69,6 +69,13 @@ export const cosineCoeffs = ]; }; +/** + * Multi-color cosine gradient generator, based on + * thi.ng/transducers/interpolate. + * + * @param n + * @param stops + */ export const multiCosineGradient = (n: number, ...stops: [number, ReadonlyColor][]) => interpolate( diff --git a/packages/color/src/parse-css.ts b/packages/color/src/parse-css.ts index e92481c70a..61d0b772b3 100644 --- a/packages/color/src/parse-css.ts +++ b/packages/color/src/parse-css.ts @@ -9,7 +9,7 @@ import { IDeref } from "@thi.ng/api/api"; const RE_HEX = /^#?([0-9a-f]{3,8})$/i; const RE_CSS = /^(rgb|hsl)a?\(\s*([0-9.]+?),\s*([0-9.]+%?),\s*([0-9.]+%?),?\s*([0-9.]+)?\s*\)$/; -export const parseCss = +export const parseCSS = (col: string | IDeref, mode = ColorMode.RGBA) => { col = typeof col === "string" ? col : col.deref(); let res: Color | number; diff --git a/packages/color/src/rgba-xyza.ts b/packages/color/src/rgba-xyza.ts index 62cc5ce62c..4c3103bd3a 100644 --- a/packages/color/src/rgba-xyza.ts +++ b/packages/color/src/rgba-xyza.ts @@ -1,13 +1,13 @@ import { Color, ReadonlyColor, RGB_XYZ } from "./api"; import { clamp } from "./clamp"; -import { mulV33 } from "./internal/mulv"; +import { mulV33 } from "./internal/matrix-ops"; import { ensureAlpha } from "./internal/ensure-alpha"; /** * https://en.wikipedia.org/wiki/CIE_1931_color_space - * + * * @param out - * @param src + * @param src */ export const rgbaXyza = (out: Color, src: ReadonlyColor) => { diff --git a/packages/color/src/xyza-rgba.ts b/packages/color/src/xyza-rgba.ts index 0be8df5a9f..1c4eb31855 100644 --- a/packages/color/src/xyza-rgba.ts +++ b/packages/color/src/xyza-rgba.ts @@ -1,5 +1,5 @@ import { Color, ReadonlyColor, XYZ_RGB } from "./api"; -import { mulV33 } from "./internal/mulv"; +import { mulV33 } from "./internal/matrix-ops"; /** * https://en.wikipedia.org/wiki/CIE_1931_color_space