diff options
Diffstat (limited to 'crates/typst-pdf')
| -rw-r--r-- | crates/typst-pdf/src/color.rs | 13 | ||||
| -rw-r--r-- | crates/typst-pdf/src/postscript/oklab.ps | 8 |
2 files changed, 13 insertions, 8 deletions
diff --git a/crates/typst-pdf/src/color.rs b/crates/typst-pdf/src/color.rs index 4c2f6183..a9ad0100 100644 --- a/crates/typst-pdf/src/color.rs +++ b/crates/typst-pdf/src/color.rs @@ -240,10 +240,10 @@ fn minify(source: &str) -> String { /// Ensures that the values are in the range [0.0, 1.0]. /// /// # Why? -/// - Oklab: The a and b components are in the range [-0.4, 0.4] and the PDF +/// - Oklab: The a and b components are in the range [-0.5, 0.5] and the PDF /// specifies (and some readers enforce) that all color values be in the range /// [0.0, 1.0]. This means that the PostScript function and the encoded color -/// must be offset by 0.4. +/// must be offset by 0.5. /// - HSV/HSL: The hue component is in the range [0.0, 360.0] and the PDF format /// specifies that it must be in the range [0.0, 1.0]. This means that the /// PostScript function and the encoded color must be divided by 360.0. @@ -256,8 +256,13 @@ impl ColorEncode for ColorSpace { fn encode(&self, color: Color) -> [f32; 4] { match self { ColorSpace::Oklab => { - let [l, a, b, alpha] = color.to_oklab().to_vec4(); - [l, (a + 0.4).clamp(0.0, 1.0), (b + 0.4).clamp(0.0, 1.0), alpha] + 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); + // Convert cylindrical coordinates back to rectangular ones. + let a = c * h.to_radians().cos(); + let b = c * h.to_radians().sin(); + [l, a + 0.5, b + 0.5, alpha] } ColorSpace::Hsl => { let [h, s, l, _] = color.to_hsl().to_vec4(); diff --git a/crates/typst-pdf/src/postscript/oklab.ps b/crates/typst-pdf/src/postscript/oklab.ps index 4d6e9ad5..e766bbd8 100644 --- a/crates/typst-pdf/src/postscript/oklab.ps +++ b/crates/typst-pdf/src/postscript/oklab.ps @@ -3,12 +3,12 @@ % /!\ WARNING: The A and B components **MUST** be encoded % in the range [0, 1] before calling this function. % This is because the function assumes that the - % A and B components are offset by a factor of 0.4 + % A and B components are offset by a factor of 0.5 % in order to meet the range requirements of the % PDF specification. - exch 0.4 sub - exch 0.4 sub + exch 0.5 sub + exch 0.5 sub % Load L a and b into the stack 2 index @@ -75,4 +75,4 @@ % Discard f1, f2, and f3 by rolling the stack and popping 6 3 roll pop pop pop -}
\ No newline at end of file +} |
