spout-rs 0.1.3

Rust bindings for Spout2 — GPU texture sharing on Windows
Documentation
use crate::ffi;
use crate::types::SenderInfo;
use cxx::UniquePtr;

pub struct SpoutReceiver(UniquePtr<ffi::SpoutReceiver>);

// SAFETY: SpoutReceiverBridge is exclusively owned via UniquePtr (never aliased).
// Spout2 receivers are designed for per-thread use; we never share one across threads.
unsafe impl Send for SpoutReceiver {}

impl SpoutReceiver {
    pub fn new(name: Option<&str>) -> Self {
        let mut inner = ffi::new_spout_receiver();
        if let Some(n) = name {
            inner.pin_mut().set_receiver_name(n);
        }
        Self(inner)
    }

    /// Connect to a sender and copy its texture into the given OpenGL texture.
    pub fn receive_texture(&mut self, tex_id: u32, target: u32, invert: bool) -> bool {
        self.0.pin_mut().receive_texture(tex_id, target, invert, 0)
    }

    /// Connect to a sender without copying — use with `bind_shared_texture` for zero-copy access.
    pub fn connect(&mut self) -> bool {
        self.0.pin_mut().receive_texture_connect()
    }

    pub fn is_updated(&mut self) -> bool {
        self.0.pin_mut().is_updated()
    }

    pub fn is_connected(&mut self) -> bool {
        self.0.pin_mut().is_connected()
    }

    pub fn is_frame_new(&mut self) -> bool {
        self.0.pin_mut().is_frame_new()
    }

    pub fn sender_name(&mut self) -> String {
        self.0.pin_mut().get_sender_name()
    }

    pub fn sender_size(&mut self) -> (u32, u32) {
        let w = self.0.pin_mut().get_sender_width();
        let h = self.0.pin_mut().get_sender_height();
        (w, h)
    }

    pub fn sender_fps(&mut self) -> f64 {
        self.0.pin_mut().get_sender_fps()
    }

    pub fn sender_info(&mut self) -> SenderInfo {
        let (width, height) = self.sender_size();
        SenderInfo {
            name: self.sender_name(),
            width,
            height,
            fps: self.sender_fps(),
        }
    }
}

impl Drop for SpoutReceiver {
    fn drop(&mut self) {
        self.0.pin_mut().release_receiver();
    }
}