1use rectf::Rectf;
4use rectu::Rectu;
5
6#[cfg(all(windows, feature = "d2d"))]
7use winapi::um::dcommon::D2D_RECT_L;
8
9#[derive(Copy, Clone, Debug, Default, PartialEq, Eq)]
12#[cfg_attr(feature = "serde_derive", derive(Serialize, Deserialize))]
13#[repr(C)]
14pub struct Recti {
15 pub left: i32,
17 pub top: i32,
19 pub right: i32,
21 pub bottom: i32,
23}
24
25impl Recti {
26 #[inline]
28 pub fn new(left: i32, top: i32, right: i32, bottom: i32) -> Recti {
29 Recti {
30 left,
31 top,
32 right,
33 bottom,
34 }
35 }
36
37 #[inline]
39 pub fn to_f32(&self) -> Rectf {
40 Rectf {
41 left: self.left as f32,
42 top: self.top as f32,
43 right: self.right as f32,
44 bottom: self.bottom as f32,
45 }
46 }
47
48 #[inline]
52 pub fn to_u32(&self) -> Rectu {
53 Rectu {
54 left: self.left as u32,
55 top: self.top as u32,
56 right: self.right as u32,
57 bottom: self.bottom as u32,
58 }
59 }
60}
61
62#[cfg(all(windows, feature = "d2d"))]
63impl From<Recti> for D2D_RECT_L {
64 #[inline]
65 fn from(rect: Recti) -> D2D_RECT_L {
66 D2D_RECT_L {
67 left: rect.left,
68 top: rect.top,
69 right: rect.right,
70 bottom: rect.bottom,
71 }
72 }
73}
74
75#[cfg(all(windows, feature = "d2d"))]
76impl From<D2D_RECT_L> for Recti {
77 #[inline]
78 fn from(rect: D2D_RECT_L) -> Recti {
79 Recti {
80 left: rect.left,
81 top: rect.top,
82 right: rect.right,
83 bottom: rect.bottom,
84 }
85 }
86}
87
88#[cfg(all(test, windows, feature = "d2d"))]
89#[test]
90fn recti_d2d_bin_compat() {
91 use std::mem::size_of_val;
92
93 fn ptr_eq<T>(a: &T, b: &T) -> bool {
94 (a as *const T) == (b as *const T)
95 }
96
97 let rect = Recti::new(0, 0, 0, 0);
98 let d2d = unsafe { &*((&rect) as *const _ as *const D2D_RECT_L) };
99
100 assert!(ptr_eq(&rect.left, &d2d.left));
101 assert!(ptr_eq(&rect.top, &d2d.top));
102 assert!(ptr_eq(&rect.right, &d2d.right));
103 assert!(ptr_eq(&rect.bottom, &d2d.bottom));
104 assert_eq!(size_of_val(&rect), size_of_val(d2d));
105}