|
13 | 13 | }
|
14 | 14 | COLOR_SPACES = _FUNCTION_SPACES | {'hsl', 'hwb', 'lab', 'lch', 'oklab', 'oklch'}
|
15 | 15 |
|
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 |
| - |
62 | 16 |
|
63 | 17 | class Color:
|
64 | 18 | """A specified color in a defined color space.
|
@@ -462,6 +416,53 @@ def _types(tokens):
|
462 | 416 | return types
|
463 | 417 |
|
464 | 418 |
|
| 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 | + |
465 | 466 | # (r, g, b) in 0..255
|
466 | 467 | _EXTENDED_COLOR_KEYWORDS = _EXTENDED_COLOR_KEYWORDS.copy()
|
467 | 468 | _EXTENDED_COLOR_KEYWORDS.append(('rebeccapurple', (102, 51, 153)))
|
|
0 commit comments