mirror of
https://github.com/typst/typst
synced 2025-08-16 07:58:32 +08:00
137 lines
3.4 KiB
Rust
137 lines
3.4 KiB
Rust
//! Basic utilities for converting typst types to krilla.
|
|
|
|
use krilla::color::rgb as kr;
|
|
use krilla::geom as kg;
|
|
use krilla::path as kp;
|
|
use krilla::path::PathBuilder;
|
|
use typst_library::layout::{Abs, Point, Size, Transform};
|
|
use typst_library::text::Font;
|
|
use typst_library::visualize::{
|
|
Color, ColorSpace, 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
|
|
}
|
|
}
|
|
|
|
pub(crate) trait ColorExt {
|
|
fn to_krilla_rgb(&self) -> (kr::Color, u8);
|
|
}
|
|
|
|
impl ColorExt for Color {
|
|
/// Convert a color into a krilla RGB color and an alpha value.
|
|
fn to_krilla_rgb(&self) -> (kr::Color, u8) {
|
|
let components = self.to_space(ColorSpace::Srgb).to_vec4_u8();
|
|
(kr::Color::new(components[0], components[1], components[2]), components[3])
|
|
}
|
|
}
|
|
|
|
/// Display the font family and variant of a font.
|
|
pub(crate) fn display_font(font: &Font) -> String {
|
|
let font_family = &font.info().family;
|
|
format!("{font_family}")
|
|
}
|
|
|
|
/// Build a typst path using a path builder.
|
|
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(),
|
|
}
|
|
}
|
|
}
|