use core::{
ffi::c_char,
ptr::{null, null_mut},
};
use crate::{
c_api::{self, NcChannels_u64, NcResult_i32, NcRgb_u32},
cstring, NcCapabilities, NcDirect, NcInput, NcTime,
};
#[inline]
pub fn ncdirect_cantruecolor(ncd: &NcDirect) -> bool {
ncdirect_capabilities(ncd).rgb
}
#[inline]
pub fn ncdirect_canchangecolor(ncd: &NcDirect) -> bool {
c_api::nccapability_canchangecolor(&ncdirect_capabilities(ncd))
}
#[inline]
pub fn ncdirect_canfade(ncd: &NcDirect) -> bool {
ncdirect_canchangecolor(ncd) || ncdirect_cantruecolor(ncd)
}
#[inline]
pub fn ncdirect_canopen_videos(_ncd: &NcDirect) -> bool {
unsafe { c_api::notcurses_canopen_videos(null()) }
}
#[inline]
pub fn ncdirect_canopen_images(_ncd: &NcDirect) -> bool {
unsafe { c_api::notcurses_canopen_images(null()) }
}
#[inline]
pub fn ncdirect_canhalfblock(ncd: &NcDirect) -> bool {
unsafe { c_api::ncdirect_canutf8(ncd) }
}
#[inline]
pub fn ncdirect_canquadrant(ncd: &NcDirect) -> bool {
(unsafe { c_api::ncdirect_canutf8(ncd) }) && ncdirect_capabilities(ncd).quadrants
}
#[inline]
pub fn ncdirect_cansextant(ncd: &NcDirect) -> bool {
(unsafe { c_api::ncdirect_canutf8(ncd) }) && ncdirect_capabilities(ncd).sextants
}
#[inline]
pub fn ncdirect_canbraille(ncd: &NcDirect) -> bool {
(unsafe { c_api::ncdirect_canutf8(ncd) }) && ncdirect_capabilities(ncd).braille
}
#[inline]
pub fn ncdirect_capabilities(ncd: &NcDirect) -> NcCapabilities {
unsafe { *crate::c_api::ffi::ncdirect_capabilities(ncd) }
}
#[inline]
pub fn ncdirect_get_blocking(ncd: &mut NcDirect, input: Option<&mut NcInput>) -> NcResult_i32 {
let input_ptr = if let Some(i) = input { i as *mut _ } else { null_mut() };
unsafe { c_api::ncdirect_get(ncd, null(), input_ptr) as NcResult_i32 }
}
#[inline]
pub fn ncdirect_get_nblock(ncd: &mut NcDirect, input: Option<&mut NcInput>) -> NcResult_i32 {
let input_ptr = if let Some(i) = input { i as *mut _ } else { null_mut() };
unsafe {
let ts = NcTime::new(0, 0);
c_api::ncdirect_get(ncd, &ts, input_ptr) as NcResult_i32
}
}
#[inline]
pub fn ncdirect_set_fg_rgb8(ncd: &mut NcDirect, red: u8, green: u8, blue: u8) -> NcResult_i32 {
let rgb = (red as NcRgb_u32) << 16 | (green as NcRgb_u32) << 8 | blue as NcRgb_u32;
unsafe { c_api::ncdirect_set_fg_rgb(ncd, rgb) }
}
#[inline]
pub fn ncdirect_set_bg_rgb8(ncd: &mut NcDirect, red: u8, green: u8, blue: u8) -> NcResult_i32 {
let rgb = (red as NcRgb_u32) << 16 | (green as NcRgb_u32) << 8 | blue as NcRgb_u32;
unsafe { c_api::ncdirect_set_bg_rgb(ncd, rgb) }
}
#[inline]
pub fn ncdirect_hline_interp(
ncd: &mut NcDirect,
egc: &str,
len: u32,
h1: impl Into<NcChannels_u64>,
h2: impl Into<NcChannels_u64>,
) -> NcResult_i32 {
let cs = cstring![egc];
let egc_ptr = cs.as_ptr() as *const c_char;
unsafe { crate::c_api::ffi::ncdirect_hline_interp(ncd, egc_ptr, len, h1.into(), h2.into()) }
}
#[inline]
pub fn ncdirect_vline_interp(
ncd: &mut NcDirect,
egc: &str,
len: u32,
h1: impl Into<NcChannels_u64>,
h2: impl Into<NcChannels_u64>,
) -> NcResult_i32 {
let cs = cstring![egc];
let egc_ptr = cs.as_ptr() as *const c_char;
unsafe { crate::c_api::ffi::ncdirect_vline_interp(ncd, egc_ptr, len, h1.into(), h2.into()) }
}