use nappgui_sys::{
palette_binary, palette_ccolors, palette_cga2, palette_colors, palette_create, palette_destroy,
palette_ega4, palette_gray1, palette_gray2, palette_gray4, palette_gray8, palette_rgb8,
palette_size,
};
use super::Color;
pub struct Palette {
pub(crate) inner: *mut nappgui_sys::Palette,
}
impl Palette {
pub(crate) fn new(ptr: *mut nappgui_sys::Palette) -> Self {
if ptr.is_null() {
panic!("Palette is null");
}
Self { inner: ptr }
}
pub fn create(size: u32) -> Self {
Self::new(unsafe { palette_create(size) })
}
pub fn cga2(mode: bool, intense: bool) -> Self {
Self::new(unsafe { palette_cga2(mode as _, intense as _) })
}
pub fn ega4() -> Self {
Self::new(unsafe { palette_ega4() })
}
pub fn rgb8() -> Self {
Self::new(unsafe { palette_rgb8() })
}
pub fn gray1() -> Self {
Self::new(unsafe { palette_gray1() })
}
pub fn gray2() -> Self {
Self::new(unsafe { palette_gray2() })
}
pub fn gray4() -> Self {
Self::new(unsafe { palette_gray4() })
}
pub fn gray8() -> Self {
Self::new(unsafe { palette_gray8() })
}
pub fn binary(zero: Color, one: Color) -> Self {
Self::new(unsafe { palette_binary(zero.inner, one.inner) })
}
pub fn size(&self) -> u32 {
unsafe { palette_size(self.inner) }
}
pub fn colors(&self) -> &mut [Color] {
let size = self.size();
let ptr = unsafe { palette_colors(self.inner) };
unsafe { std::slice::from_raw_parts_mut(ptr as _, size as usize) }
}
pub fn ccolors(&self) -> &[Color] {
let size = self.size();
let ptr = unsafe { palette_ccolors(self.inner) };
unsafe { std::slice::from_raw_parts(ptr as _, size as usize) }
}
}
impl Drop for Palette {
fn drop(&mut self) {
unsafe { palette_destroy(&mut self.inner) };
}
}