- commit
- 5a568136591570a7f6f869a38ac4c1a186106bfc
- parent
- 96a204aedf54cde3e9772c04032c63d7a3f9aefb
- Author
- Tobias Bengfort <tobias.bengfort@posteo.de>
- Date
- 2021-03-30 10:20
Merge branch 'oklab'
Diffstat
| M | preview/preview.svg | 358 | ++++++++++++++++++++++++++++++------------------------------ |
| M | xiwal/lch.py | 64 | ++++++++++++++++++++++++++++++------------------------------- |
| M | xiwal/scheme.py | 8 | ++++---- |
3 files changed, 214 insertions, 216 deletions
diff --git a/preview/preview.svg b/preview/preview.svg
@@ -2,209 +2,209 @@ 2 2 <svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2048 2048"> 3 3 <style> 4 4 @keyframes cycle1 {5 -1 0.0% {fill: #b12938}6 -1 6.7% {fill: #b11f5c}7 -1 13.3% {fill: #8e4e00}8 -1 20.0% {fill: #ae2f27}9 -1 26.7% {fill: #a8371e}10 -1 33.3% {fill: #7e43a3}11 -1 40.0% {fill: #9c4303}12 -1 46.7% {fill: #476700}13 -1 53.3% {fill: #7b5800}14 -1 60.0% {fill: #a23e11}15 -1 66.7% {fill: #ae2e2f}16 -1 73.3% {fill: #b3214a}17 -1 80.0% {fill: #b8006a}18 -1 86.7% {fill: #ad3100}19 -1 93.3% {fill: #ad2f2c}-1 5 0.0% {fill: #aa3139} -1 6 6.7% {fill: #aa295b} -1 7 13.3% {fill: #9d4700} -1 8 20.0% {fill: #a43e00} -1 9 26.7% {fill: #a63919} -1 10 33.3% {fill: #80439e} -1 11 40.0% {fill: #a24100} -1 12 46.7% {fill: #536f00} -1 13 53.3% {fill: #8e5400} -1 14 60.0% {fill: #a53d00} -1 15 66.7% {fill: #a73630} -1 16 73.3% {fill: #a6334c} -1 17 80.0% {fill: #d00069} -1 18 86.7% {fill: #a43f00} -1 19 93.3% {fill: #a7362e} 20 20 } 21 21 @keyframes cycle2 {22 -1 0.0% {fill: #7b8b0e}23 -1 6.7% {fill: #559300}24 -1 13.3% {fill: #798c10}25 -1 20.0% {fill: #54922c}26 -1 26.7% {fill: #7b8b0e}27 -1 33.3% {fill: #2184ea}28 -1 40.0% {fill: #66901f}29 -1 46.7% {fill: #678f1e}30 -1 53.3% {fill: #009759}31 -1 60.0% {fill: #d06435}32 -1 66.7% {fill: #d75d43}33 -1 73.3% {fill: #00938a}34 -1 80.0% {fill: #00982f}35 -1 86.7% {fill: #708e17}36 -1 93.3% {fill: #3c953a}-1 22 0.0% {fill: #818800} -1 23 6.7% {fill: #539500} -1 24 13.3% {fill: #7f8800} -1 25 20.0% {fill: #5f911e} -1 26 26.7% {fill: #868600} -1 27 33.3% {fill: #557ad9} -1 28 40.0% {fill: #748c00} -1 29 46.7% {fill: #659015} -1 30 53.3% {fill: #009958} -1 31 60.0% {fill: #c65c29} -1 32 66.7% {fill: #c9583d} -1 33 73.3% {fill: #009b8f} -1 34 80.0% {fill: #009e03} -1 35 86.7% {fill: #768b00} -1 36 93.3% {fill: #469538} 37 37 } 38 38 @keyframes cycle3 {39 -1 0.0% {fill: #a57d17}40 -1 6.7% {fill: #918500}41 -1 13.3% {fill: #967f6a}42 -1 20.0% {fill: #9a8043}43 -1 26.7% {fill: #9b7d6f}44 -1 33.3% {fill: #d15897}45 -1 40.0% {fill: #9e7d60}46 -1 46.7% {fill: #708d3b}47 -1 53.3% {fill: #95814f}48 -1 60.0% {fill: #cf6345}49 -1 66.7% {fill: #b57171}50 -1 73.3% {fill: #778780}51 -1 80.0% {fill: #9f8000}52 -1 86.7% {fill: #b17728}53 -1 93.3% {fill: #988143}-1 39 0.0% {fill: #a67600} -1 40 6.7% {fill: #977f00} -1 41 13.3% {fill: #927b66} -1 42 20.0% {fill: #987b3c} -1 43 26.7% {fill: #96786b} -1 44 33.3% {fill: #c54d8d} -1 45 40.0% {fill: #9a785b} -1 46 46.7% {fill: #728b35} -1 47 53.3% {fill: #937d49} -1 48 60.0% {fill: #c85a39} -1 49 66.7% {fill: #ae6a6b} -1 50 73.3% {fill: #74847d} -1 51 80.0% {fill: #ac7500} -1 52 86.7% {fill: #af700e} -1 53 93.3% {fill: #967c3b} 54 54 } 55 55 @keyframes cycle4 {56 -1 0.0% {fill: #446e8e}57 -1 6.7% {fill: #40717c}58 -1 13.3% {fill: #716771}59 -1 20.0% {fill: #596e6f}60 -1 26.7% {fill: #656b70}61 -1 33.3% {fill: #53699b}62 -1 40.0% {fill: #447270}63 -1 46.7% {fill: #5f6e58}64 -1 53.3% {fill: #626d60}65 -1 60.0% {fill: #8a55a0}66 -1 66.7% {fill: #7b646a}67 -1 73.3% {fill: #646b74}68 -1 80.0% {fill: #006eb5}69 -1 86.7% {fill: #007775}70 -1 93.3% {fill: #6e696a}-1 56 0.0% {fill: #4f7595} -1 57 6.7% {fill: #4a7a84} -1 58 13.3% {fill: #776d77} -1 59 20.0% {fill: #607677} -1 60 26.7% {fill: #6c7277} -1 61 33.3% {fill: #5e6fa1} -1 62 40.0% {fill: #4c7b79} -1 63 46.7% {fill: #68765f} -1 64 53.3% {fill: #6a7568} -1 65 60.0% {fill: #8e57a2} -1 66 66.7% {fill: #816a70} -1 67 73.3% {fill: #6b727b} -1 68 80.0% {fill: #1675be} -1 69 86.7% {fill: #008280} -1 70 93.3% {fill: #756f70} 71 71 } 72 72 @keyframes cycle5 {73 -1 0.0% {fill: #7f5e8a}74 -1 6.7% {fill: #cd0e70}75 -1 13.3% {fill: #796563}76 -1 20.0% {fill: #856253}77 -1 26.7% {fill: #a44f62}78 -1 33.3% {fill: #805aa1}79 -1 40.0% {fill: #756859}80 -1 46.7% {fill: #5b6e6a}81 -1 53.3% {fill: #9b5b14}82 -1 60.0% {fill: #cc2821}83 -1 66.7% {fill: #995759}84 -1 73.3% {fill: #925a69}85 -1 80.0% {fill: #c7009b}86 -1 86.7% {fill: #a2552e}87 -1 93.3% {fill: #8d5c6f}-1 73 0.0% {fill: #84628f} -1 74 6.7% {fill: #ca0e6e} -1 75 13.3% {fill: #806c69} -1 76 20.0% {fill: #bf3e31} -1 77 26.7% {fill: #a85264} -1 78 33.3% {fill: #855da4} -1 79 40.0% {fill: #7d6e5f} -1 80 46.7% {fill: #637672} -1 81 53.3% {fill: #a35e08} -1 82 60.0% {fill: #ce2310} -1 83 66.7% {fill: #9e5b5d} -1 84 73.3% {fill: #965e6d} -1 85 80.0% {fill: #c6009a} -1 86 86.7% {fill: #c23e00} -1 87 93.3% {fill: #926074} 88 88 } 89 89 @keyframes cycle6 {90 -1 0.0% {fill: #42817a}91 -1 6.7% {fill: #328190}92 -1 13.3% {fill: #7c747f}93 -1 20.0% {fill: #7e7755}94 -1 26.7% {fill: #747774}95 -1 33.3% {fill: #6b7697}96 -1 40.0% {fill: #008582}97 -1 46.7% {fill: #687d53}98 -1 53.3% {fill: #747966}99 -1 60.0% {fill: #897169}100 -1 66.7% {fill: #6e768e}101 -1 73.3% {fill: #008488}102 -1 80.0% {fill: #008390}103 -1 86.7% {fill: #3d8277}104 -1 93.3% {fill: #77738e}-1 90 0.0% {fill: #4e8d85} -1 91 6.7% {fill: #428c9b} -1 92 13.3% {fill: #857c87} -1 93 20.0% {fill: #88805d} -1 94 26.7% {fill: #7d817d} -1 95 33.3% {fill: #757ea0} -1 96 40.0% {fill: #20918f} -1 97 46.7% {fill: #728b35} -1 98 53.3% {fill: #7e8270} -1 99 60.0% {fill: #927a71} -1 100 66.7% {fill: #777f97} -1 101 73.3% {fill: #00949a} -1 102 80.0% {fill: #0095aa} -1 103 86.7% {fill: #498e83} -1 104 93.3% {fill: #7f7c97} 105 105 } 106 106 107 107 @keyframes cycle9 {108 -1 0.0% {fill: #df545a}109 -1 6.7% {fill: #df4f81}110 -1 13.3% {fill: #be711e}111 -1 20.0% {fill: #dc5949}112 -1 26.7% {fill: #d65f40}113 -1 33.3% {fill: #a769cd}114 -1 40.0% {fill: #ca692c}115 -1 46.7% {fill: #6a8f1c}116 -1 53.3% {fill: #aa7b09}117 -1 60.0% {fill: #d06435}118 -1 66.7% {fill: #dc5851}119 -1 73.3% {fill: #e1506e}120 -1 80.0% {fill: #fc0094}121 -1 86.7% {fill: #dd5a28}122 -1 93.3% {fill: #db594e}-1 108 0.0% {fill: #dd6163} -1 109 6.7% {fill: #de5b86} -1 110 13.3% {fill: #cf7504} -1 111 20.0% {fill: #d76c38} -1 112 26.7% {fill: #da6849} -1 113 33.3% {fill: #ae70cf} -1 114 40.0% {fill: #d56f2a} -1 115 46.7% {fill: #7e9c1c} -1 116 53.3% {fill: #be8100} -1 117 60.0% {fill: #d86c3a} -1 118 66.7% {fill: #db655b} -1 119 73.3% {fill: #d96277} -1 120 80.0% {fill: #fe0096} -1 121 86.7% {fill: #d66d32} -1 122 93.3% {fill: #db6559} 123 123 } 124 124 @keyframes cycle10 {125 -1 0.0% {fill: #b3c14a}126 -1 6.7% {fill: #80cc26}127 -1 13.3% {fill: #b0c14b}128 -1 20.0% {fill: #8ac95f}129 -1 26.7% {fill: #b3c14a}130 -1 33.3% {fill: #97b8fe}131 -1 40.0% {fill: #9cc655}132 -1 46.7% {fill: #9ec554}133 -1 53.3% {fill: #43d086}134 -1 60.0% {fill: #ffa179}135 -1 66.7% {fill: #fea088}136 -1 73.3% {fill: #00cec1}137 -1 80.0% {fill: #31d350}138 -1 86.7% {fill: #a7c34f}139 -1 93.3% {fill: #74cc6c}-1 125 0.0% {fill: #aeb733} -1 126 6.7% {fill: #80c500} -1 127 13.3% {fill: #acb734} -1 128 20.0% {fill: #8cc054} -1 129 26.7% {fill: #b4b52d} -1 130 33.3% {fill: #81a9fe} -1 131 40.0% {fill: #a1bb40} -1 132 46.7% {fill: #91bf4f} -1 133 53.3% {fill: #4ac985} -1 134 60.0% {fill: #fa8b5a} -1 135 66.7% {fill: #fd876a} -1 136 73.3% {fill: #00cbbd} -1 137 80.0% {fill: #2acf4a} -1 138 86.7% {fill: #a3ba3e} -1 139 93.3% {fill: #75c467} 140 140 } 141 141 @keyframes cycle11 {142 -1 0.0% {fill: #eebf5b}143 -1 6.7% {fill: #d9c842}144 -1 13.3% {fill: #dbc2ab}145 -1 20.0% {fill: #e1c282}146 -1 26.7% {fill: #e0bfb1}147 -1 33.3% {fill: #ffafd3}148 -1 40.0% {fill: #e4bfa0}149 -1 46.7% {fill: #b4d07a}150 -1 53.3% {fill: #dbc48e}151 -1 60.0% {fill: #feb49e}152 -1 66.7% {fill: #feb3b3}153 -1 73.3% {fill: #b9cac2}154 -1 80.0% {fill: #eec100}155 -1 86.7% {fill: #fcb968}156 -1 93.3% {fill: #dec381}-1 142 0.0% {fill: #f8c55d} -1 143 6.7% {fill: #e6ce3e} -1 144 13.3% {fill: #e1c8b1} -1 145 20.0% {fill: #e8c988} -1 146 26.7% {fill: #e6c5b6} -1 147 33.3% {fill: #fe9ddc} -1 148 40.0% {fill: #eac5a6} -1 149 46.7% {fill: #beda83} -1 150 53.3% {fill: #e2cb95} -1 151 60.0% {fill: #fea985} -1 152 66.7% {fill: #feb7b7} -1 153 73.3% {fill: #c1d2cb} -1 154 80.0% {fill: #fec600} -1 155 86.7% {fill: #febe6c} -1 156 93.3% {fill: #e6ca88} 157 157 } 158 158 @keyframes cycle12 {159 -1 0.0% {fill: #6b95b6}-1 159 0.0% {fill: #6c94b5} 160 160 6.7% {fill: #6798a3}161 -1 13.3% {fill: #988d98}162 -1 20.0% {fill: #7e9496}163 -1 26.7% {fill: #8b9197}164 -1 33.3% {fill: #7a8fc4}165 -1 40.0% {fill: #699996}166 -1 46.7% {fill: #85957d}167 -1 53.3% {fill: #889386}168 -1 60.0% {fill: #b37bc9}169 -1 66.7% {fill: #a38a90}170 -1 73.3% {fill: #8a919b}171 -1 80.0% {fill: #4a94e0}172 -1 86.7% {fill: #329f9d}173 -1 93.3% {fill: #958f90}-1 161 13.3% {fill: #958b95} -1 162 20.0% {fill: #7e9495} -1 163 26.7% {fill: #898f95} -1 164 33.3% {fill: #7a8dc1} -1 165 40.0% {fill: #6a9997} -1 166 46.7% {fill: #85947c} -1 167 53.3% {fill: #879385} -1 168 60.0% {fill: #ad75c3} -1 169 66.7% {fill: #a0878d} -1 170 73.3% {fill: #888f99} -1 171 80.0% {fill: #3d94df} -1 172 86.7% {fill: #35a19f} -1 173 93.3% {fill: #938d8e} 174 174 } 175 175 @keyframes cycle13 {176 -1 0.0% {fill: #a784b2}177 -1 6.7% {fill: #fb4c96}178 -1 13.3% {fill: #a18b89}179 -1 20.0% {fill: #ad8878}180 -1 26.7% {fill: #cf7587}181 -1 33.3% {fill: #a880ca}182 -1 40.0% {fill: #9c8e7e}183 -1 46.7% {fill: #819490}184 -1 53.3% {fill: #c7803b}185 -1 60.0% {fill: #fc5743}186 -1 66.7% {fill: #c37d7e}187 -1 73.3% {fill: #bb808f}188 -1 80.0% {fill: #f842c6}189 -1 86.7% {fill: #ce7b51}190 -1 93.3% {fill: #b68196}-1 176 0.0% {fill: #a380ae} -1 177 6.7% {fill: #ef408c} -1 178 13.3% {fill: #9e8987} -1 179 20.0% {fill: #e25f4f} -1 180 26.7% {fill: #c97082} -1 181 33.3% {fill: #a37ac4} -1 182 40.0% {fill: #9b8c7c} -1 183 46.7% {fill: #80948f} -1 184 53.3% {fill: #c37c34} -1 185 60.0% {fill: #f34c37} -1 186 66.7% {fill: #be7979} -1 187 73.3% {fill: #b67b8a} -1 188 80.0% {fill: #ea31ba} -1 189 86.7% {fill: #e55f2a} -1 190 93.3% {fill: #b17d91} 191 191 } 192 192 @keyframes cycle14 {193 -1 0.0% {fill: #84c4bc}194 -1 6.7% {fill: #79c3d4}195 -1 13.3% {fill: #bfb5c1}196 -1 20.0% {fill: #c1b894}197 -1 26.7% {fill: #b6b9b6}198 -1 33.3% {fill: #adb7dc}199 -1 40.0% {fill: #62c8c5}200 -1 46.7% {fill: #aabf92}201 -1 53.3% {fill: #b6baa7}202 -1 60.0% {fill: #cdb3aa}203 -1 66.7% {fill: #afb8d1}204 -1 73.3% {fill: #39cbd0}205 -1 80.0% {fill: #00cbdf}206 -1 86.7% {fill: #80c5b8}207 -1 93.3% {fill: #b9b5d2}-1 193 0.0% {fill: #8bccc3} -1 194 6.7% {fill: #81cadb} -1 195 13.3% {fill: #c3b9c5} -1 196 20.0% {fill: #c7be99} -1 197 26.7% {fill: #bbbebb} -1 198 33.3% {fill: #b2bce0} -1 199 40.0% {fill: #6bd1cd} -1 200 46.7% {fill: #aeca73} -1 201 53.3% {fill: #bbc0ac} -1 202 60.0% {fill: #d1b7ae} -1 203 66.7% {fill: #b4bdd6} -1 204 73.3% {fill: #46d4d9} -1 205 80.0% {fill: #00d5eb} -1 206 86.7% {fill: #88cdc0} -1 207 93.3% {fill: #bdb9d6} 208 208 } 209 209 210 210 text {
diff --git a/xiwal/lch.py b/xiwal/lch.py
@@ -1,6 +1,9 @@1 -1 import math-1 1 """Oklab color model. -1 2 -1 3 https://bottosson.github.io/posts/oklab/ -1 4 """ 2 53 -1 WHITE = (95.05, 100, 108.9)-1 6 import math 4 7 5 8 6 9 def _srgb2rgb(c): @@ -9,11 +12,10 @@ def _srgb2rgb(c): 9 12 c = c / 12.92 10 13 else: 11 14 c = ((c + 0.055) / 1.055) ** 2.412 -1 return c * 100-1 15 return c 13 16 14 17 15 18 def _rgb2srgb(c):16 -1 c = c / 100.017 19 if c <= 0.0031308: 18 20 c = c * 12.92 19 21 else: @@ -21,46 +23,42 @@ def _rgb2srgb(c): 21 23 return c * 255 22 24 23 2524 -1 def _xyz2lab(t):25 -1 if t > 216.0 / 24389:26 -1 return t ** (1.0 / 3)27 -1 else:28 -1 return 841.0 / 108 * t + 4.0 / 2929 -130 -131 -1 def _lab2xyz(t):32 -1 if t > 6.0 / 29:33 -1 return t ** 334 -1 else:35 -1 return 108.0 / 841 * (t - 4.0 / 29)36 -137 -138 26 def rgb2lab(rgb): 39 27 r, g, b = map(_srgb2rgb, rgb) 40 2841 -1 x = _xyz2lab((0.4124 * r + 0.3576 * g + 0.1805 * b) / WHITE[0])42 -1 y = _xyz2lab((0.2126 * r + 0.7152 * g + 0.0722 * b) / WHITE[1])43 -1 z = _xyz2lab((0.0193 * r + 0.1192 * g + 0.9505 * b) / WHITE[2])-1 29 l = 0.4121656120 * r + 0.5362752080 * g + 0.0514575653 * b -1 30 m = 0.2118591070 * r + 0.6807189584 * g + 0.1074065790 * b -1 31 s = 0.0883097947 * r + 0.2818474174 * g + 0.6302613616 * b 44 3245 -1 l = 116 * y - 1646 -1 a = 500 * (x - y)47 -1 b = 200 * (y - z)-1 33 l_ = l ** (1 / 3) -1 34 m_ = m ** (1 / 3) -1 35 s_ = s ** (1 / 3) 48 3649 -1 return l, a, b-1 37 L = 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_ -1 38 a = 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_ -1 39 b = 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_ -1 40 -1 41 return L, a, b 50 42 51 43 52 44 def lab2rgb(lab):53 -1 l, a, b = lab-1 45 L, a, b = lab -1 46 -1 47 l_ = L + 0.3963377774 * a + 0.2158037573 * b -1 48 m_ = L - 0.1055613458 * a - 0.0638541728 * b -1 49 s_ = L - 0.0894841775 * a - 1.2914855480 * b 54 5055 -1 l = (l + 16) / 116.0-1 51 l = l_ ** 3 -1 52 m = m_ ** 3 -1 53 s = s_ ** 3 56 5457 -1 x = WHITE[0] * _lab2xyz(l + a / 500)58 -1 y = WHITE[1] * _lab2xyz(l)59 -1 z = WHITE[2] * _lab2xyz(l - b / 200)-1 55 r = +4.0767245293 * l - 3.3072168827 * m + 0.2307590544 * s -1 56 g = -1.2681437731 * l + 2.6093323231 * m - 0.3411344290 * s -1 57 b = -0.0041119885 * l - 0.7034763098 * m + 1.7068625689 * s 60 5861 -1 r = 3.2406 * x - 1.5372 * y - 0.4986 * z62 -1 g = -0.9689 * x + 1.8758 * y + 0.0415 * z63 -1 b = 0.0557 * x - 0.2040 * y + 1.0570 * z-1 59 r = max(0, min(1, r)) -1 60 g = max(0, min(1, g)) -1 61 b = max(0, min(1, b)) 64 62 65 63 return tuple(map(_rgb2srgb, (r, g, b))) 66 64
diff --git a/xiwal/scheme.py b/xiwal/scheme.py
@@ -4,10 +4,10 @@ import functools 4 4 from . import lch 5 5 6 6 # Minimum chroma for red/green (signal colors)7 -1 C_RG = 60-1 7 C_RG = 0.15 8 8 9 9 # MAXIMUM chroma for greys10 -1 C_GREY = 8-1 10 C_GREY = 0.02 11 11 12 12 C_FACTOR = 1.2 13 13 @@ -16,8 +16,8 @@ C_FACTOR = 1.2 16 16 # - dark colors should have sufficient contrast to both black and white 17 17 # - light colors should have different levels of lightness so they can 18 18 # easily be distinguished19 -1 L_DARK = 2, 40, 55, 55, 45, 45, 50, 8520 -1 L_LIGHT = 20, 55, 75, 80, 60, 60, 75, 100-1 19 L_DARK = 0.15, 0.50, 0.60, 0.60, 0.55, 0.55, 0.60, 0.90 -1 20 L_LIGHT = 0.30, 0.65, 0.75, 0.85, 0.65, 0.65, 0.80, 1.00 21 21 22 22 # hue for red reference color 23 23 OFFSET = math.pi * 2 / 14