ass_renderer/debug/
info.rs1#[cfg(feature = "nostd")]
8extern crate alloc;
9#[cfg(feature = "nostd")]
10use alloc::{format, string::String, vec::Vec};
11
12#[derive(Debug, Clone)]
14pub struct FrameDebugInfo {
15 pub timestamp_ms: u32,
17 pub active_events: usize,
19 pub dirty_regions: Vec<DirtyRegionInfo>,
21 pub render_time_ms: f64,
23 pub memory_usage_bytes: usize,
25 pub cache_hits: usize,
27 pub cache_misses: usize,
29 pub backend_type: String,
31 pub frame_checksum: u64,
33 pub non_transparent_pixels: usize,
35 pub bounding_box: Option<BoundingBoxInfo>,
37}
38
39#[derive(Debug, Clone)]
41pub struct DirtyRegionInfo {
42 pub x: u32,
44 pub y: u32,
46 pub width: u32,
48 pub height: u32,
50 pub reason: String,
52}
53
54#[derive(Debug, Clone, PartialEq)]
56pub struct BoundingBoxInfo {
57 pub min_x: u32,
59 pub min_y: u32,
61 pub max_x: u32,
63 pub max_y: u32,
65}
66
67#[derive(Debug)]
69pub struct FrameComparison {
70 pub checksum_match: bool,
72 pub pixel_diff: u32,
74 pub render_time_diff: f64,
76 pub bbox_changed: bool,
78}
79
80#[cfg(feature = "serde")]
82impl serde::Serialize for FrameDebugInfo {
83 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
84 where
85 S: serde::Serializer,
86 {
87 use serde::ser::SerializeStruct;
88
89 let mut state = serializer.serialize_struct("FrameDebugInfo", 11)?;
90 state.serialize_field("timestamp_ms", &self.timestamp_ms)?;
91 state.serialize_field("active_events", &self.active_events)?;
92 state.serialize_field("dirty_regions", &self.dirty_regions)?;
93 state.serialize_field("render_time_ms", &self.render_time_ms)?;
94 state.serialize_field("memory_usage_bytes", &self.memory_usage_bytes)?;
95 state.serialize_field("cache_hits", &self.cache_hits)?;
96 state.serialize_field("cache_misses", &self.cache_misses)?;
97 state.serialize_field("backend_type", &self.backend_type)?;
98 state.serialize_field("frame_checksum", &format!("0x{:016x}", self.frame_checksum))?;
99 state.serialize_field("non_transparent_pixels", &self.non_transparent_pixels)?;
100 state.serialize_field("bounding_box", &self.bounding_box)?;
101 state.end()
102 }
103}
104
105#[cfg(feature = "serde")]
106impl serde::Serialize for DirtyRegionInfo {
107 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
108 where
109 S: serde::Serializer,
110 {
111 use serde::ser::SerializeStruct;
112
113 let mut state = serializer.serialize_struct("DirtyRegionInfo", 5)?;
114 state.serialize_field("x", &self.x)?;
115 state.serialize_field("y", &self.y)?;
116 state.serialize_field("width", &self.width)?;
117 state.serialize_field("height", &self.height)?;
118 state.serialize_field("reason", &self.reason)?;
119 state.end()
120 }
121}
122
123#[cfg(feature = "serde")]
124impl serde::Serialize for BoundingBoxInfo {
125 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
126 where
127 S: serde::Serializer,
128 {
129 use serde::ser::SerializeStruct;
130
131 let mut state = serializer.serialize_struct("BoundingBoxInfo", 4)?;
132 state.serialize_field("min_x", &self.min_x)?;
133 state.serialize_field("min_y", &self.min_y)?;
134 state.serialize_field("max_x", &self.max_x)?;
135 state.serialize_field("max_y", &self.max_y)?;
136 state.end()
137 }
138}