mirror of
https://github.com/typst/typst
synced 2025-06-08 21:26:24 +08:00
58 lines
1.7 KiB
Rust
58 lines
1.7 KiB
Rust
//! Convert paint types from typst to krilla.
|
|
|
|
use krilla::geom::NormalizedF32;
|
|
use typst_library::visualize::{ColorSpace, FillRule, FixedStroke, Paint};
|
|
|
|
use crate::primitive::{linecap, linejoin};
|
|
use crate::AbsExt;
|
|
|
|
pub(crate) fn fill(paint_: &Paint, fill_rule_: FillRule) -> krilla::path::Fill {
|
|
let (paint, opacity) = paint(paint_);
|
|
|
|
krilla::path::Fill {
|
|
paint,
|
|
rule: fill_rule(fill_rule_),
|
|
opacity: NormalizedF32::new(opacity as f32 / 255.0).unwrap(),
|
|
}
|
|
}
|
|
|
|
pub(crate) fn stroke(stroke: &FixedStroke) -> krilla::path::Stroke {
|
|
let (paint, opacity) = paint(&stroke.paint);
|
|
krilla::path::Stroke {
|
|
paint,
|
|
width: stroke.thickness.to_f32(),
|
|
miter_limit: stroke.miter_limit.get() as f32,
|
|
line_join: linejoin(stroke.join),
|
|
line_cap: linecap(stroke.cap),
|
|
opacity: NormalizedF32::new(opacity as f32 / 255.0).unwrap(),
|
|
// TODO: Convert dash
|
|
dash: None,
|
|
}
|
|
}
|
|
|
|
fn paint(paint: &Paint) -> (krilla::paint::Paint, u8) {
|
|
match paint {
|
|
Paint::Solid(c) => {
|
|
let components = c.to_space(ColorSpace::Srgb).to_vec4_u8();
|
|
(
|
|
krilla::color::rgb::Color::new(
|
|
components[0],
|
|
components[1],
|
|
components[2],
|
|
)
|
|
.into(),
|
|
components[3],
|
|
)
|
|
}
|
|
Paint::Gradient(_) => (krilla::color::rgb::Color::black().into(), 255),
|
|
Paint::Pattern(_) => (krilla::color::rgb::Color::black().into(), 255),
|
|
}
|
|
}
|
|
|
|
fn fill_rule(fill_rule: FillRule) -> krilla::path::FillRule {
|
|
match fill_rule {
|
|
FillRule::NonZero => krilla::path::FillRule::NonZero,
|
|
FillRule::EvenOdd => krilla::path::FillRule::EvenOdd,
|
|
}
|
|
}
|