From 6720520ec06dd0718f81049b2b11e81664f7ef62 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Tue, 23 Mar 2021 15:32:36 +0100 Subject: [PATCH] =?UTF-8?q?Render=20svg=20emoji=20=F0=9F=90=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 3 +- tests/ref/library/font.png | Bin 12348 -> 21246 bytes tests/ref/markup/escape.png | Bin 5339 -> 6530 bytes tests/ref/repr.png | Bin 10139 -> 10828 bytes tests/typeset.rs | 113 +++++++++++++++++++++++++++++------- 5 files changed, 93 insertions(+), 23 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 3f48c480a..ecb895c0f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,8 +32,9 @@ anyhow = { version = "1", optional = true } serde = { version = "1", features = ["derive"], optional = true } [dev-dependencies] -tiny-skia = "0.5" walkdir = "2" +tiny-skia = "0.5" +usvg = { version = "0.14", default-features = false } [[bin]] name = "typst" diff --git a/tests/ref/library/font.png b/tests/ref/library/font.png index 0e24bb5d3534a76b3a2c08d3e3545440fa5419aa..57a45006c84fdd91d86c94ed07664391e7a2deda 100644 GIT binary patch literal 21246 zcmcG$1z42Z+dhhkf|N84prUjL5+mIx-3=p1_aL1LlB2K@0qJh(ZV?6qq=X>_Way#0 z;jD50>O1HAU;p!+*q3|n@qO34?}}&L&;8ubvnEVcS&jgY1`h`Zhv3C?X>}Z&D^@r- zS2J#11y@`kgS|L7>c|(;5}F

rMWj$QF_}VVB?O+n%{4?*@r+&a}Dsx0E092-vt& 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 diff --git a/tests/ref/markup/escape.png b/tests/ref/markup/escape.png index 8e946279e750fe3cb2efc95b14f3bd957dd73e3a..561b5f1e8dd24737a5b07715c48501632421aded 100644 GIT binary patch literal 6530 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 literal 5339 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 diff --git a/tests/ref/repr.png b/tests/ref/repr.png index a4a4c1267ecdf57da56551716f1b4ea481f9fee3..390c2cab2935a59cdee7f54498a4f82147ea56ce 100644 GIT binary patch literal 10828 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 b=L|&Ni(ZGX%21?l5&?Z}6RmO$hw%Rc@tbwi literal 10139 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 diff --git a/tests/typeset.rs b/tests/typeset.rs index 1764b0459..c5ec01d26 100644 --- a/tests/typeset.rs +++ b/tests/typeset.rs @@ -419,13 +419,41 @@ fn draw_text(canvas: &mut Pixmap, env: &Env, ts: Transform, pos: Point, shaped: let x = (pos.x + offset).to_pt() as f32; let y = pos.y.to_pt() as f32; let scale = (shaped.font_size / units_per_em as f64).to_pt() as f32; - let ts = Transform::from_row(scale, 0.0, 0.0, -scale, x, y).post_concat(ts); - let mut builder = WrappedPathBuilder::default(); - face.outline_glyph(glyph, &mut builder); + // Try drawing SVG if present. + if let Some(tree) = face + .glyph_svg_image(glyph) + .and_then(|data| std::str::from_utf8(data).ok()) + .map(|svg| { + let viewbox = format!("viewBox=\"0 0 {0} {0}\" xmlns", units_per_em); + svg.replace("xmlns", &viewbox) + }) + .and_then(|s| usvg::Tree::from_str(&s, &usvg::Options::default()).ok()) + { + for child in tree.root().children() { + if let usvg::NodeKind::Path(node) = &*child.borrow() { + let path = convert_usvg_path(&node.data); + let transform = convert_usvg_transform(node.transform); + let ts = transform + .post_concat(Transform::from_row(scale, 0.0, 0.0, scale, x, y)) + .post_concat(ts); - if let Some(path) = builder.0.finish() { - let mut paint = convert_fill(shaped.color); + if let Some(fill) = &node.fill { + let (paint, fill_rule) = convert_usvg_fill(fill); + canvas.fill_path(&path, &paint, fill_rule, ts, None); + } + } + } + + continue; + } + + // Otherwise, draw normal outline. + let mut builder = WrappedPathBuilder(tiny_skia::PathBuilder::new()); + if face.outline_glyph(glyph, &mut builder).is_some() { + let path = builder.0.finish().unwrap(); + let ts = Transform::from_row(scale, 0.0, 0.0, -scale, x, y).post_concat(ts); + let mut paint = convert_typst_fill(shaped.color); paint.anti_alias = true; canvas.fill_path(&path, &paint, FillRule::default(), ts, None); } @@ -435,23 +463,24 @@ fn draw_text(canvas: &mut Pixmap, env: &Env, ts: Transform, pos: Point, shaped: fn draw_geometry(canvas: &mut Pixmap, ts: Transform, pos: Point, element: &Geometry) { let x = pos.x.to_pt() as f32; let y = pos.y.to_pt() as f32; + let ts = Transform::from_translate(x, y).post_concat(ts); - let paint = convert_fill(element.fill); + let paint = convert_typst_fill(element.fill); let rule = FillRule::default(); match element.shape { Shape::Rect(Size { width, height }) => { let w = width.to_pt() as f32; let h = height.to_pt() as f32; - let rect = Rect::from_xywh(x, y, w, h).unwrap(); + let rect = Rect::from_xywh(0.0, 0.0, w, h).unwrap(); canvas.fill_rect(rect, &paint, ts, None); } Shape::Ellipse(size) => { - let path = convert_path(x, y, &geom::ellipse_path(size)); + let path = convert_typst_path(&geom::ellipse_path(size)); canvas.fill_path(&path, &paint, rule, ts, None); } Shape::Path(ref path) => { - let path = convert_path(x, y, path); + let path = convert_typst_path(path); canvas.fill_path(&path, &paint, rule, ts, None); } }; @@ -492,7 +521,7 @@ fn draw_image( canvas.fill_rect(rect, &paint, ts, None); } -fn convert_fill(fill: Fill) -> Paint<'static> { +fn convert_typst_fill(fill: Fill) -> Paint<'static> { let mut paint = Paint::default(); match fill { Fill::Color(c) => match c { @@ -503,28 +532,68 @@ fn convert_fill(fill: Fill) -> Paint<'static> { paint } -fn convert_path(x: f32, y: f32, path: &geom::Path) -> tiny_skia::Path { +fn convert_typst_path(path: &geom::Path) -> tiny_skia::Path { let f = |length: Length| length.to_pt() as f32; let mut builder = tiny_skia::PathBuilder::new(); for elem in &path.0 { match elem { - geom::PathElement::MoveTo(p) => builder.move_to(x + f(p.x), y + f(p.y)), - geom::PathElement::LineTo(p) => builder.line_to(x + f(p.x), y + f(p.y)), - geom::PathElement::CubicTo(p1, p2, p3) => builder.cubic_to( - x + f(p1.x), - y + f(p1.y), - x + f(p2.x), - y + f(p2.y), - x + f(p3.x), - y + f(p3.y), - ), + geom::PathElement::MoveTo(p) => builder.move_to(f(p.x), f(p.y)), + geom::PathElement::LineTo(p) => builder.line_to(f(p.x), f(p.y)), + geom::PathElement::CubicTo(p1, p2, p3) => { + builder.cubic_to(f(p1.x), f(p1.y), f(p2.x), f(p2.y), f(p3.x), f(p3.y)) + } geom::PathElement::ClosePath => builder.close(), }; } builder.finish().unwrap() } -#[derive(Default)] +fn convert_usvg_fill(fill: &usvg::Fill) -> (Paint<'static>, FillRule) { + let mut paint = Paint::default(); + paint.anti_alias = true; + + match fill.paint { + usvg::Paint::Color(color) => paint.set_color_rgba8( + color.red, + color.green, + color.blue, + fill.opacity.to_u8(), + ), + usvg::Paint::Link(_) => {} + } + + let rule = match fill.rule { + usvg::FillRule::NonZero => FillRule::Winding, + usvg::FillRule::EvenOdd => FillRule::EvenOdd, + }; + + (paint, rule) +} + +fn convert_usvg_path(path: &usvg::PathData) -> tiny_skia::Path { + let f = |v: f64| v as f32; + let mut builder = tiny_skia::PathBuilder::new(); + for seg in path.iter() { + match *seg { + usvg::PathSegment::MoveTo { x, y } => builder.move_to(f(x), f(y)), + usvg::PathSegment::LineTo { x, y } => { + builder.line_to(f(x), f(y)); + } + usvg::PathSegment::CurveTo { x1, y1, x2, y2, x, y } => { + builder.cubic_to(f(x1), f(y1), f(x2), f(y2), f(x), f(y)) + } + usvg::PathSegment::ClosePath => builder.close(), + } + } + builder.finish().unwrap() +} + +fn convert_usvg_transform(transform: usvg::Transform) -> Transform { + let g = |v: f64| v as f32; + let usvg::Transform { a, b, c, d, e, f } = transform; + Transform::from_row(g(a), g(b), g(c), g(d), g(e), g(f)) +} + struct WrappedPathBuilder(tiny_skia::PathBuilder); impl OutlineBuilder for WrappedPathBuilder {