@bjornlu/colorblind
Version:
Simulate color blindness
2 lines (1 loc) • 1.3 kB
JavaScript
const n=[0,1.05118294,-.05116099,0,1,0,0,0,1],r=[1,0,0,.9513092,0,.04866992,0,0,1],t=[1,0,0,0,1,0,-.86744736,1.86727089,0],o=[.212656,.715158,.072186],u=[.31399022,.63951294,.04649755,.15537241,.75789446,.08670142,.01775239,.10944209,.87256922],e=[5.47221206,-4.6419601,.16963708,-1.1252419,2.29317094,-.1678952,.02980165,-.19318073,1.16364789];function c(n,r){return[n[0]*r[0]+n[1]*r[1]+n[2]*r[2],n[3]*r[0]+n[4]*r[1]+n[5]*r[2],n[6]*r[0]+n[7]*r[1]+n[8]*r[2]]}function i(n){return[n.r/255,n.g/255,n.b/255]}function a(n){return[n.l,n.m,n.s]}function f(n){return{r:255*n[0],g:255*n[1],b:255*n[2]}}function s(n){return{l:n[0],m:n[1],s:n[2]}}function d(n){return{r:l(n.r),g:l(n.g),b:l(n.b)}}function l(n){return Math.round(Math.min(Math.max(n,0),255))}function p(u,e){switch(e){case"protanopia":return h(u,n);case"deuteranopia":return h(u,r);case"tritanopia":return h(u,t);case"achromatopsia":return m(u,o);default:throw new Error("Invalid color deficiency provided")}}function h(n,r){const t=function(n){const r=i(n);return s(c(u,r))}(d(n));return d(function(n){const r=a(n);return f(c(e,r))}(s(c(r,a(t)))))}function m(n,r){const t=i(d(n)),o=(u=t,e=r,[u[0]*e[0]+u[1]*e[1]+u[2]*e[2]])[0];var u,e;return d(f(Array(3).fill(o)))}export{p as simulate,h as simulateDichromatic,m as simulateMonochromatic};