Skip to content

Commit a2f4d22

Browse files
committed
Move color conversion code to the bottom of the file
It’s internal undocumented code, Color is better higher in the code.
1 parent 56c498b commit a2f4d22

File tree

1 file changed

+47
-46
lines changed

1 file changed

+47
-46
lines changed

tinycss2/color4.py

Lines changed: 47 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -13,52 +13,6 @@
1313
}
1414
COLOR_SPACES = _FUNCTION_SPACES | {'hsl', 'hwb', 'lab', 'lch', 'oklab', 'oklch'}
1515

16-
# Code adapted from https://www.w3.org/TR/css-color-4/#color-conversion-code.
17-
= 24389 / 27
18-
= 216 / 24389
19-
_LMS_TO_XYZ = (
20-
(1.2268798733741557, -0.5578149965554813, 0.28139105017721583),
21-
(-0.04057576262431372, 1.1122868293970594, -0.07171106666151701),
22-
(-0.07637294974672142, -0.4214933239627914, 1.5869240244272418),
23-
)
24-
_OKLAB_TO_LMS = (
25-
(0.99999999845051981432, 0.39633779217376785678, 0.21580375806075880339),
26-
(1.0000000088817607767, -0.1055613423236563494, -0.063854174771705903402),
27-
(1.0000000546724109177, -0.089484182094965759684, -1.2914855378640917399),
28-
)
29-
30-
def _xyz_to_lab(X, Y, Z, d):
31-
x = X / d[0]
32-
y = Y / d[1]
33-
z = Z / d[2]
34-
f0 = x ** (1 / 3) if x > else ( * x + 16) / 116
35-
f1 = y ** (1 / 3) if y > else ( * y + 16) / 116
36-
f2 = z ** (1 / 3) if z > else ( * z + 16) / 116
37-
L = (116 * f1) - 16
38-
a = 500 * (f0 - f1)
39-
b = 200 * (f1 - f2)
40-
return L, a, b
41-
42-
43-
def _lab_to_xyz(L, a, b, d):
44-
f1 = (L + 16) / 116
45-
f0 = a / 500 + f1
46-
f2 = f1 - b / 200
47-
x = (f0 ** 3 if f0 ** 3 > else (116 * f0 - 16) / )
48-
y = (((L + 16) / 116) ** 3 if L > * else L / )
49-
z = (f2 ** 3 if f2 ** 3 > else (116 * f2 - 16) / )
50-
X = x * d[0]
51-
Y = y * d[1]
52-
Z = z * d[2]
53-
return X, Y, Z
54-
55-
56-
def _oklab_to_xyz(L, a, b):
57-
lab = (L, a, b)
58-
lms = [sum(_OKLAB_TO_LMS[i][j] * lab[j] for j in range(3)) for i in range(3)]
59-
X, Y, Z = [sum(_LMS_TO_XYZ[i][j] * lms[j]**3 for j in range(3)) for i in range(3)]
60-
return X, Y, Z
61-
6216

6317
class Color:
6418
"""A specified color in a defined color space.
@@ -462,6 +416,53 @@ def _types(tokens):
462416
return types
463417

464418

419+
# Code adapted from https://www.w3.org/TR/css-color-4/#color-conversion-code.
420+
= 24389 / 27
421+
= 216 / 24389
422+
_LMS_TO_XYZ = (
423+
(1.2268798733741557, -0.5578149965554813, 0.28139105017721583),
424+
(-0.04057576262431372, 1.1122868293970594, -0.07171106666151701),
425+
(-0.07637294974672142, -0.4214933239627914, 1.5869240244272418),
426+
)
427+
_OKLAB_TO_LMS = (
428+
(0.99999999845051981432, 0.39633779217376785678, 0.21580375806075880339),
429+
(1.0000000088817607767, -0.1055613423236563494, -0.063854174771705903402),
430+
(1.0000000546724109177, -0.089484182094965759684, -1.2914855378640917399),
431+
)
432+
433+
def _xyz_to_lab(X, Y, Z, d):
434+
x = X / d[0]
435+
y = Y / d[1]
436+
z = Z / d[2]
437+
f0 = x ** (1 / 3) if x > else ( * x + 16) / 116
438+
f1 = y ** (1 / 3) if y > else ( * y + 16) / 116
439+
f2 = z ** (1 / 3) if z > else ( * z + 16) / 116
440+
L = (116 * f1) - 16
441+
a = 500 * (f0 - f1)
442+
b = 200 * (f1 - f2)
443+
return L, a, b
444+
445+
446+
def _lab_to_xyz(L, a, b, d):
447+
f1 = (L + 16) / 116
448+
f0 = a / 500 + f1
449+
f2 = f1 - b / 200
450+
x = (f0 ** 3 if f0 ** 3 > else (116 * f0 - 16) / )
451+
y = (((L + 16) / 116) ** 3 if L > * else L / )
452+
z = (f2 ** 3 if f2 ** 3 > else (116 * f2 - 16) / )
453+
X = x * d[0]
454+
Y = y * d[1]
455+
Z = z * d[2]
456+
return X, Y, Z
457+
458+
459+
def _oklab_to_xyz(L, a, b):
460+
lab = (L, a, b)
461+
lms = [sum(_OKLAB_TO_LMS[i][j] * lab[j] for j in range(3)) for i in range(3)]
462+
X, Y, Z = [sum(_LMS_TO_XYZ[i][j] * lms[j]**3 for j in range(3)) for i in range(3)]
463+
return X, Y, Z
464+
465+
465466
# (r, g, b) in 0..255
466467
_EXTENDED_COLOR_KEYWORDS = _EXTENDED_COLOR_KEYWORDS.copy()
467468
_EXTENDED_COLOR_KEYWORDS.append(('rebeccapurple', (102, 51, 153)))

0 commit comments

Comments
 (0)