use super::DrawListIterator;
use crate::internal::{RawCast, RawWrapper};
use crate::sys;
use std::slice;
#[repr(C)]
pub struct DrawData {
pub(super) valid: bool,
pub(super) cmd_lists_count: i32,
pub(super) total_idx_count: i32,
pub(super) total_vtx_count: i32,
pub(super) cmd_lists: crate::internal::ImVector<*mut sys::ImDrawList>,
pub display_pos: [f32; 2],
pub display_size: [f32; 2],
pub framebuffer_scale: [f32; 2],
pub(super) owner_viewport: *mut sys::ImGuiViewport,
pub(super) textures: *mut crate::internal::ImVector<*mut sys::ImTextureData>,
}
const _: [(); std::mem::size_of::<sys::ImDrawData>()] = [(); std::mem::size_of::<DrawData>()];
const _: [(); std::mem::align_of::<sys::ImDrawData>()] = [(); std::mem::align_of::<DrawData>()];
unsafe impl RawCast<sys::ImDrawData> for DrawData {}
pub(super) fn total_count_from_i32(caller: &str, raw: i32) -> usize {
usize::try_from(raw).unwrap_or_else(|_| panic!("{caller} returned a negative count"))
}
impl RawWrapper for DrawData {
type Raw = sys::ImDrawData;
unsafe fn raw(&self) -> &Self::Raw {
unsafe { <Self as RawCast<Self::Raw>>::raw(self) }
}
unsafe fn raw_mut(&mut self) -> &mut Self::Raw {
unsafe { <Self as RawCast<Self::Raw>>::raw_mut(self) }
}
}
impl DrawData {
#[inline]
pub fn valid(&self) -> bool {
self.valid
}
#[inline]
pub fn draw_lists(&self) -> DrawListIterator<'_> {
unsafe { DrawListIterator::new(self.cmd_lists().iter()) }
}
#[inline]
pub fn draw_lists_count(&self) -> usize {
unsafe { self.cmd_lists().len() }
}
#[inline]
pub fn total_idx_count(&self) -> usize {
total_count_from_i32("DrawData::total_idx_count()", self.total_idx_count)
}
#[inline]
pub fn total_vtx_count(&self) -> usize {
total_count_from_i32("DrawData::total_vtx_count()", self.total_vtx_count)
}
#[inline]
pub fn display_pos(&self) -> [f32; 2] {
self.display_pos
}
#[inline]
pub fn display_size(&self) -> [f32; 2] {
self.display_size
}
#[inline]
pub fn framebuffer_scale(&self) -> [f32; 2] {
self.framebuffer_scale
}
#[inline]
pub fn owner_viewport(&self) -> *mut sys::ImGuiViewport {
self.owner_viewport
}
#[inline]
pub(crate) unsafe fn cmd_lists(&self) -> &[*mut sys::ImDrawList] {
unsafe {
if self.cmd_lists_count <= 0 || self.cmd_lists.data.is_null() {
return &[];
}
let len = match usize::try_from(self.cmd_lists_count) {
Ok(len) => len,
Err(_) => return &[],
};
slice::from_raw_parts(self.cmd_lists.data, len)
}
}
#[doc(alias = "DeIndexAllBuffers")]
pub fn deindex_all_buffers(&mut self) {
unsafe {
sys::ImDrawData_DeIndexAllBuffers(RawWrapper::raw_mut(self));
}
}
#[doc(alias = "ScaleClipRects")]
pub fn scale_clip_rects(&mut self, fb_scale: [f32; 2]) {
unsafe {
let scale = sys::ImVec2 {
x: fb_scale[0],
y: fb_scale[1],
};
sys::ImDrawData_ScaleClipRects(RawWrapper::raw_mut(self), scale);
}
}
}