|
8 | 8 | //!
|
9 | 9 | //! This crate references CIE Standard Illuminant D65 for functions to/from CIE XYZ
|
10 | 10 |
|
11 |
| -use core::cmp::Ordering; |
12 | 11 | use core::ffi::{c_char, CStr};
|
13 | 12 |
|
14 | 13 | fn spowf(n: f32, power: f32) -> f32 {
|
@@ -372,48 +371,6 @@ impl core::fmt::Display for Space {
|
372 | 371 | }
|
373 | 372 | }
|
374 | 373 |
|
375 |
| -impl PartialOrd for Space { |
376 |
| - fn partial_cmp(&self, other: &Self) -> Option<Ordering> { |
377 |
| - if self == other { |
378 |
| - return Some(Ordering::Equal); |
379 |
| - } |
380 |
| - Some(match self { |
381 |
| - // Base |
382 |
| - Space::SRGB => Ordering::Less, |
383 |
| - |
384 |
| - // Endcaps |
385 |
| - Space::HSV => Ordering::Greater, |
386 |
| - Space::CIELCH => Ordering::Greater, |
387 |
| - Space::OKLCH => Ordering::Greater, |
388 |
| - Space::JZCZHZ => Ordering::Greater, |
389 |
| - |
390 |
| - // Common intermittents |
391 |
| - Space::LRGB => match other { |
392 |
| - Space::SRGB | Space::HSV => Ordering::Greater, |
393 |
| - _ => Ordering::Less, |
394 |
| - }, |
395 |
| - Space::XYZ => match other { |
396 |
| - Space::SRGB | Space::LRGB | Space::HSV => Ordering::Greater, |
397 |
| - _ => Ordering::Less, |
398 |
| - }, |
399 |
| - |
400 |
| - // LAB Branches |
401 |
| - Space::CIELAB => match other { |
402 |
| - Space::CIELCH => Ordering::Less, |
403 |
| - _ => Ordering::Greater, |
404 |
| - }, |
405 |
| - Space::OKLAB => match other { |
406 |
| - Space::OKLCH => Ordering::Less, |
407 |
| - _ => Ordering::Greater, |
408 |
| - }, |
409 |
| - Space::JZAZBZ => match other { |
410 |
| - Space::JZCZHZ => Ordering::Less, |
411 |
| - _ => Ordering::Greater, |
412 |
| - }, |
413 |
| - }) |
414 |
| - } |
415 |
| -} |
416 |
| - |
417 | 374 | impl Space {
|
418 | 375 | /// Returns 3 channels letters for user-facing colorspace controls
|
419 | 376 | pub fn channels(&self) -> [char; 3] {
|
@@ -617,97 +574,72 @@ impl Space {
|
617 | 574 | // ### Convert Space ### {{{
|
618 | 575 |
|
619 | 576 | macro_rules! op_single {
|
620 |
| - ($func:ident, $data:expr) => {$func($data)}; |
| 577 | + ($func:ident, $data:expr) => { |
| 578 | + $func($data) |
| 579 | + }; |
621 | 580 | }
|
622 | 581 |
|
623 | 582 | macro_rules! op_chunk {
|
624 |
| - ($func:ident, $data:expr) => {$data.iter_mut().for_each(|pixel| $func(pixel))}; |
| 583 | + ($func:ident, $data:expr) => { |
| 584 | + $data.iter_mut().for_each(|pixel| $func(pixel)) |
| 585 | + }; |
625 | 586 | }
|
626 | 587 |
|
627 | 588 | macro_rules! op_inter {
|
628 |
| - ($func:ident, $data:expr) => {$data.chunks_exact_mut(3).for_each(|pixel| $func(pixel.try_into().unwrap()))}; |
| 589 | + ($func:ident, $data:expr) => { |
| 590 | + $data |
| 591 | + .chunks_exact_mut(3) |
| 592 | + .for_each(|pixel| $func(pixel.try_into().unwrap())) |
| 593 | + }; |
629 | 594 | }
|
630 | 595 |
|
| 596 | +#[rustfmt::skip] |
631 | 597 | macro_rules! graph {
|
632 | 598 | ($recurse:ident, $data:expr, $from:expr, $to:expr, $op:ident) => {
|
633 |
| - if $from > $to { |
634 |
| - match $from { |
635 |
| - Space::SRGB => unreachable!(), |
636 |
| - Space::HSV => { |
637 |
| - $op!(hsv_to_srgb, $data); |
638 |
| - $recurse(Space::SRGB, $to, $data) |
639 |
| - } |
640 |
| - Space::LRGB => { |
641 |
| - $op!(lrgb_to_srgb, $data); |
642 |
| - $recurse(Space::SRGB, $to, $data) |
643 |
| - } |
644 |
| - Space::XYZ => { |
645 |
| - $op!(xyz_to_lrgb, $data); |
646 |
| - $recurse(Space::LRGB, $to, $data) |
647 |
| - } |
648 |
| - Space::CIELAB => { |
649 |
| - $op!(lab_to_xyz, $data); |
650 |
| - $recurse(Space::XYZ, $to, $data) |
651 |
| - } |
652 |
| - Space::CIELCH => { |
653 |
| - $op!(lch_to_lab, $data); |
654 |
| - $recurse(Space::CIELAB, $to, $data) |
655 |
| - } |
656 |
| - Space::OKLAB => { |
657 |
| - $op!(oklab_to_xyz, $data); |
658 |
| - $recurse(Space::XYZ, $to, $data) |
659 |
| - } |
660 |
| - Space::OKLCH => { |
661 |
| - $op!(lch_to_lab, $data); |
662 |
| - $recurse(Space::OKLAB, $to, $data) |
663 |
| - } |
664 |
| - Space::JZAZBZ => { |
665 |
| - $op!(jzazbz_to_xyz, $data); |
666 |
| - $recurse(Space::XYZ, $to, $data) |
667 |
| - } |
668 |
| - Space::JZCZHZ => { |
669 |
| - $op!(lch_to_lab, $data); |
670 |
| - $recurse(Space::JZAZBZ, $to, $data) |
671 |
| - } |
672 |
| - } |
673 |
| - } else if $from < $to { |
674 |
| - match $from { |
675 |
| - // Endcaps |
676 |
| - Space::HSV => unreachable!(), |
677 |
| - Space::CIELCH => unreachable!(), |
678 |
| - Space::OKLCH => unreachable!(), |
679 |
| - Space::JZCZHZ => unreachable!(), |
680 |
| - |
681 |
| - Space::SRGB => match $to { |
682 |
| - Space::HSV => $op!(srgb_to_hsv, $data), |
683 |
| - _ => { |
684 |
| - $op!(srgb_to_lrgb, $data); |
685 |
| - $recurse(Space::LRGB, $to, $data) |
686 |
| - } |
687 |
| - }, |
688 |
| - Space::LRGB => { |
689 |
| - $op!(lrgb_to_xyz, $data); |
690 |
| - $recurse(Space::XYZ, $to, $data) |
691 |
| - } |
692 |
| - Space::XYZ => match $to { |
693 |
| - Space::CIELAB | Space::CIELCH => { |
694 |
| - $op!(xyz_to_lab, $data); |
695 |
| - $recurse(Space::CIELAB, $to, $data) |
696 |
| - } |
697 |
| - Space::OKLAB | Space::OKLCH => { |
698 |
| - $op!(xyz_to_oklab, $data); |
699 |
| - $recurse(Space::OKLAB, $to, $data) |
700 |
| - } |
701 |
| - Space::JZAZBZ | Space::JZCZHZ => { |
702 |
| - $op!(xyz_to_jzazbz, $data); |
703 |
| - $recurse(Space::JZAZBZ, $to, $data) |
704 |
| - } |
705 |
| - _ => unreachable!("XYZ tried $to promote $to {}", $to), |
706 |
| - }, |
707 |
| - Space::CIELAB | Space::OKLAB | Space::JZAZBZ => { |
708 |
| - $op!(lab_to_lch, $data) |
709 |
| - } |
710 |
| - } |
| 599 | + match ($from, $to) { |
| 600 | + // no-ops |
| 601 | + (Space::HSV, Space::HSV) => (), |
| 602 | + (Space::SRGB, Space::SRGB) => (), |
| 603 | + (Space::LRGB, Space::LRGB) => (), |
| 604 | + (Space::XYZ, Space::XYZ) => (), |
| 605 | + (Space::CIELAB, Space::CIELAB) => (), |
| 606 | + (Space::CIELCH, Space::CIELCH) => (), |
| 607 | + (Space::OKLAB, Space::OKLAB) => (), |
| 608 | + (Space::OKLCH, Space::OKLCH) => (), |
| 609 | + (Space::JZAZBZ, Space::JZAZBZ) => (), |
| 610 | + (Space::JZCZHZ, Space::JZCZHZ) => (), |
| 611 | + |
| 612 | + //endcaps |
| 613 | + (Space::SRGB, Space::HSV) => $op!(srgb_to_hsv, $data), |
| 614 | + (Space::CIELAB, Space::CIELCH) |
| 615 | + | (Space::OKLAB, Space::OKLCH) |
| 616 | + | (Space::JZAZBZ, Space::JZCZHZ) => $op!(lab_to_lch, $data), |
| 617 | + |
| 618 | + // Reverse Endcaps |
| 619 | + (Space::HSV, _) => { $op!(hsv_to_srgb, $data); $recurse(Space::SRGB, $to, $data) } |
| 620 | + (Space::CIELCH, _) => { $op!(lch_to_lab, $data); $recurse(Space::CIELAB, $to, $data) } |
| 621 | + (Space::OKLCH, _) => { $op!(lch_to_lab, $data); $recurse(Space::OKLAB, $to, $data) } |
| 622 | + (Space::JZCZHZ, _) => { $op!(lch_to_lab, $data); $recurse(Space::JZAZBZ, $to, $data) } |
| 623 | + |
| 624 | + // SRGB Up |
| 625 | + (Space::SRGB, _) => { $op!(srgb_to_lrgb, $data); $recurse(Space::LRGB, $to, $data) } |
| 626 | + |
| 627 | + // LRGB Down |
| 628 | + (Space::LRGB, Space::SRGB | Space::HSV) => { $op!(lrgb_to_srgb, $data); $recurse(Space::SRGB, $to, $data) } |
| 629 | + // LRGB Up |
| 630 | + (Space::LRGB, _) => { $op!(lrgb_to_xyz, $data); $recurse(Space::XYZ, $to, $data) } |
| 631 | + |
| 632 | + // XYZ Down |
| 633 | + (Space::XYZ, Space::SRGB | Space::LRGB | Space::HSV) => { $op!(xyz_to_lrgb, $data); $recurse(Space::LRGB, $to, $data) } |
| 634 | + // XYZ Up |
| 635 | + (Space::XYZ, Space::CIELAB | Space::CIELCH) => { $op!(xyz_to_cielab, $data); $recurse(Space::CIELAB, $to, $data) } |
| 636 | + (Space::XYZ, Space::OKLAB | Space::OKLCH) => { $op!(xyz_to_oklab, $data); $recurse(Space::OKLAB, $to, $data) } |
| 637 | + (Space::XYZ, Space::JZAZBZ | Space::JZCZHZ) => { $op!(xyz_to_jzazbz, $data); $recurse(Space::JZAZBZ, $to, $data) } |
| 638 | + |
| 639 | + // LAB Down |
| 640 | + (Space::CIELAB, _) => { $op!(cielab_to_xyz, $data); $recurse(Space::XYZ, $to, $data) } |
| 641 | + (Space::OKLAB, _) => { $op!(oklab_to_xyz, $data); $recurse(Space::XYZ, $to, $data) } |
| 642 | + (Space::JZAZBZ, _) => { $op!(jzazbz_to_xyz, $data); $recurse(Space::XYZ, $to, $data) } |
711 | 643 | }
|
712 | 644 | };
|
713 | 645 | }
|
@@ -973,7 +905,7 @@ pub extern "C" fn lrgb_to_xyz(pixel: &mut [f32; 3]) {
|
973 | 905 | ///
|
974 | 906 | /// <https://en.wikipedia.org/wiki/CIELAB_color_space#From_CIEXYZ_to_CIELAB>
|
975 | 907 | #[no_mangle]
|
976 |
| -pub extern "C" fn xyz_to_lab(pixel: &mut [f32; 3]) { |
| 908 | +pub extern "C" fn xyz_to_cielab(pixel: &mut [f32; 3]) { |
977 | 909 | // Reverse D65 standard illuminant
|
978 | 910 | pixel.iter_mut().zip(D65).for_each(|(c, d)| *c /= d);
|
979 | 911 |
|
@@ -1163,7 +1095,7 @@ pub extern "C" fn xyz_to_lrgb(pixel: &mut [f32; 3]) {
|
1163 | 1095 | ///
|
1164 | 1096 | /// <https://en.wikipedia.org/wiki/CIELAB_color_space#From_CIELAB_to_CIEXYZ>
|
1165 | 1097 | #[no_mangle]
|
1166 |
| -pub extern "C" fn lab_to_xyz(pixel: &mut [f32; 3]) { |
| 1098 | +pub extern "C" fn cielab_to_xyz(pixel: &mut [f32; 3]) { |
1167 | 1099 | *pixel = [
|
1168 | 1100 | (pixel[0] + 16.0) / 116.0 + pixel[1] / 500.0,
|
1169 | 1101 | (pixel[0] + 16.0) / 116.0,
|
@@ -1526,11 +1458,11 @@ mod tests {
|
1526 | 1458 |
|
1527 | 1459 | #[test]
|
1528 | 1460 | fn lab_forwards() {
|
1529 |
| - func_cmp(XYZ, LAB, xyz_to_lab) |
| 1461 | + func_cmp(XYZ, LAB, xyz_to_cielab) |
1530 | 1462 | }
|
1531 | 1463 | #[test]
|
1532 | 1464 | fn lab_backwards() {
|
1533 |
| - func_cmp(LAB, XYZ, lab_to_xyz) |
| 1465 | + func_cmp(LAB, XYZ, cielab_to_xyz) |
1534 | 1466 | }
|
1535 | 1467 |
|
1536 | 1468 | #[test]
|
@@ -1670,8 +1602,8 @@ mod tests {
|
1670 | 1602 | ("lrgb_backwards", lrgb_to_srgb),
|
1671 | 1603 | ("xyz_forwards", lrgb_to_xyz),
|
1672 | 1604 | ("xyz_backwards", xyz_to_lrgb),
|
1673 |
| - ("lab_forwards", xyz_to_lab), |
1674 |
| - ("lab_backwards", lab_to_xyz), |
| 1605 | + ("lab_forwards", xyz_to_cielab), |
| 1606 | + ("lab_backwards", cielab_to_xyz), |
1675 | 1607 | ("lch_forwards", lab_to_lch),
|
1676 | 1608 | ("lch_backwards", lch_to_lab),
|
1677 | 1609 | ("oklab_forwards", xyz_to_oklab),
|
|
0 commit comments