summaryrefslogtreecommitdiff
path: root/crates/typst-pdf/src/util.rs
diff options
context:
space:
mode:
authorLaurenz Stampfl <47084093+LaurenzV@users.noreply.github.com>2025-04-01 16:42:52 +0200
committerGitHub <noreply@github.com>2025-04-01 14:42:52 +0000
commit96dd67e011bb317cf78683bcf1edfdfca5e7b6b3 (patch)
tree900a0c4e7723af4289685af35d788041055ad4a2 /crates/typst-pdf/src/util.rs
parent012e14d40cb44997630cf6469a446f217f2e9057 (diff)
Switch PDF backend to `krilla` (#5420)
Co-authored-by: Laurenz <laurmaedje@gmail.com>
Diffstat (limited to 'crates/typst-pdf/src/util.rs')
-rw-r--r--crates/typst-pdf/src/util.rs120
1 files changed, 120 insertions, 0 deletions
diff --git a/crates/typst-pdf/src/util.rs b/crates/typst-pdf/src/util.rs
new file mode 100644
index 00000000..3b85d0b8
--- /dev/null
+++ b/crates/typst-pdf/src/util.rs
@@ -0,0 +1,120 @@
+//! Basic utilities for converting typst types to krilla.
+
+use krilla::geom as kg;
+use krilla::geom::PathBuilder;
+use krilla::paint as kp;
+use typst_library::layout::{Abs, Point, Size, Transform};
+use typst_library::text::Font;
+use typst_library::visualize::{Curve, CurveItem, FillRule, LineCap, LineJoin};
+
+pub(crate) trait SizeExt {
+ fn to_krilla(&self) -> kg::Size;
+}
+
+impl SizeExt for Size {
+ fn to_krilla(&self) -> kg::Size {
+ kg::Size::from_wh(self.x.to_f32(), self.y.to_f32()).unwrap()
+ }
+}
+
+pub(crate) trait PointExt {
+ fn to_krilla(&self) -> kg::Point;
+}
+
+impl PointExt for Point {
+ fn to_krilla(&self) -> kg::Point {
+ kg::Point::from_xy(self.x.to_f32(), self.y.to_f32())
+ }
+}
+
+pub(crate) trait LineCapExt {
+ fn to_krilla(&self) -> kp::LineCap;
+}
+
+impl LineCapExt for LineCap {
+ fn to_krilla(&self) -> kp::LineCap {
+ match self {
+ LineCap::Butt => kp::LineCap::Butt,
+ LineCap::Round => kp::LineCap::Round,
+ LineCap::Square => kp::LineCap::Square,
+ }
+ }
+}
+
+pub(crate) trait LineJoinExt {
+ fn to_krilla(&self) -> kp::LineJoin;
+}
+
+impl LineJoinExt for LineJoin {
+ fn to_krilla(&self) -> kp::LineJoin {
+ match self {
+ LineJoin::Miter => kp::LineJoin::Miter,
+ LineJoin::Round => kp::LineJoin::Round,
+ LineJoin::Bevel => kp::LineJoin::Bevel,
+ }
+ }
+}
+
+pub(crate) trait TransformExt {
+ fn to_krilla(&self) -> kg::Transform;
+}
+
+impl TransformExt for Transform {
+ fn to_krilla(&self) -> kg::Transform {
+ kg::Transform::from_row(
+ self.sx.get() as f32,
+ self.ky.get() as f32,
+ self.kx.get() as f32,
+ self.sy.get() as f32,
+ self.tx.to_f32(),
+ self.ty.to_f32(),
+ )
+ }
+}
+
+pub(crate) trait FillRuleExt {
+ fn to_krilla(&self) -> kp::FillRule;
+}
+
+impl FillRuleExt for FillRule {
+ fn to_krilla(&self) -> kp::FillRule {
+ match self {
+ FillRule::NonZero => kp::FillRule::NonZero,
+ FillRule::EvenOdd => kp::FillRule::EvenOdd,
+ }
+ }
+}
+
+pub(crate) trait AbsExt {
+ fn to_f32(self) -> f32;
+}
+
+impl AbsExt for Abs {
+ fn to_f32(self) -> f32 {
+ self.to_pt() as f32
+ }
+}
+
+/// Display the font family of a font.
+pub(crate) fn display_font(font: &Font) -> &str {
+ &font.info().family
+}
+
+/// Convert a typst path to a krilla path.
+pub(crate) fn convert_path(path: &Curve, builder: &mut PathBuilder) {
+ for item in &path.0 {
+ match item {
+ CurveItem::Move(p) => builder.move_to(p.x.to_f32(), p.y.to_f32()),
+ CurveItem::Line(p) => builder.line_to(p.x.to_f32(), p.y.to_f32()),
+ CurveItem::Cubic(p1, p2, p3) => builder.cubic_to(
+ p1.x.to_f32(),
+ p1.y.to_f32(),
+ p2.x.to_f32(),
+ p2.y.to_f32(),
+ p3.x.to_f32(),
+ p3.y.to_f32(),
+ ),
+ CurveItem::Close => builder.close(),
+ }
+ }
+}