typst/crates/typst-pdf/src/primitive.rs
2024-12-14 22:37:59 +01:00

85 lines
2.2 KiB
Rust

//! Convert basic primitive types from typst to krilla.
use typst_library::layout::{Point, Size, Transform};
use typst_library::visualize::{FillRule, LineCap, LineJoin};
use crate::AbsExt;
pub(crate) trait SizeExt {
fn as_krilla(&self) -> krilla::geom::Size;
}
impl SizeExt for Size {
fn as_krilla(&self) -> krilla::geom::Size {
krilla::geom::Size::from_wh(self.x.to_f32(), self.y.to_f32()).unwrap()
}
}
pub(crate) trait PointExt {
fn as_krilla(&self) -> krilla::geom::Point;
}
impl PointExt for Point {
fn as_krilla(&self) -> krilla::geom::Point {
krilla::geom::Point::from_xy(self.x.to_f32(), self.y.to_f32())
}
}
pub(crate) trait LineCapExt {
fn as_krilla(&self) -> krilla::path::LineCap;
}
impl LineCapExt for LineCap {
fn as_krilla(&self) -> krilla::path::LineCap {
match self {
LineCap::Butt => krilla::path::LineCap::Butt,
LineCap::Round => krilla::path::LineCap::Round,
LineCap::Square => krilla::path::LineCap::Square,
}
}
}
pub(crate) trait LineJoinExt {
fn as_krilla(&self) -> krilla::path::LineJoin;
}
impl LineJoinExt for LineJoin {
fn as_krilla(&self) -> krilla::path::LineJoin {
match self {
LineJoin::Miter => krilla::path::LineJoin::Miter,
LineJoin::Round => krilla::path::LineJoin::Round,
LineJoin::Bevel => krilla::path::LineJoin::Bevel,
}
}
}
pub(crate) trait TransformExt {
fn as_krilla(&self) -> krilla::geom::Transform;
}
impl TransformExt for Transform {
fn as_krilla(&self) -> krilla::geom::Transform {
krilla::geom::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 as_krilla(&self) -> krilla::path::FillRule;
}
impl FillRuleExt for FillRule {
fn as_krilla(&self) -> krilla::path::FillRule {
match self {
FillRule::NonZero => krilla::path::FillRule::NonZero,
FillRule::EvenOdd => krilla::path::FillRule::EvenOdd,
}
}
}