use alloc::ffi::CString;
use crate::animation::Animation;
use crate::error::{Error, Result};
use crate::paint::Paint;
use thorvg_sys as sys;
pub struct Saver<'eng> {
raw: sys::Tvg_Saver,
_engine: core::marker::PhantomData<&'eng ()>,
}
unsafe impl Send for Saver<'_> {}
impl Saver<'_> {
pub(crate) fn new() -> Result<Self> {
let raw = unsafe { sys::tvg_saver_new() };
if raw.is_null() {
return Err(Error::FailedAllocation);
}
Ok(Self {
raw,
_engine: core::marker::PhantomData,
})
}
pub fn save_to_str<P: Paint>(&mut self, paint: P, path: &str, quality: u32) -> Result<()> {
let c_path = CString::new(path)?;
Error::from_raw(unsafe {
sys::tvg_saver_save_paint(self.raw, paint.into_raw(), c_path.as_ptr(), quality)
})
}
#[cfg(feature = "std")]
pub fn save<P: Paint, Q: AsRef<std::path::Path>>(
&mut self,
paint: P,
path: Q,
quality: u32,
) -> Result<()> {
self.save_to_str(paint, &path.as_ref().to_string_lossy(), quality)
}
pub fn save_animation_to_str(
&mut self,
animation: Animation<'_>,
path: &str,
quality: u32,
fps: u32,
) -> Result<()> {
let c_path = CString::new(path)?;
Error::from_raw(unsafe {
sys::tvg_saver_save_animation(
self.raw,
animation.into_raw(),
c_path.as_ptr(),
quality,
fps,
)
})
}
#[cfg(feature = "std")]
pub fn save_animation<P: AsRef<std::path::Path>>(
&mut self,
animation: Animation<'_>,
path: P,
quality: u32,
fps: u32,
) -> Result<()> {
self.save_animation_to_str(animation, &path.as_ref().to_string_lossy(), quality, fps)
}
pub fn sync(&mut self) -> Result<()> {
Error::from_raw(unsafe { sys::tvg_saver_sync(self.raw) })
}
}
impl Drop for Saver<'_> {
fn drop(&mut self) {
unsafe {
sys::tvg_saver_del(self.raw);
}
}
}
impl core::fmt::Debug for Saver<'_> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.debug_struct("Saver").finish_non_exhaustive()
}
}