Skip to main content

mplusfonts/
rect.rs

1use embedded_graphics::geometry::{Point, Size};
2use embedded_graphics::primitives::Rectangle;
3
4/// Extension trait for rectangles.
5pub trait RectangleExt {
6    /// Returns the left half of the rectangle, rounding down the resulting width.
7    fn left_half(&self) -> Self;
8
9    /// Returns the rectangle's area that only has pixels to the left of the specified area.
10    fn left_of(&self, other: &Self) -> Self;
11
12    /// Returns the rectangle's area that only has pixels to the right of the specified area.
13    fn right_of(&self, other: &Self) -> Self;
14
15    /// Returns the rectangle's area that only has pixels above the specified area.
16    fn above(&self, other: &Self) -> Self;
17
18    /// Returns the rectangle's area that only has pixels below the specified area.
19    fn below(&self, other: &Self) -> Self;
20
21    /// Returns the rectangle with its area extended along the _y_-axis to the specified top and
22    /// bottom rows, excluding the bottom row itself.
23    fn y_extend(&self, top: i32, bottom: i32) -> Self;
24
25    /// Returns the rectangle with its area reduced along the _y_-axis to the specified top and
26    /// bottom rows, excluding the bottom row itself.
27    fn y_reduce(&self, top: i32, bottom: i32) -> Self;
28
29    /// Returns the rectangle with its left side indented to the right, making the specified column
30    /// its new left side.
31    fn indent_to(&self, right: i32) -> Self;
32}
33
34impl RectangleExt for Rectangle {
35    fn left_half(&self) -> Self {
36        let width = self.size.width.checked_div(2).unwrap_or_default();
37        let top_left = self.top_left;
38        let size = Size::new(width, self.size.height);
39
40        Self { top_left, size }
41    }
42
43    fn left_of(&self, other: &Self) -> Self {
44        let top_left = self.top_left;
45        let width = other.top_left.x.saturating_sub(self.top_left.x);
46        let width = width.try_into().unwrap_or_default();
47        let size = Size::new(width, self.size.height);
48        let size = self.size.component_min(size);
49
50        Self { top_left, size }
51    }
52
53    fn right_of(&self, other: &Self) -> Self {
54        let right = other.top_left.x.saturating_add_unsigned(other.size.width);
55        let top_left = Point::new(right, self.top_left.y);
56        let top_left = self.top_left.component_max(top_left);
57        let width = right.saturating_sub(self.top_left.x);
58        let width = width.try_into().unwrap_or_default();
59        let size = Size::new(width, Default::default());
60        let size = self.size.saturating_sub(size);
61
62        Self { top_left, size }
63    }
64
65    fn above(&self, other: &Self) -> Self {
66        let top_left = self.top_left;
67        let height = other.top_left.y.saturating_sub(self.top_left.y);
68        let height = height.try_into().unwrap_or_default();
69        let size = Size::new(self.size.width, height);
70        let size = self.size.component_min(size);
71
72        Self { top_left, size }
73    }
74
75    fn below(&self, other: &Self) -> Self {
76        let bottom = other.top_left.y.saturating_add_unsigned(other.size.height);
77        let top_left = Point::new(self.top_left.x, bottom);
78        let top_left = self.top_left.component_max(top_left);
79        let height = bottom.saturating_sub(self.top_left.y);
80        let height = height.try_into().unwrap_or_default();
81        let size = Size::new(Default::default(), height);
82        let size = self.size.saturating_sub(size);
83
84        Self { top_left, size }
85    }
86
87    fn y_extend(&self, top: i32, bottom: i32) -> Self {
88        let extent = self.top_left.y.saturating_sub(top);
89        let extent = extent.try_into().unwrap_or_default();
90        let new_size = Size::new(Default::default(), extent);
91        let new_size = self.size.saturating_add(new_size);
92        let top_left = Point::new(self.top_left.x, top);
93        let top_left = self.top_left.component_min(top_left);
94        let height = bottom.saturating_sub(top_left.y);
95        let height = height.try_into().unwrap_or_default();
96        let size = Size::new(Default::default(), height);
97        let size = new_size.component_max(size);
98
99        Self { top_left, size }
100    }
101
102    fn y_reduce(&self, top: i32, bottom: i32) -> Self {
103        let extent = top.saturating_sub(self.top_left.y);
104        let extent = extent.try_into().unwrap_or_default();
105        let new_size = Size::new(Default::default(), extent);
106        let new_size = self.size.saturating_sub(new_size);
107        let top_left = Point::new(self.top_left.x, top);
108        let top_left = self.top_left.component_max(top_left);
109        let height = bottom.saturating_sub(top_left.y);
110        let height = height.try_into().unwrap_or_default();
111        let size = Size::new(self.size.width, height);
112        let size = new_size.component_min(size);
113
114        Self { top_left, size }
115    }
116
117    fn indent_to(&self, right: i32) -> Self {
118        let top_left = Point::new(right, self.top_left.y);
119        let top_left = self.top_left.component_max(top_left);
120        let width = right.saturating_sub(self.top_left.x);
121        let width = width.try_into().unwrap_or_default();
122        let size = Size::new(width, Default::default());
123        let size = self.size.saturating_sub(size);
124
125        Self { top_left, size }
126    }
127}
128
129#[cfg(test)]
130mod tests {
131    use super::*;
132
133    macro_rules! test_left_half {
134        (
135            $(
136                $fn_ident:ident, $self:expr, $expected:expr,
137            )*
138        ) => {
139            $(
140                #[test]
141                fn $fn_ident() {
142                    let result = $self.left_half();
143                    assert_eq!(result, $expected);
144                }
145            )*
146        }
147    }
148
149    test_left_half! {
150        left_half_of_1111_2222_3333_4444,
151            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
152            Rectangle::new(Point::new(1111, 2222), Size::new(3333 / 2, 4444)),
153
154        left_half_of_0_0_0_0,
155            Rectangle::new(Point::new(0, 0), Size::new(0, 0)),
156            Rectangle::new(Point::new(0, 0), Size::new(0, 0)),
157
158        left_half_of_min_min_max_max,
159            Rectangle::new(Point::new(i32::MIN, i32::MIN), Size::new(u32::MAX, u32::MAX)),
160            Rectangle::new(Point::new(i32::MIN, i32::MIN), Size::new(u32::MAX / 2, u32::MAX)),
161
162        left_half_of_max_max_max_max,
163            Rectangle::new(Point::new(i32::MAX, i32::MAX), Size::new(u32::MAX, u32::MAX)),
164            Rectangle::new(Point::new(i32::MAX, i32::MAX), Size::new(u32::MAX / 2, u32::MAX)),
165    }
166
167    macro_rules! test_left_of {
168        (
169            $(
170                $fn_ident:ident, $self:expr, $other:expr, $expected:expr,
171            )*
172        ) => {
173            $(
174                #[test]
175                fn $fn_ident() {
176                    let result = $self.left_of(&$other);
177                    assert_eq!(result, $expected);
178                }
179            )*
180        }
181    }
182
183    test_left_of! {
184        left_of_800_for_1111_2222_3333_4444,
185            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
186            Rectangle::new(Point::new(800, 2222), Size::new(3333, 4444)),
187            Rectangle::new(Point::new(1111, 2222), Size::new(0, 4444)),
188
189        left_of_1600_for_1111_2222_3333_4444,
190            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
191            Rectangle::new(Point::new(1600, 2222), Size::new(3333, 4444)),
192            Rectangle::new(Point::new(1111, 2222), Size::new(1600 - 1111, 4444)),
193
194        left_of_3200_for_1111_2222_3333_4444,
195            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
196            Rectangle::new(Point::new(3200, 2222), Size::new(3333, 4444)),
197            Rectangle::new(Point::new(1111, 2222), Size::new(3200 - 1111, 4444)),
198
199        left_of_6400_for_1111_2222_3333_4444,
200            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
201            Rectangle::new(Point::new(6400, 2222), Size::new(3333, 4444)),
202            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
203
204        left_of_0_for_0_0_0_0,
205            Rectangle::new(Point::new(0, 0), Size::new(0, 0)),
206            Rectangle::new(Point::new(0, 0), Size::new(0, 0)),
207            Rectangle::new(Point::new(0, 0), Size::new(0, 0)),
208
209        left_of_minus_1_for_min_min_max_max,
210            Rectangle::new(Point::new(i32::MIN, i32::MIN), Size::new(u32::MAX, u32::MAX)),
211            Rectangle::new(Point::new(-1, i32::MIN), Size::new(u32::MAX, u32::MAX)),
212            Rectangle::new(Point::new(i32::MIN, i32::MIN), Size::new(u32::MAX / 2, u32::MAX)),
213
214        left_of_minus_1_for_max_max_max_max,
215            Rectangle::new(Point::new(i32::MAX, i32::MAX), Size::new(u32::MAX, u32::MAX)),
216            Rectangle::new(Point::new(-1, i32::MIN), Size::new(u32::MAX, u32::MAX)),
217            Rectangle::new(Point::new(i32::MAX, i32::MAX), Size::new(0, u32::MAX)),
218    }
219
220    macro_rules! test_right_of {
221        (
222            $(
223                $fn_ident:ident, $self:expr, $other:expr, $expected:expr,
224            )*
225        ) => {
226            $(
227                #[test]
228                fn $fn_ident() {
229                    let result = $self.right_of(&$other);
230                    assert_eq!(result, $expected);
231                }
232            )*
233        }
234    }
235
236    test_right_of! {
237        right_of_800_for_1111_2222_3333_4444,
238            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
239            Rectangle::new(Point::new(0, 2222), Size::new(800, 4444)),
240            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
241
242        right_of_1600_for_1111_2222_3333_4444,
243            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
244            Rectangle::new(Point::new(0, 2222), Size::new(1600, 4444)),
245            Rectangle::new(Point::new(1600, 2222), Size::new(3333 + 1111 - 1600, 4444)),
246
247        right_of_3200_for_1111_2222_3333_4444,
248            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
249            Rectangle::new(Point::new(0, 2222), Size::new(3200, 4444)),
250            Rectangle::new(Point::new(3200, 2222), Size::new(3333 + 1111 - 3200, 4444)),
251
252        right_of_6400_for_1111_2222_3333_4444,
253            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
254            Rectangle::new(Point::new(0, 2222), Size::new(6400, 4444)),
255            Rectangle::new(Point::new(6400, 2222), Size::new(0, 4444)),
256
257        right_of_0_for_0_0_0_0,
258            Rectangle::new(Point::new(0, 0), Size::new(0, 0)),
259            Rectangle::new(Point::new(0, 0), Size::new(0, 0)),
260            Rectangle::new(Point::new(0, 0), Size::new(0, 0)),
261
262        right_of_minus_1_for_min_min_max_max,
263            Rectangle::new(Point::new(i32::MIN, i32::MIN), Size::new(u32::MAX, u32::MAX)),
264            Rectangle::new(Point::new(i32::MIN, i32::MIN), Size::new(u32::MAX / 2, u32::MAX)),
265            Rectangle::new(Point::new(-1, i32::MIN), Size::new(u32::MAX / 2 + 1, u32::MAX)),
266
267        right_of_minus_1_for_max_max_max_max,
268            Rectangle::new(Point::new(i32::MAX, i32::MAX), Size::new(u32::MAX, u32::MAX)),
269            Rectangle::new(Point::new(i32::MIN, i32::MIN), Size::new(u32::MAX / 2, u32::MAX)),
270            Rectangle::new(Point::new(i32::MAX, i32::MAX), Size::new(u32::MAX, u32::MAX)),
271    }
272
273    macro_rules! test_above {
274        (
275            $(
276                $fn_ident:ident, $self:expr, $other:expr, $expected:expr,
277            )*
278        ) => {
279            $(
280                #[test]
281                fn $fn_ident() {
282                    let result = $self.above(&$other);
283                    assert_eq!(result, $expected);
284                }
285            )*
286        }
287    }
288
289    test_above! {
290        above_800_for_1111_2222_3333_4444,
291            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
292            Rectangle::new(Point::new(2222, 800), Size::new(3333, 4444)),
293            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 0)),
294
295        above_1600_for_1111_2222_3333_4444,
296            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
297            Rectangle::new(Point::new(2222, 1600), Size::new(3333, 4444)),
298            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 0)),
299
300        above_3200_for_1111_2222_3333_4444,
301            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
302            Rectangle::new(Point::new(1111, 3200), Size::new(3333, 4444)),
303            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 3200 - 2222)),
304
305        above_6400_for_1111_2222_3333_4444,
306            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
307            Rectangle::new(Point::new(1111, 6400), Size::new(3333, 4444)),
308            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 6400 - 2222)),
309
310        above_0_for_0_0_0_0,
311            Rectangle::new(Point::new(0, 0), Size::new(0, 0)),
312            Rectangle::new(Point::new(0, 0), Size::new(0, 0)),
313            Rectangle::new(Point::new(0, 0), Size::new(0, 0)),
314
315        above_minus_1_for_min_min_max_max,
316            Rectangle::new(Point::new(i32::MIN, i32::MIN), Size::new(u32::MAX, u32::MAX)),
317            Rectangle::new(Point::new(i32::MIN, -1), Size::new(u32::MAX, u32::MAX)),
318            Rectangle::new(Point::new(i32::MIN, i32::MIN), Size::new(u32::MAX, u32::MAX / 2)),
319
320        above_minus_1_for_max_max_max_max,
321            Rectangle::new(Point::new(i32::MAX, i32::MAX), Size::new(u32::MAX, u32::MAX)),
322            Rectangle::new(Point::new(i32::MIN, -1), Size::new(u32::MAX, u32::MAX)),
323            Rectangle::new(Point::new(i32::MAX, i32::MAX), Size::new(u32::MAX, 0)),
324    }
325
326    macro_rules! test_below {
327        (
328            $(
329                $fn_ident:ident, $self:expr, $other:expr, $expected:expr,
330            )*
331        ) => {
332            $(
333                #[test]
334                fn $fn_ident() {
335                    let result = $self.below(&$other);
336                    assert_eq!(result, $expected);
337                }
338            )*
339        }
340    }
341
342    test_below! {
343        below_800_for_1111_2222_3333_4444,
344            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
345            Rectangle::new(Point::new(1111, 0), Size::new(3333, 800)),
346            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
347
348        below_1600_for_1111_2222_3333_4444,
349            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
350            Rectangle::new(Point::new(1111, 0), Size::new(3333, 1600)),
351            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
352
353        below_3200_for_1111_2222_3333_4444,
354            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
355            Rectangle::new(Point::new(1111, 0), Size::new(3333, 3200)),
356            Rectangle::new(Point::new(1111, 3200), Size::new(3333, 4444 + 2222 - 3200)),
357
358        below_6400_for_1111_2222_3333_4444,
359            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
360            Rectangle::new(Point::new(1111, 0), Size::new(3333, 6400)),
361            Rectangle::new(Point::new(1111, 6400), Size::new(3333, 4444 + 2222 - 6400)),
362
363        below_0_for_0_0_0_0,
364            Rectangle::new(Point::new(0, 0), Size::new(0, 0)),
365            Rectangle::new(Point::new(0, 0), Size::new(0, 0)),
366            Rectangle::new(Point::new(0, 0), Size::new(0, 0)),
367
368        below_minus_1_for_min_min_max_max,
369            Rectangle::new(Point::new(i32::MIN, i32::MIN), Size::new(u32::MAX, u32::MAX)),
370            Rectangle::new(Point::new(i32::MIN, i32::MIN), Size::new(u32::MAX, u32::MAX / 2)),
371            Rectangle::new(Point::new(i32::MIN, -1), Size::new(u32::MAX, u32::MAX / 2 + 1)),
372
373        below_minus_1_for_max_max_max_max,
374            Rectangle::new(Point::new(i32::MAX, i32::MAX), Size::new(u32::MAX, u32::MAX)),
375            Rectangle::new(Point::new(i32::MIN, i32::MIN), Size::new(u32::MAX, u32::MAX / 2)),
376            Rectangle::new(Point::new(i32::MAX, i32::MAX), Size::new(u32::MAX, u32::MAX)),
377    }
378
379    macro_rules! test_y_extend {
380        (
381            $(
382                $fn_ident:ident, $self:expr, $top:expr, $bottom:expr, $expected:expr,
383            )*
384        ) => {
385            $(
386                #[test]
387                fn $fn_ident() {
388                    let result = $self.y_extend($top, $bottom);
389                    assert_eq!(result, $expected);
390                }
391            )*
392        }
393    }
394
395    test_y_extend! {
396        y_extend_top_to_0_for_1111_2222_3333_4444,
397            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
398            0, 4444 + 2222,
399            Rectangle::new(Point::new(1111, 0), Size::new(3333, 4444 + 2222)),
400
401        y_extend_top_to_1600_for_1111_2222_3333_4444,
402            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
403            1600, 4444 + 2222 - 1600,
404            Rectangle::new(Point::new(1111, 1600), Size::new(3333, 4444 + 2222 - 1600)),
405
406        y_extend_bottom_to_3200_for_1111_2222_3333_4444,
407            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
408            2222, 3200,
409            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
410
411        y_extend_bottom_to_6400_for_1111_2222_3333_4444,
412            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
413            2222, 6400,
414            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
415
416        y_extend_bottom_to_12800_for_1111_2222_3333_4444,
417            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
418            2222, 12800,
419            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 12800 - 2222)),
420
421        y_extend_top_to_0_and_bottom_to_25600_for_1111_2222_3333_4444,
422            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
423            0, 25600,
424            Rectangle::new(Point::new(1111, 0), Size::new(3333, 25600)),
425
426        y_extend_top_to_25600_and_bottom_to_0_for_1111_2222_3333_4444,
427            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
428            25600, 0,
429            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
430
431        y_extend_top_to_half_min_and_bottom_to_half_max_for_1111_2222_3333_4444,
432            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
433            i32::MIN / 2, i32::MAX / 2,
434            Rectangle::new(Point::new(1111, i32::MIN / 2), Size::new(3333, u32::MAX / 2)),
435
436        y_extend_top_to_0_and_bottom_to_max_for_1111_2222_3333_4444,
437            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
438            0, i32::MAX,
439            Rectangle::new(Point::new(1111, 0), Size::new(3333, u32::MAX / 2)),
440
441        y_extend_top_to_max_and_bottom_to_max_for_1111_2222_3333_4444,
442            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
443            i32::MAX, i32::MAX,
444            Rectangle::new(Point::new(1111, 2222), Size::new(3333, u32::MAX / 2 - 2222)),
445    }
446
447    macro_rules! test_y_reduce {
448        (
449            $(
450                $fn_ident:ident, $self:expr, $top:expr, $bottom:expr, $expected:expr,
451            )*
452        ) => {
453            $(
454                #[test]
455                fn $fn_ident() {
456                    let result = $self.y_reduce($top, $bottom);
457                    assert_eq!(result, $expected);
458                }
459            )*
460        }
461    }
462
463    test_y_reduce! {
464        y_reduce_top_to_0_for_1111_2222_3333_4444,
465            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
466            0, 4444 + 2222,
467            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
468
469        y_reduce_top_to_1600_for_1111_2222_3333_4444,
470            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
471            1600, 4444 + 2222,
472            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
473
474        y_reduce_top_to_3200_for_1111_2222_3333_4444,
475            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
476            3200, 4444 + 2222,
477            Rectangle::new(Point::new(1111, 3200), Size::new(3333, 4444 + 2222 - 3200)),
478
479        y_reduce_top_to_6400_for_1111_2222_3333_4444,
480            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
481            6400, 4444 + 2222,
482            Rectangle::new(Point::new(1111, 6400), Size::new(3333, 4444 + 2222 - 6400)),
483
484        y_reduce_bottom_to_3200_for_1111_2222_3333_4444,
485            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
486            2222, 3200,
487            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 3200 - 2222)),
488
489        y_reduce_bottom_to_6400_for_1111_2222_3333_4444,
490            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
491            2222, 6400,
492            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 6400 - 2222)),
493
494        y_reduce_bottom_to_12800_for_1111_2222_3333_4444,
495            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
496            2222, 12800,
497            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
498
499        y_reduce_top_to_1600_and_bottom_to_6400_for_1111_2222_3333_4444,
500            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
501            1600, 3200,
502            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 3200 - 2222)),
503
504        y_reduce_top_to_3200_and_bottom_to_6400_for_1111_2222_3333_4444,
505            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
506            3200, 6400,
507            Rectangle::new(Point::new(1111, 3200), Size::new(3333, 6400 - 3200)),
508
509        y_reduce_top_to_6400_and_bottom_to_12800_for_1111_2222_3333_4444,
510            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
511            6400, 12800,
512            Rectangle::new(Point::new(1111, 6400), Size::new(3333, 4444 + 2222 - 6400)),
513
514        y_reduce_top_to_0_and_bottom_to_25600_for_1111_2222_3333_4444,
515            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
516            0, 25600,
517            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
518
519        y_reduce_top_to_25600_and_bottom_to_0_for_1111_2222_3333_4444,
520            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
521            25600, 0,
522            Rectangle::new(Point::new(1111, 25600), Size::new(3333, 0)),
523
524        y_reduce_top_to_max_and_bottom_to_max_for_1111_2222_3333_4444,
525            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
526            i32::MAX, i32::MAX,
527            Rectangle::new(Point::new(1111, i32::MAX), Size::new(3333, 0)),
528    }
529
530    macro_rules! test_indent_to {
531        (
532            $(
533                $fn_ident:ident, $self:expr, $right:expr, $expected:expr,
534            )*
535        ) => {
536            $(
537                #[test]
538                fn $fn_ident() {
539                    let result = $self.indent_to($right);
540                    assert_eq!(result, $expected);
541                }
542            )*
543        }
544    }
545
546    test_indent_to! {
547        indent_to_800_for_1111_2222_3333_4444,
548            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
549            800,
550            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
551
552        indent_to_1600_for_1111_2222_3333_4444,
553            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
554            1600,
555            Rectangle::new(Point::new(1600, 2222), Size::new(3333 + 1111 - 1600, 4444)),
556
557        indent_to_3200_for_1111_2222_3333_4444,
558            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
559            3200,
560            Rectangle::new(Point::new(3200, 2222), Size::new(3333 + 1111 - 3200, 4444)),
561
562        indent_to_6400_for_1111_2222_3333_4444,
563            Rectangle::new(Point::new(1111, 2222), Size::new(3333, 4444)),
564            6400,
565            Rectangle::new(Point::new(6400, 2222), Size::new(0, 4444)),
566
567        indent_to_0_for_0_0_0_0,
568            Rectangle::new(Point::new(0, 0), Size::new(0, 0)),
569            0,
570            Rectangle::new(Point::new(0, 0), Size::new(0, 0)),
571
572        indent_to_minus_1_for_min_min_max_max,
573            Rectangle::new(Point::new(i32::MIN, i32::MIN), Size::new(u32::MAX, u32::MAX)),
574            -1,
575            Rectangle::new(Point::new(-1, i32::MIN), Size::new(u32::MAX / 2 + 1, u32::MAX)),
576
577        indent_to_minus_1_for_max_max_max_max,
578            Rectangle::new(Point::new(i32::MAX, i32::MAX), Size::new(u32::MAX, u32::MAX)),
579            -1,
580            Rectangle::new(Point::new(i32::MAX, i32::MAX), Size::new(u32::MAX, u32::MAX)),
581    }
582}