1use super::*;
2
3impl_filter_median!(
4 filter_median_u8_c1_buffer_size,
5 filter_median_u8_c1,
6 u8,
7 C1,
8 nppiFilterMedianGetBufferSize_8u_C1R_Ctx,
9 nppiFilterMedian_8u_C1R_Ctx
10);
11impl_filter_median!(
12 filter_median_u8_c3_buffer_size,
13 filter_median_u8_c3,
14 u8,
15 C3,
16 nppiFilterMedianGetBufferSize_8u_C3R_Ctx,
17 nppiFilterMedian_8u_C3R_Ctx
18);
19impl_filter_median!(
20 filter_median_u8_c4_buffer_size,
21 filter_median_u8_c4,
22 u8,
23 C4,
24 nppiFilterMedianGetBufferSize_8u_C4R_Ctx,
25 nppiFilterMedian_8u_C4R_Ctx
26);
27impl_filter_median!(
28 filter_median_u8_ac4_buffer_size,
29 filter_median_u8_ac4,
30 u8,
31 AC4,
32 nppiFilterMedianGetBufferSize_8u_AC4R_Ctx,
33 nppiFilterMedian_8u_AC4R_Ctx
34);
35impl_filter_median!(
36 filter_median_u16_c1_buffer_size,
37 filter_median_u16_c1,
38 u16,
39 C1,
40 nppiFilterMedianGetBufferSize_16u_C1R_Ctx,
41 nppiFilterMedian_16u_C1R_Ctx
42);
43impl_filter_median!(
44 filter_median_u16_c3_buffer_size,
45 filter_median_u16_c3,
46 u16,
47 C3,
48 nppiFilterMedianGetBufferSize_16u_C3R_Ctx,
49 nppiFilterMedian_16u_C3R_Ctx
50);
51impl_filter_median!(
52 filter_median_u16_c4_buffer_size,
53 filter_median_u16_c4,
54 u16,
55 C4,
56 nppiFilterMedianGetBufferSize_16u_C4R_Ctx,
57 nppiFilterMedian_16u_C4R_Ctx
58);
59impl_filter_median!(
60 filter_median_u16_ac4_buffer_size,
61 filter_median_u16_ac4,
62 u16,
63 AC4,
64 nppiFilterMedianGetBufferSize_16u_AC4R_Ctx,
65 nppiFilterMedian_16u_AC4R_Ctx
66);
67impl_filter_median!(
68 filter_median_i16_c1_buffer_size,
69 filter_median_i16_c1,
70 i16,
71 C1,
72 nppiFilterMedianGetBufferSize_16s_C1R_Ctx,
73 nppiFilterMedian_16s_C1R_Ctx
74);
75impl_filter_median!(
76 filter_median_i16_c3_buffer_size,
77 filter_median_i16_c3,
78 i16,
79 C3,
80 nppiFilterMedianGetBufferSize_16s_C3R_Ctx,
81 nppiFilterMedian_16s_C3R_Ctx
82);
83impl_filter_median!(
84 filter_median_i16_c4_buffer_size,
85 filter_median_i16_c4,
86 i16,
87 C4,
88 nppiFilterMedianGetBufferSize_16s_C4R_Ctx,
89 nppiFilterMedian_16s_C4R_Ctx
90);
91impl_filter_median!(
92 filter_median_i16_ac4_buffer_size,
93 filter_median_i16_ac4,
94 i16,
95 AC4,
96 nppiFilterMedianGetBufferSize_16s_AC4R_Ctx,
97 nppiFilterMedian_16s_AC4R_Ctx
98);
99impl_filter_median!(
100 filter_median_f32_c1_buffer_size,
101 filter_median_f32_c1,
102 f32,
103 C1,
104 nppiFilterMedianGetBufferSize_32f_C1R_Ctx,
105 nppiFilterMedian_32f_C1R_Ctx
106);
107impl_filter_median!(
108 filter_median_f32_c3_buffer_size,
109 filter_median_f32_c3,
110 f32,
111 C3,
112 nppiFilterMedianGetBufferSize_32f_C3R_Ctx,
113 nppiFilterMedian_32f_C3R_Ctx
114);
115impl_filter_median!(
116 filter_median_f32_c4_buffer_size,
117 filter_median_f32_c4,
118 f32,
119 C4,
120 nppiFilterMedianGetBufferSize_32f_C4R_Ctx,
121 nppiFilterMedian_32f_C4R_Ctx
122);
123impl_filter_median!(
124 filter_median_f32_ac4_buffer_size,
125 filter_median_f32_ac4,
126 f32,
127 AC4,
128 nppiFilterMedianGetBufferSize_32f_AC4R_Ctx,
129 nppiFilterMedian_32f_AC4R_Ctx
130);
131
132impl_filter_median_border!(
133 filter_median_border_u8_c1_buffer_size,
134 filter_median_border_u8_c1,
135 u8,
136 C1,
137 nppiFilterMedianBorderGetBufferSize_8u_C1R_Ctx,
138 nppiFilterMedianBorder_8u_C1R_Ctx
139);
140impl_filter_median_border!(
141 filter_median_border_u8_c3_buffer_size,
142 filter_median_border_u8_c3,
143 u8,
144 C3,
145 nppiFilterMedianBorderGetBufferSize_8u_C3R_Ctx,
146 nppiFilterMedianBorder_8u_C3R_Ctx
147);
148impl_filter_median_border!(
149 filter_median_border_u8_c4_buffer_size,
150 filter_median_border_u8_c4,
151 u8,
152 C4,
153 nppiFilterMedianBorderGetBufferSize_8u_C4R_Ctx,
154 nppiFilterMedianBorder_8u_C4R_Ctx
155);
156impl_filter_median_border!(
157 filter_median_border_u8_ac4_buffer_size,
158 filter_median_border_u8_ac4,
159 u8,
160 AC4,
161 nppiFilterMedianBorderGetBufferSize_8u_AC4R_Ctx,
162 nppiFilterMedianBorder_8u_AC4R_Ctx
163);
164impl_filter_median_border!(
165 filter_median_border_u16_c1_buffer_size,
166 filter_median_border_u16_c1,
167 u16,
168 C1,
169 nppiFilterMedianBorderGetBufferSize_16u_C1R_Ctx,
170 nppiFilterMedianBorder_16u_C1R_Ctx
171);
172impl_filter_median_border!(
173 filter_median_border_u16_c3_buffer_size,
174 filter_median_border_u16_c3,
175 u16,
176 C3,
177 nppiFilterMedianBorderGetBufferSize_16u_C3R_Ctx,
178 nppiFilterMedianBorder_16u_C3R_Ctx
179);
180impl_filter_median_border!(
181 filter_median_border_u16_c4_buffer_size,
182 filter_median_border_u16_c4,
183 u16,
184 C4,
185 nppiFilterMedianBorderGetBufferSize_16u_C4R_Ctx,
186 nppiFilterMedianBorder_16u_C4R_Ctx
187);
188impl_filter_median_border!(
189 filter_median_border_u16_ac4_buffer_size,
190 filter_median_border_u16_ac4,
191 u16,
192 AC4,
193 nppiFilterMedianBorderGetBufferSize_16u_AC4R_Ctx,
194 nppiFilterMedianBorder_16u_AC4R_Ctx
195);
196impl_filter_median_border!(
197 filter_median_border_i16_c1_buffer_size,
198 filter_median_border_i16_c1,
199 i16,
200 C1,
201 nppiFilterMedianBorderGetBufferSize_16s_C1R_Ctx,
202 nppiFilterMedianBorder_16s_C1R_Ctx
203);
204impl_filter_median_border!(
205 filter_median_border_i16_c3_buffer_size,
206 filter_median_border_i16_c3,
207 i16,
208 C3,
209 nppiFilterMedianBorderGetBufferSize_16s_C3R_Ctx,
210 nppiFilterMedianBorder_16s_C3R_Ctx
211);
212impl_filter_median_border!(
213 filter_median_border_i16_c4_buffer_size,
214 filter_median_border_i16_c4,
215 i16,
216 C4,
217 nppiFilterMedianBorderGetBufferSize_16s_C4R_Ctx,
218 nppiFilterMedianBorder_16s_C4R_Ctx
219);
220impl_filter_median_border!(
221 filter_median_border_i16_ac4_buffer_size,
222 filter_median_border_i16_ac4,
223 i16,
224 AC4,
225 nppiFilterMedianBorderGetBufferSize_16s_AC4R_Ctx,
226 nppiFilterMedianBorder_16s_AC4R_Ctx
227);
228impl_filter_median_border!(
229 filter_median_border_f32_c1_buffer_size,
230 filter_median_border_f32_c1,
231 f32,
232 C1,
233 nppiFilterMedianBorderGetBufferSize_32f_C1R_Ctx,
234 nppiFilterMedianBorder_32f_C1R_Ctx
235);
236impl_filter_median_border!(
237 filter_median_border_f32_c3_buffer_size,
238 filter_median_border_f32_c3,
239 f32,
240 C3,
241 nppiFilterMedianBorderGetBufferSize_32f_C3R_Ctx,
242 nppiFilterMedianBorder_32f_C3R_Ctx
243);
244impl_filter_median_border!(
245 filter_median_border_f32_c4_buffer_size,
246 filter_median_border_f32_c4,
247 f32,
248 C4,
249 nppiFilterMedianBorderGetBufferSize_32f_C4R_Ctx,
250 nppiFilterMedianBorder_32f_C4R_Ctx
251);
252impl_filter_median_border!(
253 filter_median_border_f32_ac4_buffer_size,
254 filter_median_border_f32_ac4,
255 f32,
256 AC4,
257 nppiFilterMedianBorderGetBufferSize_32f_AC4R_Ctx,
258 nppiFilterMedianBorder_32f_AC4R_Ctx
259);
260
261pub trait FilterMedian<L: ChannelLayout>: DataTypeLike {
262 fn filter_median_buffer_size(
263 stream_context: &StreamContext,
264 roi: Size,
265 mask_size: Size,
266 ) -> Result<usize>;
267
268 fn filter_median(
269 stream_context: &StreamContext,
270 source: &ImageView<'_, Self, L>,
271 destination: &mut ImageViewMut<'_, Self, L>,
272 mask_size: Size,
273 anchor: Point,
274 ) -> Result<()>;
275}
276
277macro_rules! impl_filter_median_dispatch {
278 ($pixel_ty:ty, $layout:ty, $buffer_size_name:ident, $name:ident) => {
279 impl FilterMedian<$layout> for $pixel_ty {
280 fn filter_median_buffer_size(
281 stream_context: &StreamContext,
282 roi: Size,
283 mask_size: Size,
284 ) -> Result<usize> {
285 $buffer_size_name(stream_context, roi, mask_size)
286 }
287
288 fn filter_median(
289 stream_context: &StreamContext,
290 source: &ImageView<'_, Self, $layout>,
291 destination: &mut ImageViewMut<'_, Self, $layout>,
292 mask_size: Size,
293 anchor: Point,
294 ) -> Result<()> {
295 $name(stream_context, source, destination, mask_size, anchor)
296 }
297 }
298 };
299}
300
301impl_filter_median_dispatch!(u8, C1, filter_median_u8_c1_buffer_size, filter_median_u8_c1);
302impl_filter_median_dispatch!(u8, C3, filter_median_u8_c3_buffer_size, filter_median_u8_c3);
303impl_filter_median_dispatch!(u8, C4, filter_median_u8_c4_buffer_size, filter_median_u8_c4);
304impl_filter_median_dispatch!(
305 u8,
306 AC4,
307 filter_median_u8_ac4_buffer_size,
308 filter_median_u8_ac4
309);
310impl_filter_median_dispatch!(
311 u16,
312 C1,
313 filter_median_u16_c1_buffer_size,
314 filter_median_u16_c1
315);
316impl_filter_median_dispatch!(
317 u16,
318 C3,
319 filter_median_u16_c3_buffer_size,
320 filter_median_u16_c3
321);
322impl_filter_median_dispatch!(
323 u16,
324 C4,
325 filter_median_u16_c4_buffer_size,
326 filter_median_u16_c4
327);
328impl_filter_median_dispatch!(
329 u16,
330 AC4,
331 filter_median_u16_ac4_buffer_size,
332 filter_median_u16_ac4
333);
334impl_filter_median_dispatch!(
335 i16,
336 C1,
337 filter_median_i16_c1_buffer_size,
338 filter_median_i16_c1
339);
340impl_filter_median_dispatch!(
341 i16,
342 C3,
343 filter_median_i16_c3_buffer_size,
344 filter_median_i16_c3
345);
346impl_filter_median_dispatch!(
347 i16,
348 C4,
349 filter_median_i16_c4_buffer_size,
350 filter_median_i16_c4
351);
352impl_filter_median_dispatch!(
353 i16,
354 AC4,
355 filter_median_i16_ac4_buffer_size,
356 filter_median_i16_ac4
357);
358impl_filter_median_dispatch!(
359 f32,
360 C1,
361 filter_median_f32_c1_buffer_size,
362 filter_median_f32_c1
363);
364impl_filter_median_dispatch!(
365 f32,
366 C3,
367 filter_median_f32_c3_buffer_size,
368 filter_median_f32_c3
369);
370impl_filter_median_dispatch!(
371 f32,
372 C4,
373 filter_median_f32_c4_buffer_size,
374 filter_median_f32_c4
375);
376impl_filter_median_dispatch!(
377 f32,
378 AC4,
379 filter_median_f32_ac4_buffer_size,
380 filter_median_f32_ac4
381);
382
383pub fn filter_median_buffer_size<T, L>(
384 stream_context: &StreamContext,
385 roi: Size,
386 mask_size: Size,
387) -> Result<usize>
388where
389 T: FilterMedian<L>,
390 L: ChannelLayout,
391{
392 T::filter_median_buffer_size(stream_context, roi, mask_size)
393}
394
395pub fn filter_median<T, L>(
396 stream_context: &StreamContext,
397 source: &ImageView<'_, T, L>,
398 destination: &mut ImageViewMut<'_, T, L>,
399 mask_size: Size,
400 anchor: Point,
401) -> Result<()>
402where
403 T: FilterMedian<L>,
404 L: ChannelLayout,
405{
406 T::filter_median(stream_context, source, destination, mask_size, anchor)
407}
408
409pub trait FilterMedianBorder<L: ChannelLayout>: DataTypeLike {
410 fn filter_median_border_buffer_size(
411 stream_context: &StreamContext,
412 roi: Size,
413 mask_size: Size,
414 border_type: BorderType,
415 ) -> Result<usize>;
416
417 fn filter_median_border(
418 stream_context: &StreamContext,
419 source: &ImageView<'_, Self, L>,
420 source_offset: Point,
421 destination: &mut ImageViewMut<'_, Self, L>,
422 mask_size: Size,
423 anchor: Point,
424 border_type: BorderType,
425 ) -> Result<()>;
426}
427
428macro_rules! impl_filter_median_border_dispatch {
429 ($pixel_ty:ty, $layout:ty, $buffer_size_name:ident, $name:ident) => {
430 impl FilterMedianBorder<$layout> for $pixel_ty {
431 fn filter_median_border_buffer_size(
432 stream_context: &StreamContext,
433 roi: Size,
434 mask_size: Size,
435 border_type: BorderType,
436 ) -> Result<usize> {
437 $buffer_size_name(stream_context, roi, mask_size, border_type)
438 }
439
440 fn filter_median_border(
441 stream_context: &StreamContext,
442 source: &ImageView<'_, Self, $layout>,
443 source_offset: Point,
444 destination: &mut ImageViewMut<'_, Self, $layout>,
445 mask_size: Size,
446 anchor: Point,
447 border_type: BorderType,
448 ) -> Result<()> {
449 $name(
450 stream_context,
451 source,
452 source_offset,
453 destination,
454 mask_size,
455 anchor,
456 border_type,
457 )
458 }
459 }
460 };
461}
462
463impl_filter_median_border_dispatch!(
464 u8,
465 C1,
466 filter_median_border_u8_c1_buffer_size,
467 filter_median_border_u8_c1
468);
469impl_filter_median_border_dispatch!(
470 u8,
471 C3,
472 filter_median_border_u8_c3_buffer_size,
473 filter_median_border_u8_c3
474);
475impl_filter_median_border_dispatch!(
476 u8,
477 C4,
478 filter_median_border_u8_c4_buffer_size,
479 filter_median_border_u8_c4
480);
481impl_filter_median_border_dispatch!(
482 u8,
483 AC4,
484 filter_median_border_u8_ac4_buffer_size,
485 filter_median_border_u8_ac4
486);
487impl_filter_median_border_dispatch!(
488 u16,
489 C1,
490 filter_median_border_u16_c1_buffer_size,
491 filter_median_border_u16_c1
492);
493impl_filter_median_border_dispatch!(
494 u16,
495 C3,
496 filter_median_border_u16_c3_buffer_size,
497 filter_median_border_u16_c3
498);
499impl_filter_median_border_dispatch!(
500 u16,
501 C4,
502 filter_median_border_u16_c4_buffer_size,
503 filter_median_border_u16_c4
504);
505impl_filter_median_border_dispatch!(
506 u16,
507 AC4,
508 filter_median_border_u16_ac4_buffer_size,
509 filter_median_border_u16_ac4
510);
511impl_filter_median_border_dispatch!(
512 i16,
513 C1,
514 filter_median_border_i16_c1_buffer_size,
515 filter_median_border_i16_c1
516);
517impl_filter_median_border_dispatch!(
518 i16,
519 C3,
520 filter_median_border_i16_c3_buffer_size,
521 filter_median_border_i16_c3
522);
523impl_filter_median_border_dispatch!(
524 i16,
525 C4,
526 filter_median_border_i16_c4_buffer_size,
527 filter_median_border_i16_c4
528);
529impl_filter_median_border_dispatch!(
530 i16,
531 AC4,
532 filter_median_border_i16_ac4_buffer_size,
533 filter_median_border_i16_ac4
534);
535impl_filter_median_border_dispatch!(
536 f32,
537 C1,
538 filter_median_border_f32_c1_buffer_size,
539 filter_median_border_f32_c1
540);
541impl_filter_median_border_dispatch!(
542 f32,
543 C3,
544 filter_median_border_f32_c3_buffer_size,
545 filter_median_border_f32_c3
546);
547impl_filter_median_border_dispatch!(
548 f32,
549 C4,
550 filter_median_border_f32_c4_buffer_size,
551 filter_median_border_f32_c4
552);
553impl_filter_median_border_dispatch!(
554 f32,
555 AC4,
556 filter_median_border_f32_ac4_buffer_size,
557 filter_median_border_f32_ac4
558);
559
560pub fn filter_median_border_buffer_size<T, L>(
561 stream_context: &StreamContext,
562 roi: Size,
563 mask_size: Size,
564 border_type: BorderType,
565) -> Result<usize>
566where
567 T: FilterMedianBorder<L>,
568 L: ChannelLayout,
569{
570 T::filter_median_border_buffer_size(stream_context, roi, mask_size, border_type)
571}
572
573pub fn filter_median_border<T, L>(
574 stream_context: &StreamContext,
575 source: &ImageView<'_, T, L>,
576 source_offset: Point,
577 destination: &mut ImageViewMut<'_, T, L>,
578 mask_size: Size,
579 anchor: Point,
580 border_type: BorderType,
581) -> Result<()>
582where
583 T: FilterMedianBorder<L>,
584 L: ChannelLayout,
585{
586 T::filter_median_border(
587 stream_context,
588 source,
589 source_offset,
590 destination,
591 mask_size,
592 anchor,
593 border_type,
594 )
595}