summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/typst-pdf/src/color.rs5
-rw-r--r--tests/typ/bugs/2902-gradient-oklch-panic.typ20
2 files changed, 21 insertions, 4 deletions
diff --git a/crates/typst-pdf/src/color.rs b/crates/typst-pdf/src/color.rs
index d7781b35..a758d935 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 00000000..6e09df52
--- /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))