Skip to content

Commit 168b96b

Browse files
Fix cam16 and hct type errors (#622)
* Fix cam16 and hct type errors Add additional types, @ts-expect-error comments and some minor code changes to fix all typescript errors in the cam16 and hct modules. * Narrow number[] types to [number, number, number] Co-authored-by: Adam Thompson-Sharpe <[email protected]> --------- Co-authored-by: Adam Thompson-Sharpe <[email protected]>
1 parent 148af07 commit 168b96b

File tree

3 files changed

+95
-11
lines changed

3 files changed

+95
-11
lines changed

Diff for: src/spaces/cam16.js

+14-11
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ import {WHITES} from "../adapt.js";
88
/** @typedef {import("../types.js").Coords} Coords */
99
/** @typedef {import("../types.js").Matrix3x3} Matrix3x3 */
1010
/** @typedef {import("../types.js").Vector3} Vector3 */
11+
/** @typedef {import("../types.js").Cam16Object} Cam16Object */
12+
/** @typedef {import("../types.js").Cam16Input} Cam16Input */
13+
/** @typedef {import("../types.js").Cam16Environment} Cam16Environment */
1114

1215
const white = WHITES.D65;
1316
const adaptedCoef = 0.42;
@@ -117,6 +120,7 @@ export function invHueQuadrature (H) {
117120
* @param {number} backgroundLuminance
118121
* @param {keyof typeof surroundMap} surround
119122
* @param {boolean} discounting
123+
* @returns {Cam16Environment}
120124
*/
121125
export function environment (
122126
refWhite,
@@ -146,11 +150,10 @@ export function environment (
146150
const rgbW = multiply_v3_m3x3(xyzW, cat16);
147151

148152
// Surround: dark, dim, and average
149-
// @ts-expect-error surround is never used again
150-
surround = surroundMap[env.surround];
151-
const f = surround[0];
152-
env.c = surround[1];
153-
env.nc = surround[2];
153+
let values = surroundMap[env.surround];
154+
const f = values[0];
155+
env.c = values[1];
156+
env.nc = values[2];
154157

155158
const k = 1 / (5 * env.la + 1);
156159
const k4 = k ** 4;
@@ -199,27 +202,28 @@ const viewingConditions = environment(
199202
false,
200203
);
201204

202-
/** @typedef {{J: number, C: number, h: number, s: number, Q: number, M: number, H: number}} Cam16Object */
203205

204206
/**
205-
* @param {Cam16Object} cam16
206-
* @param {Record<string, unknown>} env
207+
* @param {Cam16Input} cam16
208+
* @param {Cam16Environment} env
207209
* @returns {[number, number, number]}
208-
* @todo Add types for `env`
209210
*/
210211
export function fromCam16 (cam16, env) {
211212

212213
// These check ensure one, and only one attribute for a
213214
// given category is provided.
215+
// @ts-expect-error The '^` operator is not allowed for boolean types
214216
if (!((cam16.J !== undefined) ^ (cam16.Q !== undefined))) {
215217
throw new Error("Conversion requires one and only one: 'J' or 'Q'");
216218
}
217219

220+
// @ts-expect-error - The '^` operator is not allowed for boolean types
218221
if (!((cam16.C !== undefined) ^ (cam16.M !== undefined) ^ (cam16.s !== undefined))) {
219222
throw new Error("Conversion requires one and only one: 'C', 'M' or 's'");
220223
}
221224

222225
// Hue is absolutely required
226+
// @ts-expect-error - The '^` operator is not allowed for boolean types
223227
if (!((cam16.h !== undefined) ^ (cam16.H !== undefined))) {
224228
throw new Error("Conversion requires one and only one: 'h' or 'H'");
225229
}
@@ -302,9 +306,8 @@ export function fromCam16 (cam16, env) {
302306

303307
/**
304308
* @param {[number, number, number]} xyzd65
305-
* @param {Record<string, unknown>} env
309+
* @param {Cam16Environment} env
306310
* @returns {Cam16Object}
307-
* @todo Add types for `env`
308311
*/
309312
export function toCam16 (xyzd65, env) {
310313
// Cone response

Diff for: src/types.d.ts

+35
Original file line numberDiff line numberDiff line change
@@ -205,3 +205,38 @@ export interface DeltasReturn {
205205
coords: [number, number, number];
206206
alpha: number;
207207
}
208+
209+
// cam16.js
210+
export type LightnessOrBrightness = { J: number; Q?: never; } | { J?: never; Q: number; };
211+
export type ChromaOrColorfulnessOrSaturation = { C: number; M?: never; s?: never; } | { C?: never; M: number; s?: never; } | { C?: never; M?: never; s: number; };
212+
export type HueOrHueQuadrature = { h: number; H?: never; } | { h?: never; H: number; };
213+
export type Cam16Input = LightnessOrBrightness & ChromaOrColorfulnessOrSaturation & HueOrHueQuadrature;
214+
215+
export interface Cam16Object {
216+
J: number,
217+
C: number,
218+
h: number,
219+
s: number,
220+
Q: number,
221+
M: number,
222+
H: number
223+
}
224+
225+
export interface Cam16Environment {
226+
discounting: boolean;
227+
refWhite: [number, number, number];
228+
surround: "dark" | "dim" | "average";
229+
la: number;
230+
yb: number;
231+
c: number;
232+
nc: number;
233+
fl: number;
234+
flRoot: number;
235+
n: number;
236+
z: number;
237+
nbb: number;
238+
ncb: number;
239+
dRgb: [number, number, number];
240+
dRgbInv: [number, number, number];
241+
aW: number;
242+
}

Diff for: types/test/cam16.ts

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { environment, fromCam16 } from "colorjs.io/src/spaces/cam16";
2+
3+
const viewingConditions = environment(
4+
[1, 2, 3],
5+
64 / Math.PI * 0.2, 20,
6+
"average",
7+
false,
8+
);
9+
// @ts-expect-error
10+
fromCam16({}, viewingConditions);
11+
12+
// @ts-expect-error
13+
fromCam16({J: 0}, viewingConditions);
14+
15+
// @ts-expect-error
16+
fromCam16({C: 0}, viewingConditions);
17+
18+
// @ts-expect-error
19+
fromCam16({h: 0}, viewingConditions);
20+
21+
// @ts-expect-error
22+
fromCam16({J: 0, C: 0}, viewingConditions);
23+
24+
// @ts-expect-error
25+
fromCam16({J: 0, H: 0}, viewingConditions);
26+
27+
// @ts-expect-error
28+
fromCam16({J: 0, C: 0, H: 0, Q: 0}, viewingConditions);
29+
30+
// @ts-expect-error
31+
fromCam16({J: 0, C: 0, H: 0, M: 0}, viewingConditions);
32+
33+
// @ts-expect-error
34+
fromCam16({J: 0, C: 0, H: 0, s: 0}, viewingConditions);
35+
36+
// @ts-expect-error
37+
fromCam16({J: 0, M: 0, H: 0, s: 0}, viewingConditions);
38+
39+
// @ts-expect-error
40+
fromCam16({J: 0, C: 0, H: 0, h: 0}, viewingConditions);
41+
42+
fromCam16({J: 0, C: 0, H: 0}, viewingConditions); // $ExpectType [number, number, number]
43+
fromCam16({Q: 0, M: 0, h: 0}, viewingConditions); // $ExpectType [number, number, number]
44+
fromCam16({Q: 0, s: 0, h: 0}, viewingConditions); // $ExpectType [number, number, number]
45+
46+

0 commit comments

Comments
 (0)