Laurenz Stampfl 849994c827 more
2024-12-02 08:54:05 +01:00

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,
}
}