#![doc(html_root_url = "https://docs.rs/resvg-raqote/0.10.0")]
#![warn(missing_docs)]
macro_rules! try_opt {
($task:expr) => {
match $task {
Some(v) => v,
None => return,
}
};
}
macro_rules! try_opt_or {
($task:expr, $ret:expr) => {
match $task {
Some(v) => v,
None => return $ret,
}
};
}
use usvg::{NodeExt, ScreenSize};
use log::warn;
mod clip;
mod filter;
mod image;
mod layers;
mod mask;
mod paint_server;
mod path;
mod render;
pub struct Options {
pub usvg: usvg::Options,
pub fit_to: usvg::FitTo,
pub background: Option<usvg::Color>,
}
impl Default for Options {
fn default() -> Options {
Options {
usvg: usvg::Options::default(),
fit_to: usvg::FitTo::Original,
background: None,
}
}
}
pub fn render_to_image(
tree: &usvg::Tree,
opt: &Options,
) -> Option<raqote::DrawTarget> {
let (mut dt, img_view) = render::create_target(
tree.svg_node().size.to_screen_size(),
opt,
)?;
if let Some(c) = opt.background {
dt.clear(raqote::SolidSource { r: c.red, g: c.green, b: c.blue, a: 255 });
}
render_to_canvas(tree, opt, img_view, &mut dt);
Some(dt)
}
pub fn render_node_to_image(
node: &usvg::Node,
opt: &Options,
) -> Option<raqote::DrawTarget> {
let node_bbox = if let Some(bbox) = node.calculate_bbox() {
bbox
} else {
warn!("Node '{}' has a zero size.", node.id());
return None;
};
let (mut dt, img_size) = render::create_target(node_bbox.to_screen_size(), opt)?;
let vbox = usvg::ViewBox {
rect: node_bbox,
aspect: usvg::AspectRatio::default(),
};
if let Some(c) = opt.background {
dt.clear(raqote::SolidSource { r: c.red, g: c.green, b: c.blue, a: 255 });
}
render_node_to_canvas(node, opt, vbox, img_size, &mut dt);
Some(dt)
}
pub fn render_to_canvas(
tree: &usvg::Tree,
opt: &Options,
img_size: ScreenSize,
dt: &mut raqote::DrawTarget,
) {
render_node_to_canvas(&tree.root(), opt, tree.svg_node().view_box, img_size, dt);
}
pub fn render_node_to_canvas(
node: &usvg::Node,
opt: &Options,
view_box: usvg::ViewBox,
img_size: ScreenSize,
dt: &mut raqote::DrawTarget,
) {
render::render_node_to_canvas(node, opt, view_box, img_size, &mut render::RenderState::Ok, dt)
}