From 241a6d9e5aa36c41e1f3be8a75a769e2ce98f7fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20d=27Herbais=20de=20Thun?= Date: Tue, 7 Nov 2023 12:09:51 +0100 Subject: [PATCH] Gradient Part 5b: Fix gradients in math (#2604) --- crates/typst-library/src/math/cancel.rs | 2 +- crates/typst-library/src/math/frac.rs | 2 +- crates/typst-library/src/math/fragment.rs | 2 +- crates/typst-library/src/math/matrix.rs | 2 +- crates/typst-library/src/math/root.rs | 2 +- crates/typst-library/src/math/underover.rs | 2 +- tests/ref/visualize/gradient-math.png | Bin 0 -> 29775 bytes tests/typ/visualize/gradient-math.typ | 68 +++++++++++++++++++++ 8 files changed, 74 insertions(+), 6 deletions(-) create mode 100644 tests/ref/visualize/gradient-math.png create mode 100644 tests/typ/visualize/gradient-math.typ diff --git a/crates/typst-library/src/math/cancel.rs b/crates/typst-library/src/math/cancel.rs index 16e4067a7..455750f7a 100644 --- a/crates/typst-library/src/math/cancel.rs +++ b/crates/typst-library/src/math/cancel.rs @@ -108,7 +108,7 @@ impl LayoutMath for CancelElem { let length = self.length(styles).resolve(styles); let stroke = self.stroke(styles).unwrap_or(FixedStroke { - paint: TextElem::fill_in(styles), + paint: TextElem::fill_in(styles).as_decoration(), ..Default::default() }); diff --git a/crates/typst-library/src/math/frac.rs b/crates/typst-library/src/math/frac.rs index bd8d86bf0..c30141786 100644 --- a/crates/typst-library/src/math/frac.rs +++ b/crates/typst-library/src/math/frac.rs @@ -143,7 +143,7 @@ fn layout( line_pos, FrameItem::Shape( Geometry::Line(Point::with_x(line_width)).stroked(FixedStroke { - paint: TextElem::fill_in(ctx.styles()), + paint: TextElem::fill_in(ctx.styles()).as_decoration(), thickness, ..FixedStroke::default() }), diff --git a/crates/typst-library/src/math/fragment.rs b/crates/typst-library/src/math/fragment.rs index a40ed2bfe..76ee2512f 100644 --- a/crates/typst-library/src/math/fragment.rs +++ b/crates/typst-library/src/math/fragment.rs @@ -225,7 +225,7 @@ impl GlyphFragment { c, font: ctx.font.clone(), lang: TextElem::lang_in(ctx.styles()), - fill: TextElem::fill_in(ctx.styles()), + fill: TextElem::fill_in(ctx.styles()).as_decoration(), shift: TextElem::baseline_in(ctx.styles()), style: ctx.style, font_size: ctx.size, diff --git a/crates/typst-library/src/math/matrix.rs b/crates/typst-library/src/math/matrix.rs index b54da5d60..4142d2357 100644 --- a/crates/typst-library/src/math/matrix.rs +++ b/crates/typst-library/src/math/matrix.rs @@ -397,7 +397,7 @@ fn layout_mat_body( let default_stroke_thickness = DEFAULT_STROKE_THICKNESS.scaled(ctx); let default_stroke = FixedStroke { thickness: default_stroke_thickness, - paint: TextElem::fill_in(ctx.styles()), + paint: TextElem::fill_in(ctx.styles()).as_decoration(), line_cap: LineCap::Square, ..Default::default() }; diff --git a/crates/typst-library/src/math/root.rs b/crates/typst-library/src/math/root.rs index 13c5c1478..ba918ea94 100644 --- a/crates/typst-library/src/math/root.rs +++ b/crates/typst-library/src/math/root.rs @@ -122,7 +122,7 @@ fn layout( line_pos, FrameItem::Shape( Geometry::Line(Point::with_x(radicand.width())).stroked(FixedStroke { - paint: TextElem::fill_in(ctx.styles()), + paint: TextElem::fill_in(ctx.styles()).as_decoration(), thickness, ..FixedStroke::default() }), diff --git a/crates/typst-library/src/math/underover.rs b/crates/typst-library/src/math/underover.rs index aeb83061f..6fc768300 100644 --- a/crates/typst-library/src/math/underover.rs +++ b/crates/typst-library/src/math/underover.rs @@ -96,7 +96,7 @@ fn layout_underoverline( line_pos, FrameItem::Shape( Geometry::Line(Point::with_x(width)).stroked(FixedStroke { - paint: TextElem::fill_in(ctx.styles()), + paint: TextElem::fill_in(ctx.styles()).as_decoration(), thickness: bar_height, ..FixedStroke::default() }), diff --git a/tests/ref/visualize/gradient-math.png b/tests/ref/visualize/gradient-math.png new file mode 100644 index 0000000000000000000000000000000000000000..13185bec7d419255b5f1c7d946b981b1a14d8365 GIT binary patch literal 29775 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 W+=ow2mi}`hKv7mrrcTN{^gjSHtNzdc literal 0 HcmV?d00001 diff --git a/tests/typ/visualize/gradient-math.typ b/tests/typ/visualize/gradient-math.typ new file mode 100644 index 000000000..2030ecbbb --- /dev/null +++ b/tests/typ/visualize/gradient-math.typ @@ -0,0 +1,68 @@ +// Test that gradients are applied correctly on equations. + +--- +// Test on cancel +#show math.equation: set text(fill: gradient.linear(..color.map.rainbow)) +#show math.equation: box + +$ a dot cancel(5) = cancel(25) 5 x + cancel(5) 1 $ + +--- +// Test on frac +#show math.equation: set text(fill: gradient.linear(..color.map.rainbow)) +#show math.equation: box + +$ nabla dot bold(E) = frac(rho, epsilon_0) $ + +--- +// Test on root +#show math.equation: set text(fill: gradient.linear(..color.map.rainbow)) +#show math.equation: box + +$ x_"1,2" = frac(-b +- sqrt(b^2 - 4 a c), 2 a) $ + +--- +// Test on matrix +#show math.equation: set text(fill: gradient.linear(..color.map.rainbow)) +#show math.equation: box + +$ A = mat( + 1, 2, 3; + 4, 5, 6; + 7, 8, 9 +) $ + +--- +// Test on underover +#show math.equation: set text(fill: gradient.linear(..color.map.rainbow)) +#show math.equation: box + +$ underline(X^2) $ +$ overline("hello, world!") $ + +--- +// Test a different direction +#show math.equation: set text(fill: gradient.linear(..color.map.rainbow, dir: ttb)) +#show math.equation: box + +$ A = mat( + 1, 2, 3; + 4, 5, 6; + 7, 8, 9 +) $ + +$ x_"1,2" = frac(-b +- sqrt(b^2 - 4 a c), 2 a) $ + +--- +// Test miscelaneous + +#show math.equation: set text(fill: gradient.linear(..color.map.rainbow)) +#show math.equation: box + +$ hat(x) = bar x bar = vec(x, y, z) = tilde(x) = dot(x) $ +$ x prime = vec(1, 2, delim: "[") $ +$ sum_(i in NN) 1 + i $ +$ attach( + Pi, t: alpha, b: beta, + tl: 1, tr: 2+3, bl: 4+5, br: 6, +) $