mirror of
https://github.com/typst/typst
synced 2025-05-16 10:05:28 +08:00
121 lines
2.9 KiB
Rust
121 lines
2.9 KiB
Rust
//! 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(),
|
|
}
|
|
}
|
|
}
|