Skip to content

Commit

Permalink
Append all h* spaces
Browse files Browse the repository at this point in the history
  • Loading branch information
dy committed Jan 31, 2025
1 parent ff3472c commit bcb721c
Show file tree
Hide file tree
Showing 18 changed files with 234 additions and 49 deletions.
3 changes: 1 addition & 2 deletions hcg.js
Original file line number Diff line number Diff line change
Expand Up @@ -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],
Expand Down Expand Up @@ -85,7 +84,7 @@ var hcg = {
}
};

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


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

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

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


/**
Expand Down
5 changes: 2 additions & 3 deletions hpluv.js
Original file line number Diff line number Diff line change
Expand Up @@ -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],
Expand All @@ -25,7 +24,7 @@ var hpluv = {
}
};

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

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

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

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


/**
Expand Down
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
*/
Expand All @@ -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 = {
Expand All @@ -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],
Expand All @@ -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;
Expand Down
7 changes: 2 additions & 5 deletions hsp.js
Original file line number Diff line number Diff line change
Expand Up @@ -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],
Expand Down Expand Up @@ -96,11 +95,9 @@ 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
Expand All @@ -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) {
Expand Down
44 changes: 21 additions & 23 deletions hwb.js
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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));
};
1 change: 1 addition & 0 deletions types/coloroid.d.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { ColorSpace } from "./types";

export interface ColoroidSpace extends ColorSpace {
table: number[][]
xyy: (atv: [number, number, number]) => [number, number, number]
xyz: (atv: [number, number, number]) => [number, number, number]
}
Expand Down
22 changes: 22 additions & 0 deletions types/cubehelix.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { ColorSpace } from "./types";

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

export interface CubehelixSpace extends ColorSpace {
rgb: (rgb: [number, number, number]) => [number]
defaults: CubehelixOptions
}

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

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

export interface HcgSpace extends ColorSpace {
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;
14 changes: 14 additions & 0 deletions types/hcy.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { ColorSpace } from "./types";

export interface HcySpace extends ColorSpace {
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;
21 changes: 21 additions & 0 deletions types/hpluv.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { ColorSpace } from "./types";

export interface HpluvSpace extends ColorSpace {
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;
14 changes: 14 additions & 0 deletions types/hsi.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { ColorSpace } from "./types";

export interface HsiSpace extends ColorSpace {
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;
13 changes: 13 additions & 0 deletions types/hsl.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { ColorSpace } from "./types";

export interface HslSpace extends ColorSpace {
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;
Loading

0 comments on commit bcb721c

Please sign in to comment.