From ecdead20c72ec609ba996efa105cbaa875d4ee19 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 14 Oct 2026 11:57:53 +0000 Subject: [PATCH] Select Color: CMYK sliders, field below the sliders, Document first - Editor modes RGB, HSB and CMYK; the saturation/brightness field and hue strip now sit below the sliders in every mode instead of being a mode. - The panel opens on the Document tab. - Built-in colour books: RAL CLASSIC and SIKKENS 4041 (Open Colour Systems Collection 2.0, CC BY-ND 4.0); CSS COLORS removed. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_013rGmDUNr1hUf4zo1X3dak8 --- assets/color_books/README.md | 12 +- assets/color_books/css-colors.acb | 202 --- assets/color_books/sikkens-4041.acb | 2101 +++++++++++++++++++++++++++ src/ui/color_select/book.rs | 2 +- src/ui/color_select/editor.rs | 161 +- src/ui/color_select/math.rs | 18 + src/ui/color_select/picker.rs | 32 +- 7 files changed, 2205 insertions(+), 323 deletions(-) delete mode 100644 assets/color_books/css-colors.acb create mode 100644 assets/color_books/sikkens-4041.acb diff --git a/assets/color_books/README.md b/assets/color_books/README.md index d20dbd5f6..5b4198ea6 100644 --- a/assets/color_books/README.md +++ b/assets/color_books/README.md @@ -3,11 +3,11 @@ AutoCAD `.acb` colour books built into the Select Color panel. Each file carries its source and licence in its header comment. -| File | Book | Licence | +| File | Book | Source and licence | |---|---|---| -| `ral-classic.acb` | RAL CLASSIC, 216 approximate sRGB values | CC BY-SA 4.0, adapted from Wikipedia, "List of RAL colours" | -| `css-colors.acb` | CSS COLORS, the 148 CSS named colours | Values from the W3C CSS Color Module Level 4 | +| `ral-classic.acb` | RAL CLASSIC, 216 approximate sRGB values | Adapted from Wikipedia, "List of RAL colours"; CC BY-SA 4.0 | +| `sikkens-4041.acb` | SIKKENS 4041, 1,624 colours | Open Colour Systems Collection 2.0, © 2015 dtp studio oldenburg (freieFarbe e.V.); CC BY-ND 4.0. Converted from the GIMP palette: same names, values and order, only the file format changed | -RAL is a registered trademark of RAL gGmbH. The RAL values are approximate -screen representations, not colour-binding references, and are not -affiliated with, endorsed by or licensed by RAL gGmbH. +Values are approximate screen representations, not colour-binding +references. RAL is a registered trademark of RAL gGmbH and Sikkens of +AkzoNobel; these files are not affiliated with or endorsed by either. diff --git a/assets/color_books/css-colors.acb b/assets/color_books/css-colors.acb deleted file mode 100644 index 0868c4b83..000000000 --- a/assets/color_books/css-colors.acb +++ /dev/null @@ -1,202 +0,0 @@ - - - - CSS COLORS - 1 - 0 - - mistyrose255228225 - red25500 - salmon250128114 - lightcoral240128128 - indianred2059292 - rosybrown188143143 - firebrick1783434 - - - brown1654242 - darkred13900 - maroon12800 - coral25512780 - lightsalmon255160122 - orangered255690 - tomato2559971 - - - darksalmon233150122 - sienna1608245 - bisque255228196 - blanchedalmond255235205 - darkorange2551400 - navajowhite255222173 - papayawhip255239213 - - - peachpuff255218185 - antiquewhite250235215 - sandybrown24416496 - burlywood222184135 - chocolate21010530 - tan210180140 - peru20513363 - - - saddlebrown1396919 - cornsilk255248220 - gold2552150 - moccasin255228181 - orange2551650 - wheat245222179 - goldenrod21816532 - - - darkgoldenrod18413411 - lemonchiffon255250205 - lightyellow255255224 - yellow2552550 - lightgoldenrodyellow250250210 - beige245245220 - khaki240230140 - - - palegoldenrod238232170 - darkkhaki189183107 - olive1281280 - yellowgreen15420550 - olivedrab10714235 - darkolivegreen8510747 - chartreuse1272550 - - - greenyellow17325547 - lawngreen1242520 - lime02550 - palegreen152251152 - lightgreen144238144 - limegreen5020550 - darkseagreen143188143 - - - forestgreen3413934 - green01280 - darkgreen01000 - springgreen0255127 - mediumspringgreen0250154 - mediumseagreen60179113 - seagreen4613987 - - - aquamarine127255212 - mediumaquamarine102205170 - aqua0255255 - cyan0255255 - lightcyan224255255 - paleturquoise175238238 - powderblue176224230 - - - turquoise64224208 - darkturquoise0206209 - mediumturquoise72209204 - lightseagreen32178170 - cadetblue95158160 - darkcyan0139139 - teal0128128 - - - darkslategray477979 - darkslategrey477979 - deepskyblue0191255 - skyblue135206235 - lightblue173216230 - dodgerblue30144255 - lightskyblue135206250 - - - lightsteelblue176196222 - steelblue70130180 - lightslategray119136153 - lightslategrey119136153 - slategray112128144 - slategrey112128144 - cornflowerblue100149237 - - - royalblue65105225 - blue00255 - mediumblue00205 - darkblue00139 - navy00128 - midnightblue2525112 - mediumslateblue123104238 - - - mediumpurple147112219 - slateblue10690205 - darkslateblue7261139 - blueviolet13843226 - rebeccapurple10251153 - indigo750130 - darkviolet1480211 - - - mediumorchid18685211 - darkorchid15350204 - fuchsia2550255 - magenta2550255 - violet238130238 - plum221160221 - orchid218112214 - - - thistle216191216 - darkmagenta1390139 - purple1280128 - mediumvioletred19921133 - deeppink25520147 - hotpink255105180 - lightpink255182193 - - - pink255192203 - crimson2202060 - palevioletred219112147 - aliceblue240248255 - azure240255255 - floralwhite255250240 - ghostwhite248248255 - - - honeydew240255240 - ivory255255240 - lavenderblush255240245 - mintcream245255250 - seashell255245238 - snow255250250 - white255255255 - - - oldlace253245230 - lavender230230250 - linen250240230 - whitesmoke245245245 - gainsboro220220220 - lightgray211211211 - lightgrey211211211 - - - silver192192192 - darkgray169169169 - darkgrey169169169 - gray128128128 - grey128128128 - dimgray105105105 - dimgrey105105105 - - - black000 - - diff --git a/assets/color_books/sikkens-4041.acb b/assets/color_books/sikkens-4041.acb new file mode 100644 index 000000000..d1aba92aa --- /dev/null +++ b/assets/color_books/sikkens-4041.acb @@ -0,0 +1,2101 @@ + + + + SIKKENS 4041 + 1 + 0 + + Sikkens ON.00.90241239236 + Sikkens ON.00.81221221218 + Sikkens ON.00.69192191189 + Sikkens ON.00.60165163162 + Sikkens ON.00.50135135134 + Sikkens ON.00.40108107106 + Sikkens ON.00.31888686 + + + Sikkens ON.00.21686665 + Sikkens ON.00.86235234230 + Sikkens ON.00.76207206205 + Sikkens ON.00.64179177175 + Sikkens ON.00.55150150148 + Sikkens ON.00.45125124124 + Sikkens ON.00.3610099100 + + + Sikkens ON.00.26777676 + Sikkens ON.00.15575657 + Sikkens ON.00.83228229224 + Sikkens ON.00.78214214211 + Sikkens ON.00.63176174170 + Sikkens ON.00.58160159160 + Sikkens ON.00.53146146146 + + + Sikkens ON.00.33949493 + Sikkens ON.01.26808182 + Sikkens ON.00.10454443 + Sikkens AN.02.82231221221 + Sikkens AN.01.80223216214 + Sikkens AN.02.80230218217 + Sikkens AN.02.77222208209 + + + Sikkens AN.02.65184174174 + Sikkens AN.02.55157148149 + Sikkens AN.02.3510599100 + Sikkens AN.02.25827879 + Sikkens A0.05.85247223224 + Sikkens A0.05.75221197201 + Sikkens A0.05.65194173176 + + + Sikkens A0.05.55163143148 + Sikkens A0.05.45134119122 + Sikkens A0.05.3511397101 + Sikkens A0.05.25867476 + Sikkens A0.05.15665858 + Sikkens A0.07.77237204212 + Sikkens A0.10.75245195206 + + + Sikkens A0.10.70227181194 + Sikkens A0.10.60194155166 + Sikkens A0.10.50163129139 + Sikkens A0.10.40133105113 + Sikkens A0.10.301057886 + Sikkens A0.10.20826266 + Sikkens A0.15.65225162177 + + + Sikkens A0.20.60215140162 + Sikkens A0.20.50190123143 + Sikkens A0.20.4015495111 + Sikkens A0.20.301257592 + Sikkens A0.20.20965768 + Sikkens A0.20.12724353 + Sikkens A6.25.05694548 + + + Sikkens A8.20.60218143151 + Sikkens A6.30.50201104122 + Sikkens A0.30.50204104138 + Sikkens A6.35.4018279107 + Sikkens A0.30.4016883111 + Sikkens A0.30.301376693 + Sikkens A0.41.281494384 + + + Sikkens A0.30.201094669 + Sikkens B3.19.67239158159 + Sikkens B2.30.60227126132 + Sikkens B3.37.51222100111 + Sikkens B2.40.5021793105 + Sikkens B0.39.401876990 + Sikkens B0.39.301515674 + + + Sikkens B0.35.251265163 + Sikkens B0.25.251186472 + Sikkens B3.31.54228116124 + Sikkens B6.40.5021795100 + Sikkens B6.40.401837481 + Sikkens B6.50.401925874 + Sikkens B2.40.401856687 + + + Sikkens B3.49.331714767 + Sikkens B8.50.201243541 + Sikkens B6.45.151053946 + Sikkens B3.14.73247183182 + Sikkens B3.25.60233139144 + Sikkens B2.30.50210104116 + Sikkens B2.30.401678594 + + + Sikkens B0.35.351626884 + Sikkens B2.30.301366877 + Sikkens B2.24.251176470 + Sikkens B2.30.201064653 + Sikkens B5.08.80248204200 + Sikkens B2.20.70245166168 + Sikkens B2.20.60215144146 + + + Sikkens B2.20.50193120125 + Sikkens B2.20.401509599 + Sikkens B2.20.301186773 + Sikkens B2.20.20975961 + Sikkens B1.16.12694547 + Sikkens B7.06.83251216211 + Sikkens B6.20.70243170167 + + + Sikkens B6.30.60232131128 + Sikkens B6.30.50202107110 + Sikkens B6.35.401698083 + Sikkens B6.30.401668485 + Sikkens B6.30.301356870 + Sikkens B6.28.19995046 + Sikkens B3.07.78240203202 + + + Sikkens B6.10.70229184180 + Sikkens B6.15.65219159155 + Sikkens B6.20.60216143140 + Sikkens B6.20.50184120116 + Sikkens B6.20.401489796 + Sikkens B6.20.301206869 + Sikkens B7.28.191004750 + + + Sikkens B2.10.80248206205 + Sikkens B2.10.70221176175 + Sikkens B2.10.60197156157 + Sikkens B2.10.50162125126 + Sikkens B2.10.40134103106 + Sikkens B2.10.301088384 + Sikkens B2.10.25946870 + + + Sikkens B2.10.20846263 + Sikkens B6.05.85249227223 + Sikkens B2.05.75229202203 + Sikkens B2.05.70208185184 + Sikkens B2.05.65199175177 + Sikkens B2.05.55167150148 + Sikkens B1.05.45139122122 + + + Sikkens B3.05.40124110109 + Sikkens B1.05.351139899 + Sikkens CN.02.88249243236 + Sikkens CN.03.86248232226 + Sikkens CN.02.77220208203 + Sikkens CN.02.67193184181 + Sikkens CN.02.57162155153 + + + Sikkens CN.02.47136128127 + Sikkens CN.02.37111105104 + Sikkens CN.02.27858079 + Sikkens C0.04.83247224220 + Sikkens C0.04.78232212208 + Sikkens C0.05.75220199196 + Sikkens C0.05.65194173171 + + + Sikkens C0.05.55166146143 + Sikkens C0.05.45136121119 + Sikkens C0.05.35116101100 + Sikkens C0.05.25867573 + Sikkens C0.07.82250218211 + Sikkens C0.07.77236205200 + Sikkens C0.10.70223182176 + + + Sikkens C0.10.60195158153 + Sikkens C0.10.50161130128 + Sikkens C0.10.40137108104 + Sikkens C0.10.301088683 + Sikkens C0.10.20816564 + Sikkens C0.10.80248205197 + Sikkens C0.15.75247187180 + + + Sikkens C0.15.65223165159 + Sikkens C0.15.55188135131 + Sikkens C0.20.50185122115 + Sikkens C0.20.4015210094 + Sikkens C0.20.301217470 + Sikkens C0.30.201004845 + Sikkens C0.08.80249211202 + + + Sikkens C4.20.70238171155 + Sikkens C4.20.60205146133 + Sikkens C4.20.50177123113 + Sikkens C4.30.50193116100 + Sikkens C0.30.401578976 + Sikkens C0.30.301327364 + Sikkens C0.40.201154841 + + + Sikkens C1.10.79249201188 + Sikkens C0.20.70248173160 + Sikkens C0.20.60212144137 + Sikkens C0.25.55201124119 + Sikkens C0.25.4517110297 + Sikkens C0.30.401678579 + Sikkens C0.30.301255955 + + + Sikkens C4.35.15994642 + Sikkens C0.17.72246173161 + Sikkens C0.25.65238151143 + Sikkens C0.30.60235132126 + Sikkens C0.30.50207115107 + Sikkens B8.35.451949690 + Sikkens C0.40.401858482 + + + Sikkens C0.40.301466362 + Sikkens C0.40.201103937 + Sikkens C3.20.73255180163 + Sikkens C0.28.58226132121 + Sikkens C0.40.5021210090 + Sikkens C0.50.401905958 + Sikkens C0.50.301554750 + + + Sikkens C2.60.251413738 + Sikkens C2.50.251253936 + Sikkens C0.45.201134040 + Sikkens C4.30.60228136117 + Sikkens C4.40.5020710180 + Sikkens C4.40.401788367 + Sikkens C4.50.401867057 + + + Sikkens C3.57.311665048 + Sikkens C4.40.301516150 + Sikkens C0.60.301683344 + Sikkens C0.48.201273340 + Sikkens C2.24.65237145131 + Sikkens C2.38.5021610792 + Sikkens C2.53.401956762 + + + Sikkens C4.60.402025649 + Sikkens C6.65.351764538 + Sikkens C4.75.301813334 + Sikkens C4.60.301664338 + Sikkens C4.50.301515346 + Sikkens C4.32.60235136117 + Sikkens C5.43.5824612498 + + + Sikkens C5.43.5423111597 + Sikkens C4.46.502219880 + Sikkens C4.50.502218978 + Sikkens C4.55.401965836 + Sikkens C4.49.331646958 + Sikkens C4.55.301494739 + Sikkens C8.34.63245146112 + + + Sikkens C8.45.5523511683 + Sikkens C8.50.5021910275 + Sikkens C6.49.482078761 + Sikkens C8.50.401848154 + Sikkens C8.51.391767849 + Sikkens C8.60.301575643 + Sikkens C8.50.301436649 + + + Sikkens C7.26.67247166141 + Sikkens C8.30.60224141112 + Sikkens C8.40.6023912896 + Sikkens C8.40.5021110976 + Sikkens C8.40.401739170 + Sikkens C8.40.301346546 + Sikkens C7.34.241156757 + + + Sikkens C8.40.201095848 + Sikkens C7.22.72249175152 + Sikkens C8.25.65234156132 + Sikkens C8.25.55200133111 + Sikkens C8.30.5019111592 + Sikkens C8.25.4517111293 + Sikkens C8.30.401629777 + + + Sikkens C8.30.301317862 + Sikkens C8.30.201005745 + Sikkens C8.15.75243191172 + Sikkens C8.19.74255189165 + Sikkens C8.20.70244179157 + Sikkens C8.20.60219150130 + Sikkens C8.20.4014610185 + + + Sikkens C8.20.301117157 + Sikkens C8.20.20916155 + Sikkens C4.05.20746461 + Sikkens C8.07.82247217208 + Sikkens C8.10.80253213200 + Sikkens C8.10.70219185172 + Sikkens C8.15.65216166152 + + + Sikkens C8.20.50174126109 + Sikkens C4.20.401449887 + Sikkens C4.20.301167768 + Sikkens C6.22.231006557 + Sikkens CN.01.90250241235 + Sikkens C8.04.83242226219 + Sikkens C8.05.75220199191 + + + Sikkens C8.10.60190159149 + Sikkens C8.15.55184144131 + Sikkens C8.16.48163122108 + Sikkens C9.21.311198169 + Sikkens C8.25.18936458 + Sikkens C8.03.78222209204 + Sikkens C4.05.65195177171 + + + Sikkens C8.05.65191173168 + Sikkens C8.05.55164147142 + Sikkens C8.10.50158133124 + Sikkens C8.10.40133108101 + Sikkens C8.10.30998074 + Sikkens C8.10.20846963 + Sikkens D2.03.86249234223 + + + Sikkens D2.05.80244219208 + Sikkens D2.10.70222184168 + Sikkens D2.10.60192162147 + Sikkens D2.10.50155131121 + Sikkens D2.10.40129108101 + Sikkens D2.10.301038780 + Sikkens D2.10.25876962 + + + Sikkens D2.10.80247211196 + Sikkens D2.15.75243194170 + Sikkens D2.15.65210166146 + Sikkens D2.15.55180142126 + Sikkens D3.18.4314711396 + Sikkens D2.20.301147863 + Sikkens D2.15.25906758 + + + Sikkens D2.15.15826460 + Sikkens D2.15.80246205184 + Sikkens D2.20.70234178151 + Sikkens D2.20.60201147121 + Sikkens D2.20.50173125103 + Sikkens D2.20.4014310082 + Sikkens D2.25.301217857 + + + Sikkens D2.30.301257858 + Sikkens D2.35.251247152 + Sikkens D2.30.70241160123 + Sikkens D2.30.60221144106 + Sikkens D2.35.5521212990 + Sikkens D2.30.5018111890 + Sikkens D2.35.4517210574 + + + Sikkens D2.30.401599768 + Sikkens D2.40.401639163 + Sikkens D2.40.301357855 + Sikkens D4.23.71237168131 + Sikkens D6.35.70244159107 + Sikkens D2.40.6023613690 + Sikkens D2.50.5523912269 + + + Sikkens D2.40.5019711276 + Sikkens D2.50.5020510261 + Sikkens D2.50.301437143 + Sikkens D4.30.201016246 + Sikkens D9.25.74251187142 + Sikkens D7.41.6022914690 + Sikkens D6.47.6124214079 + + + Sikkens D6.58.5824412248 + Sikkens D5.63.5323510836 + Sikkens D3.71.482299037 + Sikkens D3.65.432078535 + Sikkens D1.58.401947941 + Sikkens D9.40.6825016599 + Sikkens D6.50.6023813565 + + + Sikkens D8.65.5023010930 + Sikkens D6.60.5021010337 + Sikkens D6.50.5020210955 + Sikkens D6.60.401768835 + Sikkens D6.50.401679046 + Sikkens D6.50.301427543 + Sikkens D8.37.65239160102 + + + Sikkens D6.40.6022814084 + Sikkens D6.35.5520313592 + Sikkens D6.40.5019711466 + Sikkens D6.40.401589151 + Sikkens D6.40.301277648 + Sikkens D6.30.301258360 + Sikkens D6.30.20946348 + + + Sikkens D6.25.70247181141 + Sikkens D6.30.70245169124 + Sikkens D6.30.60219145103 + Sikkens D6.25.65223161125 + Sikkens D6.30.5017912388 + Sikkens D6.35.4517211275 + Sikkens D6.30.401489662 + + + Sikkens D6.25.301178261 + Sikkens D6.20.80251195162 + Sikkens D6.20.70228173142 + Sikkens D6.20.60202153125 + Sikkens D6.25.55192137108 + Sikkens D6.20.50173128102 + Sikkens D6.20.4013810079 + + + Sikkens D6.20.301087759 + Sikkens D6.20.20866451 + Sikkens D7.10.82251217198 + Sikkens D6.10.80245214196 + Sikkens D6.15.75239197175 + Sikkens D6.15.65210170147 + Sikkens D6.15.55175141121 + + + Sikkens D6.10.4012810997 + Sikkens D6.15.25916956 + Sikkens D6.10.20837163 + Sikkens D6.05.65242223212 + Sikkens D6.07.82242218203 + Sikkens D6.07.77229204189 + Sikkens D6.10.70213182164 + + + Sikkens D6.10.60185156139 + Sikkens D6.10.50155134121 + Sikkens D6.10.30998374 + Sikkens E0.05.25797064 + Sikkens DN.02.82233224218 + Sikkens D6.04.78229217207 + Sikkens D6.05.75223205195 + + + Sikkens D6.05.65196180171 + Sikkens D6.05.55165151144 + Sikkens D6.05.45138127121 + Sikkens D6.05.3511210398 + Sikkens D6.05.25867773 + Sikkens E0.03.88247236226 + Sikkens E0.03.84243231221 + + + Sikkens E0.05.75217201188 + Sikkens E0.10.70215187168 + Sikkens E0.10.60182158143 + Sikkens E0.10.50152131116 + Sikkens E0.05.45136125117 + Sikkens E0.10.30998778 + Sikkens E0.10.80243215196 + + + Sikkens E1.14.79247209179 + Sikkens E0.15.75239197167 + Sikkens E0.15.65205171146 + Sikkens E0.15.55175144121 + Sikkens E0.15.45145119100 + Sikkens E0.10.4012710995 + Sikkens E0.15.351179476 + + + Sikkens E0.20.80252202162 + Sikkens E0.20.70231183145 + Sikkens E0.25.65220168127 + Sikkens E0.20.60193152120 + Sikkens E0.20.50167129103 + Sikkens E0.25.4516111988 + Sikkens E0.20.4013510277 + + + Sikkens E0.20.301087654 + Sikkens E0.25.75250189141 + Sikkens E0.30.70245179127 + Sikkens E1.21.69225178139 + Sikkens E0.30.60207152109 + Sikkens E0.25.55187141105 + Sikkens E0.30.5017112182 + + + Sikkens E0.30.4014610165 + Sikkens E0.25.351289467 + Sikkens E0-35.65230163108 + Sikkens E0.40.6021514386 + Sikkens E0.35.5519813787 + Sikkens E0.45.5521112964 + Sikkens E0.50.5019811756 + + + Sikkens E0.40.5018812070 + Sikkens E0.40.4015910253 + Sikkens E0.45.301398747 + Sikkens E0.40.7024816396 + Sikkens E0.50.6525015065 + Sikkens E0.50.6023413862 + Sikkens E0.60.5020311540 + + + Sikkens E0.60.401679334 + Sikkens E0.50.401629546 + Sikkens E0.48.301297838 + Sikkens E0.30.20986848 + Sikkens E4.50.7025016674 + Sikkens E4.50.6022214458 + Sikkens E4.60.6023514132 + + + Sikkens E4.60.5019511730 + Sikkens E4.50.5018912248 + Sikkens E4.50.401579738 + Sikkens E0.40.301227842 + Sikkens E0.30.301208151 + Sikkens E5.27.77255201142 + Sikkens E4.30.75249189126 + + + Sikkens E4.40.7025117798 + Sikkens E4.40.6021414981 + Sikkens E4.40.5018612867 + Sikkens E4.40.4014510053 + Sikkens E4.40.301198042 + Sikkens E5.35.251007247 + Sikkens E6.19.80255213165 + + + Sikkens E4.30.70233176118 + Sikkens E4.30.60204156107 + Sikkens E4.30.5016612581 + Sikkens E1.22.4716713099 + Sikkens E4.30.4013910263 + Sikkens E4.30.301148762 + Sikkens E4.30.20866238 + + + Sikkens E4.20.80252210169 + Sikkens E4.25.75245188133 + Sikkens E4.25.65214166122 + Sikkens E1.26.54193146104 + Sikkens E4.25.55184142102 + Sikkens E4.25.351229466 + Sikkens E4.25.301148660 + + + Sikkens E4.15.25917560 + Sikkens E4.10.85251225195 + Sikkens E3.20.77247200159 + Sikkens E4.20.75243197153 + Sikkens E4.20.70221183146 + Sikkens E4.20.60196158127 + Sikkens E4.20.50167135106 + + + Sikkens E4.20.4013711082 + Sikkens E4.20.30997553 + Sikkens E5.08.84248227205 + Sikkens E4.07.82240220199 + Sikkens E4.10.80245220193 + Sikkens E4.15.75233199166 + Sikkens E4.15.65205171141 + + + Sikkens E4.15.55175147122 + Sikkens E4.15.4513911694 + Sikkens E4.15.351179577 + Sikkens E4.03.80222214207 + Sikkens E4.05.75216204191 + Sikkens E4.07.77223206189 + Sikkens E4.10.70209189171 + + + Sikkens E4.10.60179160142 + Sikkens E4.10.50153134117 + Sikkens E4.10.4012010796 + Sikkens E4.10.30928069 + Sikkens E4.05.85246231218 + Sikkens E6.07.84246228210 + Sikkens E1.09.78234210190 + + + Sikkens E3.09.72214194175 + Sikkens E0.11.67204179159 + Sikkens E0.09.53161142127 + Sikkens E8.10.4012311096 + Sikkens E8.10.301019078 + Sikkens EN.02.88246238230 + Sikkens EN.02.87246238230 + + + Sikkens EN.02.85238232225 + Sikkens E5.05.77214201185 + Sikkens E4.05.65186174163 + Sikkens E4.05.55158148140 + Sikkens E4.05.3510810094 + Sikkens E4.05.20736864 + Sikkens EN.02.90249243236 + + + Sikkens E4.04.83238226213 + Sikkens E8.05.80231219204 + Sikkens E8.07.77225210192 + Sikkens E8.05.70204194183 + Sikkens E8.03.60172165159 + Sikkens E4.05.45131122114 + Sikkens E4.05.25837772 + + + Sikkens E8.10.85251229205 + Sikkens E8.10.80235218196 + Sikkens E8.10.75221201176 + Sikkens E8.10.70211190167 + Sikkens E8.10.60176160142 + Sikkens E8.10.50149134118 + Sikkens E8.15.351109576 + + + Sikkens E8.10.25948577 + Sikkens E8.15.85251225192 + Sikkens E8.15.80243214180 + Sikkens E6.18.76241204163 + Sikkens E8.15.75223196164 + Sikkens E8.15.65201176146 + Sikkens E8.15.55171149123 + + + Sikkens E8.15.4513811998 + Sikkens E8.20.4013411388 + Sikkens E8.20.80247211165 + Sikkens E8.20.75240204155 + Sikkens E8.20.70217184140 + Sikkens E8.25.65209170120 + Sikkens E8.20.60186155119 + + + Sikkens E8.20.50160134104 + Sikkens E8.25.4514812087 + Sikkens E8.20.301048665 + Sikkens E8.25.80255210147 + Sikkens E8.25.75239195140 + Sikkens E8.30.70231183118 + Sikkens E8.35.65217168101 + + + Sikkens E8.30.60196156106 + Sikkens E8.25.55180146105 + Sikkens E5.21.49166135101 + Sikkens E8.30.4013510665 + Sikkens E8.35.75252190115 + Sikkens E8.40.7024017694 + Sikkens E8.40.6021215478 + + + Sikkens E8.35.5519214788 + Sikkens E8.35.4515711765 + Sikkens E8.40.4014310452 + Sikkens E8.25.351189464 + Sikkens E8.30.301128756 + Sikkens E9.44.7325218888 + Sikkens E8.50.7024417663 + + + Sikkens E8.55.7025117050 + Sikkens E8.60.6022814723 + Sikkens E8.50.6021415458 + Sikkens E8.50.5018613149 + Sikkens E8.40.5017813065 + Sikkens E8.55.4517911843 + Sikkens E9.29.79255207135 + + + Sikkens E7.36.76255195113 + Sikkens F0.40.7023918393 + Sikkens E8.49.7325518471 + Sikkens E6.58.6524016139 + Sikkens E7.72.582211390 + Sikkens E6.63.5320413024 + Sikkens E6.63.4718211523 + + + Sikkens F3.40.77254204100 + Sikkens F2.45.7525519271 + Sikkens F2.55.7525218739 + Sikkens F2.50.7023817955 + Sikkens F2.70.652401670 + Sikkens F2.60.7023817640 + Sikkens F2.60.6021115116 + + + Sikkens F2.50.5016912744 + Sikkens F3.33.80255214125 + Sikkens F2.35.80254205113 + Sikkens F2.40.7023318488 + Sikkens F2.50.6522216853 + Sikkens F2.50.6020715750 + Sikkens F2.50.5519114544 + + + Sikkens F2.50.4014610631 + Sikkens F2.40.301158434 + Sikkens F5.20.80242218164 + Sikkens F2.30.80249211140 + Sikkens F2.35.75243197115 + Sikkens F2.35.6521116999 + Sikkens F2.40.6019915780 + + + Sikkens F2.40.5016913361 + Sikkens F2.40.4013810647 + Sikkens F2.30.301058651 + Sikkens F2.25.75232199141 + Sikkens F2.30.70221185118 + Sikkens F2.25.65205175121 + Sikkens F2.30.60194159100 + + + Sikkens F2.25.55180150103 + Sikkens F2.30.5016513787 + Sikkens F2.25.4514311879 + Sikkens F2.30.4013611168 + Sikkens F2.15.85251223185 + Sikkens F0.20.80244211167 + Sikkens F0.24.80254214154 + + + Sikkens F0.25.75240205149 + Sikkens F0.30.70229186122 + Sikkens F0.25.70214178128 + Sikkens F1.22.52161137100 + Sikkens F2.20.4012810979 + Sikkens F0.10.85247228203 + Sikkens F0.17.80242214170 + + + Sikkens F2.15.80239215175 + Sikkens F2.20.80242212163 + Sikkens F2.20.70217189145 + Sikkens F2.20.60187162123 + Sikkens F2.20.50154133100 + Sikkens F2.20.30998257 + Sikkens F2.08.86249233210 + + + Sikkens F2.10.80234216190 + Sikkens F0.15.75222199166 + Sikkens F2.15.75229204166 + Sikkens F2.15.65193173141 + Sikkens F2.15.55164146118 + Sikkens F2.15.4513712196 + Sikkens F2.15.351119878 + + + Sikkens F2.07.88250238219 + Sikkens F2.06.84239228211 + Sikkens F2.06.74214206190 + Sikkens F2.10.70208192170 + Sikkens F2.10.60176163143 + Sikkens F2.10.50150138121 + Sikkens F2.10.4011911095 + + + Sikkens F2.10.30948470 + Sikkens F2.05.87248239222 + Sikkens F2.05.85243232216 + Sikkens F2.03.84235229221 + Sikkens F2.05.75211203191 + Sikkens F2.05.65184176165 + Sikkens F2.05.55160154145 + + + Sikkens F2.05.45129124116 + Sikkens F2.05.351059890 + Sikkens FN.02.88241235224 + Sikkens FN.02.82227221212 + Sikkens FN.02.77211207199 + Sikkens FN.02.67179176168 + Sikkens FN.02.57159155148 + + + Sikkens FN.02.47132129124 + Sikkens FN.02.3710710499 + Sikkens FN.02.27848176 + Sikkens F6.03.87243236225 + Sikkens F6.03.72203198189 + Sikkens F6.05.70200191178 + Sikkens F6.05.60168161149 + + + Sikkens F6.05.50144139128 + Sikkens F6.05.40117111103 + Sikkens F6.05.30948981 + Sikkens F6.03.20686562 + Sikkens FN.02.85233230222 + Sikkens F6.05.80227222204 + Sikkens F6.10.80229215190 + + + Sikkens F6.10.70200186162 + Sikkens F6.10.60174162139 + Sikkens F6.10.50151141123 + Sikkens F6.10.4012011196 + Sikkens F6.10.30938776 + Sikkens F2.03.88245239227 + Sikkens F6.07.77218206187 + + + Sikkens F6.15.75218200164 + Sikkens F6.15.65190175144 + Sikkens F6.15.55166152124 + Sikkens F8.16.48143132105 + Sikkens F6.15.45139127102 + Sikkens F6.15.3511310282 + Sikkens F6.07.82237225203 + + + Sikkens F6.15.80235216175 + Sikkens F6.20.80238213164 + Sikkens F6.20.70210190145 + Sikkens F6.20.60177158116 + Sikkens F6.20.50151134100 + Sikkens F6.20.4012611179 + Sikkens F6.20.30938257 + + + Sikkens F6.05.85242236221 + Sikkens F6.15.85248228187 + Sikkens F6.25.80244216148 + Sikkens F6.25.75231206149 + Sikkens F6.25.70212189129 + Sikkens F6.25.65201176119 + Sikkens F6.30.5015413280 + + + Sikkens F6.30.301048956 + Sikkens F6.09.86250236209 + Sikkens F6.20.83249227172 + Sikkens F6.26.81252219148 + Sikkens F6.35.75232197112 + Sikkens F6.30.70222188106 + Sikkens F6.35.65203174103 + + + Sikkens F6.30.60186162104 + Sikkens F6.30.4013311677 + Sikkens F6.25.85252223158 + Sikkens F6.30.80251214136 + Sikkens F6.40.80251207103 + Sikkens F6.40.7022318789 + Sikkens F6.40.6019416175 + + + Sikkens F6.40.5015612956 + Sikkens F6.40.4013411156 + Sikkens F6.40.301028742 + Sikkens F8.15.80233216173 + Sikkens F8.20.80235215166 + Sikkens F8.20.75224208159 + Sikkens F8.30.70214190120 + + + Sikkens F8.40.70219191100 + Sikkens F8.40.6019116477 + Sikkens F8.45.5518315558 + Sikkens F8.41.4614912862 + Sikkens F8.25.81239216151 + Sikkens F8.30.80244214134 + Sikkens F6.45.7524119574 + + + Sikkens F6.55.7524719854 + Sikkens F6.50.7022618752 + Sikkens F6.50.6019016053 + Sikkens F6.50.5016513141 + Sikkens F6.50.4013711040 + Sikkens G0.31.84247222130 + Sikkens F8.40.80253218105 + + + Sikkens F8.50.8025321068 + Sikkens F8.60.8025521236 + Sikkens F6.60.7022718318 + Sikkens F6.70.702351840 + Sikkens F6.60.6019815833 + Sikkens F6.55.5417914435 + Sikkens G0.35.85246226131 + + + Sikkens G0.40.80241216109 + Sikkens G0.45.8025122097 + Sikkens G0.50.8024721972 + Sikkens G0.55.8024821952 + Sikkens G0.60.702231902 + Sikkens G0.55.7021918937 + Sikkens G0.60.6018715927 + + + Sikkens G3.34.84249231128 + Sikkens G2.51.8124622474 + Sikkens G1.57.7924121543 + Sikkens G0.60.7523220613 + Sikkens G0.70.762422120 + Sikkens G0.50.7021718761 + Sikkens G0.50.6018716147 + + + Sikkens G0.50.5016014042 + Sikkens G5.27.85246237154 + Sikkens G4.34.84245234132 + Sikkens G3.46.8324622885 + Sikkens G0.35.75225204110 + Sikkens G0.40.7020518492 + Sikkens G0.40.6018015975 + + + Sikkens G0.40.5015013661 + Sikkens G0.40.4012511148 + Sikkens G0.25.85250229158 + Sikkens G0.30.80239216134 + Sikkens G0.25.75225206144 + Sikkens G0.30.70212190117 + Sikkens G0.25.65198179120 + + + Sikkens G0.30.60180162100 + Sikkens G0.30.5015113783 + Sikkens G0.30.30988952 + Sikkens G0.15.85249235188 + Sikkens G0.20.80237219163 + Sikkens G0.20.70207191140 + Sikkens G0.20.60180165122 + + + Sikkens G0.20.5014613598 + Sikkens G0.20.4012411482 + Sikkens G0.20.30958762 + Sikkens G0.20.20736750 + Sikkens GN.02.90246242230 + Sikkens G0.08.84235224196 + Sikkens G0.10.80227214186 + + + Sikkens G0.10.75214203174 + Sikkens G0.15.75217201161 + Sikkens G0.15.65186174140 + Sikkens G0.10.50144137117 + Sikkens G0.10.30928773 + Sikkens G0.05.88245239219 + Sikkens G0.08.88248238211 + + + Sikkens G0.09.85242233204 + Sikkens G1.13.79227216179 + Sikkens G0.10.70202193166 + Sikkens G0.10.65187179157 + Sikkens G0.10.60172163142 + Sikkens G0.10.4011510994 + Sikkens GN.01.88246245234 + + + Sikkens G4.04.88245240223 + Sikkens G0.05.85235229210 + Sikkens G0.05.75212206190 + Sikkens G0.05.65182178165 + Sikkens G0.05.55157152141 + Sikkens G0.05.45128125116 + Sikkens G0.05.25747166 + + + Sikkens GN.00.88239239236 + Sikkens G4.03.88245242231 + Sikkens G0.03.86235232219 + Sikkens G0.04.84233228214 + Sikkens G0.05.80224217202 + Sikkens G0.05.70197191177 + Sikkens G4.05.55157154144 + + + Sikkens G0.05.3510310093 + Sikkens G4.04.84237233217 + Sikkens G4.08.83234229204 + Sikkens G4.05.81224220205 + Sikkens G4.07.80225217197 + Sikkens G4.05.77214209194 + Sikkens G4.10.70198190162 + + + Sikkens G4.10.60171166145 + Sikkens G8.10.4011411396 + Sikkens G4.08.88247243218 + Sikkens G4.13.85244235196 + Sikkens G4.15.85241232185 + Sikkens G4.10.80227223196 + Sikkens G4.15.75211204163 + + + Sikkens G4.20.70205198147 + Sikkens G4.15.65186179146 + Sikkens G4.20.5014113496 + Sikkens G8.06.90244241221 + Sikkens G8.06.85233230209 + Sikkens G8.10.85239234204 + Sikkens G8.10.80227224188 + + + Sikkens G8.10.70194192167 + Sikkens G8.10.60166165140 + Sikkens G8.10.50141138119 + Sikkens G8.10.30858369 + Sikkens G9.13.85237236192 + Sikkens G8.20.85236231173 + Sikkens G8.20.80222219162 + + + Sikkens G8.20.70196196146 + Sikkens G8.20.60170169124 + Sikkens G8.20.5013913799 + Sikkens G8.20.4011611683 + Sikkens G8.20.30908861 + Sikkens G7.18.87246242182 + Sikkens G8.20.90242241177 + + + Sikkens G8.30.85238240144 + Sikkens G8.30.80225227136 + Sikkens G8.30.70199195117 + Sikkens G8.30.60171168102 + Sikkens G8.30.5014414485 + Sikkens G8.30.30919153 + Sikkens G5.24.85246237159 + + + Sikkens G5.36.83242232119 + Sikkens G8.40.80225229111 + Sikkens G8.40.7019819784 + Sikkens G8.40.6016516673 + Sikkens G8.40.5014013962 + Sikkens G8.30.4011511564 + Sikkens G8.30.20696838 + + + Sikkens G3.26.85248236164 + Sikkens G4.30.80234224145 + Sikkens G4.30.70203190112 + Sikkens G4.40.7020719390 + Sikkens G4.40.6017516371 + Sikkens G4.30.6017616799 + Sikkens G4.30.5014914083 + + + Sikkens G4.25.3510910567 + Sikkens G4.40.80232218103 + Sikkens G4.50.8023021670 + Sikkens G4.50.7019919158 + Sikkens G4.60.7020019110 + Sikkens G4.60.601771640 + Sikkens G4.50.6017316145 + + + Sikkens G4.40.5014913959 + Sikkens G4.50.5015014040 + Sikkens G8.45.8021722173 + Sikkens G8.50.7018819250 + Sikkens G7.57.6618519042 + Sikkens G8.60.6017017021 + Sikkens G8.50.6016416852 + + + Sikkens G8.50.5014214036 + Sikkens G8.40.4011711953 + Sikkens G8.40.30919344 + Sikkens H1.39.83222236115 + Sikkens G9.56.7620421950 + Sikkens G8.60.7018919726 + Sikkens H2.55.6516418846 + + + Sikkens H2.60.6015117516 + Sikkens H2.50.6015617149 + Sikkens H2.50.5013214240 + Sikkens H2.45.4512013352 + Sikkens G9.27.84232236151 + Sikkens G9.35.84230236126 + Sikkens H2.40.80214224102 + + + Sikkens H2.45.7519721488 + Sikkens H2.50.7018020061 + Sikkens H2.40.7018720094 + Sikkens H2.40.6016216977 + Sikkens H2.40.5013814769 + Sikkens H2.15.85234240187 + Sikkens H2.30.80211223134 + + + Sikkens H3.24,78210220151 + Sikkens H2.20.70191196142 + Sikkens H2.30.70187195118 + Sikkens H2.30.60159170101 + Sikkens H2.30.5013314084 + Sikkens H2.35.30889248 + Sikkens H4.06.85234237216 + + + Sikkens H2.07.87239239213 + Sikkens H6.06.80220222198 + Sikkens H3.12.78211216180 + Sikkens H4.16.70187195153 + Sikkens H3.18.60162168127 + Sikkens H2.20.5013714099 + Sikkens H2.25.30868959 + + + Sikkens H2.08.90245244216 + Sikkens H2.04.88241241223 + Sikkens H2.08.80224222200 + Sikkens H2.10.80221221193 + Sikkens H2.10.70190192165 + Sikkens H2.10.60166169144 + Sikkens H3.10.43120122104 + + + Sikkens H2.12.25787965 + Sikkens H2.03.90246245229 + Sikkens HN.02.85233233222 + Sikkens HN.02.88240239231 + Sikkens H2.03.82224225214 + Sikkens H3.04.72197198185 + Sikkens H2.05.65178178166 + + + Sikkens H2.05.55150149136 + Sikkens H2.05.45131132123 + Sikkens J0.04.88239243226 + Sikkens JN.02.82222226217 + Sikkens J0.05.75201207188 + Sikkens J0.05.65176180165 + Sikkens J0.05.55149152139 + + + Sikkens J0.05.45124126116 + Sikkens J0.05.3510010294 + Sikkens J0.05.25767770 + Sikkens J0.05.85227230211 + Sikkens J0.07.82221228204 + Sikkens J0.07.77207214190 + Sikkens J0.10.70185193167 + + + Sikkens J0.10.60162168147 + Sikkens J0.10.50134140120 + Sikkens J0.10.4011011499 + Sikkens J0.10.30868975 + Sikkens J0.15.85221238189 + Sikkens J0.10.80209220189 + Sikkens J0.15.75197210166 + + + Sikkens J0.15.65170183145 + Sikkens J0.20.60154170123 + Sikkens J0.20.50123139100 + Sikkens J0.20.4010511683 + Sikkens J0.15.25778365 + Sikkens J0.20.80203225165 + Sikkens J0.20.70178196146 + + + Sikkens J0.30.70171197120 + Sikkens J0.30.60147170105 + Sikkens J0.30.5012714690 + Sikkens J0.30.409711769 + Sikkens J0.20.30818961 + Sikkens J0.20.20657254 + Sikkens H9.21.83214235173 + + + Sikkens J0.30.80198224139 + Sikkens J0.40.7015520198 + Sikkens J0.40.6013817482 + Sikkens J0.40.5011014261 + Sikkens J0.40.409612059 + Sikkens J0.30.30879962 + Sikkens J0.30.20627240 + + + Sikkens H7.22.83214235164 + Sikkens H7.38.79195229113 + Sikkens J0.48.7015520476 + Sikkens J0.50.6012717358 + Sikkens J0.50.5010814749 + Sikkens J0.60.5010614932 + Sikkens J0.50.409212041 + + + Sikkens J0.40.30749437 + Sikkens J1.21.83208235174 + Sikkens J6.26.76163213141 + Sikkens J8.41.70135211114 + Sikkens J6.39.63132189102 + Sikkens J6.45.5310416074 + Sikkens J6.51.437913457 + + + Sikkens J7.41.357411156 + Sikkens J4.44.25558340 + Sikkens J9.19.80191230177 + Sikkens K0.28.76164221149 + Sikkens J8.48.6411419686 + Sikkens K2.50.608418182 + Sikkens K2.50.506815368 + + + Sikkens K2.50.406113058 + Sikkens K2.60.404313547 + Sikkens K6.50.304510455 + Sikkens J6.11.83206229193 + Sikkens K0.26.76168221154 + Sikkens K2.40.70128208116 + Sikkens K2.40.60110178100 + + + Sikkens K2.40.508815384 + Sikkens K2.40.407312467 + Sikkens K2.40.30579852 + Sikkens K2.45.20477946 + Sikkens K0.19.78189227178 + Sikkens K5.21.77168221172 + Sikkens K6.34.67123200131 + + + Sikkens K5.44.6492197107 + Sikkens K7.48.566117796 + Sikkens K7.58.44814269 + Sikkens K7.60.30010545 + Sikkens K4.54.23418744 + Sikkens K2.10.80203224197 + Sikkens K2.21.72162208156 + + + Sikkens K2.30.70144205135 + Sikkens K2.30.60120174114 + Sikkens K2.30.5010515098 + Sikkens K2.30.407911975 + Sikkens K2.30.30669863 + Sikkens K2.29.20527351 + Sikkens K0.09.85217239210 + + + Sikkens K2.20.80184228175 + Sikkens K2.20.70163201155 + Sikkens K2.20.60137171128 + Sikkens K2.20.50119147113 + Sikkens K2.20.4510012698 + Sikkens K2.20.409211687 + Sikkens K2.20.30729268 + + + Sikkens K2.09.79199218192 + Sikkens K2.10.70177196169 + Sikkens K2.15.65161186154 + Sikkens K2.10.60154169150 + Sikkens K2.10.50127141121 + Sikkens K2.10.4010011295 + Sikkens K2.10.30809076 + + + Sikkens K2.10.20626758 + Sikkens KN.02.87236242230 + Sikkens K2.05.85228237223 + Sikkens K2.05.75201210196 + Sikkens K2.05.65167177164 + Sikkens K2.05.50130136126 + Sikkens K2.05.43114120111 + + + Sikkens K3.06.34939891 + Sikkens K2.05.25697466 + Sikkens LN.02.88232240234 + Sikkens LN.02.86230239232 + Sikkens LN.02.77204211202 + Sikkens LN.02.67180185178 + Sikkens LN.02.57151155150 + + + Sikkens LN.02.47124127122 + Sikkens LN.02.379910499 + Sikkens LN.02.27788177 + Sikkens L0.03.88216227217 + Sikkens L0.04.78203216204 + Sikkens L0.05.75194207194 + Sikkens L0.05.65169179170 + + + Sikkens L0.05.55143153143 + Sikkens L0.05.45117125117 + Sikkens L0.05.359410194 + Sikkens L0.05.25737973 + Sikkens L0.05.85219236220 + Sikkens L0.07.82208230210 + Sikkens L0.07.77196219198 + + + Sikkens L0.10.70178201180 + Sikkens L0.10.60144164147 + Sikkens L0.10.50126144129 + Sikkens L0.10.4098115101 + Sikkens L0.10.30799281 + Sikkens L3.10.82200233210 + Sikkens L0.15.75171212175 + + + Sikkens L0.15.65147184155 + Sikkens L0.15.55127157130 + Sikkens K8.23.4598135101 + Sikkens L0.20.30689473 + Sikkens L0.20.20487053 + Sikkens L0.15.20567058 + Sikkens L0.10.80192223197 + + + Sikkens L0.20.70150198159 + Sikkens L0.20.60129171135 + Sikkens L0.20.50108148115 + Sikkens L0.20.409111996 + Sikkens L0.30.30499260 + Sikkens L0.35.20417251 + Sikkens L0.20.15446250 + + + Sikkens L3.17.75153211176 + Sikkens L0.30.60101173123 + Sikkens L0.30.5086149103 + Sikkens L0.30.406412180 + Sikkens L0.40.355511573 + Sikkens L0.40.30409761 + Sikkens L0.30.20417148 + + + Sikkens L0.15.15455545 + Sikkens L0.30.70128209149 + Sikkens L0.40.6084185117 + Sikkens L0.50.503815381 + Sikkens L0.40.506614894 + Sikkens L0.40.404812073 + Sikkens L0.50.403113070 + + + Sikkens L0.70.40013157 + Sikkens L0.50.302811061 + Sikkens L9.13.79178226199 + Sikkens L5.21.73146211174 + Sikkens L4.32.66102200144 + Sikkens L8.40.6054186130 + Sikkens L5.47.526162105 + + + Sikkens L5.60.43014179 + Sikkens L5.63.33011465 + Sikkens L6.59.2308651 + Sikkens L8.20.70141204172 + Sikkens L8.30.70104206159 + Sikkens L8.30.6098182143 + Sikkens L8.50.500160103 + + + Sikkens L8.50.40013185 + Sikkens L8.40.352411783 + Sikkens L8.40.302310171 + Sikkens L8.50.30010370 + Sikkens L8.05.85219237223 + Sikkens L8.05.75191206196 + Sikkens L8.10.60146171157 + + + Sikkens L8.19.60116174145 + Sikkens L8.20.5099146122 + Sikkens L8.30.5073151113 + Sikkens L8.30.405812192 + Sikkens L8.30.30519675 + Sikkens M5.09.83205236219 + Sikkens L8.10.80188223202 + + + Sikkens L9.17.79172230201 + Sikkens M2.20.75138213186 + Sikkens M2.40.6046186140 + Sikkens M2.30.6090181146 + Sikkens M2.40.5018157118 + Sikkens M2.30.5072151121 + Sikkens M8.06.85214239228 + + + Sikkens N0.12.78176221207 + Sikkens N1.21.65119192177 + Sikkens N1.37.5528168147 + Sikkens N0.40.500150128 + Sikkens N0.50.500156130 + Sikkens N0.50.400129107 + Sikkens N0.40.30010187 + + + Sikkens M8.11.81192232217 + Sikkens M8.19.72139211195 + Sikkens N0.28.7099208183 + Sikkens N0.30.6085179160 + Sikkens N0.30.5060152133 + Sikkens N0.40.400128108 + Sikkens N0.30.4047119104 + + + Sikkens N0.40.2067866 + Sikkens N0.10.80188223214 + Sikkens N0.20.70137200184 + Sikkens N0.20.60120178162 + Sikkens N0.20.5095150136 + Sikkens N0.20.4073120108 + Sikkens N0.20.30589686 + + + Sikkens N0.20.20417063 + Sikkens N0.15.10415148 + Sikkens N0.05.85222236232 + Sikkens N8.09.81196231227 + Sikkens N0.10.70165199188 + Sikkens N0.10.60145174165 + Sikkens N0.10.50116141133 + + + Sikkens N0.10.4092113107 + Sikkens N0.10.30739085 + Sikkens N0.10.20596966 + Sikkens NN.01.84227229227 + Sikkens N7.04.73189204201 + Sikkens N6.08.70171196191 + Sikkens N1.06.88172189184 + + + Sikkens N0.05.65172184180 + Sikkens N1.05.55138152148 + Sikkens N0.05.44114124121 + Sikkens M8.06.349010197 + Sikkens PN.02.82218228226 + Sikkens PN.02.77203212210 + Sikkens P0.05.75191208204 + + + Sikkens P0.05.65165180178 + Sikkens P0.03.60160167165 + Sikkens P0.03.55141148148 + Sikkens P0.03.359110098 + Sikkens P0.05.25727877 + Sikkens P0.05.83211230226 + Sikkens P0.07.85212234230 + + + Sikkens P0.07.77191217214 + Sikkens P0.06.74185208205 + Sikkens P5.08.58144164164 + Sikkens P0.05.55138153150 + Sikkens P0.05.45119130128 + Sikkens P0.10.30719189 + Sikkens P1.03.79211222220 + + + Sikkens P0.04.78200216214 + Sikkens P0.10.70163197193 + Sikkens P1.11.63147178177 + Sikkens P0.10.60143170167 + Sikkens P0.10.50118144142 + Sikkens P0.10.4097117117 + Sikkens P0.10.20536765 + + + Sikkens P4.10.75178208207 + Sikkens P1.09.69166194193 + Sikkens P0.15.65138185181 + Sikkens P0.15.55116156153 + Sikkens P0.15.4598129126 + Sikkens P0.15.3576106104 + Sikkens P0.20.30579491 + + + Sikkens P0.20.20426968 + Sikkens P0.10.80189227223 + Sikkens P0.20.70129203197 + Sikkens P0.20.60110175170 + Sikkens P0.20.5094148145 + Sikkens P0.30.4051127123 + Sikkens P0.20.4078122120 + + + Sikkens P0.30.30379995 + Sikkens P0.30.25308583 + Sikkens P0.15.75161215209 + Sikkens P0.30.6080181178 + Sikkens P0.30.5059150145 + Sikkens P0.40.500155151 + Sikkens P0.50.400130127 + + + Sikkens P0.40.400126122 + Sikkens P0.50.30010299 + Sikkens P0.40.300104102 + Sikkens P2.11.80187227225 + Sikkens P2.20.73136210210 + Sikkens P2.32.6374190190 + Sikkens P3.35.5336160165 + + + Sikkens P3.40.440136138 + Sikkens P2.46.330107109 + Sikkens P4.48.2709396 + Sikkens Q0.40.2007581 + Sikkens Q0.30.6087174183 + Sikkens Q0.30.5060148156 + Sikkens P9.38.4917149162 + + + Sikkens Q0.40.400124135 + Sikkens Q0.50.400128141 + Sikkens Q0.50.300101111 + Sikkens Q0.40.30099105 + Sikkens Q0.50.2007582 + Sikkens P9.14.77170219224 + Sikkens Q0.20.73143210218 + + + Sikkens Q0.29.6598191203 + Sikkens Q0.40.5031151162 + Sikkens Q0.30.4039118126 + Sikkens Q0.30.304196103 + Sikkens Q0.30.20277175 + Sikkens Q1.19.10355153 + Sikkens Q0.09.81196225229 + + + Sikkens Q0.10.80190223225 + Sikkens Q0.20.70140199208 + Sikkens Q0.20.60122174180 + Sikkens Q0.20.5093144150 + Sikkens Q0.20.4078117121 + Sikkens Q0.20.30528892 + Sikkens Q0.20.20497477 + + + Sikkens Q0.05.84217234235 + Sikkens Q6.09.81201228234 + Sikkens Q6.10.80196227233 + Sikkens Q5.10.76187216222 + Sikkens Q0.10.70167197200 + Sikkens Q0.10.60145170173 + Sikkens Q0.10.50119141144 + + + Sikkens Q0.10.4097117120 + Sikkens QN.02.88238244243 + Sikkens QN.02.78215218217 + Sikkens P9.05.75192209210 + Sikkens Q0.05.65166182183 + Sikkens Q0.05.55147156156 + Sikkens Q5.05.44113123125 + + + Sikkens Q0.10.30759092 + Sikkens Q0.10.20526262 + Sikkens R0.05.85219232235 + Sikkens Q5.06.80203220224 + Sikkens R0.05.75196211214 + Sikkens Q9.12.74176209220 + Sikkens R0.10.60148169176 + + + Sikkens Q9.10.50120139145 + Sikkens Q9.10.4098114120 + Sikkens R3.10.30799297 + Sikkens R0.10.80195220227 + Sikkens Q7.15.76171216227 + Sikkens R0.20.70146199217 + Sikkens R0.20.60123170185 + + + Sikkens R0.20.50106145158 + Sikkens R0.30.4063121137 + Sikkens R0.30.304895108 + Sikkens R0.20.15375762 + Sikkens R0.13.77182217228 + Sikkens R1.17.73161206220 + Sikkens R1.23.72146205225 + + + Sikkens R0.30.60107175196 + Sikkens R0.30.5076148165 + Sikkens R0.40.4020122146 + Sikkens R0.40.30095111 + Sikkens R0.28.19367080 + Sikkens R2.20.73156208227 + Sikkens R2.22.66136189209 + + + Sikkens R2.29.68124197223 + Sikkens R2.33.5581162189 + Sikkens R0.40.5038152179 + Sikkens R0.50.400126154 + Sikkens R0.50.300101123 + Sikkens R1.35.23298095 + Sikkens R4.14.80175214225 + + + Sikkens R5.23.70130190214 + Sikkens R5.37.5673163197 + Sikkens R4.42.4743141175 + Sikkens R5.52.490146191 + Sikkens R6.56.360112147 + Sikkens R7.43.262287112 + Sikkens R9.35.22347797 + + + Sikkens R7.22.69145196221 + Sikkens R7.31.62112179213 + Sikkens R6.31.5288152179 + Sikkens R7.33.4777138166 + Sikkens R7.44.4133125160 + Sikkens R8.40.3945116148 + Sikkens R8.33.3653106130 + + + Sikkens S0.40.2017294 + Sikkens S0.30.60112172206 + Sikkens S0.40.6075176218 + Sikkens S0.50.500150199 + Sikkens S0.40.5060144185 + Sikkens S0.50.400123165 + Sikkens S0.40.4037118153 + + + Sikkens S0.50.30097133 + Sikkens S0.40.302493123 + Sikkens S4.26.64131183219 + Sikkens S1.38.5681163208 + Sikkens S4.43.4958144194 + Sikkens S4.43.4647136182 + Sikkens S3.56.420129186 + + + Sikkens S5.48.4119124173 + Sikkens S4.50.350104147 + Sikkens S5.44.301695131 + Sikkens S1.13.73177202218 + Sikkens S0.20.70158199222 + Sikkens S0.20.60131168189 + Sikkens S0.30.5086145174 + + + Sikkens S0.30.4070119144 + Sikkens S0.30.304892113 + Sikkens S1.37.253482108 + Sikkens S0.30.20347088 + Sikkens S0.10.80198224235 + Sikkens S0.15.80191219234 + Sikkens S0.15.65150181197 + + + Sikkens S0.15.55126154170 + Sikkens S0.20.50107141161 + Sikkens S0.20.4084116133 + Sikkens S0.20.306288101 + Sikkens S0.20.20517182 + Sikkens S0.05.85219232238 + Sikkens S0.11.78187215229 + + + Sikkens S0.10.70180199210 + Sikkens S0.10.60152168178 + Sikkens S0.10.50124141150 + Sikkens S0.10.40102114122 + Sikkens S0.10.30799096 + Sikkens S0.10.20566570 + Sikkens SN.02.85229235237 + + + Sikkens SN.02.82217223223 + Sikkens SN.02.77206210211 + Sikkens SN.02.67178185187 + Sikkens SN.02.57155158160 + Sikkens SN.02.47126128130 + Sikkens SN.02.37105107108 + Sikkens SN.02.27828484 + + + Sikkens S0.04.78205214217 + Sikkens S0.07.77198215222 + Sikkens S0.05.75193205210 + Sikkens S0.05.65167177182 + Sikkens S0.05.55146152154 + Sikkens S0.05.45120127131 + Sikkens S0.05.3596102105 + + + Sikkens S0.05.25727780 + Sikkens S6.09.77196211226 + Sikkens S2.10.71175196209 + Sikkens S3.10.73184205218 + Sikkens S8.10.65161177192 + Sikkens S8.12.55135152167 + Sikkens S8.15.4199118135 + + + Sikkens S8.10.3591101110 + Sikkens S8.14.17526373 + Sikkens S2.07.80206221231 + Sikkens S6.14.75183210231 + Sikkens S8.12.68170189207 + Sikkens S6.15.65157182205 + Sikkens S7.19.60137167194 + + + Sikkens S6.29.4382125157 + Sikkens S9.32.3562105137 + Sikkens S8.22.296788109 + Sikkens S7.17.72171202230 + Sikkens S6.21.66148186217 + Sikkens S7.27.61128174211 + Sikkens S8.34.5499155201 + + + Sikkens S9.35.56107161208 + Sikkens S9.39.4160120167 + Sikkens S8.48.28090135 + Sikkens T2.47.24082130 + Sikkens S8.16.73177204230 + Sikkens T0.20.70160191223 + Sikkens S9.25.65138181222 + + + Sikkens T0.30.60118168212 + Sikkens T0.40.5072143198 + Sikkens T0.50.400123184 + Sikkens T0.50.30095145 + Sikkens T0.45.203180114 + Sikkens T0.12.73181201222 + Sikkens S9.18.69160189218 + + + Sikkens T0.20.60134165194 + Sikkens T6.39.5296149213 + Sikkens T0.40.4052118166 + Sikkens T0.45.3531106153 + Sikkens T0.40.303791130 + Sikkens T0.40.202174111 + Sikkens T0.10.80208220235 + + + Sikkens T2.17.69167194223 + Sikkens T3.23.65149182223 + Sikkens T0.30.5095141180 + Sikkens T0.30.4078118153 + Sikkens T4.36.274686127 + Sikkens T0.30.305592121 + Sikkens T0.30.20386996 + + + Sikkens T3.06.78209217227 + Sikkens T0.13.64160177198 + Sikkens T4.18.59139164196 + Sikkens T3.20.50118142173 + Sikkens T0.23.48105136166 + Sikkens T4.27.3677105140 + Sikkens T4.40.303586128 + + + Sikkens T0.25.255579102 + Sikkens T3.06.80205215227 + Sikkens T0.10.70175191208 + Sikkens T0.10.60147162177 + Sikkens T3.14.55135152173 + Sikkens T0.20.50111138163 + Sikkens T0.20.4092116138 + + + Sikkens T0.20.306589110 + Sikkens T0.20.20526987 + Sikkens TN.02.82224226228 + Sikkens S7.04.85227235243 + Sikkens S7.05.75196204211 + Sikkens S8.05.65170177184 + Sikkens T0.10.50127138152 + + + Sikkens T0.10.40102113124 + Sikkens T0.10.307989100 + Sikkens T0.10.20596675 + Sikkens UN.02.82229228233 + Sikkens UN.02.85231233238 + Sikkens UN.02.77211211216 + Sikkens U0.05.75205209220 + + + Sikkens U0.05.65174177187 + Sikkens U0.05.55147151160 + Sikkens U0.05.45122125133 + Sikkens U0.05.359799106 + Sikkens U0.04.84229231236 + Sikkens T7.07.77203210227 + Sikkens T9.07.67176184197 + + + Sikkens U0.10.60159165183 + Sikkens U0.10.50128135154 + Sikkens U0.10.40107112128 + Sikkens U0.10.308389102 + Sikkens U0.10.20596373 + Sikkens T9.07.82219224240 + Sikkens T8.10.73190201222 + + + Sikkens U0.15.65160176208 + Sikkens U0.15.55134149176 + Sikkens U0.20.50123139174 + Sikkens U0.20.4096112142 + Sikkens U0.20.307085114 + Sikkens U0.20.20607092 + Sikkens U0.10.70181195217 + + + Sikkens U0.20.70170187223 + Sikkens U0.20.60144165206 + Sikkens U0.25.60135164209 + Sikkens U0.30.50111140194 + Sikkens U0.30.4083111159 + Sikkens U0.30.306891130 + Sikkens U0.30.20466498 + + + Sikkens U2.09.75189198220 + Sikkens U3.14.67171181211 + Sikkens U2.16.60151163195 + Sikkens U4.30.52121140201 + Sikkens U0.40.4069112173 + Sikkens U0.40.304986137 + Sikkens U0.40.203673116 + + + Sikkens U0.30.16395582 + Sikkens U3.07.78196204222 + Sikkens U3.20.64175191221 + Sikkens U3.19.64158174218 + Sikkens U4.25.55132149201 + Sikkens U4.35.4597121188 + Sikkens U5.44.356398173 + + + Sikkens U5.19.25445691 + Sikkens U2.21.09344360 + Sikkens U7.03.81210212222 + Sikkens U6.06.73198199216 + Sikkens U4.10.72193200224 + Sikkens U6.18.63164171215 + Sikkens U6.26.46113125175 + + + Sikkens U7.27.3692101149 + Sikkens U6.25.256776112 + Sikkens U4.15.10424558 + Sikkens VN.02.85233232236 + Sikkens U9.05.75203203217 + Sikkens V0.15.65177180212 + Sikkens V0.25.55137144199 + + + Sikkens V0.37.42103113185 + Sikkens V1.42.307284156 + Sikkens V0.40.307082148 + Sikkens V0.47.194462125 + Sikkens V0.07.80221220236 + Sikkens V0.10.70187187214 + Sikkens V0.20.60157159208 + + + Sikkens V0.20.50137141182 + Sikkens V0.25.45115120169 + Sikkens V0.30.40104111170 + Sikkens V0.30.307683132 + Sikkens U9.30.205864110 + Sikkens V7.03.81225222228 + Sikkens V2.08.71195194217 + + + Sikkens V5.14.60167161197 + Sikkens V4.25.55149142203 + Sikkens V5.25.45125117172 + Sikkens V0.25.359697141 + Sikkens V0.25.257175115 + Sikkens V3.35.14464797 + Sikkens V8.04.79216211224 + + + Sikkens V9.08.73205196220 + Sikkens V9.11.69189176208 + Sikkens V6.20.55155144192 + Sikkens V9.17.54147135181 + Sikkens V8.23.44129117166 + Sikkens V9.26.39115100156 + Sikkens V9.26.3310185136 + + + Sikkens W0.05.75210202219 + Sikkens W0.08.71201191214 + Sikkens W0.10.70196186214 + Sikkens W0.20.60172156201 + Sikkens W0.25.50147128186 + Sikkens W0.25.40122103160 + Sikkens W0.30.40120102165 + + + Sikkens W0.30.3010184141 + Sikkens W1.03.81227220231 + Sikkens W0.07.77213205225 + Sikkens W0.15.65183169209 + Sikkens W0.15.55155142180 + Sikkens W0.15.45131120153 + Sikkens W0.20.50147129179 + + + Sikkens W0.20.40119105150 + Sikkens W0.20.309381116 + Sikkens WN.02.82230225232 + Sikkens WN.02.77212207212 + Sikkens W0.05.70205197211 + Sikkens W0.10.60173161187 + Sikkens W0.10.50141136159 + + + Sikkens W0.10.40118109129 + Sikkens W0.10.309386106 + Sikkens W0.10.20575370 + Sikkens W0.03.84231223229 + Sikkens W0.04.78217212223 + Sikkens W0.05.65179175187 + Sikkens W0.05.55154148162 + + + Sikkens W0.05.45129123135 + Sikkens W0.05.3510499109 + Sikkens W0.05.25817788 + Sikkens W0.05.15585562 + Sikkens XN.01.83234228230 + Sikkens W6.05.72208196210 + Sikkens W8.05.63181170185 + + + Sikkens W6.07.53153142160 + Sikkens W7.07.44130119136 + Sikkens W7.07.3410696111 + Sikkens W7.08.24827387 + Sikkens X0.08.15645566 + Sikkens XN.01.84234227227 + Sikkens X0.04.80225213222 + + + Sikkens X0.10.70207186212 + Sikkens X0.10.60179157184 + Sikkens X0.10.50150130155 + Sikkens X0.10.40124106128 + Sikkens X0.10.309781100 + Sikkens X0.10.20695977 + Sikkens ZN.01.83237231230 + + + Sikkens X6.04.76220205217 + Sikkens X7.07.69204182199 + Sikkens X7.13.58184150179 + Sikkens X0.15.50158130167 + Sikkens X0.20.50158125172 + Sikkens X0.20.40131101141 + Sikkens X0.20.3010578112 + + + Sikkens X9.04.79230215224 + Sikkens X9.06.79236212229 + Sikkens X9.11.74230195221 + Sikkens X7.16.66211165205 + Sikkens X7.18.54179133173 + Sikkens X9.21.44157106148 + Sikkens X9.24.3312877118 + + + Sikkens Y0.30.18914889 + Sikkens YN.01.83236229230 + Sikkens YN.02.82234222225 + Sikkens Y1.08.73222194213 + Sikkens Y0.12.63200163191 + Sikkens Y0.20.50170122161 + Sikkens Y0.20.4013995133 + + + Sikkens Y0.20.3010870101 + Sikkens Y0.20.20915886 + Sikkens YN.02.77216206209 + Sikkens Y0.05.72211193200 + Sikkens Y0.10.70214181205 + Sikkens Y0.10.60188155179 + Sikkens Y0.10.50158130152 + + + Sikkens Y0.10.40129105124 + Sikkens Y0.10.30977893 + Sikkens Y0.10.20746073 + Sikkens ZN.01.85238230231 + Sikkens Z2.06.81239209217 + Sikkens Z1.10.70222180198 + Sikkens Z0.10.60188155169 + + + Sikkens Z0.10.50159127142 + Sikkens Z0.10.40135106118 + Sikkens Z0.10.301078293 + Sikkens Z0.05.20726468 + Sikkens Z8.05.81234207210 + Sikkens Z1.10.80252207226 + Sikkens Z1.14.71235178203 + + + Sikkens Z0.20.60211139174 + Sikkens Z0.20.50176121148 + Sikkens Z0.20.4014992122 + Sikkens Z0.20.301207197 + Sikkens Z0.19.20935878 + Sikkens Z9.10.77239191200 + Sikkens Z4.09.76236190205 + + + Sikkens Z6.23.60224128160 + Sikkens Z5.31.4819597140 + Sikkens Z3.37.4319181132 + Sikkens Z9.35.3817574110 + Sikkens Z2.32.3315269107 + Sikkens Z0.30.3013365103 + Sikkens Z8.11.75243194207 + + + Sikkens Z9.16.68235167186 + Sikkens Z8.18.63226151173 + Sikkens Z8.23.57215129157 + Sikkens Z9.32.4920999136 + Sikkens Z9.30.3515970100 + Sikkens Z8.23.271216584 + Sikkens Z3.23.241085477 + + diff --git a/src/ui/color_select/book.rs b/src/ui/color_select/book.rs index 59bbdba88..15fe2df1a 100644 --- a/src/ui/color_select/book.rs +++ b/src/ui/color_select/book.rs @@ -62,7 +62,7 @@ impl ColorBook { pub fn builtin() -> impl Iterator { [ include_str!("../../../assets/color_books/ral-classic.acb"), - include_str!("../../../assets/color_books/css-colors.acb"), + include_str!("../../../assets/color_books/sikkens-4041.acb"), ] .into_iter() .filter_map(|text| parse(text).ok()) diff --git a/src/ui/color_select/editor.rs b/src/ui/color_select/editor.rs index ea97384c7..47970c9ab 100644 --- a/src/ui/color_select/editor.rs +++ b/src/ui/color_select/editor.rs @@ -1,6 +1,6 @@ -//! The colour editor: HSB or RGB sliders, or a saturation/brightness field -//! with a hue strip, plus a hex box. Shared by the CAD Select Color panel and -//! the interface colour picker. +//! The colour editor: RGB, HSB or CMYK sliders above a saturation/brightness +//! field with a hue strip, plus a hex box. Shared by the CAD Select Color +//! panel and the interface colour picker. use super::math::{self, Hsb}; use super::widgets::ColorArea; @@ -15,19 +15,17 @@ use iced::{Background, Border, Color, Element, Gradient, Length, Radians, Theme} const ROW_HEIGHT: f32 = 26.0; const TRACK: f32 = 18.0; const STRIP_WIDTH: f32 = 22.0; -/// Gap between slider rows. Together with `FIELD_HEIGHT` it puts the hex row -/// at the same height in every mode: 3 × 26 + 2 × 14 + 12 = 108 + 10. -const ROW_GAP: f32 = 14.0; -const FIELD_HEIGHT: f32 = 108.0; -const MODE_WIDTH: f32 = 40.0; +const ROW_GAP: f32 = 8.0; +const FIELD_HEIGHT: f32 = 96.0; +const MODE_WIDTH: f32 = 48.0; const MODE_HEIGHT: f32 = 24.0; #[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] pub enum EditorMode { + Rgb, #[default] Hsb, - Rgb, - Field, + Cmyk, } #[derive(Debug, Clone)] @@ -43,6 +41,8 @@ pub enum EditorMsg { Red(u8), Green(u8), Blue(u8), + /// One CMYK channel (0 cyan … 3 black), in percent. + Cmyk(usize, f32), HexInput(String), HexSubmit, } @@ -51,6 +51,8 @@ pub struct ColorEditor { mode: EditorMode, /// Kept beside `rgb` so hue and saturation survive grays and black. hsb: Hsb, + /// Kept too, so black keeps its inks and rounding doesn't move them. + cmyk: [f32; 4], rgb: (u8, u8, u8), hex_draft: Option, } @@ -64,6 +66,7 @@ impl ColorEditor { s: 0.0, b: 1.0, }, + cmyk: [0.0; 4], rgb, hex_draft: None, }; @@ -85,6 +88,7 @@ impl ColorEditor { s: if next.b == 0.0 { self.hsb.s } else { next.s }, b: next.b, }; + self.cmyk = math::rgb_to_cmyk(r, g, b); self.rgb = (r, g, b); self.hex_draft = None; } @@ -96,9 +100,17 @@ impl ColorEditor { b: hsb.b.clamp(0.0, 1.0), }; self.rgb = self.hsb.to_rgb(); + self.cmyk = math::rgb_to_cmyk(self.rgb.0, self.rgb.1, self.rgb.2); self.hex_draft = None; } + fn set_cmyk(&mut self, channel: usize, value: f32) { + let mut cmyk = self.cmyk; + cmyk[channel.min(3)] = value.clamp(0.0, 100.0); + self.set_rgb(math::cmyk_to_rgb(cmyk)); + self.cmyk = cmyk; + } + /// Apply a message; returns whether the colour changed. pub fn update(&mut self, msg: EditorMsg) -> bool { let before = self.rgb; @@ -118,6 +130,7 @@ impl ColorEditor { EditorMsg::Red(v) => self.set_rgb((v, g, b)), EditorMsg::Green(v) => self.set_rgb((r, v, b)), EditorMsg::Blue(v) => self.set_rgb((r, g, v)), + EditorMsg::Cmyk(channel, v) => self.set_cmyk(channel, v), EditorMsg::HexInput(value) => { // Six digits are unambiguous, so apply them while typing; the // short #RGB form waits for Enter. @@ -138,28 +151,26 @@ impl ColorEditor { /// `mode_end` sits at the far right of the mode buttons (the pipette); /// `hex_end` at the far right of the hex row (the nearest index colour). - /// The field view shows the hex value beside H, S and B and leaves out - /// `hex_end`; the slider views end on a hex row. pub fn view<'a>( &'a self, mode_end: Option>, hex_end: Option>, ) -> Element<'a, Message> { - let view = column![self.mode_row(mode_end)].spacing(12); - match self.mode { - EditorMode::Hsb | EditorMode::Rgb => view - .push(self.slider_rows()) - .push(self.hex_row(hex_end)) - .into(), - EditorMode::Field => view.push(self.field_view()).into(), - } + column![ + self.mode_row(mode_end), + self.slider_rows(), + self.field(), + self.hex_row(hex_end), + ] + .spacing(12) + .into() } - /// HSB, RGB and the gradient-field button, with `end` at the far right. + /// RGB, HSB and CMYK, with `end` at the far right. fn mode_row<'a>(&self, end: Option>) -> Element<'a, Message> { - let mode_button = |content: Element<'a, Message>, mode: EditorMode| { + let mode_button = |label: &'static str, mode: EditorMode| { let active = self.mode == mode; - button(container(content).center(Length::Fill)) + button(container(text(label).size(13)).center(Length::Fill)) .on_press(msg(EditorMsg::Mode(mode))) .width(MODE_WIDTH) .height(MODE_HEIGHT) @@ -168,35 +179,10 @@ impl ColorEditor { super::picker::toggle_style(theme, active, status) }) }; - // The field button is only its gradient, without a frame; it takes - // colour when its mode is active and stays gray otherwise. - let field_active = self.mode == EditorMode::Field; - let field_button = button(Space::new().width(MODE_WIDTH).height(MODE_HEIGHT)) - .on_press(msg(EditorMsg::Mode(EditorMode::Field))) - .padding(0) - .style(move |_theme: &Theme, _status| { - let middle = if field_active { - Color::from_rgb8(0x3A, 0xA0, 0xFF) - } else { - Color::from_rgb8(0x80, 0x80, 0x80) - }; - let icon = gradient_box( - 3.0 * std::f32::consts::FRAC_PI_4, - &[(0.0, Color::WHITE), (0.5, middle), (1.0, Color::BLACK)], - ); - button::Style { - background: icon.background, - border: Border { - radius: 5.0.into(), - ..Border::default() - }, - ..Default::default() - } - }); let mut modes = row![ - mode_button(text("HSB").size(13).into(), EditorMode::Hsb), - mode_button(text("RGB").size(13).into(), EditorMode::Rgb), - field_button, + mode_button("RGB", EditorMode::Rgb), + mode_button("HSB", EditorMode::Hsb), + mode_button("CMYK", EditorMode::Cmyk), Space::new().width(Length::Fill), ] .spacing(6); @@ -206,12 +192,29 @@ impl ColorEditor { modes.into() } - /// Three gradient sliders: hue, saturation and brightness, or red, green - /// and blue. + /// Gradient sliders: red, green and blue; hue, saturation and + /// brightness; or cyan, magenta, yellow and black. fn slider_rows<'a>(&self) -> Element<'a, Message> { let Hsb { h, s, b } = self.hsb; let (r, g, bl) = self.rgb; - let rows = if self.mode == EditorMode::Rgb { + let rows = if self.mode == EditorMode::Cmyk { + let ink = |i: usize, letter| { + let at = |v| { + let mut cmyk = self.cmyk; + cmyk[i] = v; + rgb_color(math::cmyk_to_rgb(cmyk)) + }; + channel( + letter, + self.cmyk[i], + 100.0, + Some('%'), + vec![(0.0, at(0.0)), (1.0, at(100.0))], + move |v| EditorMsg::Cmyk(i, v), + ) + }; + column![ink(0, "C"), ink(1, "M"), ink(2, "Y"), ink(3, "K")] + } else if self.mode == EditorMode::Rgb { let ends = |lo: (u8, u8, u8), hi: (u8, u8, u8)| { vec![(0.0, rgb_color(lo)), (1.0, rgb_color(hi))] }; @@ -266,9 +269,8 @@ impl ColorEditor { rows.spacing(ROW_GAP).into() } - /// The saturation/brightness field with its hue strip, and below it H, S - /// and B on the left and the hex value on the right. - fn field_view<'a>(&self) -> Element<'a, Message> { + /// The saturation/brightness field with its hue strip. + fn field<'a>(&self) -> Element<'a, Message> { let Hsb { h, s, b } = self.hsb; let area = ColorArea::new(hsb_color(h, 1.0, 1.0), rgb_color(self.rgb), s, b, |s, b| { msg(EditorMsg::Field(s, b)) @@ -285,50 +287,17 @@ impl ColorEditor { .height(FIELD_HEIGHT) .style(handle_style), ]; - let value = - |letter: &'static str, v: f32, max: f32, unit: char, f: fn(f32) -> EditorMsg| { - row![ - text(letter).size(12).font(iced::Font::MONOSPACE), - number_box(v, max, Some(unit), f), - ] - .spacing(4) - .align_y(iced::Center) - }; - column![ - row![area, strip].spacing(12), - row![ - value("H", h, 360.0, '°', EditorMsg::Hue), - value("S", s * 100.0, 100.0, '%', EditorMsg::Saturation), - value("B", b * 100.0, 100.0, '%', EditorMsg::Brightness), - Space::new().width(Length::Fill), - self.hex_field(), - ] - .spacing(10) - .align_y(iced::Center), - ] - // 108 + 10 matches the slider views' 3 × 26 + 2 × 14 + 12. - .spacing(10) - .into() + row![area, strip].spacing(12).into() } /// The hex value with `end` (the nearest index colour) at the far right. fn hex_row<'a>(&self, end: Option>) -> Element<'a, Message> { - let mut hex_row = row![self.hex_field(), Space::new().width(Length::Fill)] - .spacing(8) - .align_y(iced::Center); - if let Some(end) = end { - hex_row = hex_row.push(end); - } - hex_row.into() - } - - fn hex_field<'a>(&self) -> Element<'a, Message> { let (r, g, b) = self.rgb; let hex = self .hex_draft .clone() .unwrap_or_else(|| math::hex_string(r, g, b)); - row![ + let mut hex_row = row![ text(t!("Hex")).size(11).style(super::picker::muted_text), text_input("", &hex) .on_input(|value| msg(EditorMsg::HexInput(value))) @@ -337,10 +306,14 @@ impl ColorEditor { .font(iced::Font::MONOSPACE) .padding([5, 6]) .width(Length::Fixed(74.0)), + Space::new().width(Length::Fill), ] .spacing(8) - .align_y(iced::Center) - .into() + .align_y(iced::Center); + if let Some(end) = end { + hex_row = hex_row.push(end); + } + hex_row.into() } } diff --git a/src/ui/color_select/math.rs b/src/ui/color_select/math.rs index 74ab9968d..b62250425 100644 --- a/src/ui/color_select/math.rs +++ b/src/ui/color_select/math.rs @@ -59,6 +59,24 @@ pub fn rgb_to_hsb(r: u8, g: u8, b: u8) -> Hsb { Hsb { h, s, b: max } } +/// Cyan, magenta, yellow and black in percent, by the plain device-free +/// formula (no ICC profile): screen values, not press values. +pub fn rgb_to_cmyk(r: u8, g: u8, b: u8) -> [f32; 4] { + let max = r.max(g).max(b); + if max == 0 { + return [0.0, 0.0, 0.0, 100.0]; + } + let max = f32::from(max); + let ink = |v: u8| (1.0 - f32::from(v) / max) * 100.0; + [ink(r), ink(g), ink(b), (1.0 - max / 255.0) * 100.0] +} + +pub fn cmyk_to_rgb([c, m, y, k]: [f32; 4]) -> (u8, u8, u8) { + let white = 255.0 * (1.0 - k.clamp(0.0, 100.0) / 100.0); + let channel = |ink: f32| (white * (1.0 - ink.clamp(0.0, 100.0) / 100.0)).round() as u8; + (channel(c), channel(m), channel(y)) +} + /// RGB of an ACI entry, or `None` outside 1–255. pub fn aci_rgb(index: u8) -> Option<(u8, u8, u8)> { codec::types::aci_table::aci_to_rgb(index) diff --git a/src/ui/color_select/picker.rs b/src/ui/color_select/picker.rs index a4313f881..c02c3723d 100644 --- a/src/ui/color_select/picker.rs +++ b/src/ui/color_select/picker.rs @@ -24,7 +24,7 @@ const PANEL_WIDTH: f32 = 400.0; /// Scope for Tab / Shift+Tab, so focus cycles through the panel's own /// fields instead of the dialogs and command line underneath. const PANEL_ID: &str = "select-color-panel"; -const BODY_HEIGHT: f32 = 352.0; +const BODY_HEIGHT: f32 = 368.0; /// Swatches per row in the Document tab. const DOC_COLUMNS: usize = 8; /// Search matches shown at once in the Color books tab. @@ -32,8 +32,8 @@ const PAGE_BARS: usize = 7; #[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] pub enum ColorPickerTab { - Document, #[default] + Document, Index, TrueColor, Books, @@ -106,11 +106,6 @@ pub struct ColorPicker { impl ColorPicker { pub fn new(target: ColorPickTarget, current: AcadColor, varies: bool) -> Self { - let tab = if matches!(current, AcadColor::Rgb { .. }) { - ColorPickerTab::TrueColor - } else { - ColorPickerTab::Index - }; Self { target, current, @@ -118,7 +113,7 @@ impl ColorPicker { pending: current, current_name: None, pending_name: None, - tab, + tab: ColorPickerTab::Document, editor: ColorEditor::new(math::color_rgb(current).unwrap_or((255, 255, 255))), eyedropper: None, doc: Vec::new(), @@ -133,8 +128,7 @@ impl ColorPicker { } /// Fill the Document and Color books tabs. `current_name` is the - /// `BOOK$NAME` of the current colour; a colour from a loaded book opens - /// on its page. + /// `BOOK$NAME` of the current colour; the Color books tab shows its page. pub fn with_drawing( mut self, mut doc: Vec, @@ -147,9 +141,7 @@ impl ColorPicker { self.recent = recent.to_vec(); self.books = books; if let Some(name) = current_name.filter(|name| !name.is_empty()) { - if self.show_identity(&name) { - self.tab = ColorPickerTab::Books; - } + self.show_identity(&name); self.current_name = Some(name.clone()); self.pending_name = Some(name); } @@ -1152,13 +1144,12 @@ mod tests { } #[test] - fn opens_on_the_tab_that_fits_the_current_colour() { - assert_eq!(picker(AcadColor::Index(30)).tab(), ColorPickerTab::Index); + fn opens_on_the_document_tab() { + assert_eq!(picker(AcadColor::Index(30)).tab(), ColorPickerTab::Document); assert_eq!( picker(AcadColor::Rgb { r: 1, g: 2, b: 3 }).tab(), - ColorPickerTab::TrueColor + ColorPickerTab::Document ); - assert_eq!(picker(AcadColor::ByLayer).tab(), ColorPickerTab::Index); } #[test] @@ -1225,6 +1216,7 @@ mod tests { assert_eq!(step_index(255, ArrowKey::Right), None); let mut p = picker(AcadColor::Index(140)); + p.update(ColorPickerMsg::Tab(ColorPickerTab::Index)); p.update(ColorPickerMsg::Arrow(ArrowKey::Right)); assert_eq!(p.pending(), AcadColor::Index(150)); } @@ -1313,7 +1305,6 @@ mod tests { b: 179, }) .with_drawing(Vec::new(), &[], ral(), Some("RAL CLASSIC$RAL 5015".into())); - assert_eq!(p.tab(), ColorPickerTab::Books); assert_eq!(p.book_selection(), Some(2)); assert_eq!(p.book_page, 1); } @@ -1388,6 +1379,7 @@ mod tests { g: 191, b: 252, }); + p.update(ColorPickerMsg::Tab(ColorPickerTab::TrueColor)); edit(&mut p, EditorMsg::Mode(EditorMode::Rgb)); let mut ui = simulator(&p); let label = ui.find("R").expect("R label"); @@ -1489,11 +1481,11 @@ mod tests { false, ), ( - "field", + "cmyk", ColorPickTarget::Properties, blue, ColorPickerTab::TrueColor, - EditorMode::Field, + EditorMode::Cmyk, false, ), (