Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Type declarations #63

Merged
merged 17 commits into from
Jan 31, 2025
40 changes: 13 additions & 27 deletions cmy.js
Original file line number Diff line number Diff line change
@@ -3,35 +3,26 @@
*/
import rgb from './rgb.js';

/** @type {Partial<import('./index.js').ColorSpace>} */
var cmy = {
const cmy = {
name: 'cmy',
min: [0,0,0],
max: [100,100,100],
channel: ['cyan', 'magenta', 'yellow'],
alias: ['CMY']
};


/**
* CMY to RGB
*
* @param {Array<number>} cmy Channels
* @param {Array<number>} CMY channels
*
* @return {Array<number>} RGB channels
*/
cmy.rgb = function(cmy) {
var c = cmy[0] / 100,
m = cmy[1] / 100,
y = cmy[2] / 100;

return [
(1 - c) * 255,
(1 - m) * 255,
(1 - y) * 255
];
};

cmy.rgb = ([c, m, y]) => [
(1 - c/100) * 255,
(1 - m/100) * 255,
(1 - y/100) * 255
];

/**
* RGB to CMY
@@ -40,16 +31,11 @@ cmy.rgb = function(cmy) {
*
* @return {Array<number>} CMY channels
*/
rgb.cmy = function(rgb) {
var r = rgb[0] / 255,
g = rgb[1] / 255,
b = rgb[2] / 255;
rgb.cmy = ([r, g, b]) => [
(1-r/255) * 100 || 0,
(1-g/255) * 100 || 0,
(1-b/255) * 100 || 0
];

return [
(1-r) * 100 || 0,
(1-g) * 100 || 0,
(1-b) * 100 || 0
];
}

export default /** @type {import('./index.js').ColorSpace} */ (cmy);
export default cmy;
19 changes: 9 additions & 10 deletions cmyk.js
Original file line number Diff line number Diff line change
@@ -3,32 +3,30 @@
*/
import rgb from './rgb.js';

/** @type {Partial<import('./index.js').ColorSpace>} */
const cmyk = {
name: 'cmyk',
min: [0,0,0,0],
max: [100,100,100,100],
channel: ['cyan', 'magenta', 'yellow', 'black'],
alias: ['CMYK'],

rgb: function(cmyk) {
var c = cmyk[0] / 100,
rgb: (cmyk) => {
let c = cmyk[0] / 100,
m = cmyk[1] / 100,
y = cmyk[2] / 100,
k = cmyk[3] / 100,
r, g, b;

r = 1 - Math.min(1, c * (1 - k) + k);
g = 1 - Math.min(1, m * (1 - k) + k);
r = 1 - Math.min(1, c * (1 - k) + k),
g = 1 - Math.min(1, m * (1 - k) + k),
b = 1 - Math.min(1, y * (1 - k) + k);

return [r * 255, g * 255, b * 255];
}
};


//extend rgb
rgb.cmyk = function(rgb) {
var r = rgb[0] / 255,
rgb.cmyk = (rgb) => {
let r = rgb[0] / 255,
g = rgb[1] / 255,
b = rgb[2] / 255,
c, m, y, k;
@@ -37,7 +35,8 @@ rgb.cmyk = function(rgb) {
c = (1 - r - k) / (1 - k) || 0;
m = (1 - g - k) / (1 - k) || 0;
y = (1 - b - k) / (1 - k) || 0;

return [c * 100, m * 100, y * 100, k * 100];
};

export default /** @type {import('./index.js').ColorSpace} */ (cmyk);
export default cmyk;
52 changes: 19 additions & 33 deletions coloroid.js
Original file line number Diff line number Diff line change
@@ -9,31 +9,23 @@
import xyy from './xyy.js';
import xyz from './xyz.js';

/** @typedef {{table: Array<Array<number>>}} ColoroidSpecific */

/**
* Main color space object
* @type {Partial<import('./index.js').ColorSpace> & {xyy: import('./index.js').Transform} & ColoroidSpecific}
*/
var coloroid = {
name: 'coloroid',
alias: ['ATV'],

//hue, saturation, luminosity
//note that hue values are ids, not the numbers - not every value is possible
//e.g. 38 will be rounded to 36
// hue, saturation, luminosity
// note that hue values are ids, not the numbers - not every value is possible
// e.g. 38 will be rounded to 36
channel: ['A', 'T', 'V'],
min: [10, 0, 0],
max: [76, 100, 100],
/**
* Coloroid table
* Regression of values is almost impossible, as hues don’t correlate
* Even angle values are picked very inconsistently, based on aesthetical evaluation.
*
* - tgф, ctgф are removed, ф is searched instead
* - eλ = xλ + yλ + zλ
* - λ is removed as not used
*/

// Coloroid table
// Regression of values is almost impossible, as hues don’t correlate
// Even angle values are picked very inconsistently, based on aesthetical evaluation.
// - tgф, ctgф are removed, ф is searched instead
// - eλ = xλ + yλ + zλ
// - λ is removed as not used
table: [
//A angle eλ xλ yλ
[10, 59.0, 1.724349, 0.44987, 0.53641],
@@ -85,16 +77,15 @@ var coloroid = {
[75, 66.9, 1.681080, 0.42141, 0.56222],
[76, 62.8, 1.704979, 0.43647, 0.54895]
],

/**
* Backwise - from coloroid to xyY
*
* @param {Array<number>} arg Coloroid values
*
* @return {Array<number>} xyY values
*/
xyy: function (arg) {
var A = arg[0], T = arg[1], V = arg[2];

xyy: function ([A, T, V]) {
//find the closest row in the table
var row;
for (var i = 0; i < table.length; i++) {
@@ -105,7 +96,6 @@ var coloroid = {
}

//FIXME row is possibly undefined
//@ts-ignore
var yl = row[4], el = row[2], xl = row[3];

var Y = V * V / 100;
@@ -190,17 +180,13 @@ A λ ф tg ф ctg ф xλ yλ zλ xλ yλ
*/




/** Create angle-sorted table */
// Create angle-sorted table
var table = coloroid.table;
var angleTable = table.slice(-13).concat(table.slice(0, -13));


/**
* Some precalculations
* 2° D65 whitepoint is used
*/
// Some precalculations
// 2° D65 whitepoint is used
var i = 'D65';
var o = 2;

@@ -212,8 +198,6 @@ var y0 = Xn / (Xn + Yn + Zn);
var x0 = Yn / (Xn + Yn + Zn);
var ew = (Xn + Yn + Zn) / 100;



/**
* From xyY to coloroid
*
@@ -257,7 +241,9 @@ xyy.coloroid = function (arg) {
return [A, T, V];
};

/** Proper transformation to a XYZ (via xyY) */
/**
* Proper transformation to a XYZ (via xyY)
**/
xyz.coloroid = function (arg) {
return xyy.coloroid(xyz.xyy(arg));
};
@@ -267,4 +253,4 @@ coloroid.xyz = function (arg) {



export default /** @type {import('./index.js').ColorSpace & ColoroidSpecific} */ (coloroid);
export default coloroid;
25 changes: 8 additions & 17 deletions cubehelix.js
Original file line number Diff line number Diff line change
@@ -3,44 +3,36 @@
*
* @module color-space/cubehelix
*/

/** @typedef {{defaults: {start: number, rotation: number, hue: number, gamma: number}}} CubeHelixSpecific */

import rgb from './rgb.js';

/** Default options for space */
var defaults = {
//0..3
// 0..3
start: 0,
//-10..10
// -10..10
rotation: 0.5,
//0..1+
// 0..1+
hue: 1,
//0..2
// 0..2
gamma: 1
};

/** @type {Partial<import('./index.js').ColorSpace> & CubeHelixSpecific} */
var cubehelix = {
name: 'cubehelix',
channel: ['fraction'],
min: [0],
max: [1],
defaults: defaults
defaults
};


/**
* Transform cubehelix level to RGB
*
* @param {Number|Array<number>} fraction 0..1 cubehelix level
* @param {number|Array<number>} fraction 0..1 cubehelix level
* @param {Object<string, number>} options Mapping options, overrides defaults
*
* @return {Array<number>} rgb tuple
*/
cubehelix.rgb = function(fraction, options) {
options = options || {};

cubehelix.rgb = function(fraction, options={}) {
if (Array.isArray(fraction)) fraction = fraction[0];

var start = options.start !== undefined ? options.start : defaults.start;
@@ -70,7 +62,6 @@ cubehelix.rgb = function(fraction, options) {
* RGB to cubehelix
*
* @param {Array<number>} rgb RGB values
*
* @return {Array<number>} cubehelix fraction(s)
*/
rgb.cubehelix = function(rgb) {
@@ -79,4 +70,4 @@ rgb.cubehelix = function(rgb) {
};


export default /** @type {import('./index.js').ColorSpace & CubeHelixSpecific} */ (cubehelix);
export default cubehelix;
2,766 changes: 0 additions & 2,766 deletions dist/color-space.d.ts

This file was deleted.

1 change: 0 additions & 1 deletion dist/color-space.d.ts.map

This file was deleted.

3 changes: 1 addition & 2 deletions hcg.js
Original file line number Diff line number Diff line change
@@ -6,7 +6,6 @@ import hsl from './hsl.js';
import hsv from './hsv.js';
import hwb from './hwb.js';

/** @type {Partial<import('./index.js').ColorSpace>} */
var hcg = {
name: 'hcg',
min: [0,0,0],
@@ -85,7 +84,7 @@ var hcg = {
}
};

export default /** @type {import('./index.js').ColorSpace} */ (hcg);
export default (hcg);


//append rgb
3 changes: 1 addition & 2 deletions hcy.js
Original file line number Diff line number Diff line change
@@ -6,7 +6,6 @@
*/
import rgb from './rgb.js';

/** @type {Partial<import('./index.js').ColorSpace>} */
var hcy = {
name: 'hcy',
min: [0,0,0],
@@ -15,7 +14,7 @@ var hcy = {
alias: ['HCY']
};

export default /** @type {import('./index.js').ColorSpace} */ (hcy);
export default (hcy);


/**
5 changes: 2 additions & 3 deletions hpluv.js
Original file line number Diff line number Diff line change
@@ -6,9 +6,8 @@
*/
import xyz from './xyz.js';
import lchuv from './lchuv.js';
import hsluv, {_hsluv} from './hsluv.js';
import {_hsluv} from './hsluv.js';

/** @type {Partial<import('./index.js').ColorSpace>} */
var hpluv = {
name: 'hpluv',
min: [0,0,0],
@@ -25,7 +24,7 @@ var hpluv = {
}
};

export default /** @type {import('./index.js').ColorSpace} */ (hpluv);
export default hpluv;

//extend lchuv, xyz
lchuv.hpluv = _hsluv.lchToHpluv;
3 changes: 1 addition & 2 deletions hsi.js
Original file line number Diff line number Diff line change
@@ -6,7 +6,6 @@
*/
import rgb from './rgb.js';

/** @type {Partial<import('./index.js').ColorSpace>} */
var hsi = {
name: 'hsi',
min: [0,0,0],
@@ -15,7 +14,7 @@ var hsi = {
alias: ['HSI']
};

export default /** @type {import('./index.js').ColorSpace} */ (hsi)
export default hsi


/**
3 changes: 1 addition & 2 deletions hsl.js
Original file line number Diff line number Diff line change
@@ -3,7 +3,6 @@
*/
import rgb from './rgb.js';

/** @type {Partial<import('./index.js').ColorSpace>} */
var hsl = {
name: 'hsl',
min: [0,0,0],
@@ -34,7 +33,7 @@ var hsl = {
}
};

export default /** @type {import('./index.js').ColorSpace} */ (hsl);
export default (hsl);


//extend rgb
15 changes: 3 additions & 12 deletions hsluv.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/**
* A uniform wrapper for hsluv.
* // http://www.hsluv.org/
* http://www.hsluv.org/
*
* @module color-space/hsluv
*/
@@ -11,19 +11,13 @@ import rgb from './rgb.js';

// unwrapped https://github.com/hsluv/hsluv/blob/master/javascript/dist/hsluv-0.1.0.min.js
// FIXME: it has redundant functions like rgbToXyz - can be reused from color-space itself
//@ts-ignore
// FIXME: update to the latest
function f(a){var c=[],b=Math.pow(a+16,3)/1560896;b=b>g?b:a/k;for(var d=0;3>d;){var e=d++,h=l[e][0],w=l[e][1];e=l[e][2];for(var x=0;2>x;){var y=x++,z=(632260*e-126452*w)*b+126452*y;c.push({b:(284517*h-94839*e)*b/z,a:((838422*e+769860*w+731718*h)*a*b-769860*y*a)/z})}}return c}function m(a){a=f(a);for(var c=Infinity,b=0;b<a.length;){var d=a[b];++b;c=Math.min(c,Math.abs(d.a)/Math.sqrt(Math.pow(d.b,2)+1))}return c}
//@ts-ignore
function n(a,c){c=c/360*Math.PI*2;a=f(a);for(var b=Infinity,d=0;d<a.length;){var e=a[d];++d;e=e.a/(Math.sin(c)-e.b*Math.cos(c));0<=e&&(b=Math.min(b,e))}return b}function p(a,c){for(var b=0,d=0,e=a.length;d<e;){var h=d++;b+=a[h]*c[h]}return b}function q(a){return.0031308>=a?12.92*a:1.055*Math.pow(a,.4166666666666667)-.055}function r(a){return.04045<a?Math.pow((a+.055)/1.055,2.4):a/12.92}function t(a){return[q(p(l[0],a)),q(p(l[1],a)),q(p(l[2],a))]}
//@ts-ignore
function u(a){a=[r(a[0]),r(a[1]),r(a[2])];return[p(v[0],a),p(v[1],a),p(v[2],a)]}function A(a){var c=a[0],b=a[1];a=c+15*b+3*a[2];0!=a?(c=4*c/a,a=9*b/a):a=c=NaN;b=b<=g?b/B*k:116*Math.pow(b/B,.3333333333333333)-16;return 0==b?[0,0,0]:[b,13*b*(c-C),13*b*(a-D)]}function E(a){var c=a[0];if(0==c)return[0,0,0];var b=a[1]/(13*c)+C;a=a[2]/(13*c)+D;c=8>=c?B*c/k:B*Math.pow((c+16)/116,3);b=0-9*c*b/((b-4)*a-b*a);return[b,c,(9*c-15*a*c-a*b)/(3*a)]}
//@ts-ignore
function F(a){var c=a[0],b=a[1],d=a[2];a=Math.sqrt(b*b+d*d);1E-8>a?b=0:(b=180*Math.atan2(d,b)/Math.PI,0>b&&(b=360+b));return[c,a,b]}function G(a){var c=a[1],b=a[2]/360*2*Math.PI;return[a[0],Math.cos(b)*c,Math.sin(b)*c]}function H(a){var c=a[0],b=a[1];a=a[2];if(99.9999999<a)return[100,0,c];if(1E-8>a)return[0,0,c];b=n(a,c)/100*b;return[a,b,c]}function I(a){var c=a[0],b=a[1];a=a[2];if(99.9999999<c)return[a,0,100];if(1E-8>c)return[a,0,0];var d=n(c,a);return[a,b/d*100,c]}
//@ts-ignore
function J(a){var c=a[0],b=a[1];a=a[2];if(99.9999999<a)return[100,0,c];if(1E-8>a)return[0,0,c];b=m(a)/100*b;return[a,b,c]}function K(a){var c=a[0],b=a[1];a=a[2];if(99.9999999<c)return[a,0,100];if(1E-8>c)return[a,0,0];var d=m(c);return[a,b/d*100,c]}function L(a){for(var c="#",b=0;3>b;){var d=b++;d=Math.round(255*a[d]);var e=d%16;c+=M.charAt((d-e)/16|0)+M.charAt(e)}return c}
//@ts-ignore
function N(a){a=a.toLowerCase();for(var c=[],b=0;3>b;){var d=b++;c.push((16*M.indexOf(a.charAt(2*d+1))+M.indexOf(a.charAt(2*d+2)))/255)}return c}function O(a){return t(E(G(a)))}function P(a){return F(A(u(a)))}function Q(a){return O(H(a))}function R(a){return I(P(a))}function S(a){return O(J(a))}function T(a){return K(P(a))}
//@ts-ignore
var l=[[3.240969941904521,-1.537383177570093,-.498610760293],[-.96924363628087,1.87596750150772,.041555057407175],[.055630079696993,-.20397695888897,1.056971514242878]],v=[[.41239079926595,.35758433938387,.18048078840183],[.21263900587151,.71516867876775,.072192315360733],[.019330818715591,.11919477979462,.95053215224966]],B=1,C=.19783000664283,D=.46831999493879,k=903.2962962,g=.0088564516,M="0123456789abcdef";

export const _hsluv = {
@@ -45,9 +39,6 @@ export const _hsluv = {
xyzToRgb: t,
};

/** @typedef {{_hsluv: Object<string, import('./index.js').Transform>}} HSLuvSpecific */

/** @type {Partial<import('./index.js').ColorSpace> & HSLuvSpecific} */
var hsluv = {
name: 'hsluv',
min: [0,0,0],
@@ -70,7 +61,7 @@ var hsluv = {
_hsluv
};

export default /** @type {import('./index.js').ColorSpace & HSLuvSpecific} */ (hsluv);
export default hsluv;

//extend lchuv, xyz
lchuv.hsluv = _hsluv.lchToHsluv;
13 changes: 5 additions & 8 deletions hsp.js
Original file line number Diff line number Diff line change
@@ -7,7 +7,6 @@ const Pr = 0.299,
Pg = 0.587,
Pb = 0.114;

/** @type {Partial<import('./index.js').ColorSpace>} */
var hsp = {
name: 'hsp',
min: [0, 0, 0],
@@ -96,18 +95,16 @@ var hsp = {

return [Math.round(r), Math.round(g), Math.round(b)];
}


};

export default /** @type {import('./index.js').ColorSpace} */ (hsp);
export default hsp;


//append rgb
rgb.hsp = function (rgb) {
var r = parseInt(/** @type {?} */ (rgb[0]), 10),
g = parseInt(/** @type {?} */ (rgb[1]), 10),
b = parseInt(/** @type {?} */ (rgb[2]), 10),
var r = parseInt((rgb[0]), 10),
g = parseInt((rgb[1]), 10),
b = parseInt((rgb[2]), 10),
h, s, p;

// Calculate the Perceived brightness
@@ -117,7 +114,7 @@ rgb.hsp = function (rgb) {
if (r === g && r === b) {
h = 0.0;
s = 0.0;
} else {
} else {
// R is largest
if (r >= g && r >= b) {
if (b >= g) {
6 changes: 3 additions & 3 deletions hsv.js
Original file line number Diff line number Diff line change
@@ -4,7 +4,7 @@
import rgb from './rgb.js';
import hsl from './hsl.js';

/** @type {Partial<import('./index.js').ColorSpace>} */

var hsv = {
name: 'hsv',
min: [0,0,0],
@@ -16,7 +16,7 @@ var hsv = {
var h = hsv[0] / 60,
s = hsv[1] / 100,
v = hsv[2] / 100,
hi = /** @type {0 | 1 | 2 | 3 | 4 | 5} */ (Math.floor(h) % 6);
hi = (Math.floor(h) % 6);

var f = h - Math.floor(h),
p = 255 * v * (1 - s),
@@ -56,7 +56,7 @@ var hsv = {
}
};

export default /** @type {import('./index.js').ColorSpace} */ (hsv);
export default (hsv);


//append rgb
44 changes: 21 additions & 23 deletions hwb.js
Original file line number Diff line number Diff line change
@@ -5,16 +5,15 @@ import rgb from './rgb.js';
import hsv from './hsv.js';
import hsl from './hsl.js';

/** @type {Partial<import('./index.js').ColorSpace> & {hsv: import('./index.js').Transform}} */
var hwb = {
name: 'hwb',
min: [0,0,0],
max: [360,100,100],
min: [0, 0, 0],
max: [360, 100, 100],
channel: ['hue', 'whiteness', 'blackness'],
alias: ['HWB'],

// http://dev.w3.org/csswg/css-color/#hwb-to-rgb
rgb: function(hwb) {
rgb: function (hwb) {
var h = hwb[0] / 360,
wh = hwb[1] / 100,
bl = hwb[2] / 100,
@@ -56,56 +55,55 @@ var hwb = {


// http://alvyray.com/Papers/CG/HWB_JGTv208.pdf
hsv: function(arg){
hsv: function (arg) {
var h = arg[0], w = arg[1], b = arg[2], s, v;

//if w+b > 100% - take proportion (how many times )
if (w + b >= 100){
if (w + b >= 100) {
s = 0;
v = 100 * w/(w+b);
v = 100 * w / (w + b);
}

//by default - take wiki formula
else {
s = 100-(w/(1-b/100));
v = 100-b;
s = 100 - (w / (1 - b / 100));
v = 100 - b;
}


return [h, s, v];
},

hsl: function(arg){
hsl: function (arg) {
return hsv.hsl(hwb.hsv(arg));
}
};

export default /** @type {import('./index.js').ColorSpace} */ (hwb);
export default (hwb);


//extend rgb
rgb.hwb = function(val) {
// extend rgb
rgb.hwb = function (val) {
var r = val[0],
g = val[1],
b = val[2],
h = rgb.hsl(val)[0],
w = 1/255 * Math.min(r, Math.min(g, b));
g = val[1],
b = val[2],
h = rgb.hsl(val)[0],
w = 1 / 255 * Math.min(r, Math.min(g, b));

b = 1 - 1/255 * Math.max(r, Math.max(g, b));
b = 1 - 1 / 255 * Math.max(r, Math.max(g, b));

return [h, w * 100, b * 100];
};



//keep proper hue on 0 values (conversion to rgb loses hue on zero-lightness)
hsv.hwb = function(arg){
// keep proper hue on 0 values (conversion to rgb loses hue on zero-lightness)
hsv.hwb = function (arg) {
var h = arg[0], s = arg[1], v = arg[2];
return [h, v === 0 ? 0 : (v * (1-s/100)), 100 - v];
return [h, v === 0 ? 0 : (v * (1 - s / 100)), 100 - v];
};


//extend hsl with proper conversions
hsl.hwb = function(arg){
hsl.hwb = function (arg) {
return hsv.hwb(hsl.hsv(arg));
};
31 changes: 11 additions & 20 deletions index.js
Original file line number Diff line number Diff line change
@@ -41,35 +41,24 @@ import yes from './yes.js'
import osaucs from './osaucs.js'
import hsp from './hsp.js'

/** @typedef {'rgb' | 'xyz' | 'hsl' | 'hsv' | 'hsi' | 'hwb' | 'cmyk' | 'cmy' | 'xyy' | 'yiq' | 'yuv' | 'ydbdr' | 'ycgco' | 'ypbpr' | 'ycbcr' | 'xvycc' | 'yccbccrc' | 'ucs' | 'uvw' | 'jpeg' | 'lab' | 'labh' | 'lms' | 'lchab' | 'luv' | 'lchuv' | 'hsluv' | 'hpluv' | 'cubehelix' | 'coloroid' | 'hcg' | 'hcy' | 'tsl' | 'yes' | 'osaucs' | 'hsp'} SpaceId */

/** @typedef {(color: Array<number>, ...rest: Array<*>) => Array<number>} Transform */

/** @typedef {{[key in SpaceId]: Transform}} ColorSpaceTransforms */

/**
* @typedef {Object} ColorSpaceBase
* @property {SpaceId} name
* @property {Array<number>} min
* @property {Array<number>} max
* @property {Array<string>} channel
* @property {Array<string>} [alias]
* Dict with all color spaces
*
* @type {{[key in SpaceId]: ColorSpace}}
*/

/** @typedef {ColorSpaceBase & ColorSpaceTransforms} ColorSpace */


const spaces = /** @type {{[key in SpaceId]: ColorSpace}} */ ({});
const spaces = {};
export default spaces;


/**
* @param {ColorSpace} newSpace
* Register new color space and conversions with all existing spaces
*
* @param {ColorSpace} newSpace
*/
export function register (newSpace) {
const newSpaceName = newSpace.name;
/** @type {SpaceId} */
var existingSpaceName;
for (existingSpaceName in spaces) {
for (const existingSpaceName in spaces) {
if (!newSpace[existingSpaceName]) newSpace[existingSpaceName] = createConverter(newSpace, existingSpaceName);

const existingSpace = spaces[existingSpaceName]
@@ -79,6 +68,8 @@ export function register (newSpace) {
}

/**
* Creates a color space converter function.
*
* @param {ColorSpace} fromSpace
* @param {SpaceId} toSpaceName
* @returns {Transform}
4 changes: 2 additions & 2 deletions jpeg.js
Original file line number Diff line number Diff line change
@@ -7,7 +7,7 @@
*/
import rgb from './rgb.js';

/** @type {Partial<import('./index.js').ColorSpace>} */

var jpeg = {
name: 'jpeg',
min: [0, 0, 0],
@@ -16,7 +16,7 @@ var jpeg = {
alias: ['JPEG']
};

export default /** @type {import('./index.js').ColorSpace} */ (jpeg);
export default (jpeg);


/**
31 changes: 15 additions & 16 deletions lab.js
Original file line number Diff line number Diff line change
@@ -6,26 +6,25 @@

import xyz from './xyz.js';

/** @type {Partial<import('./index.js').ColorSpace>} */
var lab = {
name: 'lab',
min: [0,-100,-100],
max: [100,100,100],
min: [0, -100, -100],
max: [100, 100, 100],
channel: ['lightness', 'a', 'b'],
alias: ['LAB', 'cielab'],

xyz: function(lab) {
xyz: function (lab) {
var l = lab[0],
a = lab[1],
b = lab[2],
x, y, z, y2;
a = lab[1],
b = lab[2],
x, y, z, y2;

if (l <= 8) {
y = (l * 100) / 903.3;
y2 = (7.787 * (y / 100)) + (16 / 116);
} else {
y = 100 * Math.pow((l + 16) / 116, 3);
y2 = Math.pow(y / 100, 1/3);
y2 = Math.pow(y / 100, 1 / 3);
}

//FIXME x is undefined!
@@ -40,23 +39,23 @@ var lab = {
}
};

export default /** @type {import('./index.js').ColorSpace} */ (lab);
export default (lab);


//extend xyz
xyz.lab = function(xyz){
xyz.lab = function (xyz) {
var x = xyz[0],
y = xyz[1],
z = xyz[2],
l, a, b;
y = xyz[1],
z = xyz[2],
l, a, b;

x /= 95.047;
y /= 100;
z /= 108.883;

x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116);
y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116);
z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116);
x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);
y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);
z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);

l = (116 * y) - 16;
a = 500 * (x - y);
21 changes: 10 additions & 11 deletions labh.js
Original file line number Diff line number Diff line change
@@ -6,42 +6,41 @@

import xyz from './xyz.js';

/** @type {Partial<import('./index.js').ColorSpace>} */
var labh = {
name: 'labh',

//mins/maxes are taken from colormine
//FIXME: check whether mins/maxes correct
min: [0,-128,-128],
max: [100,128,128],
min: [0, -128, -128],
max: [100, 128, 128],
channel: ['lightness', 'a', 'b'],
alias: ['LABh', 'hunter-lab', 'hlab'],

//maths are taken from EasyRGB
xyz: function(lab) {
xyz: function (lab) {
var l = lab[0], a = lab[1], b = lab[2];

var _y = l / 10;
var _x = a / 17.5 * l / 10;
var _z = b / 7 * l / 10;

var y = _y * _y;
var x = ( _x + y ) / 1.02;
var z = -( _z - y ) / 0.847;
var x = (_x + y) / 1.02;
var z = -(_z - y) / 0.847;

return [x,y,z];
return [x, y, z];
}
};

export default /** @type {import('./index.js').ColorSpace} */ (labh);
export default (labh);

//extend xyz
xyz.labh = function(xyz){
xyz.labh = function (xyz) {
var x = xyz[0], y = xyz[1], z = xyz[2];
var _y12 = Math.sqrt(y);
var l = 10 * _y12;
var a = y === 0 ? 0 : 17.5 * ((( 1.02 * x ) - y ) / _y12 );
var b = y === 0 ? 0 : 7 * ( ( y - ( 0.847 * z ) ) / _y12 );
var a = y === 0 ? 0 : 17.5 * (((1.02 * x) - y) / _y12);
var b = y === 0 ? 0 : 7 * ((y - (0.847 * z)) / _y12);

return [l, a, b];
};
3 changes: 1 addition & 2 deletions lchab.js
Original file line number Diff line number Diff line change
@@ -8,7 +8,6 @@ import lab from './lab.js';


//cylindrical lab
/** @type {Partial<import('./index.js').ColorSpace> & {lab: import('./index.js').Transform}} */
var lchab = {
name: 'lchab',
min: [0,0,0],
@@ -55,4 +54,4 @@ xyz.lchab = function(arg){
};


export default /** @type {import('./index.js').ColorSpace} */ (lchab);
export default (lchab);
31 changes: 15 additions & 16 deletions lchuv.js
Original file line number Diff line number Diff line change
@@ -6,47 +6,46 @@
import luv from './luv.js';
import xyz from './xyz.js';

//cylindrical luv
/** @type {Partial<import('./index.js').ColorSpace> & {luv: import('./index.js').Transform}} */
// cylindrical luv
var lchuv = {
name: 'lchuv',
channel: ['lightness', 'chroma', 'hue'],
alias: ['LCHuv', 'cielchuv'],
min: [0,0,0],
max: [100,100,360],
min: [0, 0, 0],
max: [100, 100, 360],

luv: function(luv){
luv: function (luv) {
var l = luv[0],
c = luv[1],
h = luv[2],
u, v, hr;
c = luv[1],
h = luv[2],
u, v, hr;

hr = h / 360 * 2 * Math.PI;
u = c * Math.cos(hr);
v = c * Math.sin(hr);
return [l, u, v];
},

xyz: function(arg) {
xyz: function (arg) {
return luv.xyz(lchuv.luv(arg));
}
};

export default /** @type {import('./index.js').ColorSpace} */ (lchuv);
export default (lchuv);

luv.lchuv = function(luv){
luv.lchuv = function (luv) {
var l = luv[0], u = luv[1], v = luv[2];

var c = Math.sqrt(u*u + v*v);
var hr = Math.atan2(v,u);
var c = Math.sqrt(u * u + v * v);
var hr = Math.atan2(v, u);
var h = hr * 360 / 2 / Math.PI;
if (h < 0) {
h += 360;
}

return [l,c,h]
return [l, c, h]
};

xyz.lchuv = function(arg){
return luv.lchuv(xyz.luv(arg));
xyz.lchuv = function (arg) {
return luv.lchuv(xyz.luv(arg));
};
5 changes: 1 addition & 4 deletions lms.js
Original file line number Diff line number Diff line change
@@ -12,9 +12,6 @@
*/
import xyz from './xyz.js';

/** @typedef {{matrix: Object<string, Array<number>>}} LMSSpecific */

/** @type {Partial<import('./index.js').ColorSpace> & LMSSpecific} */
var lms = {
name: 'lms',
min: [0,0,0],
@@ -51,7 +48,7 @@ var lms = {
}
};

export default /** @type {import('./index.js').ColorSpace & LMSSpecific} */ (lms);
export default lms;

lms.xyz = function(arg, matrix){
var l = arg[0], m = arg[1], s = arg[2];
19 changes: 9 additions & 10 deletions luv.js
Original file line number Diff line number Diff line change
@@ -5,23 +5,22 @@
*/
import xyz from './xyz.js';

/** @type {Partial<import('./index.js').ColorSpace>} */
var luv = {
name: 'luv',
//NOTE: luv has no rigidly defined limits
//easyrgb fails to get proper coords
//boronine states no rigid limits
//colorMine refers this ones:
min: [0,-134,-140],
max: [100,224,122],
min: [0, -134, -140],
max: [100, 224, 122],
channel: ['lightness', 'u', 'v'],
alias: ['LUV', 'cieluv', 'cie1976'],

xyz: function(arg, i, o){
xyz: function (arg, i, o) {
var _u, _v, l, u, v, x, y, z, xn, yn, zn, un, vn;
l = arg[0], u = arg[1], v = arg[2];

if (l === 0) return [0,0,0];
if (l === 0) return [0, 0, 0];

//get constants
//var e = 0.008856451679035631; //(6/29)^3
@@ -44,7 +43,7 @@ var luv = {
_u = u / (13 * l) + un || 0;
_v = v / (13 * l) + vn || 0;

y = l > 8 ? yn * Math.pow( (l + 16) / 116 , 3) : yn * l * k;
y = l > 8 ? yn * Math.pow((l + 16) / 116, 3) : yn * l * k;

//wikipedia method
x = y * 9 * _u / (4 * _v) || 0;
@@ -59,13 +58,13 @@ var luv = {
}
};

export default /** @type {import('./index.js').ColorSpace} */ (luv);
export default (luv);

// http://www.brucelindbloom.com/index.html?Equations.html
// https://github.com/boronine/husl/blob/master/husl.coffee
//i - illuminant
//o - observer
xyz.luv = function(arg, i, o) {
xyz.luv = function (arg, i, o) {
var _u, _v, l, u, v, x, y, z, xn, yn, zn, un, vn;

//get constants
@@ -90,9 +89,9 @@ xyz.luv = function(arg, i, o) {
_u = (4 * x) / (x + (15 * y) + (3 * z)) || 0;
_v = (9 * y) / (x + (15 * y) + (3 * z)) || 0;

var yr = y/yn;
var yr = y / yn;

l = yr <= e ? k * yr : 116 * Math.pow(yr, 1/3) - 16;
l = yr <= e ? k * yr : 116 * Math.pow(yr, 1 / 3) - 16;

u = 13 * l * (_u - un);
v = 13 * l * (_v - vn);
2 changes: 1 addition & 1 deletion munsell.js
Original file line number Diff line number Diff line change
@@ -6,14 +6,14 @@ var munsell = {
alias: [],
min: [],
max: [],

//hue, value, chroma
channel: ['H', 'V', 'C']
}

/**
* http://www.pp.bme.hu/ar/article/view/2395/1500
*/
// FIXME: obviously unfinished
munsell.coloroid = function (cv) {
var c = arg[0], vm = arg[1];

4 changes: 2 additions & 2 deletions osaucs.js
Original file line number Diff line number Diff line change
@@ -6,7 +6,7 @@

import xyz from './xyz.js';

/** @type {Partial<import('./index.js').ColorSpace>} */

var osaucs = {
name: 'osaucs',
alias: ['OSA-UCS'],
@@ -73,4 +73,4 @@ xyz.osaucs = function (arg) {
};


export default /** @type {import('./index.js').ColorSpace} */ (osaucs);
export default (osaucs);
5 changes: 2 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
@@ -38,7 +38,7 @@
],
"license": "MIT",
"main": "./index.js",
"types": "./dist/color-space.d.ts",
"types": "./types/index.d.ts",
"devDependencies": {
"almost-equal": "^1.1.0",
"esbuild": "^0.24.2",
@@ -48,7 +48,6 @@
"test": "uvu test",
"build": "esbuild ./index.js --bundle --format=esm --outfile=dist/color-space.js",
"min": "esbuild ./dist/color-space.js --minify --outfile=dist/color-space.min.js",
"types": "npx -y --package=typescript@latest -c 'tsc' && npx --package dts-bundle@latest -c 'dts-bundle --name color-space --main build/**/*.d.ts --baseDir . --out dist/color-space.d.ts'",
"prepublishOnly": "npm run build && npm run min && npm run types"
"prepublishOnly": "npm run build && npm run min"
}
}
11 changes: 4 additions & 7 deletions rgb.js
Original file line number Diff line number Diff line change
@@ -3,15 +3,12 @@
*
* @module color-space/rgb
*/


/** @type {Partial<import('./index.js').ColorSpace>} */
var rgb = {
const rgb = {
name: 'rgb',
min: [0,0,0],
max: [255,255,255],
min: [0, 0, 0],
max: [255, 255, 255],
channel: ['red', 'green', 'blue'],
alias: ['RGB']
};

export default /** @type {import('./index.js').ColorSpace} */ (rgb);
export default rgb;
2 changes: 0 additions & 2 deletions test/index.js
Original file line number Diff line number Diff line change
@@ -3,7 +3,6 @@ import assert from 'assert';
import almost from 'almost-equal';
import {suite} from 'uvu'


assert.almost = function (x, y, precision=1e-1) {
if (!almost(x, y, precision)) assert.fail(x + ' ≈ ' + y);
return true;
@@ -793,4 +792,3 @@ let yesTest = suite('yes')
assert.deepEqualAlmost(s.yes.rgb(s.rgb.yes([10,20,30])), [10,20,30]);
});
yesTest.run()

17 changes: 0 additions & 17 deletions tsconfig.json

This file was deleted.

3 changes: 1 addition & 2 deletions tsl.js
Original file line number Diff line number Diff line change
@@ -8,7 +8,6 @@
*/
import rgb from './rgb.js';

/** @type {Partial<import('./index.js').ColorSpace>} */
var tsl = {
name: 'tsl',
min: [0,0,0],
@@ -17,7 +16,7 @@ var tsl = {
alias: ['TSL'],
};

export default /** @type {import('./index.js').ColorSpace} */ (tsl);
export default (tsl);

/**
* TSL to RGB
15 changes: 15 additions & 0 deletions types/cmy.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { ColorSpace } from "./color-space";

export interface CmySpace extends ColorSpace {
name: 'cmy'
rgb: (cmy: [number, number, number]) => [number, number, number]
}

declare module "./rgb" {
interface RgbSpace {
cmy: (rgb: [number, number, number]) => [number, number, number]
}
}

declare const cmy: CmySpace;
export default cmy;
15 changes: 15 additions & 0 deletions types/cmyk.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { ColorSpace } from "./color-space";

export interface CmykSpace extends ColorSpace<[number, number, number, number]> {
name: 'cmyk'
rgb: (cmyk: [number, number, number, number]) => [number, number, number]
}

declare module "./rgb" {
interface RgbSpace {
cmyk: (rgb: [number, number, number]) => [number, number, number, number]
}
}

declare const cmyk: CmykSpace;
export default cmyk;
7 changes: 7 additions & 0 deletions types/color-space.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
export interface ColorSpace<T extends readonly number[] = [number, number, number]> {
name: string;
min: T;
max: T;
channel: { [K in keyof T]: string };
alias?: string[];
}
22 changes: 22 additions & 0 deletions types/coloroid.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { ColorSpace } from "./color-space";

export interface ColoroidSpace extends ColorSpace {
name: 'coloroid'
table: number[][]
xyy: (atv: [number, number, number]) => [number, number, number]
xyz: (atv: [number, number, number]) => [number, number, number]
}

declare module "./xyy" {
interface XyySpace {
coloroid: (xyy: [number, number, number]) => [number, number, number]
}
}
declare module "./xyz" {
interface XyzSpace {
coloroid: (xyz: [number, number, number]) => [number, number, number]
}
}

declare const coloroid: ColoroidSpace;
export default coloroid;
23 changes: 23 additions & 0 deletions types/cubehelix.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { ColorSpace } from "./color-space";

export type CubehelixOptions = {
start: number,
rotation: number,
hue: number,
gamma: number
}

export interface CubehelixSpace extends ColorSpace<[number]> {
name: 'cubehelix'
rgb: (fraction: [number], options?: CubehelixOptions) => [number]
defaults: CubehelixOptions
}

declare module "./rgb" {
interface RgbSpace {
cubehelix: (rgb: [number, number, number]) => [number, number, number]
}
}

declare const coloroid: CubehelixSpace;
export default coloroid;
33 changes: 33 additions & 0 deletions types/hcg.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import { ColorSpace } from "./color-space";

export interface HcgSpace extends ColorSpace {
name: 'hcg'
rgb: (hcg: [number, number, number]) => [number, number, number];
hsl: (hcg: [number, number, number]) => [number, number, number];
hsv: (hcg: [number, number, number]) => [number, number, number];
hwb: (hcg: [number, number, number]) => [number, number, number];
}

declare module "./rgb" {
interface RgbSpace {
hcg: (rgb: [number, number, number]) => [number, number, number]
}
}
declare module "./hsl" {
interface HslSpace {
hcg: (hsl: [number, number, number]) => [number, number, number]
}
}
declare module "./hsv" {
interface HsvSpace {
hcg: (hsv: [number, number, number]) => [number, number, number]
}
}
declare module "./hwb" {
interface HwbSpace {
hcg: (hwb: [number, number, number]) => [number, number, number]
}
}

declare const hcg: HcgSpace;
export default hcg;
15 changes: 15 additions & 0 deletions types/hcy.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { ColorSpace } from "./color-space";

export interface HcySpace extends ColorSpace {
name: 'hcy'
rgb: (hcy: [number, number, number]) => [number, number, number];
}

declare module "./rgb" {
interface RgbSpace {
hcy: (rgb: [number, number, number]) => [number, number, number]
}
}

declare const hcy: HcySpace;
export default hcy;
22 changes: 22 additions & 0 deletions types/hpluv.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { ColorSpace } from "./color-space";

export interface HpluvSpace extends ColorSpace {
name: 'hpluv'
lchuv: (hpl: [number, number, number]) => [number, number, number]
xyz: (hpl: [number, number, number]) => [number, number, number]
hsluv: (hpl: [number, number, number]) => [number, number, number]
}

declare module "./lchuv" {
interface LchuvSpace {
hpluv: (lch: [number, number, number]) => [number, number, number]
}
}
declare module "./xyz" {
interface XyzSpace {
hpluv: (xyz: [number, number, number]) => [number, number, number]
}
}

declare const hcy: HpluvSpace;
export default hcy;
15 changes: 15 additions & 0 deletions types/hsi.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { ColorSpace } from "./color-space";

export interface HsiSpace extends ColorSpace {
name: 'hsi'
rgb: (hsi: [number, number, number]) => [number, number, number];
}

declare module "./rgb" {
interface RgbSpace {
hsi: (rgb: [number, number, number]) => [number, number, number]
}
}

declare const hsi: HsiSpace;
export default hsi;
14 changes: 14 additions & 0 deletions types/hsl.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { ColorSpace } from "./color-space";

export interface HslSpace extends ColorSpace {
name: 'hsl'
rgb: (hsl: [number, number, number]) => [number, number, number];
}

declare module "./rgb" {
interface RgbSpace {
hsl: (rgb: [number, number, number]) => [number, number, number]
}
}
declare const hsl: HslSpace;
export default hsl;
27 changes: 27 additions & 0 deletions types/hsluv.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { ColorSpace } from "./color-space";

export interface HsluvSpace extends ColorSpace {
name: 'hsluv'
lchuv: (hsluv: [number, number, number]) => [number, number, number];
xyz: (hsluv: [number, number, number]) => [number, number, number];
hpluv: (hsluv: [number, number, number]) => [number, number, number];
}

declare module "./rgb" {
interface RgbSpace {
hsluv: (rgb: [number, number, number]) => [number, number, number]
}
}
declare module "./lchuv" {
interface LchuvSpace {
hsluv: (lchuv: [number, number, number]) => [number, number, number]
}
}
declare module "./xyz" {
interface XyzSpace {
hsluv: (xyz: [number, number, number]) => [number, number, number]
}
}

declare const hsluv: HsluvSpace;
export default hsluv;
15 changes: 15 additions & 0 deletions types/hsp.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { ColorSpace } from "./color-space";

export interface HspSpace extends ColorSpace {
name: 'hsp'
rgb: (hsp: [number, number, number]) => [number, number, number];
}

declare module "./rgb" {
interface RgbSpace {
hsp: (rgb: [number, number, number]) => [number, number, number]
}
}

declare const hsp: HspSpace;
export default hsp;
21 changes: 21 additions & 0 deletions types/hsv.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { ColorSpace } from "./color-space";

export interface HsvSpace extends ColorSpace {
name: 'hsv'
rgb: (hsv: [number, number, number]) => [number, number, number];
hsl: (hsv: [number, number, number]) => [number, number, number];
}

declare module "./rgb" {
interface RgbSpace {
hsv: (rgb: [number, number, number]) => [number, number, number]
}
}
declare module "./hsl" {
interface HslSpace {
hsv: (hsl: [number, number, number]) => [number, number, number]
}
}

declare const hsv: HsvSpace;
export default hsv;
27 changes: 27 additions & 0 deletions types/hwb.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { ColorSpace } from "./color-space";

export interface HwbSpace extends ColorSpace {
name: 'hwb'
rgb: (hwb: [number, number, number]) => [number, number, number];
hsl: (hwb: [number, number, number]) => [number, number, number];
hsv: (hwb: [number, number, number]) => [number, number, number];
}

declare module "./rgb" {
interface RgbSpace {
hwb: (rgb: [number, number, number]) => [number, number, number]
}
}
declare module "./hsl" {
interface HslSpace {
hwb: (hsl: [number, number, number]) => [number, number, number]
}
}
declare module "./hsv" {
interface HsvSpace {
hwb: (hsv: [number, number, number]) => [number, number, number]
}
}

declare const hwb: HwbSpace;
export default hwb;
133 changes: 133 additions & 0 deletions types/index.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
// Import type definitions for all color space modules
import cmy from './cmy';
import cmyk from './cmyk';
import coloroid from './coloroid';
import cubehelix from './cubehelix';
import hcg from './hcg';
import hcy from './hcy';
import hpluv from './hpluv';
import hsi from './hsi';
import hsl from './hsl';
import hsluv from './hsluv';
import hsp from './hsp';
import hsv from './hsv';
import hwb from './hwb';
import jpeg from './jpeg';
import lab from './lab';
import labh from './labh';
import lchab from './lchab';
import lchuv from './lchuv';
import lms from './lms';
import luv from './luv';
import munsell from './munsell';
import osaucs from './osaucs';
import rgb from './rgb';
import tsl from './tsl';
import ucs from './ucs';
import uvw from './uvw';
import xvycc from './xvycc';
import xyz from './xyz';
import xyy from './xyy';
import ycbcr from './ycbcr';
import yccbccrc from './yccbccrc';
import ycgco from './ycgco';
import ydbdr from './ydbdr';
import yes from './yes';
import yiq from './yiq';
import ypbpr from './ypbpr';
import yuv from './yuv';

// Declare the space object with the defined type
declare const space: {
cmy: typeof cmy;
cmyk: typeof cmyk;
coloroid: typeof coloroid;
cubehelix: typeof cubehelix;
hcg: typeof hcg;
hcy: typeof hcy;
hpluv: typeof hpluv;
hsi: typeof hsi;
hsl: typeof hsl;
hsluv: typeof hsluv;
hsp: typeof hsp;
hsv: typeof hsv;
hwb: typeof hwb;
jpeg: typeof jpeg;
lab: typeof lab;
labh: typeof labh;
lchab: typeof lchab;
lchuv: typeof lchuv;
lms: typeof lms;
luv: typeof luv;
munsell: typeof munsell;
osaucs: typeof osaucs;
rgb: typeof rgb;
tsl: typeof tsl;
ucs: typeof ucs;
uvw: typeof uvw;
xvycc: typeof xvycc;
xyz: typeof xyz;
xyy: typeof xyy;
ycbcr: typeof ycbcr;
yccbccrc: typeof yccbccrc;
ycgco: typeof ycgco;
ydbdr: typeof ydbdr;
yes: typeof yes;
yiq: typeof yiq;
ypbpr: typeof ypbpr;
yuv: typeof yuv;
};

type SpaceId = keyof typeof space;

export default space;

// NOTE: to exclude self-transform this can be modified to Transforms<Exclude<SpaceId, 'cmy'>>
export type Transforms<Channels extends readonly number[]=[number, number, number]> = {
/**
* Convert value from current color space to target color space.
* @param channels - Channel values in the current color space.
* @returns target color space channel values.
*/
[key in SpaceId]?: (channels: Channels) => number[];
};

// augment all color spaces with conversions to every other space, except itself
// FIXME: something with type inference can be done here, but for now good enough
declare module './cmy' { interface CmySpace extends Transforms {}}
declare module './cmyk' { interface CmykSpace extends Transforms<[number, number, number, number]> {}}
declare module './coloroid' { interface ColoroidSpace extends Transforms {}}
declare module './cubehelix' { interface CubehelixSpace extends Transforms<[number]> {}}
declare module './hcg' { interface HcgSpace extends Transforms {}}
declare module './hcy' { interface HcySpace extends Transforms {}}
declare module './hpluv' { interface HpluvSpace extends Transforms {}}
declare module './hsi' { interface HsiSpace extends Transforms {}}
declare module './hsl' { interface HslSpace extends Transforms {}}
declare module './hsluv' { interface HsluvSpace extends Transforms {}}
declare module './hsp' { interface HspSpace extends Transforms {}}
declare module './hsv' { interface HsvSpace extends Transforms {}}
declare module './hwb' { interface HwbSpace extends Transforms {}}
declare module './jpeg' { interface JpegSpace extends Transforms {}}
declare module './lab' { interface LabSpace extends Transforms {}}
declare module './labh' { interface LabhSpace extends Transforms {}}
declare module './lchab' { interface LchabSpace extends Transforms {}}
declare module './lchuv' { interface LchuvSpace extends Transforms {}}
declare module './lms' { interface LmsSpace extends Transforms {}}
declare module './luv' { interface LuvSpace extends Transforms {}}
declare module './munsell' { interface MunsellSpace extends Transforms {}}
declare module './osaucs' { interface OsaucsSpace extends Transforms {}}
declare module './rgb' { interface RgbSpace extends Transforms {}}
declare module './tsl' { interface TslSpace extends Transforms {}}
declare module './ucs' { interface UcsSpace extends Transforms {}}
declare module './uvw' { interface UvwSpace extends Transforms {}}
declare module './xvycc' { interface XvyccSpace extends Transforms {}}
declare module './xyz' { interface XyzSpace extends Transforms {}}
declare module './xyy' { interface XyySpace extends Transforms {}}
declare module './ycbcr' { interface YcbcrSpace extends Transforms {}}
declare module './yccbccrc' { interface YccbccrcSpace extends Transforms {}}
declare module './ycgco' { interface YcgcoSpace extends Transforms {}}
declare module './ydbdr' { interface YdbdrSpace extends Transforms {}}
declare module './yes' { interface YesSpace extends Transforms {}}
declare module './yiq' { interface YiqSpace extends Transforms {}}
declare module './ypbpr' { interface YpbprSpace extends Transforms {}}
declare module './yuv' { interface YuvSpace extends Transforms {}}
15 changes: 15 additions & 0 deletions types/jpeg.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { ColorSpace } from "./color-space";

export interface JpegSpace extends ColorSpace {
name: 'jpeg'
rgb: (jpeg: [number, number, number]) => [number, number, number];
}

declare module "./rgb" {
interface RgbSpace {
jpeg: (rgb: [number, number, number]) => [number, number, number]
}
}

declare const jpeg: JpegSpace;
export default jpeg;
15 changes: 15 additions & 0 deletions types/lab.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { ColorSpace } from "./color-space";

export interface LabSpace extends ColorSpace {
name: 'lab'
xyz: (lab: [number, number, number]) => [number, number, number];
}

declare module "./xyz" {
interface XyzSpace {
lab: (xyz: [number, number, number]) => [number, number, number]
}
}

declare const lab: LabSpace;
export default lab;
15 changes: 15 additions & 0 deletions types/labh.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { ColorSpace } from "./color-space";

export interface LabhSpace extends ColorSpace {
name: 'labh'
xyz: (labh: [number, number, number]) => [number, number, number];
}

declare module "./xyz" {
interface XyzSpace {
labh: (xyz: [number, number, number]) => [number, number, number]
}
}

declare const labh: LabhSpace;
export default labh;
22 changes: 22 additions & 0 deletions types/lchab.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { ColorSpace } from "./color-space";

export interface LchabSpace extends ColorSpace {
name: 'lchab'
xyz: (lchab: [number, number, number]) => [number, number, number];
lab: (lchab: [number, number, number]) => [number, number, number];
}

declare module "./lab" {
interface LabSpace {
lchab: (lab: [number, number, number]) => [number, number, number]
}
}

declare module "./xyz" {
interface XyzSpace {
lchab: (xyz: [number, number, number]) => [number, number, number]
}
}

declare const lchab: LchabSpace;
export default lchab;
22 changes: 22 additions & 0 deletions types/lchuv.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { ColorSpace } from "./color-space";

export interface LchuvSpace extends ColorSpace {
name: 'lchuv'
xyz: (lchuv: [number, number, number]) => [number, number, number];
luv: (lchuv: [number, number, number]) => [number, number, number];
}

declare module "./luv" {
interface LuvSpace {
lchuv: (luv: [number, number, number]) => [number, number, number]
}
}

declare module "./xyz" {
interface XyzSpace {
lchuv: (xyz: [number, number, number]) => [number, number, number]
}
}

declare const lchuv: LchuvSpace;
export default lchuv;
15 changes: 15 additions & 0 deletions types/lms.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { ColorSpace } from "./color-space";

export interface LmsSpace extends ColorSpace {
name: 'lms'
xyz: (lms: [number, number, number]) => [number, number, number];
}

declare module "./xyz" {
interface XyzSpace {
lms: (xyz: [number, number, number]) => [number, number, number]
}
}

declare const lms: LmsSpace;
export default lms;
15 changes: 15 additions & 0 deletions types/luv.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { ColorSpace } from "./color-space";

export interface LuvSpace extends ColorSpace {
name: 'luv'
xyz: (luv: [number, number, number]) => [number, number, number];
}

declare module "./xyz" {
interface XyzSpace {
luv: (xyz: [number, number, number]) => [number, number, number]
}
}

declare const luv: LuvSpace;
export default luv;
9 changes: 9 additions & 0 deletions types/munsell.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { ColorSpace } from "./color-space";

export interface MunsellSpace extends ColorSpace {
name: 'munsell'
coloroid: (munsell: [number, number, number]) => [number, number, number];
}

declare const munsell: MunsellSpace;
export default munsell;
15 changes: 15 additions & 0 deletions types/osaucs.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { ColorSpace } from "./color-space";

export interface OsaucsSpace extends ColorSpace {
name: 'osaucs'
xyz: (osaucs: [number, number, number]) => [number, number, number];
}

declare module "./xyz" {
interface XyzSpace {
osaucs: (xyz: [number, number, number]) => [number, number, number]
}
}

declare const osaucs: OsaucsSpace;
export default osaucs;
5 changes: 5 additions & 0 deletions types/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"name": "@types/color-space",
"version": "1.0.0",
"types": "index.d.ts"
}
13 changes: 13 additions & 0 deletions types/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# @types/color-space

* `index.d.ts` exports full space with all conversions.
* `*.d.ts` exports individual color spaces.

Types are kept as meaningfully minimal as possible.

## Why not generating from jsdoc?

* Proper jsdoc declarations introduce hacks to js files and still don't attain correct results.
* JSdoc doesn't provide merging interfaces, which we need. It lacks capabilities of TS.
* Generated types look wrong: they miss important parts and somehow retain jsdocs.
* Current JSDoc serve literally formalized description purpose.
8 changes: 8 additions & 0 deletions types/rgb.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { ColorSpace } from './color-space'

export interface RgbSpace extends ColorSpace {
name: 'rgb'
}

declare const rgb: RgbSpace;
export default rgb;
15 changes: 15 additions & 0 deletions types/tsl.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { ColorSpace } from "./color-space";

export interface TslSpace extends ColorSpace {
name: 'tsl'
rgb: (tsl: [number, number, number]) => [number, number, number];
}

declare module "./rgb" {
interface RgbSpace {
tsl: (rgb: [number, number, number]) => [number, number, number]
}
}

declare const tsl: TslSpace;
export default tsl;
15 changes: 15 additions & 0 deletions types/ucs.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { ColorSpace } from "./color-space";

export interface UcsSpace extends ColorSpace {
name: 'ucs'
xyz: (ucs: [number, number, number]) => [number, number, number];
}

declare module "./xyz" {
interface XyzSpace {
ucs: (xyz: [number, number, number]) => [number, number, number]
}
}

declare const ucs: UcsSpace;
export default ucs;
22 changes: 22 additions & 0 deletions types/uvw.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { ColorSpace } from "./color-space";

export interface UvwSpace extends ColorSpace {
name: 'uvw'
xyz: (uvw: [number, number, number]) => [number, number, number];
ucs: (uvw: [number, number, number]) => [number, number, number];
}

declare module "./xyz" {
interface XyzSpace {
uvw: (xyz: [number, number, number]) => [number, number, number]
}
}

declare module "./ucs" {
interface UcsSpace {
uvw: (ucs: [number, number, number]) => [number, number, number]
}
}

declare const uvw: UvwSpace;
export default uvw;
21 changes: 21 additions & 0 deletions types/xvycc.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { ColorSpace } from "./color-space";

export interface XvyccSpace extends ColorSpace {
name: 'xvycc'
rgb: (xvycc: [number, number, number]) => [number, number, number];
ypbpr: (xvycc: [number, number, number]) => [number, number, number];
}

declare module "./rgb" {
interface RgbSpace {
xvycc: (rgb: [number, number, number]) => [number, number, number]
}
}
declare module "./ypbpr" {
interface YpbprSpace {
xvycc: (ypbpr: [number, number, number]) => [number, number, number]
}
}

declare const xvycc: XvyccSpace;
export default xvycc;
15 changes: 15 additions & 0 deletions types/xyy.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { ColorSpace } from './color-space'

export interface XyySpace extends ColorSpace {
name: 'xyy'
xyz: (xyy: [number, number, number]) => [number, number, number];
}

declare module "./xyz" {
interface XyzSpace {
xyy: (xyz: [number, number, number]) => [number, number, number]
}
}

declare const xyy: XyySpace;
export default xyy;
15 changes: 15 additions & 0 deletions types/xyz.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { ColorSpace } from './color-space'

export interface XyzSpace extends ColorSpace {
name: 'xyz'
rgb: (xyz: [number, number, number]) => [number, number, number]
}

declare module "./rgb" {
interface RgbSpace {
xyz: (rgb: [number, number, number]) => [number, number, number]
}
}

declare const xyz: XyzSpace;
export default xyz;
21 changes: 21 additions & 0 deletions types/ycbcr.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { ColorSpace } from "./color-space";

export interface YcbcrSpace extends ColorSpace {
name: 'ycbcr'
rgb: (ycbcr: [number, number, number]) => [number, number, number];
ypbpr: (ycbcr: [number, number, number]) => [number, number, number];
}

declare module "./rgb" {
interface RgbSpace {
ycbcr: (rgb: [number, number, number]) => [number, number, number]
}
}
declare module "./ypbpr" {
interface YpbprSpace {
ycbcr: (ypbpr: [number, number, number]) => [number, number, number]
}
}

declare const ycbcr: YcbcrSpace;
export default ycbcr;
15 changes: 15 additions & 0 deletions types/yccbccrc.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { ColorSpace } from "./color-space";

export interface YccbccrcSpace extends ColorSpace {
name: 'yccbccrc'
rgb: (yccbccrc: [number, number, number]) => [number, number, number];
}

declare module "./rgb" {
interface RgbSpace {
yccbccrc: (rgb: [number, number, number]) => [number, number, number]
}
}

declare const yccbccrc: YccbccrcSpace;
export default yccbccrc;
15 changes: 15 additions & 0 deletions types/ycgco.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { ColorSpace } from "./color-space";

export interface YcgcoSpace extends ColorSpace {
name: 'ycgco'
rgb: (ycgco: [number, number, number]) => [number, number, number];
}

declare module "./rgb" {
interface RgbSpace {
ycgco: (rgb: [number, number, number]) => [number, number, number]
}
}

declare const ycgco: YcgcoSpace;
export default ycgco;
21 changes: 21 additions & 0 deletions types/ydbdr.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { ColorSpace } from "./color-space";

export interface YdbdrSpace extends ColorSpace {
name: 'ydbdr'
rgb: (ydbdr: [number, number, number]) => [number, number, number];
yuv: (ydbdr: [number, number, number]) => [number, number, number];
}

declare module "./rgb" {
interface RgbSpace {
ydbdr: (rgb: [number, number, number]) => [number, number, number]
}
}
declare module "./yuv" {
interface YuvSpace {
ydbdr: (yuv: [number, number, number]) => [number, number, number]
}
}

declare const ydbdr: YdbdrSpace;
export default ydbdr;
15 changes: 15 additions & 0 deletions types/yes.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { ColorSpace } from "./color-space";

export interface YesSpace extends ColorSpace {
name: 'yes'
rgb: (yes: [number, number, number]) => [number, number, number];
}

declare module "./rgb" {
interface RgbSpace {
yes: (rgb: [number, number, number]) => [number, number, number]
}
}

declare const yes: YesSpace;
export default yes;
15 changes: 15 additions & 0 deletions types/yiq.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { ColorSpace } from "./color-space";

export interface YiqSpace extends ColorSpace {
name: 'yiq'
rgb: (yiq: [number, number, number]) => [number, number, number];
}

declare module "./rgb" {
interface RgbSpace {
yiq: (rgb: [number, number, number]) => [number, number, number]
}
}

declare const yiq: YiqSpace;
export default yiq;
15 changes: 15 additions & 0 deletions types/ypbpr.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { ColorSpace } from "./color-space";

export interface YpbprSpace extends ColorSpace {
name: 'ypbpr'
rgb: (ypbpr: [number, number, number]) => [number, number, number];
}

declare module "./rgb" {
interface RgbSpace {
ypbpr: (rgb: [number, number, number]) => [number, number, number]
}
}

declare const ypbpr: YpbprSpace;
export default ypbpr;
15 changes: 15 additions & 0 deletions types/yuv.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { ColorSpace } from "./color-space";

export interface YuvSpace extends ColorSpace {
name: 'yuv'
rgb: (yuv: [number, number, number]) => [number, number, number];
}

declare module "./rgb" {
interface RgbSpace {
yuv: (rgb: [number, number, number]) => [number, number, number]
}
}

declare const yuv: YuvSpace;
export default yuv;
3 changes: 1 addition & 2 deletions ucs.js
Original file line number Diff line number Diff line change
@@ -7,7 +7,6 @@
*/
import xyz from './xyz.js';

/** @type {Partial<import('./index.js').ColorSpace>} */
var ucs = {
name: 'ucs',
min: [0,0,0],
@@ -16,7 +15,7 @@ var ucs = {
alias: ['UCS', 'cie1960']
};

export default /** @type {import('./index.js').ColorSpace} */ (ucs);
export default (ucs);

/**
* UCS to XYZ
4 changes: 1 addition & 3 deletions uvw.js
Original file line number Diff line number Diff line change
@@ -8,7 +8,6 @@
import ucs from './ucs.js';
import xyz from './xyz.js';

/** @type {Partial<import('./index.js').ColorSpace>} */
var uvw = {
name: 'uvw',
min: [-134, -140, 0],
@@ -17,12 +16,11 @@ var uvw = {
alias: ['UVW', 'cieuvw', 'cie1964']
};

export default /** @type {import('./index.js').ColorSpace} */ (uvw);
export default (uvw);

/**
* UVW to XYZ
*/
/** @type {import('./index.js').Transform} */
uvw.xyz = function (arg, i, o) {
var _u, _v, w, u, v, x, y, z, xn, yn, zn, un, vn;
u = arg[0], v = arg[1], w = arg[2];
30 changes: 14 additions & 16 deletions xvycc.js
Original file line number Diff line number Diff line change
@@ -18,7 +18,6 @@
import rgb from './rgb.js';
import ypbpr from './ypbpr.js';

/** @type {Partial<import('./index.js').ColorSpace> & {ypbpr: import('./index.js').Transform}} */
var xvycc = {
name: 'xvycc',
min: [0, 0, 0],
@@ -37,10 +36,23 @@ var xvycc = {
(cb - 128) / 224,
(cr - 128) / 224
];
},

/**
* xvYCC to RGB
* transform through analog form
*
* @param {Array<number>} arr RGB values
* @param {number} kb
* @param {number} kr
* @return {Array<number>} xvYCC values
*/
rgb: function (arr, kb, kr) {
return ypbpr.rgb(xvycc.ypbpr(arr), kb, kr);
}
};

export default /** @type {import('./index.js').ColorSpace} */ (xvycc);
export default (xvycc);

/**
* From analog to digital form.
@@ -59,20 +71,6 @@ ypbpr.xvycc = function (ypbpr) {
}


/**
* xvYCC to RGB
* transform through analog form
*
* @param {Array<number>} arr RGB values
* @param {number} kb
* @param {number} kr
* @return {Array<number>} xvYCC values
*/
xvycc.rgb = function (arr, kb, kr) {
return ypbpr.rgb(xvycc.ypbpr(arr), kb, kr);
};


/**
* RGB to xvYCC
* transform through analog form
3 changes: 1 addition & 2 deletions xyy.js
Original file line number Diff line number Diff line change
@@ -5,7 +5,6 @@
*/
import xyz from './xyz.js';

/** @type {Partial<import('./index.js').ColorSpace>} */
var xyy = {
name: 'xyy',
min: [0,0,0],
@@ -35,4 +34,4 @@ xyz.xyy = function(arg) {
return [X / sum, Y / sum, Y];
};

export default /** @type {import('./index.js').ColorSpace} */ (xyy);
export default (xyy);
33 changes: 14 additions & 19 deletions xyz.js
Original file line number Diff line number Diff line change
@@ -5,24 +5,19 @@
*/
import rgb from './rgb.js';

/** @typedef {{whitepoint: Object<number, Object<string, Array<number>>>}} XYZSpecific */

/** @type {Partial<import('./index.js').ColorSpace> & XYZSpecific} */
var xyz = {
const xyz = {
name: 'xyz',
min: [0,0,0],
channel: ['X','Y','Z'],
min: [0, 0, 0],
channel: ['X', 'Y', 'Z'],
alias: ['XYZ', 'ciexyz', 'cie1931'],
/**
* Whitepoint reference values with observer/illuminant
*
* http://en.wikipedia.org/wiki/Standard_illuminant
*/

// Whitepoint reference values with observer/illuminant
// http://en.wikipedia.org/wiki/Standard_illuminant
whitepoint: {
//1931 2°
2: {
//incadescent
A:[109.85, 100, 35.585],
A: [109.85, 100, 35.585],
// B:[],
C: [98.074, 100, 118.232],
D50: [96.422, 100, 82.521],
@@ -43,13 +38,13 @@ var xyz = {
// F10: [],
F11: [100.966, 100, 64.370],
// F12: [],
E: [100,100,100]
E: [100, 100, 100]
},

//1964 10°
10: {
//incadescent
A:[111.144, 100, 35.200],
A: [111.144, 100, 35.200],
C: [97.285, 100, 116.145],
D50: [96.720, 100, 81.427],
D55: [95.799, 100, 90.926],
@@ -60,7 +55,7 @@ var xyz = {
F2: [103.280, 100, 69.026],
F7: [95.792, 100, 107.687],
F11: [103.866, 100, 65.627],
E: [100,100,100]
E: [100, 100, 100]
}
}
};
@@ -80,7 +75,7 @@ xyz.max = xyz.whitepoint[2].D65;
* @return {Array<number>} RGB values
*/
xyz.rgb = function (_xyz, white) {
//FIXME: make sure we have to divide like this. Probably we have to replace matrix as well then
// FIXME: make sure we have to divide like this. Probably we have to replace matrix as well then
white = white || xyz.whitepoint[2].E;

var x = _xyz[0] / white[0],
@@ -121,8 +116,8 @@ xyz.rgb = function (_xyz, white) {
*/
rgb.xyz = function(rgb, white) {
var r = rgb[0] / 255,
g = rgb[1] / 255,
b = rgb[2] / 255;
g = rgb[1] / 255,
b = rgb[2] / 255;

// assume sRGB
r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);
@@ -140,4 +135,4 @@ rgb.xyz = function(rgb, white) {



export default /** @type {import('./index.js').ColorSpace & XYZSpecific} */ (xyz);
export default xyz;
3 changes: 1 addition & 2 deletions ycbcr.js
Original file line number Diff line number Diff line change
@@ -9,7 +9,6 @@
import rgb from './rgb.js'
import ypbpr from './ypbpr.js'

/** @type {Partial<import('./index.js').ColorSpace> & {ypbpr: import('./index.js').Transform}} */
var ycbcr = {
name: 'ycbcr',
min: [16, 16, 16],
@@ -77,4 +76,4 @@ rgb.ycbcr = function(arr, kb, kr) {
};


export default /** @type {import('./index.js').ColorSpace} */ (ycbcr);
export default (ycbcr);
3 changes: 1 addition & 2 deletions yccbccrc.js
Original file line number Diff line number Diff line change
@@ -6,7 +6,6 @@
import rgb from './rgb.js';
import ypbpr from './ypbpr.js';

/** @type {Partial<import('./index.js').ColorSpace>} */
var yccbccrc = {
name: 'yccbccrc',
min: [0, -0.5, -0.5],
@@ -40,4 +39,4 @@ rgb.yccbccrc = function(arr) {
};


export default /** @type {import('./index.js').ColorSpace} */ (yccbccrc);
export default (yccbccrc);
4 changes: 2 additions & 2 deletions ycgco.js
Original file line number Diff line number Diff line change
@@ -5,7 +5,7 @@
*/
import rgb from './rgb.js';

/** @type {Partial<import('./index.js').ColorSpace>} */

var ycgco = {
name: 'ycgco',
min: [0, -0.5, -0.5],
@@ -55,4 +55,4 @@ rgb.ycgco = function(arr) {
};


export default /** @type {import('./index.js').ColorSpace} */ (ycgco);
export default (ycgco);
4 changes: 2 additions & 2 deletions ydbdr.js
Original file line number Diff line number Diff line change
@@ -7,7 +7,7 @@
import rgb from './rgb.js';
import yuv from './yuv.js';

/** @type {Partial<import('./index.js').ColorSpace>} */

var ydbdr = {
name: 'ydbdr',
min: [0,-1.333,-1.333],
@@ -71,4 +71,4 @@ ydbdr.yuv = function (ydbdr) {
};


export default /** @type {import('./index.js').ColorSpace} */ (ydbdr);
export default (ydbdr);
4 changes: 1 addition & 3 deletions yes.js
Original file line number Diff line number Diff line change
@@ -7,15 +7,13 @@

import rgb from './rgb.js';

/** @type {Partial<import('./index.js').ColorSpace>} */
var yes = {
name: 'yes',
min: [0,0,0],
max: [1,1,1],
channel: ['luminance', 'e-factor', 's-factor']
};

/** @type {import('./index.js').Transform} */
yes.rgb = function(arg){
var y = arg[0], e = arg[1], s = arg[2];

@@ -49,4 +47,4 @@ rgb.yes = function(arg) {
};


export default /** @type {import('./index.js').ColorSpace} */ (yes);
export default yes;
3 changes: 1 addition & 2 deletions yiq.js
Original file line number Diff line number Diff line change
@@ -5,15 +5,14 @@
*/
import rgb from './rgb.js';

var yiq = /** @type {import('./index.js').ColorSpace} */ ({
var yiq = ({
name: 'yiq',
min: [0,-0.5957,-0.5226],
max: [1, 0.5957, 0.5226],
channel: ['Y','I','Q'],
alias: ['YIQ']
});

/** @type {import('./index.js').Transform} */
yiq.rgb = function(yiq) {
var y = yiq[0],
i = yiq[1],
2 changes: 1 addition & 1 deletion ypbpr.js
Original file line number Diff line number Diff line change
@@ -10,7 +10,7 @@
*/
import rgb from './rgb.js';

var ypbpr = /** @type {import('./index.js').ColorSpace} */ ({
var ypbpr = ({
name: 'ypbpr',
min: [0,-0.5,-0.5],
max: [1, 0.5, 0.5],
3 changes: 1 addition & 2 deletions yuv.js
Original file line number Diff line number Diff line change
@@ -5,15 +5,14 @@
*/
import rgb from './rgb.js';

var yuv = /** @type {import('./index.js').ColorSpace} */ ({
var yuv = ({
name: 'yuv',
min: [0,-0.5,-0.5],
max: [1, 0.5, 0.5],
channel: ['Y','U','V'],
alias: ['YUV', 'EBU'],
});

/** @type {import('./index.js').Transform} */
yuv.rgb = function(yuv) {
var y = yuv[0],
u = yuv[1],