Skip to content

Commit

Permalink
feat(color): add convert() fallback, minor other updates
Browse files Browse the repository at this point in the history
  • Loading branch information
postspectacular committed Dec 29, 2018
1 parent 445b8c1 commit aa30344
Show file tree
Hide file tree
Showing 6 changed files with 42 additions and 23 deletions.
5 changes: 5 additions & 0 deletions packages/color/src/api.ts
Expand Up @@ -29,6 +29,11 @@ export const enum ColorMode {
YCBCRA
}

/**
* Reverse lookup for `ColorMode` enums
*/
export const __ColorMode = (<any>exports).ColorMode;

export interface IColor {
readonly mode: ColorMode;
}
Expand Down
43 changes: 25 additions & 18 deletions 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";
Expand All @@ -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";
Expand All @@ -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<string | number | ReadonlyColor | IColor, ColorMode, ColorMode, Color | string | number> =
defmulti(
(col, mdest, msrc) =>
(<any>col).mode !== undefined ?
`${mdest}-${(<any>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 <string>convert(col, ColorMode.CSS, mode);
}

Expand Down Expand Up @@ -92,20 +105,14 @@ const defConversion = (
src: ColorMode,
impl: Implementation3<string | number | ReadonlyColor, ColorMode, ColorMode, Color | string | number>
) =>
convert.add(
`${dest}-${src}`,
impl
);
convert.add(`${dest}-${src}`, impl);

const defConversions = (
src: ColorMode,
toRGBA: ColorConversion<any>,
...dest: ColorMode[]
) => {
defConversion(
ColorMode.RGBA, src,
(x: any) => toRGBA([], x)
);
defConversion(ColorMode.RGBA, src, (x: any) => toRGBA([], x));
dest.forEach(
(id) => defConversion(
id, src,
Expand All @@ -128,7 +135,7 @@ const defConversions = (
].forEach(
(id) => defConversion(
id, ColorMode.CSS,
(x: string) => <Color>parseCss(x, id)
(x: string) => <Color>parseCSS(x, id)
)
);

Expand Down
7 changes: 7 additions & 0 deletions packages/color/src/cosine-gradients.ts
Expand Up @@ -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(
Expand Down
2 changes: 1 addition & 1 deletion packages/color/src/parse-css.ts
Expand Up @@ -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<string>, mode = ColorMode.RGBA) => {
col = typeof col === "string" ? col : col.deref();
let res: Color | number;
Expand Down
6 changes: 3 additions & 3 deletions 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) => {
Expand Down
2 changes: 1 addition & 1 deletion 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
Expand Down

0 comments on commit aa30344

Please sign in to comment.