1use super::*;
2
3macro_rules! impl_morphology_mask {
4 ($name:ident, $ty:ty, $layout:ty, $ffi:ident) => {
5 pub fn $name(
6 stream_context: &StreamContext,
7 source: &ImageView<'_, $ty, $layout>,
8 destination: &mut ImageViewMut<'_, $ty, $layout>,
9 mask: &[u8],
10 mask_size: Size,
11 anchor: Point,
12 ) -> Result<()> {
13 validate_same_size(source.size(), destination.size())?;
14 validate_mask(mask, mask_size, anchor)?;
15
16 unsafe {
17 try_ffi!(sys::$ffi(
18 source.as_ptr().cast(),
19 source.step(),
20 destination.as_mut_ptr().cast(),
21 destination.step(),
22 source.size().into(),
23 mask.as_ptr().cast(),
24 mask_size.into(),
25 anchor.into(),
26 stream_context.as_raw(),
27 ))?;
28 }
29 Ok(())
30 }
31 };
32}
33
34macro_rules! impl_generic_morphology_mask {
35 ($trait:ident, $method:ident, $function:ident, $layout:ty, [$($ty:ty => $direct:ident),* $(,)?]) => {
36 pub trait $trait<Layout>: DataTypeLike + Sized {
37 fn $method(
38 stream_context: &StreamContext,
39 source: &ImageView<'_, Self, Layout>,
40 destination: &mut ImageViewMut<'_, Self, Layout>,
41 mask: &[u8],
42 mask_size: Size,
43 anchor: Point,
44 ) -> Result<()>;
45 }
46
47 pub fn $function<T>(
48 stream_context: &StreamContext,
49 source: &ImageView<'_, T, $layout>,
50 destination: &mut ImageViewMut<'_, T, $layout>,
51 mask: &[u8],
52 mask_size: Size,
53 anchor: Point,
54 ) -> Result<()>
55 where
56 T: $trait<$layout>,
57 {
58 T::$method(stream_context, source, destination, mask, mask_size, anchor)
59 }
60
61 $(
62 impl $trait<$layout> for $ty {
63 fn $method(
64 stream_context: &StreamContext,
65 source: &ImageView<'_, Self, $layout>,
66 destination: &mut ImageViewMut<'_, Self, $layout>,
67 mask: &[u8],
68 mask_size: Size,
69 anchor: Point,
70 ) -> Result<()> {
71 $direct(stream_context, source, destination, mask, mask_size, anchor)
72 }
73 }
74 )*
75 };
76}
77
78impl_morphology_mask!(dilate_u8_c1, u8, C1, nppiDilate_8u_C1R_Ctx);
79impl_morphology_mask!(dilate_u8_c3, u8, C3, nppiDilate_8u_C3R_Ctx);
80impl_morphology_mask!(dilate_u8_c4, u8, C4, nppiDilate_8u_C4R_Ctx);
81impl_morphology_mask!(dilate_u8_ac4, u8, AC4, nppiDilate_8u_AC4R_Ctx);
82impl_morphology_mask!(dilate_u16_c1, u16, C1, nppiDilate_16u_C1R_Ctx);
83impl_morphology_mask!(dilate_u16_c3, u16, C3, nppiDilate_16u_C3R_Ctx);
84impl_morphology_mask!(dilate_u16_c4, u16, C4, nppiDilate_16u_C4R_Ctx);
85impl_morphology_mask!(dilate_u16_ac4, u16, AC4, nppiDilate_16u_AC4R_Ctx);
86impl_morphology_mask!(dilate_f32_c1, f32, C1, nppiDilate_32f_C1R_Ctx);
87impl_morphology_mask!(dilate_f32_c3, f32, C3, nppiDilate_32f_C3R_Ctx);
88impl_morphology_mask!(dilate_f32_c4, f32, C4, nppiDilate_32f_C4R_Ctx);
89impl_morphology_mask!(dilate_f32_ac4, f32, AC4, nppiDilate_32f_AC4R_Ctx);
90
91impl_morphology_mask!(erode_u8_c1, u8, C1, nppiErode_8u_C1R_Ctx);
92impl_morphology_mask!(erode_u8_c3, u8, C3, nppiErode_8u_C3R_Ctx);
93impl_morphology_mask!(erode_u8_c4, u8, C4, nppiErode_8u_C4R_Ctx);
94impl_morphology_mask!(erode_u8_ac4, u8, AC4, nppiErode_8u_AC4R_Ctx);
95impl_morphology_mask!(erode_u16_c1, u16, C1, nppiErode_16u_C1R_Ctx);
96impl_morphology_mask!(erode_u16_c3, u16, C3, nppiErode_16u_C3R_Ctx);
97impl_morphology_mask!(erode_u16_c4, u16, C4, nppiErode_16u_C4R_Ctx);
98impl_morphology_mask!(erode_u16_ac4, u16, AC4, nppiErode_16u_AC4R_Ctx);
99impl_morphology_mask!(erode_f32_c1, f32, C1, nppiErode_32f_C1R_Ctx);
100impl_morphology_mask!(erode_f32_c3, f32, C3, nppiErode_32f_C3R_Ctx);
101impl_morphology_mask!(erode_f32_c4, f32, C4, nppiErode_32f_C4R_Ctx);
102impl_morphology_mask!(erode_f32_ac4, f32, AC4, nppiErode_32f_AC4R_Ctx);
103
104impl_generic_morphology_mask!(DilateC1, dilate, dilate_c1, C1, [
105 u8 => dilate_u8_c1,
106 u16 => dilate_u16_c1,
107 f32 => dilate_f32_c1,
108]);
109impl_generic_morphology_mask!(DilateC3, dilate, dilate_c3, C3, [
110 u8 => dilate_u8_c3,
111 u16 => dilate_u16_c3,
112 f32 => dilate_f32_c3,
113]);
114impl_generic_morphology_mask!(DilateC4, dilate, dilate_c4, C4, [
115 u8 => dilate_u8_c4,
116 u16 => dilate_u16_c4,
117 f32 => dilate_f32_c4,
118]);
119impl_generic_morphology_mask!(DilateAc4, dilate, dilate_ac4, AC4, [
120 u8 => dilate_u8_ac4,
121 u16 => dilate_u16_ac4,
122 f32 => dilate_f32_ac4,
123]);
124impl_generic_morphology_mask!(ErodeC1, erode, erode_c1, C1, [
125 u8 => erode_u8_c1,
126 u16 => erode_u16_c1,
127 f32 => erode_f32_c1,
128]);
129impl_generic_morphology_mask!(ErodeC3, erode, erode_c3, C3, [
130 u8 => erode_u8_c3,
131 u16 => erode_u16_c3,
132 f32 => erode_f32_c3,
133]);
134impl_generic_morphology_mask!(ErodeC4, erode, erode_c4, C4, [
135 u8 => erode_u8_c4,
136 u16 => erode_u16_c4,
137 f32 => erode_f32_c4,
138]);
139impl_generic_morphology_mask!(ErodeAc4, erode, erode_ac4, AC4, [
140 u8 => erode_u8_ac4,
141 u16 => erode_u16_ac4,
142 f32 => erode_f32_ac4,
143]);