diff --git a/library/src/text/shaping.rs b/library/src/text/shaping.rs index a96238d9..53e90bc5 100644 --- a/library/src/text/shaping.rs +++ b/library/src/text/shaping.rs @@ -103,7 +103,7 @@ impl<'a> ShapedText<'a> { for ((font, y_offset), group) in self.glyphs.as_ref().group_by_key(|g| (g.font.clone(), g.y_offset)) { - let pos = Point::new(offset, top + shift + y_offset.at(self.size)); + let pos = Point::new(offset, top + shift - y_offset.at(self.size)); let glyphs = group .iter() .map(|glyph| Glyph { diff --git a/src/export/render.rs b/src/export/render.rs index fcf7458a..03160d97 100644 --- a/src/export/render.rs +++ b/src/export/render.rs @@ -11,7 +11,7 @@ use usvg::FitTo; use crate::doc::{Element, Frame, Group, Meta, Text}; use crate::geom::{ - self, Abs, Geometry, Paint, PathElement, Shape, Size, Stroke, Transform, + self, Abs, Color, Geometry, Paint, PathElement, Shape, Size, Stroke, Transform, }; use crate::image::{DecodedImage, Image}; @@ -19,13 +19,13 @@ use crate::image::{DecodedImage, Image}; /// /// This renders the frame at the given number of pixels per point and returns /// the resulting `tiny-skia` pixel buffer. -pub fn render(frame: &Frame, pixel_per_pt: f32) -> sk::Pixmap { +pub fn render(frame: &Frame, pixel_per_pt: f32, fill: Color) -> sk::Pixmap { let size = frame.size(); let pxw = (pixel_per_pt * size.x.to_f32()).round().max(1.0) as u32; let pxh = (pixel_per_pt * size.y.to_f32()).round().max(1.0) as u32; let mut canvas = sk::Pixmap::new(pxw, pxh).unwrap(); - canvas.fill(sk::Color::WHITE); + canvas.fill(fill.into()); let ts = sk::Transform::from_scale(pixel_per_pt, pixel_per_pt); render_frame(&mut canvas, ts, None, frame); @@ -432,13 +432,19 @@ impl From for sk::Paint<'static> { fn from(paint: Paint) -> Self { let mut sk_paint = sk::Paint::default(); let Paint::Solid(color) = paint; - let c = color.to_rgba(); - sk_paint.set_color_rgba8(c.r, c.g, c.b, c.a); + sk_paint.set_color(color.into()); sk_paint.anti_alias = true; sk_paint } } +impl From for sk::Color { + fn from(color: Color) -> Self { + let c = color.to_rgba(); + sk::Color::from_rgba8(c.r, c.g, c.b, c.a) + } +} + /// Allows to build tiny-skia paths from glyph outlines. struct WrappedPathBuilder(sk::PathBuilder); diff --git a/tests/ref/layout/columns.png b/tests/ref/layout/columns.png index 4bf76146..51fd5b2c 100644 Binary files a/tests/ref/layout/columns.png and b/tests/ref/layout/columns.png differ diff --git a/tests/ref/layout/par-bidi.png b/tests/ref/layout/par-bidi.png index 0406fbf1..8751d93e 100644 Binary files a/tests/ref/layout/par-bidi.png and b/tests/ref/layout/par-bidi.png differ diff --git a/tests/ref/layout/par-indent.png b/tests/ref/layout/par-indent.png index 7aca22c1..269c0024 100644 Binary files a/tests/ref/layout/par-indent.png and b/tests/ref/layout/par-indent.png differ diff --git a/tests/src/benches.rs b/tests/src/benches.rs index ea53f602..21fdbc7a 100644 --- a/tests/src/benches.rs +++ b/tests/src/benches.rs @@ -5,6 +5,7 @@ use iai::{black_box, main, Iai}; use typst::diag::{FileError, FileResult}; use typst::eval::Library; use typst::font::{Font, FontBook}; +use typst::geom::Color; use typst::syntax::{Source, SourceId}; use typst::util::Buffer; use typst::World; @@ -90,7 +91,7 @@ fn bench_compile(iai: &mut Iai) { fn bench_render(iai: &mut Iai) { let world = BenchWorld::new(); let document = typst::compile(&world, &world.source).unwrap(); - iai.run(|| typst::export::render(&document.pages[0], 1.0)) + iai.run(|| typst::export::render(&document.pages[0], 1.0, Color::WHITE)) } struct BenchWorld { diff --git a/tests/src/tests.rs b/tests/src/tests.rs index 8a25af15..24b3431f 100644 --- a/tests/src/tests.rs +++ b/tests/src/tests.rs @@ -690,7 +690,7 @@ fn render(frames: &[Frame]) -> sk::Pixmap { if frame.width() > limit || frame.height() > limit { panic!("overlarge frame: {:?}", frame.size()); } - typst::export::render(frame, pixel_per_pt) + typst::export::render(frame, pixel_per_pt, Color::WHITE) }) .collect();