#[cfg(feature = "nostd")]
extern crate alloc;
#[cfg(feature = "nostd")]
use alloc::{format, string::String, vec::Vec};
#[derive(Debug, Clone)]
pub struct FrameDebugInfo {
pub timestamp_ms: u32,
pub active_events: usize,
pub dirty_regions: Vec<DirtyRegionInfo>,
pub render_time_ms: f64,
pub memory_usage_bytes: usize,
pub cache_hits: usize,
pub cache_misses: usize,
pub backend_type: String,
pub frame_checksum: u64,
pub non_transparent_pixels: usize,
pub bounding_box: Option<BoundingBoxInfo>,
}
#[derive(Debug, Clone)]
pub struct DirtyRegionInfo {
pub x: u32,
pub y: u32,
pub width: u32,
pub height: u32,
pub reason: String,
}
#[derive(Debug, Clone, PartialEq)]
pub struct BoundingBoxInfo {
pub min_x: u32,
pub min_y: u32,
pub max_x: u32,
pub max_y: u32,
}
#[derive(Debug)]
pub struct FrameComparison {
pub checksum_match: bool,
pub pixel_diff: u32,
pub render_time_diff: f64,
pub bbox_changed: bool,
}
#[cfg(feature = "serde")]
impl serde::Serialize for FrameDebugInfo {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
use serde::ser::SerializeStruct;
let mut state = serializer.serialize_struct("FrameDebugInfo", 11)?;
state.serialize_field("timestamp_ms", &self.timestamp_ms)?;
state.serialize_field("active_events", &self.active_events)?;
state.serialize_field("dirty_regions", &self.dirty_regions)?;
state.serialize_field("render_time_ms", &self.render_time_ms)?;
state.serialize_field("memory_usage_bytes", &self.memory_usage_bytes)?;
state.serialize_field("cache_hits", &self.cache_hits)?;
state.serialize_field("cache_misses", &self.cache_misses)?;
state.serialize_field("backend_type", &self.backend_type)?;
state.serialize_field("frame_checksum", &format!("0x{:016x}", self.frame_checksum))?;
state.serialize_field("non_transparent_pixels", &self.non_transparent_pixels)?;
state.serialize_field("bounding_box", &self.bounding_box)?;
state.end()
}
}
#[cfg(feature = "serde")]
impl serde::Serialize for DirtyRegionInfo {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
use serde::ser::SerializeStruct;
let mut state = serializer.serialize_struct("DirtyRegionInfo", 5)?;
state.serialize_field("x", &self.x)?;
state.serialize_field("y", &self.y)?;
state.serialize_field("width", &self.width)?;
state.serialize_field("height", &self.height)?;
state.serialize_field("reason", &self.reason)?;
state.end()
}
}
#[cfg(feature = "serde")]
impl serde::Serialize for BoundingBoxInfo {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
use serde::ser::SerializeStruct;
let mut state = serializer.serialize_struct("BoundingBoxInfo", 4)?;
state.serialize_field("min_x", &self.min_x)?;
state.serialize_field("min_y", &self.min_y)?;
state.serialize_field("max_x", &self.max_x)?;
state.serialize_field("max_y", &self.max_y)?;
state.end()
}
}