use super::{XDisplay, XError};
#[doc = crate::_tags!(unix runtime)]
#[doc = crate::_doc_meta!{location("sys/device/display/x11")}]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[must_use]
pub enum XImageMode {
Auto,
Cpu,
#[cfg(ffi_xcb_shm··)]
Shm,
}
#[doc = crate::_tags!(unix runtime)]
#[doc = crate::_doc_meta!{location("sys/device/display/x11")}]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub(crate) struct XImageFormat {
pub(crate) depth: u8,
pub(crate) bits_per_pixel: u8,
pub(crate) scanline_pad_bits: u8,
}
impl XImageFormat {
pub const fn new(depth: u8, bits_per_pixel: u8, scanline_pad_bits: u8) -> Self {
Self { depth, bits_per_pixel, scanline_pad_bits }
}
pub const fn bytes_per_line(self, width: u16) -> u32 {
let bits = width as u32 * self.bits_per_pixel as u32;
let pad = self.scanline_pad_bits as u32;
if pad == 0 { bits.div_ceil(8) } else { (bits.div_ceil(pad) * pad).div_ceil(8) }
}
pub const fn len_bytes(self, width: u16, height: u16) -> usize {
self.bytes_per_line(width) as usize * height as usize
}
}
pub(crate) trait XImageStore {
fn size(&self) -> (u16, u16);
fn depth(&self) -> u8;
fn bytes(&self) -> &[u8];
fn bytes_mut(&mut self) -> &mut [u8];
#[allow(dead_code, reason = "WIP")]
fn resize(
&mut self,
display: &XDisplay,
width: u16,
height: u16,
depth: u8,
) -> Result<(), XError>;
}