From 62f37ad4abf09b52b3062b96ab078f33f2e40b93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20d=27Herbais=20de=20Thun?= Date: Fri, 29 Sep 2023 15:04:08 +0200 Subject: [PATCH] Color fixes (#2262) --- crates/typst-library/src/text/raw.rs | 17 ++++++----------- crates/typst/src/export/pdf/color.rs | 11 ++--------- crates/typst/src/export/pdf/image.rs | 9 ++++++--- crates/typst/src/geom/color.rs | 7 +++++-- tests/ref/bugs/raw-color-overwrite.png | Bin 0 -> 15184 bytes tests/typ/bugs/raw-color-overwrite.typ | 13 +++++++++++++ 6 files changed, 32 insertions(+), 25 deletions(-) create mode 100644 tests/ref/bugs/raw-color-overwrite.png create mode 100644 tests/typ/bugs/raw-color-overwrite.typ diff --git a/crates/typst-library/src/text/raw.rs b/crates/typst-library/src/text/raw.rs index cf4a0b6b6..8c121fa83 100644 --- a/crates/typst-library/src/text/raw.rs +++ b/crates/typst-library/src/text/raw.rs @@ -290,11 +290,7 @@ impl Show for RawElem { let theme = theme.as_deref().unwrap_or(&THEME); - let foreground = theme - .settings - .foreground - .map(to_typst) - .map_or(Color::BLACK, Color::from); + let foreground = theme.settings.foreground.unwrap_or(synt::Color::BLACK); let mut realized = if matches!(lang.as_deref(), Some("typ" | "typst" | "typc")) { let root = match lang.as_deref() { @@ -309,7 +305,7 @@ impl Show for RawElem { vec![], &highlighter, &mut |node, style| { - seq.push(styled(&text[node.range()], foreground.into(), style)); + seq.push(styled(&text[node.range()], foreground, style)); }, ); @@ -334,7 +330,7 @@ impl Show for RawElem { for (style, piece) in highlighter.highlight_line(line, syntax_set).into_iter().flatten() { - seq.push(styled(piece, foreground.into(), style)); + seq.push(styled(piece, foreground, style)); } } @@ -432,12 +428,11 @@ fn highlight_themed( } /// Style a piece of text with a syntect style. -fn styled(piece: &str, foreground: Paint, style: synt::Style) -> Content { +fn styled(piece: &str, foreground: synt::Color, style: synt::Style) -> Content { let mut body = TextElem::packed(piece); - let paint = to_typst(style.foreground).into(); - if paint != foreground { - body = body.styled(TextElem::set_fill(paint)); + if style.foreground != foreground { + body = body.styled(TextElem::set_fill(to_typst(style.foreground).into())); } if style.font_style.contains(synt::FontStyle::BOLD) { diff --git a/crates/typst/src/export/pdf/color.rs b/crates/typst/src/export/pdf/color.rs index 1ca0c3f79..4263993e3 100644 --- a/crates/typst/src/export/pdf/color.rs +++ b/crates/typst/src/export/pdf/color.rs @@ -199,20 +199,13 @@ impl ColorSpaces { writer .icc_profile(srgb, &profile) .n(3) - .range([0.0, 1.0, 0.0, 1.0, 0.0, 1.0]) - .alternate() - .srgb(); + .range([0.0, 1.0, 0.0, 1.0, 0.0, 1.0]); } // Write the gray color space if let Some(gray) = self.d65_gray { let profile = gray_icc(); - writer - .icc_profile(gray, &profile) - .n(1) - .range([0.0, 1.0]) - .alternate() - .d65_gray(); + writer.icc_profile(gray, &profile).n(1).range([0.0, 1.0]); } } } diff --git a/crates/typst/src/export/pdf/image.rs b/crates/typst/src/export/pdf/image.rs index d8064e3c1..5205c6f63 100644 --- a/crates/typst/src/export/pdf/image.rs +++ b/crates/typst/src/export/pdf/image.rs @@ -5,7 +5,10 @@ use image::{DynamicImage, GenericImageView, Rgba}; use pdf_writer::{Filter, Finish}; use super::{deflate, PdfContext, RefExt}; -use crate::image::{ImageKind, RasterFormat, RasterImage}; +use crate::{ + geom::ColorSpace, + image::{ImageKind, RasterFormat, RasterImage}, +}; /// Embed all used images into the PDF. #[tracing::instrument(skip_all)] @@ -33,9 +36,9 @@ pub fn write_images(ctx: &mut PdfContext) { if raster.icc().is_some() { space.icc_based(icc_ref); } else if has_color { - space.device_rgb(); + ctx.colors.write(ColorSpace::Srgb, space, &mut ctx.alloc); } else { - space.device_gray(); + ctx.colors.write(ColorSpace::D65Gray, space, &mut ctx.alloc); } // Add a second gray-scale image containing the alpha values if diff --git a/crates/typst/src/geom/color.rs b/crates/typst/src/geom/color.rs index aec0c5cd0..b99ba83d1 100644 --- a/crates/typst/src/geom/color.rs +++ b/crates/typst/src/geom/color.rs @@ -907,8 +907,9 @@ impl Color { } } + /// Returns the color's RGB(A) representation as an array of 8-bit values. pub fn to_vec4_u8(&self) -> [u8; 4] { - self.to_vec4().map(|x| (x * 255.0).round() as u8) + self.to_rgba().to_vec4().map(|x| (x * 255.0).round() as u8) } pub fn to_space(self, space: ColorSpace) -> Self { @@ -1113,7 +1114,9 @@ impl PartialEq for Color { // Lower precision for comparison to avoid rounding errors. // Keeps backward compatibility with previous versions of Typst. (Self::Rgba(_), Self::Rgba(_)) => self.to_vec4_u8() == other.to_vec4_u8(), - (Self::Luma(a), Self::Luma(b)) => a == b, + (Self::Luma(a), Self::Luma(b)) => { + (a.luma * 255.0).round() as u8 == (b.luma * 255.0).round() as u8 + } (Self::Oklab(a), Self::Oklab(b)) => a == b, (Self::LinearRgb(a), Self::LinearRgb(b)) => a == b, (Self::Cmyk(a), Self::Cmyk(b)) => a == b, diff --git a/tests/ref/bugs/raw-color-overwrite.png b/tests/ref/bugs/raw-color-overwrite.png new file mode 100644 index 0000000000000000000000000000000000000000..b01d86a49cbfa26e49fc8883b0af1035d85e26b5 GIT binary patch literal 15184 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 HY|sA!X+qB% literal 0 HcmV?d00001 diff --git a/tests/typ/bugs/raw-color-overwrite.typ b/tests/typ/bugs/raw-color-overwrite.typ new file mode 100644 index 000000000..ec306ef1a --- /dev/null +++ b/tests/typ/bugs/raw-color-overwrite.typ @@ -0,0 +1,13 @@ +// Test that the color of a raw block is not overwritten + +--- + +#show raw: set text(fill: blue) + +`Hello, World!` + +```rs +fn main() { + println!("Hello, World!"); +} +``` \ No newline at end of file