#![cfg(feature = "write")]
use crate::{
enums::ktx_result,
stream::{RWSeekable, RustKtxStream},
texture::{Texture, TextureSink},
KtxError,
};
use std::sync::{Arc, Mutex};
#[derive(Debug)]
pub struct StreamSink<'a, T: RWSeekable + ?Sized + 'a> {
stream: Arc<Mutex<RustKtxStream<'a, T>>>,
}
impl<'a, T: RWSeekable + ?Sized + 'a> StreamSink<'a, T> {
pub fn new(inner: Arc<Mutex<RustKtxStream<'a, T>>>) -> Self {
StreamSink { stream: inner }
}
pub fn into_inner(self) -> Arc<Mutex<RustKtxStream<'a, T>>> {
self.stream
}
}
impl<'a, T: RWSeekable + ?Sized + 'a> TextureSink for StreamSink<'a, T> {
fn write_texture(&mut self, texture: &Texture) -> Result<(), KtxError> {
let vtbl = unsafe { (*texture.handle).vtbl };
let write_pfn = match unsafe { (*vtbl).WriteToStream } {
Some(pfn) => pfn,
None => return Err(KtxError::InvalidValue),
};
let err = unsafe {
write_pfn(
texture.handle,
self.stream
.lock()
.expect("Poisoned self.stream lock")
.ktx_stream(),
)
};
ktx_result(err, ())
}
}