1
1
// sRGB-related functions
2
2
3
3
function lin_sRGB ( RGB ) {
4
- // convert an array of sRGB values in the range 0.0 - 1.0
4
+ // convert an array of sRGB values in the range 0.0 - 1.0
5
5
// to linear light (un-companded) form.
6
6
// https://en.wikipedia.org/wiki/SRGB
7
7
return RGB . map ( function ( val ) {
8
8
if ( val < 0.04045 ) {
9
9
return val / 12.92 ;
10
10
}
11
-
11
+
12
12
return Math . pow ( ( val + 0.055 ) / 1.055 , 2.4 ) ;
13
13
} ) ;
14
14
}
@@ -21,11 +21,11 @@ function gam_sRGB(RGB) {
21
21
if ( val > 0.0031308 ) {
22
22
return 1.055 * Math . pow ( val , 1 / 2.4 ) - 0.055 ;
23
23
}
24
-
24
+
25
25
return 12.92 * val ;
26
26
} ) ;
27
27
}
28
-
28
+
29
29
function lin_sRGB_to_XYZ ( rgb ) {
30
30
// convert an array of linear-light sRGB values to CIE XYZ
31
31
// using sRGB's own white, D65 (no chromatic adaptation)
@@ -35,7 +35,7 @@ function lin_sRGB_to_XYZ(rgb) {
35
35
[ 0.2126729 , 0.7151522 , 0.0721750 ] ,
36
36
[ 0.0193339 , 0.1191920 , 0.9503041 ]
37
37
] ) ;
38
-
38
+
39
39
return math . multiply ( M , rgb ) . valueOf ( ) ;
40
40
}
41
41
@@ -46,15 +46,15 @@ function XYZ_to_lin_sRGB(XYZ) {
46
46
[ - 0.9692660 , 1.8760108 , 0.0415560 ] ,
47
47
[ 0.0556434 , - 0.2040259 , 1.0572252 ]
48
48
] ) ;
49
-
49
+
50
50
return math . multiply ( M , XYZ ) . valueOf ( ) ;
51
51
}
52
52
53
53
// DCI P3-related functions
54
54
55
55
56
56
function lin_P3 ( RGB ) {
57
- // convert an array of DCI P3 RGB values in the range 0.0 - 1.0
57
+ // convert an array of DCI P3 RGB values in the range 0.0 - 1.0
58
58
// to linear light (un-companded) form.
59
59
60
60
return RGB . map ( function ( val ) {
@@ -65,23 +65,23 @@ function lin_P3(RGB) {
65
65
function gam_P3 ( RGB ) {
66
66
// convert an array of linear-light P3 RGB in the range 0.0-1.0
67
67
// to gamma corrected form
68
-
68
+
69
69
return RGB . map ( function ( val ) {
70
70
return Math . pow ( val , 1 / 2.6 ) ;
71
71
} ) ;
72
72
}
73
-
73
+
74
74
function lin_P3_to_XYZ ( rgb ) {
75
75
// convert an array of linear-light P3 values to CIE XYZ
76
76
// using D65 (no chromatic adaptation)
77
77
// http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html
78
78
var M = math . matrix ( [
79
79
[ 0.4865709486482162 , 0.26566769316909306 , 0.1982172852343625 ] ,
80
- [ 0.2289745640697488 , 0.6917385218365064 , 0.079286914093745 ] ,
80
+ [ 0.2289745640697488 , 0.6917385218365064 , 0.079286914093745 ] ,
81
81
[ 0.0000000000000000 , 0.04511338185890264 , 1.043944368900976 ]
82
82
] ) ;
83
83
// 0 was computed as -3.972075516933488e-17
84
-
84
+
85
85
return math . multiply ( M , rgb ) . valueOf ( ) ;
86
86
}
87
87
@@ -92,45 +92,45 @@ function XYZ_to_lin_P3(XYZ) {
92
92
[ - 0.8294889695615747 , 1.7626640603183463 , 0.023624685841943577 ] ,
93
93
[ 0.03584583024378447 , - 0.07617238926804182 , 0.9568845240076872 ]
94
94
] ) ;
95
-
95
+
96
96
return math . multiply ( M , XYZ ) . valueOf ( ) ;
97
97
}
98
98
99
- //Rec.2020-related functions
99
+ //Rec. 2020-related functions
100
100
101
101
function lin_2020 ( RGB ) {
102
- // convert an array of Rec.2020 RGB values in the range 0.0 - 1.0
102
+ // convert an array of Rec. 2020 RGB values in the range 0.0 - 1.0
103
103
// to linear light (un-companded) form.
104
104
const α = 1.09929682680944 ;
105
105
const β = 0.018053968510807 ;
106
-
106
+
107
107
return RGB . map ( function ( val ) {
108
108
if ( val < β * 4.5 ) {
109
109
return val / 4.5 ;
110
110
}
111
-
111
+
112
112
return Math . pow ( ( val + α - 1 ) / α , 2.4 ) ;
113
113
} ) ;
114
114
}
115
115
//check with standard this really is 2.4 and 1/2.4, not 0.45 was wikipedia claims
116
116
117
117
function gam_2020 ( RGB ) {
118
- // convert an array of linear-light Rec.2020 RGB in the range 0.0-1.0
118
+ // convert an array of linear-light Rec. 2020 RGB in the range 0.0-1.0
119
119
// to gamma corrected form
120
120
const α = 1.09929682680944 ;
121
121
const β = 0.018053968510807 ;
122
-
122
+
123
123
return RGB . map ( function ( val ) {
124
124
if ( val > β ) {
125
125
return α * Math . pow ( val , 1 / 2.4 ) - ( α - 1 ) ;
126
126
}
127
-
127
+
128
128
return 4.5 * val ;
129
129
} ) ;
130
130
}
131
-
131
+
132
132
function lin_2020_to_XYZ ( rgb ) {
133
- // convert an array of linear-light rec. 2020 values to CIE XYZ
133
+ // convert an array of linear-light Rec. 2020 values to CIE XYZ
134
134
// using D65 (no chromatic adaptation)
135
135
// http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html
136
136
var M = math . matrix ( [
@@ -139,18 +139,18 @@ function lin_2020_to_XYZ(rgb) {
139
139
[ 0.000000000000000 , 0.028072693049087428 , 1.060985057710791 ]
140
140
] ) ;
141
141
// 0 is actually calculated as 4.994106574466076e-17
142
-
142
+
143
143
return math . multiply ( M , rgb ) . valueOf ( ) ;
144
144
}
145
145
146
146
function XYZ_to_lin_2020 ( XYZ ) {
147
- // convert XYZ to linear-light rec. 2020
147
+ // convert XYZ to linear-light Rec. 2020
148
148
var M = math . matrix ( [
149
149
[ 1.7166511879712674 , - 0.35567078377639233 , - 0.25336628137365974 ] ,
150
150
[ - 0.6666843518324892 , 1.6164812366349395 , 0.01576854581391113 ] ,
151
151
[ 0.017639857445310783 , - 0.042770613257808524 , 0.9421031212354738 ]
152
152
] ) ;
153
-
153
+
154
154
return math . multiply ( M , XYZ ) . valueOf ( ) ;
155
155
}
156
156
@@ -168,7 +168,7 @@ function D65_to_D50(XYZ) {
168
168
[ 0.0295424 , 0.9904844 , - 0.0170491 ] ,
169
169
[ - 0.0092345 , 0.0150436 , 0.7521316 ]
170
170
] ) ;
171
-
171
+
172
172
return math . multiply ( M , XYZ ) . valueOf ( ) ;
173
173
}
174
174
@@ -179,7 +179,7 @@ function D50_to_D65(XYZ) {
179
179
[ - 0.0282895 , 1.0099416 , 0.0210077 ] ,
180
180
[ 0.0122982 , - 0.0204830 , 1.3299098 ]
181
181
] ) ;
182
-
182
+
183
183
return math . multiply ( M , XYZ ) . valueOf ( ) ;
184
184
}
185
185
@@ -191,13 +191,13 @@ function XYZ_to_Lab(XYZ) {
191
191
var ε = 216 / 24389 ; // 6^3/29^3
192
192
var κ = 24389 / 27 ; // 29^3/3^3
193
193
var white = [ 0.9642 , 1.0000 , 0.8249 ] ; // D50 reference white
194
-
194
+
195
195
// compute xyz, which is XYZ scaled relative to reference white
196
196
var xyz = XYZ . map ( ( value , i ) => value / white [ i ] ) ;
197
-
197
+
198
198
// now compute f
199
199
var f = xyz . map ( value => value > ε ? Math . cbrt ( value ) : ( κ * value + 16 ) / 116 ) ;
200
-
200
+
201
201
return [
202
202
( 116 * f [ 1 ] ) - 16 , // L
203
203
500 * ( f [ 0 ] - f [ 1 ] ) , // a
@@ -212,28 +212,28 @@ function Lab_to_XYZ(Lab) {
212
212
var ε = 216 / 24389 ; // 6^3/29^3
213
213
var white = [ 0.9642 , 1.0000 , 0.8249 ] ; // D50 reference white
214
214
var f = [ ] ;
215
-
215
+
216
216
// compute f, starting with the luminance-related term
217
217
f [ 1 ] = ( Lab [ 0 ] + 16 ) / 116 ;
218
218
f [ 0 ] = Lab [ 1 ] / 500 + f [ 1 ] ;
219
219
f [ 2 ] = f [ 1 ] - Lab [ 2 ] / 200 ;
220
-
220
+
221
221
// compute xyz
222
222
var xyz = [
223
223
Math . pow ( f [ 0 ] , 3 ) > ε ? Math . pow ( f [ 0 ] , 3 ) : ( 116 * f [ 0 ] - 16 ) / κ ,
224
224
Lab [ 0 ] > κ * ε ? Math . pow ( ( Lab [ 0 ] + 16 ) / 116 , 3 ) : Lab [ 0 ] / κ ,
225
225
Math . pow ( f [ 2 ] , 3 ) > ε ? Math . pow ( f [ 2 ] , 3 ) : ( 116 * f [ 2 ] - 16 ) / κ
226
226
] ;
227
-
228
- // Compute XYZ by scaling xyz by reference white
227
+
228
+ // Compute XYZ by scaling xyz by reference white
229
229
return xyz . map ( ( value , i ) => value * white [ i ] ) ;
230
230
}
231
231
232
232
function Lab_to_LCH ( Lab ) {
233
233
// Convert to polar form
234
234
return [
235
235
Lab [ 0 ] , // L is still L
236
- Math . sqrt ( Math . pow ( Lab [ 1 ] , 2 ) + Math . pow ( Lab [ 2 ] , 2 ) ) , // Chroma
236
+ Math . sqrt ( Math . pow ( Lab [ 1 ] , 2 ) + Math . pow ( Lab [ 2 ] , 2 ) ) , // Chroma
237
237
Math . atan2 ( Lab [ 2 ] , Lab [ 1 ] ) * 180 / Math . PI // Hue, in degrees
238
238
] ;
239
239
}
0 commit comments