From a59666369b946c3a8b62db363659cbfca35f0a26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20d=27Herbais=20de=20Thun?= Date: Thu, 12 Oct 2023 18:03:52 +0200 Subject: [PATCH] Part 5a: Gradients on text with `relative: auto` or `relative: "parent"` (#2364) --- crates/typst-library/src/text/deco.rs | 2 +- crates/typst-library/src/text/mod.rs | 14 +- crates/typst/src/export/pdf/color.rs | 25 +-- crates/typst/src/export/pdf/gradient.rs | 72 +++++++-- crates/typst/src/export/pdf/page.rs | 22 ++- crates/typst/src/export/render.rs | 151 +++++++++++++++--- crates/typst/src/export/svg.rs | 57 +++++-- crates/typst/src/geom/gradient.rs | 41 ++++- crates/typst/src/geom/paint.rs | 16 +- .../visualize/gradient-text-decorations.png | Bin 0 -> 6393 bytes tests/ref/visualize/gradient-text-other.png | Bin 0 -> 60270 bytes tests/ref/visualize/gradient-text.png | Bin 0 -> 48309 bytes .../visualize/gradient-text-decorations.typ | 9 ++ tests/typ/visualize/gradient-text-other.typ | 14 ++ tests/typ/visualize/gradient-text.typ | 50 +++++- 15 files changed, 389 insertions(+), 84 deletions(-) create mode 100644 tests/ref/visualize/gradient-text-decorations.png create mode 100644 tests/ref/visualize/gradient-text-other.png create mode 100644 tests/ref/visualize/gradient-text.png create mode 100644 tests/typ/visualize/gradient-text-decorations.typ create mode 100644 tests/typ/visualize/gradient-text-other.typ diff --git a/crates/typst-library/src/text/deco.rs b/crates/typst-library/src/text/deco.rs index 203232071..136dfad87 100644 --- a/crates/typst-library/src/text/deco.rs +++ b/crates/typst-library/src/text/deco.rs @@ -400,7 +400,7 @@ pub(super) fn decorate( let offset = offset.unwrap_or(-metrics.position.at(text.size)) - shift; let stroke = stroke.clone().unwrap_or(FixedStroke { - paint: text.fill.clone(), + paint: text.fill.as_decoration(), thickness: metrics.thickness.at(text.size), ..FixedStroke::default() }); diff --git a/crates/typst-library/src/text/mod.rs b/crates/typst-library/src/text/mod.rs index b380431b4..748d71ad0 100644 --- a/crates/typst-library/src/text/mod.rs +++ b/crates/typst-library/src/text/mod.rs @@ -182,10 +182,16 @@ pub struct TextElem { #[parse({ let paint: Option> = args.named_or_find("fill")?; if let Some(paint) = &paint { - // TODO: Implement gradients on text. - if matches!(paint.v, Paint::Gradient(_)) { - bail!(error!(paint.span, "text fill must be a solid color") - .with_hint("gradients on text will be supported soon")); + if let Paint::Gradient(gradient) = &paint.v { + if gradient.relative() == Smart::Custom(Relative::Self_) { + bail!( + error!( + paint.span, + "gradients on text must be relative to the parent" + ) + .with_hint("make sure to set `relative: auto` on your text fill") + ); + } } } paint.map(|paint| paint.v) diff --git a/crates/typst/src/export/pdf/color.rs b/crates/typst/src/export/pdf/color.rs index 6ad273d85..d5b6f3f1d 100644 --- a/crates/typst/src/export/pdf/color.rs +++ b/crates/typst/src/export/pdf/color.rs @@ -274,30 +274,35 @@ impl ColorEncode for ColorSpace { /// Encodes a paint into either a fill or stroke color. pub(super) trait PaintEncode { /// Set the paint as the fill color. - fn set_as_fill(&self, ctx: &mut PageContext, transforms: Transforms); + fn set_as_fill(&self, ctx: &mut PageContext, on_text: bool, transforms: Transforms); /// Set the paint as the stroke color. - fn set_as_stroke(&self, ctx: &mut PageContext, transforms: Transforms); + fn set_as_stroke(&self, ctx: &mut PageContext, on_text: bool, transforms: Transforms); } impl PaintEncode for Paint { - fn set_as_fill(&self, ctx: &mut PageContext, transforms: Transforms) { + fn set_as_fill(&self, ctx: &mut PageContext, on_text: bool, transforms: Transforms) { match self { - Self::Solid(c) => c.set_as_fill(ctx, transforms), - Self::Gradient(gradient) => gradient.set_as_fill(ctx, transforms), + Self::Solid(c) => c.set_as_fill(ctx, on_text, transforms), + Self::Gradient(gradient) => gradient.set_as_fill(ctx, on_text, transforms), } } - fn set_as_stroke(&self, ctx: &mut PageContext, transforms: Transforms) { + fn set_as_stroke( + &self, + ctx: &mut PageContext, + on_text: bool, + transforms: Transforms, + ) { match self { - Self::Solid(c) => c.set_as_stroke(ctx, transforms), - Self::Gradient(gradient) => gradient.set_as_stroke(ctx, transforms), + Self::Solid(c) => c.set_as_stroke(ctx, on_text, transforms), + Self::Gradient(gradient) => gradient.set_as_stroke(ctx, on_text, transforms), } } } impl PaintEncode for Color { - fn set_as_fill(&self, ctx: &mut PageContext, _: Transforms) { + fn set_as_fill(&self, ctx: &mut PageContext, _: bool, _: Transforms) { match self { Color::Luma(_) => { ctx.parent.colors.d65_gray(&mut ctx.parent.alloc); @@ -350,7 +355,7 @@ impl PaintEncode for Color { } } - fn set_as_stroke(&self, ctx: &mut PageContext, _: Transforms) { + fn set_as_stroke(&self, ctx: &mut PageContext, _: bool, _: Transforms) { match self { Color::Luma(_) => { ctx.parent.colors.d65_gray(&mut ctx.parent.alloc); diff --git a/crates/typst/src/export/pdf/gradient.rs b/crates/typst/src/export/pdf/gradient.rs index 1123b53e2..6ecf85882 100644 --- a/crates/typst/src/export/pdf/gradient.rs +++ b/crates/typst/src/export/pdf/gradient.rs @@ -27,12 +27,14 @@ pub struct PdfGradient { pub aspect_ratio: Ratio, /// The gradient. pub gradient: Gradient, + /// Whether the gradient is applied to text. + pub on_text: bool, } /// Writes the actual gradients (shading patterns) to the PDF. /// This is performed once after writing all pages. pub fn write_gradients(ctx: &mut PdfContext) { - for PdfGradient { transform, aspect_ratio, gradient } in + for PdfGradient { transform, aspect_ratio, gradient, on_text } in ctx.gradient_map.items().cloned().collect::>() { let shading = ctx.alloc.bump(); @@ -89,7 +91,7 @@ pub fn write_gradients(ctx: &mut PdfContext) { shading_pattern } Gradient::Conic(conic) => { - let vertices = compute_vertex_stream(conic); + let vertices = compute_vertex_stream(conic, aspect_ratio, on_text); let stream_shading_id = ctx.alloc.bump(); let mut stream_shading = @@ -254,20 +256,25 @@ fn single_gradient( } impl PaintEncode for Gradient { - fn set_as_fill(&self, ctx: &mut PageContext, transforms: Transforms) { + fn set_as_fill(&self, ctx: &mut PageContext, on_text: bool, transforms: Transforms) { ctx.reset_fill_color_space(); - let id = register_gradient(ctx, self, transforms); + let id = register_gradient(ctx, self, on_text, transforms); let name = Name(id.as_bytes()); ctx.content.set_fill_color_space(ColorSpaceOperand::Pattern); ctx.content.set_fill_pattern(None, name); } - fn set_as_stroke(&self, ctx: &mut PageContext, transforms: Transforms) { + fn set_as_stroke( + &self, + ctx: &mut PageContext, + on_text: bool, + transforms: Transforms, + ) { ctx.reset_stroke_color_space(); - let id = register_gradient(ctx, self, transforms); + let id = register_gradient(ctx, self, on_text, transforms); let name = Name(id.as_bytes()); ctx.content.set_stroke_color_space(ColorSpaceOperand::Pattern); @@ -279,6 +286,7 @@ impl PaintEncode for Gradient { fn register_gradient( ctx: &mut PageContext, gradient: &Gradient, + on_text: bool, mut transforms: Transforms, ) -> EcoString { // Edge cases for strokes. @@ -290,17 +298,21 @@ fn register_gradient( transforms.size.y = Abs::pt(1.0); } - let size = match gradient.unwrap_relative(false) { + let size = match gradient.unwrap_relative(on_text) { Relative::Self_ => transforms.size, Relative::Parent => transforms.container_size, }; + // Correction for y-axis flipping on text. + let angle = gradient.angle().unwrap_or_else(Angle::zero); + let angle = if on_text { Angle::rad(TAU as f64) - angle } else { angle }; + let (offset_x, offset_y) = match gradient { Gradient::Conic(conic) => ( -size.x * (1.0 - conic.center.x.get() / 2.0) / 2.0, -size.y * (1.0 - conic.center.y.get() / 2.0) / 2.0, ), - gradient => match gradient.angle().unwrap_or_else(Angle::zero).quadrant() { + _ => match angle.quadrant() { Quadrant::First => (Abs::zero(), Abs::zero()), Quadrant::Second => (size.x, Abs::zero()), Quadrant::Third => (size.x, size.y), @@ -310,10 +322,10 @@ fn register_gradient( let rotation = match gradient { Gradient::Conic(_) => Angle::zero(), - gradient => gradient.angle().unwrap_or_default(), + _ => angle, }; - let transform = match gradient.unwrap_relative(false) { + let transform = match gradient.unwrap_relative(on_text) { Relative::Self_ => transforms.transform, Relative::Parent => transforms.container_transform, }; @@ -339,6 +351,7 @@ fn register_gradient( size.aspect_ratio(), ))), gradient: gradient.clone(), + on_text, }; let index = ctx.parent.gradient_map.insert(pdf_gradient); @@ -371,9 +384,16 @@ fn write_patch( c0: [u16; 3], c1: [u16; 3], angle: Angle, + on_text: bool, ) { - let theta = -TAU * t + angle.to_rad() as f32 + PI; - let theta1 = -TAU * t1 + angle.to_rad() as f32 + PI; + let mut theta = -TAU * t + angle.to_rad() as f32 + PI; + let mut theta1 = -TAU * t1 + angle.to_rad() as f32 + PI; + + // Correction for y-axis flipping on text. + if on_text { + theta = (TAU - theta).rem_euclid(TAU); + theta1 = (TAU - theta1).rem_euclid(TAU); + } let (cp1, cp2) = control_point(Point::new(Abs::pt(0.5), Abs::pt(0.5)), 0.5, theta, theta1); @@ -434,10 +454,17 @@ fn control_point(c: Point, r: f32, angle_start: f32, angle_end: f32) -> (Point, } #[comemo::memoize] -fn compute_vertex_stream(conic: &ConicGradient) -> Arc> { +fn compute_vertex_stream( + conic: &ConicGradient, + aspect_ratio: Ratio, + on_text: bool, +) -> Arc> { // Generated vertices for the Coons patches let mut vertices = Vec::new(); + // Correct the gradient's angle + let angle = Gradient::correct_aspect_ratio(conic.angle, aspect_ratio); + // We want to generate a vertex based on some conditions, either: // - At the boundary of a stop // - At the boundary of a quadrant @@ -507,10 +534,19 @@ fn compute_vertex_stream(conic: &ConicGradient) -> Arc> { t_prime, conic.space.convert(c), c0, - conic.angle, + angle, + on_text, ); - write_patch(&mut vertices, t_prime, t_prime, c0, c1, conic.angle); + write_patch( + &mut vertices, + t_prime, + t_prime, + c0, + c1, + angle, + on_text, + ); write_patch( &mut vertices, @@ -518,7 +554,8 @@ fn compute_vertex_stream(conic: &ConicGradient) -> Arc> { t_next as f32, c1, conic.space.convert(c_next), - conic.angle, + angle, + on_text, ); t_x = t_next; @@ -533,7 +570,8 @@ fn compute_vertex_stream(conic: &ConicGradient) -> Arc> { t_next as f32, conic.space.convert(c), conic.space.convert(c_next), - conic.angle, + angle, + on_text, ); t_x = t_next; diff --git a/crates/typst/src/export/pdf/page.rs b/crates/typst/src/export/pdf/page.rs index 04470aad1..c36bed4e8 100644 --- a/crates/typst/src/export/pdf/page.rs +++ b/crates/typst/src/export/pdf/page.rs @@ -354,11 +354,11 @@ impl PageContext<'_, '_> { self.state.size = size; } - fn set_fill(&mut self, fill: &Paint, transforms: Transforms) { + fn set_fill(&mut self, fill: &Paint, on_text: bool, transforms: Transforms) { if self.state.fill.as_ref() != Some(fill) || matches!(self.state.fill, Some(Paint::Gradient(_))) { - fill.set_as_fill(self, transforms); + fill.set_as_fill(self, on_text, transforms); self.state.fill = Some(fill.clone()); } } @@ -390,7 +390,7 @@ impl PageContext<'_, '_> { miter_limit, } = stroke; - paint.set_as_stroke(self, transforms); + paint.set_as_stroke(self, false, transforms); self.content.set_line_width(thickness.to_f32()); if self.state.stroke.as_ref().map(|s| &s.line_cap) != Some(line_cap) { @@ -455,13 +455,21 @@ fn write_group(ctx: &mut PageContext, pos: Point, group: &GroupItem) { let translation = Transform::translate(pos.x, pos.y); ctx.save_state(); - ctx.transform(translation.pre_concat(group.transform)); if group.frame.kind().is_hard() { - ctx.group_transform(translation.pre_concat(group.transform)); + ctx.group_transform( + translation + .pre_concat( + ctx.state + .transform + .post_concat(ctx.state.container_transform.invert().unwrap()), + ) + .pre_concat(group.transform), + ); ctx.size(group.frame.size()); } + ctx.transform(translation.pre_concat(group.transform)); if let Some(clip_path) = &group.clip_path { write_path(ctx, 0.0, 0.0, clip_path); ctx.content.clip_nonzero(); @@ -485,7 +493,7 @@ fn write_text(ctx: &mut PageContext, pos: Point, text: &TextItem) { glyph_set.entry(g.id).or_insert_with(|| segment.into()); } - ctx.set_fill(&text.fill, ctx.state.transforms(Size::zero(), pos)); + ctx.set_fill(&text.fill, true, ctx.state.transforms(Size::zero(), pos)); ctx.set_font(&text.font, text.size); ctx.set_opacities(None, Some(&text.fill)); ctx.content.begin_text(); @@ -550,7 +558,7 @@ fn write_shape(ctx: &mut PageContext, pos: Point, shape: &Shape) { } if let Some(fill) = &shape.fill { - ctx.set_fill(fill, ctx.state.transforms(shape.geometry.bbox_size(), pos)); + ctx.set_fill(fill, false, ctx.state.transforms(shape.geometry.bbox_size(), pos)); } if let Some(stroke) = stroke { diff --git a/crates/typst/src/export/render.rs b/crates/typst/src/export/render.rs index 090c9756b..7a33849fd 100644 --- a/crates/typst/src/export/render.rs +++ b/crates/typst/src/export/render.rs @@ -149,7 +149,7 @@ fn render_frame(canvas: &mut sk::Pixmap, state: State, frame: &Frame) { for (pos, item) in frame.items() { match item { FrameItem::Group(group) => { - render_group(canvas, state.pre_translate(*pos), group); + render_group(canvas, state, *pos, group); } FrameItem::Text(text) => { render_text(canvas, state.pre_translate(*pos), text); @@ -172,11 +172,18 @@ fn render_frame(canvas: &mut sk::Pixmap, state: State, frame: &Frame) { } /// Render a group frame with optional transform and clipping into the canvas. -fn render_group(canvas: &mut sk::Pixmap, state: State, group: &GroupItem) { +fn render_group(canvas: &mut sk::Pixmap, state: State, pos: Point, group: &GroupItem) { let state = match group.frame.kind() { - FrameKind::Soft => state.pre_concat(group.transform.into()), + FrameKind::Soft => state.pre_translate(pos).pre_concat(group.transform.into()), FrameKind::Hard => state + .pre_translate(pos) .pre_concat(group.transform.into()) + .pre_concat_container( + state + .transform + .post_concat(state.container_transform.invert().unwrap()), + ) + .pre_concat_container(Transform::translate(pos.x, pos.y).into()) .pre_concat_container(group.transform.into()) .with_size(group.frame.size()), }; @@ -375,15 +382,23 @@ fn render_outline_glyph( builder.0.finish()? }; - // TODO: Implement gradients on text. + let scale = text.size.to_f32() / text.font.units_per_em() as f32; + let mut pixmap = None; - let paint = to_sk_paint(&text.fill, state, Size::zero(), None, &mut pixmap, None); + let paint = to_sk_paint( + &text.fill, + state.pre_concat(sk::Transform::from_scale(scale, -scale)), + Size::zero(), + true, + None, + &mut pixmap, + None, + ); let rule = sk::FillRule::default(); // Flip vertically because font design coordinate // system is Y-up. - let scale = text.size.to_f32() / text.font.units_per_em() as f32; let ts = ts.pre_scale(scale, -scale); canvas.fill_path(&path, &paint, rule, ts, state.mask); return Some(()); @@ -410,31 +425,47 @@ fn render_outline_glyph( // doesn't exist, yet. let bitmap = rasterize(&text.font, id, ts.tx.to_bits(), ts.ty.to_bits(), ppem.to_bits())?; + match &text.fill { + Paint::Gradient(gradient) => { + let sampler = GradientSampler::new(gradient, &state, Size::zero(), true); + write_bitmap(canvas, &bitmap, &state, sampler)?; + } + Paint::Solid(color) => { + write_bitmap(canvas, &bitmap, &state, *color)?; + } + } + Some(()) +} + +fn write_bitmap( + canvas: &mut sk::Pixmap, + bitmap: &Bitmap, + state: &State, + sampler: S, +) -> Option<()> { // If we have a clip mask we first render to a pixmap that we then blend // with our canvas if state.mask.is_some() { let mw = bitmap.width; let mh = bitmap.height; - let color = text.fill.unwrap_solid(); - let color = sk::ColorU8::from(color); - // Pad the pixmap with 1 pixel in each dimension so that we do // not get any problem with floating point errors along their border let mut pixmap = sk::Pixmap::new(mw + 2, mh + 2)?; for x in 0..mw { for y in 0..mh { let alpha = bitmap.coverage[(y * mw + x) as usize]; - let color = sk::ColorU8::from_rgba( - color.red(), - color.green(), - color.blue(), - alpha, - ) - .premultiply(); + let color: sk::ColorU8 = sampler.sample((x, y)).into(); - pixmap.pixels_mut()[((y + 1) * (mw + 2) + (x + 1)) as usize] = color; + pixmap.pixels_mut()[((y + 1) * (mw + 2) + (x + 1)) as usize] = + sk::ColorU8::from_rgba( + color.red(), + color.green(), + color.blue(), + alpha, + ) + .premultiply(); } } @@ -461,10 +492,6 @@ fn render_outline_glyph( let top = bitmap.top; let bottom = top + mh; - // Premultiply the text color. - let Paint::Solid(color) = text.fill else { todo!() }; - let color = bytemuck::cast(sk::ColorU8::from(color).premultiply()); - // Blend the glyph bitmap with the existing pixels on the canvas. let pixels = bytemuck::cast_slice_mut::(canvas.data_mut()); for x in left.clamp(0, cw)..right.clamp(0, cw) { @@ -475,6 +502,8 @@ fn render_outline_glyph( continue; } + let color: sk::ColorU8 = sampler.sample((x as _, y as _)).into(); + let color = bytemuck::cast(color.premultiply()); let pi = (y * cw + x) as usize; if cov == 255 { pixels[pi] = color; @@ -510,8 +539,15 @@ fn render_shape(canvas: &mut sk::Pixmap, state: State, shape: &Shape) -> Option< if let Some(fill) = &shape.fill { let mut pixmap = None; - let mut paint: sk::Paint = - to_sk_paint(fill, state, shape.geometry.bbox_size(), None, &mut pixmap, None); + let mut paint: sk::Paint = to_sk_paint( + fill, + state, + shape.geometry.bbox_size(), + false, + None, + &mut pixmap, + None, + ); if matches!(shape.geometry, Geometry::Rect(_)) { paint.anti_alias = false; @@ -578,6 +614,7 @@ fn render_shape(canvas: &mut sk::Pixmap, state: State, shape: &Shape) -> Option< paint, state, offset_bbox, + false, fill_transform, &mut pixmap, gradient_map, @@ -731,6 +768,71 @@ impl From for Transform { } } +/// Trait for sampling of a paint, used as a generic +/// abstraction over solid colors and gradients. +trait PaintSampler: Copy { + /// Sample the color at the `pos` in the pixmap. + fn sample(self, pos: (u32, u32)) -> Color; +} + +impl PaintSampler for Color { + fn sample(self, _: (u32, u32)) -> Color { + self + } +} + +/// State used when sampling colors for text. +/// +/// It caches the inverse transform to the parent, so that we can +/// reuse it instead of recomputing it for each pixel. +#[derive(Clone, Copy)] +struct GradientSampler<'a> { + gradient: &'a Gradient, + container_size: Size, + transform_to_parent: sk::Transform, +} + +impl<'a> GradientSampler<'a> { + fn new( + gradient: &'a Gradient, + state: &State, + item_size: Size, + on_text: bool, + ) -> Self { + let relative = gradient.unwrap_relative(on_text); + let container_size = match relative { + Relative::Self_ => item_size, + Relative::Parent => state.size, + }; + + let fill_transform = match relative { + Relative::Self_ => sk::Transform::identity(), + Relative::Parent => state.container_transform.invert().unwrap(), + }; + + Self { + gradient, + container_size, + transform_to_parent: fill_transform, + } + } +} + +impl PaintSampler for GradientSampler<'_> { + /// Samples a single point in a glyph. + fn sample(self, (x, y): (u32, u32)) -> Color { + // Compute the point in the gradient's coordinate space. + let mut point = sk::Point { x: x as f32, y: y as f32 }; + self.transform_to_parent.map_point(&mut point); + + // Sample the gradient + self.gradient.sample_at( + (point.x, point.y), + (self.container_size.x.to_f32(), self.container_size.y.to_f32()), + ) + } +} + /// Transforms a [`Paint`] into a [`sk::Paint`]. /// Applying the necessary transform, if the paint is a gradient. /// @@ -740,6 +842,7 @@ fn to_sk_paint<'a>( paint: &Paint, state: State, item_size: Size, + on_text: bool, fill_transform: Option, pixmap: &'a mut Option>, gradient_map: Option<(Point, Axes)>, @@ -782,7 +885,7 @@ fn to_sk_paint<'a>( sk_paint.anti_alias = true; } Paint::Gradient(gradient) => { - let relative = gradient.unwrap_relative(false); + let relative = gradient.unwrap_relative(on_text); let container_size = match relative { Relative::Self_ => item_size, Relative::Parent => state.size, diff --git a/crates/typst/src/export/svg.rs b/crates/typst/src/export/svg.rs index 6399f77d9..00fc5c2ba 100644 --- a/crates/typst/src/export/svg.rs +++ b/crates/typst/src/export/svg.rs @@ -51,7 +51,7 @@ pub fn svg_merged(frames: &[Frame], padding: Abs) -> String { let [x, mut y] = [padding; 2]; for frame in frames { let ts = Transform::translate(x, y); - let state = State::new(frame.size(), ts); + let state = State::new(frame.size(), Transform::identity()); renderer.render_frame(state, ts, frame); y += frame.height() + padding; } @@ -262,9 +262,9 @@ impl SVGRenderer { fn render_group(&mut self, state: State, group: &GroupItem) { let state = match group.frame.kind() { FrameKind::Soft => state.pre_concat(group.transform), - FrameKind::Hard => { - state.with_transform(group.transform).with_size(group.frame.size()) - } + FrameKind::Hard => state + .with_transform(Transform::identity()) + .with_size(group.frame.size()), }; self.xml.start_element("g"); @@ -283,8 +283,7 @@ impl SVGRenderer { /// Render a text item. The text is rendered as a group of glyphs. We will /// try to render the text as SVG first, then bitmap, then outline. If none /// of them works, we will skip the text. - // TODO: implement gradient on text. - fn render_text(&mut self, _state: State, text: &TextItem) { + fn render_text(&mut self, state: State, text: &TextItem) { let scale: f64 = text.size.to_pt() / text.font.units_per_em(); let inv_scale: f64 = text.font.units_per_em() / text.size.to_pt(); @@ -302,7 +301,23 @@ impl SVGRenderer { self.render_svg_glyph(text, id, offset, inv_scale) .or_else(|| self.render_bitmap_glyph(text, id, offset, inv_scale)) - .or_else(|| self.render_outline_glyph(text, id, offset, inv_scale)); + .or_else(|| { + self.render_outline_glyph( + state + .pre_concat(Transform::scale( + Ratio::new(scale), + Ratio::new(-scale), + )) + .pre_translate(Point::new( + Abs::pt(offset / scale), + Abs::zero(), + )), + text, + id, + offset, + inv_scale, + ) + }); x += glyph.x_advance.at(text.size).to_pt(); } @@ -388,25 +403,45 @@ impl SVGRenderer { /// Render a glyph defined by an outline. fn render_outline_glyph( &mut self, + state: State, text: &TextItem, - id: GlyphId, + glyph_id: GlyphId, x_offset: f64, inv_scale: f64, ) -> Option<()> { - let path = convert_outline_glyph_to_path(&text.font, id)?; - let hash = hash128(&(&text.font, id)); + let path = convert_outline_glyph_to_path(&text.font, glyph_id)?; + let hash = hash128(&(&text.font, glyph_id)); let id = self.glyphs.insert_with(hash, || RenderedGlyph::Path(path)); self.xml.start_element("use"); self.xml.write_attribute_fmt("xlink:href", format_args!("#{id}")); self.xml .write_attribute_fmt("x", format_args!("{}", x_offset * inv_scale)); - self.write_fill(&text.fill, Size::zero(), Transform::identity()); + self.write_fill( + &text.fill, + state.size, + self.text_paint_transform(state, &text.fill), + ); self.xml.end_element(); Some(()) } + fn text_paint_transform(&self, state: State, paint: &Paint) -> Transform { + let Paint::Gradient(gradient) = paint else { + return Transform::identity(); + }; + + match gradient.unwrap_relative(true) { + Relative::Self_ => Transform::scale(Ratio::one(), Ratio::one()), + Relative::Parent => Transform::scale( + Ratio::new(state.size.x.to_pt()), + Ratio::new(state.size.y.to_pt()), + ) + .post_concat(state.transform.invert().unwrap()), + } + } + /// Render a shape element. fn render_shape(&mut self, state: State, shape: &Shape) { self.xml.start_element("path"); diff --git a/crates/typst/src/geom/gradient.rs b/crates/typst/src/geom/gradient.rs index f4c750a37..b7944b10c 100644 --- a/crates/typst/src/geom/gradient.rs +++ b/crates/typst/src/geom/gradient.rs @@ -19,9 +19,6 @@ use crate::syntax::{Span, Spanned}; /// the [`gradient.radial` function]($gradient.radial), and conic gradients /// through the [`gradient.conic` function]($gradient.conic). /// -/// See the [tracking issue](https://github.com/typst/typst/issues/2282) for -/// more details on the progress of gradient implementation. -/// /// ```example /// #stack( /// dir: ltr, @@ -31,6 +28,25 @@ use crate::syntax::{Span, Spanned}; /// ) /// ``` /// +/// # Gradients on text +/// Gradients are supported on text but only when setting the relativeness to +/// either `{auto}` (the default value) or `{"parent"}`. It was decided that +/// glyph-by-glyph gradients would not be supported out-of-the-box but can be +/// emulated using [show rules]($styling/#show-rules). +/// +/// You can use gradients on text as follows: +/// +/// ```example +/// #set page(margin: 1pt) +/// #set text(fill: gradient.linear(red, blue)) +/// #let rainbow(content) = { +/// set text(fill: gradient.linear(..color.map.rainbow)) +/// box(content) +/// } +/// +/// This is a gradient on text, but with a #rainbow[twist]! +/// ``` +/// /// # Stops /// A gradient is composed of a series of stops. Each of these stops has a color /// and an offset. The offset is a [ratio]($ratio) between `{0%}` and `{100%}` or @@ -56,7 +72,8 @@ use crate::syntax::{Span, Spanned}; /// of a container. This container can either be the shape they are painted on, /// or to the closest container ancestor. This is controlled by the `relative` /// argument of a gradient constructor. By default, gradients are relative to -/// the shape they are painted on. +/// the shape they are painted on, unless the gradient is applied on text, in +/// which case they are relative to the closest ancestor container. /// /// Typst determines the ancestor container as follows: /// - For shapes that are placed at the root/top level of the document, the @@ -707,6 +724,22 @@ impl Gradient { } impl Gradient { + /// Clones this gradient, but with a different relative placement. + pub fn with_relative(mut self, relative: Relative) -> Self { + match &mut self { + Self::Linear(linear) => { + Arc::make_mut(linear).relative = Smart::Custom(relative); + } + Self::Radial(radial) => { + Arc::make_mut(radial).relative = Smart::Custom(relative); + } + Self::Conic(conic) => { + Arc::make_mut(conic).relative = Smart::Custom(relative); + } + } + + self + } /// Returns a reference to the stops of this gradient. pub fn stops_ref(&self) -> &[(Color, Ratio)] { match self { diff --git a/crates/typst/src/geom/paint.rs b/crates/typst/src/geom/paint.rs index c5a6c7e43..1277107f9 100644 --- a/crates/typst/src/geom/paint.rs +++ b/crates/typst/src/geom/paint.rs @@ -10,14 +10,26 @@ pub enum Paint { } impl Paint { - /// Temporary method to unwrap a solid color used for text rendering. + /// Unwraps a solid color used for text rendering. pub fn unwrap_solid(&self) -> Color { - // TODO: Implement gradients on text. match self { Self::Solid(color) => *color, Self::Gradient(_) => panic!("expected solid color"), } } + + /// Turns this paint into a paint for a text decoration. + /// + /// If this paint is a gradient, it will be converted to a gradient with + /// relative set to [`Relative::Parent`]. + pub fn as_decoration(&self) -> Self { + match self { + Self::Solid(color) => Self::Solid(*color), + Self::Gradient(gradient) => { + Self::Gradient(gradient.clone().with_relative(Relative::Parent)) + } + } + } } impl> From for Paint { diff --git a/tests/ref/visualize/gradient-text-decorations.png b/tests/ref/visualize/gradient-text-decorations.png new file mode 100644 index 0000000000000000000000000000000000000000..887cd5008645db67c50379f4f91c0dbbb59dbc30 GIT binary patch literal 6393 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 b_<$3CJa*b^`aJjF-v+q6s$8{ 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 z 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 literal 0 HcmV?d00001 diff --git a/tests/ref/visualize/gradient-text.png b/tests/ref/visualize/gradient-text.png new file mode 100644 index 0000000000000000000000000000000000000000..478a058635e07f61e8470a5dc08a37e21de298d6 GIT binary patch literal 48309 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 z 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 z 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 RM*Vl{x2UX0wUEC5{{kmk#NGe^ literal 0 HcmV?d00001 diff --git a/tests/typ/visualize/gradient-text-decorations.typ b/tests/typ/visualize/gradient-text-decorations.typ new file mode 100644 index 000000000..a4e861d84 --- /dev/null +++ b/tests/typ/visualize/gradient-text-decorations.typ @@ -0,0 +1,9 @@ +// Tests gradients on text decorations. + +--- + +#set text(fill: gradient.linear(red, blue)) + +Hello #underline[World]! \ +Hello #overline[World]! \ +Hello #strike[World]! \ diff --git a/tests/typ/visualize/gradient-text-other.typ b/tests/typ/visualize/gradient-text-other.typ new file mode 100644 index 000000000..04b84cb6c --- /dev/null +++ b/tests/typ/visualize/gradient-text-other.typ @@ -0,0 +1,14 @@ +// Test text gradients with radial and conic gradients. + +--- +#set page(width: 200pt, height: auto, margin: 10pt) +#set par(justify: true) +#set text(fill: gradient.radial(red, blue)) +#lorem(30) + + +--- +#set page(width: 200pt, height: auto, margin: 10pt) +#set par(justify: true) +#set text(fill: gradient.conic(red, blue, angle: 45deg)) +#lorem(30) diff --git a/tests/typ/visualize/gradient-text.typ b/tests/typ/visualize/gradient-text.typ index e93160832..a233ba6b9 100644 --- a/tests/typ/visualize/gradient-text.typ +++ b/tests/typ/visualize/gradient-text.typ @@ -1,7 +1,49 @@ -// Test that gradient fills on text don't work (for now). -// Ref: false +// Test that gradient fills on text. +// The solid bar gradients are used to make sure that all transforms are +// correct: if you can see the text through the bar, then the gradient is +// misaligned to its reference container. +// Ref: true --- -// Hint: 17-43 gradients on text will be supported soon -// Error: 17-43 text fill must be a solid color +// Ref: false +// Make sure they don't work when `relative: "self"`. + +// Hint: 17-61 make sure to set `relative: auto` on your text fill +// Error: 17-61 gradients on text must be relative to the parent +#set text(fill: gradient.linear(red, blue, relative: "self")) + +--- +// Test that gradient fills on text work for globally defined gradients. + +#set page(width: 200pt, height: auto, margin: 10pt, background: { + rect(width: 100%, height: 30pt, fill: gradient.linear(red, blue)) +}) +#set par(justify: true) #set text(fill: gradient.linear(red, blue)) +#lorem(30) + +--- +// Sanity check that the direction works on text. + +#set page(width: 200pt, height: auto, margin: 10pt, background: { + rect(height: 100%, width: 30pt, fill: gradient.linear(dir: btt, red, blue)) +}) +#set par(justify: true) +#set text(fill: gradient.linear(dir: btt, red, blue)) +#lorem(30) + +--- +// Test that gradient fills on text work for locally defined gradients. + +#set page(width: auto, height: auto, margin: 10pt) +#show box: set text(fill: gradient.linear(..color.map.rainbow)) + +Hello, #box[World]! + +--- +// Test that gradients fills on text work with transforms. + +#set page(width: auto, height: auto, margin: 10pt) +#show box: set text(fill: gradient.linear(..color.map.rainbow)) + +#rotate(45deg, box[World])