Skip to content

Commit a56e62f

Browse files
committed
Rename CIELAB functions && remove Space::PartialOrd
Now use a fat match block in the universal graph macro. Actually less code... Renamed xyz_to_lab and lab_to_xyz to cielab cause I forgot.
1 parent 13619e2 commit a56e62f

File tree

2 files changed

+66
-134
lines changed

2 files changed

+66
-134
lines changed

benches/conversions.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ pub fn conversions(c: &mut Criterion) {
2424
black_box(pixels.clone().chunks_exact_mut(3).for_each(|pixel| colcon::lrgb_to_xyz(pixel.try_into().unwrap())));
2525
} ));
2626

27-
c.bench_function("xyz_to_lab", |b| b.iter(|| {
28-
black_box(pixels.clone().chunks_exact_mut(3).for_each(|pixel| colcon::xyz_to_lab(pixel.try_into().unwrap())));
27+
c.bench_function("xyz_to_cielab", |b| b.iter(|| {
28+
black_box(pixels.clone().chunks_exact_mut(3).for_each(|pixel| colcon::xyz_to_cielab(pixel.try_into().unwrap())));
2929
} ));
3030

3131
c.bench_function("xyz_to_oklab", |b| b.iter(|| {
@@ -52,8 +52,8 @@ pub fn conversions(c: &mut Criterion) {
5252
black_box(pixels.clone().chunks_exact_mut(3).for_each(|pixel| colcon::oklab_to_xyz(pixel.try_into().unwrap())));
5353
} ));
5454

55-
c.bench_function("lab_to_xyz", |b| b.iter(|| {
56-
black_box(pixels.clone().chunks_exact_mut(3).for_each(|pixel| colcon::lab_to_xyz(pixel.try_into().unwrap())));
55+
c.bench_function("cielab_to_xyz", |b| b.iter(|| {
56+
black_box(pixels.clone().chunks_exact_mut(3).for_each(|pixel| colcon::cielab_to_xyz(pixel.try_into().unwrap())));
5757
} ));
5858

5959
c.bench_function("xyz_to_lrgb", |b| b.iter(|| {

src/lib.rs

+62-130
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
//!
99
//! This crate references CIE Standard Illuminant D65 for functions to/from CIE XYZ
1010
11-
use core::cmp::Ordering;
1211
use core::ffi::{c_char, CStr};
1312

1413
fn spowf(n: f32, power: f32) -> f32 {
@@ -372,48 +371,6 @@ impl core::fmt::Display for Space {
372371
}
373372
}
374373

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-
417374
impl Space {
418375
/// Returns 3 channels letters for user-facing colorspace controls
419376
pub fn channels(&self) -> [char; 3] {
@@ -617,97 +574,72 @@ impl Space {
617574
// ### Convert Space ### {{{
618575

619576
macro_rules! op_single {
620-
($func:ident, $data:expr) => {$func($data)};
577+
($func:ident, $data:expr) => {
578+
$func($data)
579+
};
621580
}
622581

623582
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+
};
625586
}
626587

627588
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+
};
629594
}
630595

596+
#[rustfmt::skip]
631597
macro_rules! graph {
632598
($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) }
711643
}
712644
};
713645
}
@@ -973,7 +905,7 @@ pub extern "C" fn lrgb_to_xyz(pixel: &mut [f32; 3]) {
973905
///
974906
/// <https://en.wikipedia.org/wiki/CIELAB_color_space#From_CIEXYZ_to_CIELAB>
975907
#[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]) {
977909
// Reverse D65 standard illuminant
978910
pixel.iter_mut().zip(D65).for_each(|(c, d)| *c /= d);
979911

@@ -1163,7 +1095,7 @@ pub extern "C" fn xyz_to_lrgb(pixel: &mut [f32; 3]) {
11631095
///
11641096
/// <https://en.wikipedia.org/wiki/CIELAB_color_space#From_CIELAB_to_CIEXYZ>
11651097
#[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]) {
11671099
*pixel = [
11681100
(pixel[0] + 16.0) / 116.0 + pixel[1] / 500.0,
11691101
(pixel[0] + 16.0) / 116.0,
@@ -1526,11 +1458,11 @@ mod tests {
15261458

15271459
#[test]
15281460
fn lab_forwards() {
1529-
func_cmp(XYZ, LAB, xyz_to_lab)
1461+
func_cmp(XYZ, LAB, xyz_to_cielab)
15301462
}
15311463
#[test]
15321464
fn lab_backwards() {
1533-
func_cmp(LAB, XYZ, lab_to_xyz)
1465+
func_cmp(LAB, XYZ, cielab_to_xyz)
15341466
}
15351467

15361468
#[test]
@@ -1670,8 +1602,8 @@ mod tests {
16701602
("lrgb_backwards", lrgb_to_srgb),
16711603
("xyz_forwards", lrgb_to_xyz),
16721604
("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),
16751607
("lch_forwards", lab_to_lch),
16761608
("lch_backwards", lch_to_lab),
16771609
("oklab_forwards", xyz_to_oklab),

0 commit comments

Comments
 (0)