use alloc::vec::Vec;
use core::mem::MaybeUninit;
pub(crate) struct MemWriter {
inner: libwebp_sys::WebPMemoryWriter,
consumed: bool,
}
impl MemWriter {
pub(crate) fn new() -> Self {
let mut writer = MaybeUninit::<libwebp_sys::WebPMemoryWriter>::zeroed();
unsafe { libwebp_sys::WebPMemoryWriterInit(writer.as_mut_ptr()) };
Self {
inner: unsafe { writer.assume_init() },
consumed: false,
}
}
pub(crate) fn as_mut_ptr(&mut self) -> *mut libwebp_sys::WebPMemoryWriter {
&mut self.inner
}
pub(crate) fn to_vec(&self) -> Vec<u8> {
if self.inner.mem.is_null() || self.inner.size == 0 {
return Vec::new();
}
let bytes = unsafe { core::slice::from_raw_parts(self.inner.mem, self.inner.size) };
bytes.to_vec()
}
pub(crate) fn into_webp_data(mut self) -> crate::WebPData {
if self.inner.mem.is_null() || self.inner.size == 0 {
return unsafe { crate::WebPData::from_raw(core::ptr::null_mut(), 0) };
}
let webp = unsafe { crate::WebPData::from_raw(self.inner.mem, self.inner.size) };
self.consumed = true;
webp
}
}
impl Drop for MemWriter {
fn drop(&mut self) {
if self.consumed {
return;
}
unsafe { libwebp_sys::WebPMemoryWriterClear(&mut self.inner) };
}
}