From 343a423e9f07f4bccc41bc0a60a3a2251c8a228a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20d=27Herbais=20de=20Thun?= Date: Mon, 11 Dec 2023 17:03:59 +0100 Subject: [PATCH] Fix #2902 (#2913) --- crates/typst-pdf/src/color.rs | 5 +---- tests/typ/bugs/2902-gradient-oklch-panic.typ | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 tests/typ/bugs/2902-gradient-oklch-panic.typ diff --git a/crates/typst-pdf/src/color.rs b/crates/typst-pdf/src/color.rs index d7781b352..a758d935d 100644 --- a/crates/typst-pdf/src/color.rs +++ b/crates/typst-pdf/src/color.rs @@ -255,7 +255,7 @@ pub trait ColorEncode { impl ColorEncode for ColorSpace { fn encode(&self, color: Color) -> [f32; 4] { match self { - ColorSpace::Oklab => { + ColorSpace::Oklab | ColorSpace::Oklch => { let [l, c, h, alpha] = color.to_oklch().to_vec4(); // Clamp on Oklch's chroma, not Oklab's a\* and b\* as to not distort hue. let c = c.clamp(0.0, 0.5); @@ -272,9 +272,6 @@ impl ColorEncode for ColorSpace { let [h, s, v, _] = color.to_hsv().to_vec4(); [h / 360.0, s, v, 0.0] } - ColorSpace::Oklch => { - unimplemented!("Oklch is always converted to Oklab first") - } _ => color.to_vec4(), } } diff --git a/tests/typ/bugs/2902-gradient-oklch-panic.typ b/tests/typ/bugs/2902-gradient-oklch-panic.typ new file mode 100644 index 000000000..6e09df521 --- /dev/null +++ b/tests/typ/bugs/2902-gradient-oklch-panic.typ @@ -0,0 +1,20 @@ +// Minimal reproduction of #2902 +// Ref: false + +--- +#set page(width: 15cm, height: auto, margin: 1em) +#set block(width: 100%, height: 1cm, above: 2pt) + +// Oklch +#block(fill: gradient.linear(red, purple, space: oklch)) +#block(fill: gradient.linear(..color.map.rainbow, space: oklch)) +#block(fill: gradient.linear(..color.map.plasma, space: oklch)) + +--- +#set page(width: 15cm, height: auto, margin: 1em) +#set block(width: 100%, height: 1cm, above: 2pt) + +// Oklab +#block(fill: gradient.linear(red, purple, space: oklab)) +#block(fill: gradient.linear(..color.map.rainbow, space: oklab)) +#block(fill: gradient.linear(..color.map.plasma, space: oklab))