use crate::{edid::Edid, ffi, string_from_owned_ffi_ptr};
#[cfg(any(feature = "v0_2", feature = "v0_3"))]
use libdisplay_info_derive::FFIFrom;
#[derive(Debug, Copy, Clone, FFIFrom)]
#[ffi(ffi::info::di_hdr_static_metadata)]
#[cfg(any(feature = "v0_2", feature = "v0_3"))]
pub struct HdrStaticMetadata {
pub desired_content_max_luminance: f32,
pub desired_content_max_frame_avg_luminance: f32,
pub desired_content_min_luminance: f32,
pub type1: bool,
pub traditional_sdr: bool,
pub traditional_hdr: bool,
pub pq: bool,
pub hlg: bool,
}
#[derive(Debug, Copy, Clone, FFIFrom)]
#[ffi(ffi::info::di_chromaticity_cie1931)]
#[cfg(any(feature = "v0_2", feature = "v0_3"))]
pub struct ChromaticityCie1931 {
pub x: f32,
pub y: f32,
}
#[derive(Debug, Copy, Clone, FFIFrom)]
#[ffi(ffi::info::di_color_primaries)]
#[cfg(any(feature = "v0_2", feature = "v0_3"))]
pub struct ColorPrimaries {
pub has_primaries: bool,
pub has_default_white_point: bool,
pub primary: [ChromaticityCie1931; 3usize],
pub default_white: ChromaticityCie1931,
}
#[derive(Debug, Copy, Clone, FFIFrom)]
#[ffi(ffi::info::di_supported_signal_colorimetry)]
#[cfg(any(feature = "v0_2", feature = "v0_3"))]
pub struct SupportedSignalColorimetry {
pub bt2020_cycc: bool,
pub bt2020_ycc: bool,
pub bt2020_rgb: bool,
pub st2113_rgb: bool,
pub ictcp: bool,
}
#[derive(Debug)]
pub struct Info(*mut ffi::info::di_info);
#[derive(Debug, thiserror::Error)]
#[error("Parsing the EDID blob failed")]
pub struct ParseFailed;
impl Info {
pub fn parse_edid(data: &[u8]) -> Result<Self, ParseFailed> {
let info = unsafe {
ffi::info::di_info_parse_edid(data.as_ptr() as *const std::ffi::c_void, data.len())
};
if info.is_null() {
return Err(ParseFailed);
}
Ok(Self(info))
}
pub fn failure_msg(&self) -> Option<&std::ffi::CStr> {
let failure_msg = unsafe { ffi::info::di_info_get_failure_msg(self.0) };
if failure_msg.is_null() {
None
} else {
Some(unsafe { std::ffi::CStr::from_ptr(failure_msg) })
}
}
pub fn edid(&self) -> Option<Edid<'_>> {
Edid::from_ptr(unsafe { ffi::info::di_info_get_edid(self.0) as *const ffi::edid::di_edid })
}
pub fn make(&self) -> Option<String> {
string_from_owned_ffi_ptr(unsafe { ffi::info::di_info_get_make(self.0) })
}
pub fn model(&self) -> Option<String> {
string_from_owned_ffi_ptr(unsafe { ffi::info::di_info_get_model(self.0) })
}
pub fn serial(&self) -> Option<String> {
string_from_owned_ffi_ptr(unsafe { ffi::info::di_info_get_serial(self.0) })
}
#[cfg(any(feature = "v0_2", feature = "v0_3"))]
pub fn hdr_static_metadata(&self) -> HdrStaticMetadata {
HdrStaticMetadata::from(unsafe { *ffi::info::di_info_get_hdr_static_metadata(self.0) })
}
#[cfg(any(feature = "v0_2", feature = "v0_3"))]
pub fn default_color_primaries(&self) -> ColorPrimaries {
ColorPrimaries::from(unsafe { *ffi::info::di_info_get_default_color_primaries(self.0) })
}
#[cfg(any(feature = "v0_2", feature = "v0_3"))]
pub fn supported_signal_colorimetry(&self) -> SupportedSignalColorimetry {
SupportedSignalColorimetry::from(unsafe {
*ffi::info::di_info_get_supported_signal_colorimetry(self.0)
})
}
#[cfg(any(feature = "v0_2", feature = "v0_3"))]
pub fn default_gamma(&self) -> Option<f32> {
let default_gamma = unsafe { ffi::info::di_info_get_default_gamma(self.0) };
if default_gamma == 0f32 {
None
} else {
Some(default_gamma)
}
}
}
impl Drop for Info {
fn drop(&mut self) {
unsafe {
ffi::info::di_info_destroy(self.0);
}
}
}