1use super::*;
2
3impl_filter_directional!(filter_sharpen_u8_c1, u8, C1, nppiFilterSharpen_8u_C1R_Ctx);
4impl_filter_directional!(filter_sharpen_u8_c3, u8, C3, nppiFilterSharpen_8u_C3R_Ctx);
5impl_filter_directional!(filter_sharpen_u8_c4, u8, C4, nppiFilterSharpen_8u_C4R_Ctx);
6impl_filter_directional!(
7 filter_sharpen_u8_ac4,
8 u8,
9 AC4,
10 nppiFilterSharpen_8u_AC4R_Ctx
11);
12impl_filter_directional!(
13 filter_sharpen_u16_c1,
14 u16,
15 C1,
16 nppiFilterSharpen_16u_C1R_Ctx
17);
18impl_filter_directional!(
19 filter_sharpen_u16_c3,
20 u16,
21 C3,
22 nppiFilterSharpen_16u_C3R_Ctx
23);
24impl_filter_directional!(
25 filter_sharpen_u16_c4,
26 u16,
27 C4,
28 nppiFilterSharpen_16u_C4R_Ctx
29);
30impl_filter_directional!(
31 filter_sharpen_u16_ac4,
32 u16,
33 AC4,
34 nppiFilterSharpen_16u_AC4R_Ctx
35);
36impl_filter_directional!(
37 filter_sharpen_i16_c1,
38 i16,
39 C1,
40 nppiFilterSharpen_16s_C1R_Ctx
41);
42impl_filter_directional!(
43 filter_sharpen_i16_c3,
44 i16,
45 C3,
46 nppiFilterSharpen_16s_C3R_Ctx
47);
48impl_filter_directional!(
49 filter_sharpen_i16_c4,
50 i16,
51 C4,
52 nppiFilterSharpen_16s_C4R_Ctx
53);
54impl_filter_directional!(
55 filter_sharpen_i16_ac4,
56 i16,
57 AC4,
58 nppiFilterSharpen_16s_AC4R_Ctx
59);
60impl_filter_directional!(
61 filter_sharpen_f32_c1,
62 f32,
63 C1,
64 nppiFilterSharpen_32f_C1R_Ctx
65);
66impl_filter_directional!(
67 filter_sharpen_f32_c3,
68 f32,
69 C3,
70 nppiFilterSharpen_32f_C3R_Ctx
71);
72impl_filter_directional!(
73 filter_sharpen_f32_c4,
74 f32,
75 C4,
76 nppiFilterSharpen_32f_C4R_Ctx
77);
78impl_filter_directional!(
79 filter_sharpen_f32_ac4,
80 f32,
81 AC4,
82 nppiFilterSharpen_32f_AC4R_Ctx
83);
84
85impl_filter_directional_border!(
86 filter_sharpen_border_u8_c1,
87 u8,
88 C1,
89 nppiFilterSharpenBorder_8u_C1R_Ctx
90);
91impl_filter_directional_border!(
92 filter_sharpen_border_u8_c3,
93 u8,
94 C3,
95 nppiFilterSharpenBorder_8u_C3R_Ctx
96);
97impl_filter_directional_border!(
98 filter_sharpen_border_u8_c4,
99 u8,
100 C4,
101 nppiFilterSharpenBorder_8u_C4R_Ctx
102);
103impl_filter_directional_border!(
104 filter_sharpen_border_u8_ac4,
105 u8,
106 AC4,
107 nppiFilterSharpenBorder_8u_AC4R_Ctx
108);
109impl_filter_directional_border!(
110 filter_sharpen_border_u16_c1,
111 u16,
112 C1,
113 nppiFilterSharpenBorder_16u_C1R_Ctx
114);
115impl_filter_directional_border!(
116 filter_sharpen_border_u16_c3,
117 u16,
118 C3,
119 nppiFilterSharpenBorder_16u_C3R_Ctx
120);
121impl_filter_directional_border!(
122 filter_sharpen_border_u16_c4,
123 u16,
124 C4,
125 nppiFilterSharpenBorder_16u_C4R_Ctx
126);
127impl_filter_directional_border!(
128 filter_sharpen_border_u16_ac4,
129 u16,
130 AC4,
131 nppiFilterSharpenBorder_16u_AC4R_Ctx
132);
133impl_filter_directional_border!(
134 filter_sharpen_border_i16_c1,
135 i16,
136 C1,
137 nppiFilterSharpenBorder_16s_C1R_Ctx
138);
139impl_filter_directional_border!(
140 filter_sharpen_border_i16_c3,
141 i16,
142 C3,
143 nppiFilterSharpenBorder_16s_C3R_Ctx
144);
145impl_filter_directional_border!(
146 filter_sharpen_border_i16_c4,
147 i16,
148 C4,
149 nppiFilterSharpenBorder_16s_C4R_Ctx
150);
151impl_filter_directional_border!(
152 filter_sharpen_border_i16_ac4,
153 i16,
154 AC4,
155 nppiFilterSharpenBorder_16s_AC4R_Ctx
156);
157impl_filter_directional_border!(
158 filter_sharpen_border_f32_c1,
159 f32,
160 C1,
161 nppiFilterSharpenBorder_32f_C1R_Ctx
162);
163impl_filter_directional_border!(
164 filter_sharpen_border_f32_c3,
165 f32,
166 C3,
167 nppiFilterSharpenBorder_32f_C3R_Ctx
168);
169impl_filter_directional_border!(
170 filter_sharpen_border_f32_c4,
171 f32,
172 C4,
173 nppiFilterSharpenBorder_32f_C4R_Ctx
174);
175impl_filter_directional_border!(
176 filter_sharpen_border_f32_ac4,
177 f32,
178 AC4,
179 nppiFilterSharpenBorder_32f_AC4R_Ctx
180);
181
182pub trait FilterSharpen<L: ChannelLayout>: DataTypeLike {
183 fn filter_sharpen(
184 stream_context: &StreamContext,
185 source: &ImageView<'_, Self, L>,
186 destination: &mut ImageViewMut<'_, Self, L>,
187 ) -> Result<()>;
188}
189
190macro_rules! impl_filter_sharpen_dispatch {
191 ($pixel_ty:ty, $layout:ty, $name:ident) => {
192 impl FilterSharpen<$layout> for $pixel_ty {
193 fn filter_sharpen(
194 stream_context: &StreamContext,
195 source: &ImageView<'_, Self, $layout>,
196 destination: &mut ImageViewMut<'_, Self, $layout>,
197 ) -> Result<()> {
198 $name(stream_context, source, destination)
199 }
200 }
201 };
202}
203
204impl_filter_sharpen_dispatch!(u8, C1, filter_sharpen_u8_c1);
205impl_filter_sharpen_dispatch!(u8, C3, filter_sharpen_u8_c3);
206impl_filter_sharpen_dispatch!(u8, C4, filter_sharpen_u8_c4);
207impl_filter_sharpen_dispatch!(u8, AC4, filter_sharpen_u8_ac4);
208impl_filter_sharpen_dispatch!(u16, C1, filter_sharpen_u16_c1);
209impl_filter_sharpen_dispatch!(u16, C3, filter_sharpen_u16_c3);
210impl_filter_sharpen_dispatch!(u16, C4, filter_sharpen_u16_c4);
211impl_filter_sharpen_dispatch!(u16, AC4, filter_sharpen_u16_ac4);
212impl_filter_sharpen_dispatch!(i16, C1, filter_sharpen_i16_c1);
213impl_filter_sharpen_dispatch!(i16, C3, filter_sharpen_i16_c3);
214impl_filter_sharpen_dispatch!(i16, C4, filter_sharpen_i16_c4);
215impl_filter_sharpen_dispatch!(i16, AC4, filter_sharpen_i16_ac4);
216impl_filter_sharpen_dispatch!(f32, C1, filter_sharpen_f32_c1);
217impl_filter_sharpen_dispatch!(f32, C3, filter_sharpen_f32_c3);
218impl_filter_sharpen_dispatch!(f32, C4, filter_sharpen_f32_c4);
219impl_filter_sharpen_dispatch!(f32, AC4, filter_sharpen_f32_ac4);
220
221pub fn filter_sharpen<T, L>(
222 stream_context: &StreamContext,
223 source: &ImageView<'_, T, L>,
224 destination: &mut ImageViewMut<'_, T, L>,
225) -> Result<()>
226where
227 T: FilterSharpen<L>,
228 L: ChannelLayout,
229{
230 T::filter_sharpen(stream_context, source, destination)
231}
232
233pub trait FilterSharpenBorder<L: ChannelLayout>: DataTypeLike {
234 fn filter_sharpen_border(
235 stream_context: &StreamContext,
236 source: &ImageView<'_, Self, L>,
237 source_offset: Point,
238 destination: &mut ImageViewMut<'_, Self, L>,
239 border_type: BorderType,
240 ) -> Result<()>;
241}
242
243macro_rules! impl_filter_sharpen_border_dispatch {
244 ($pixel_ty:ty, $layout:ty, $name:ident) => {
245 impl FilterSharpenBorder<$layout> for $pixel_ty {
246 fn filter_sharpen_border(
247 stream_context: &StreamContext,
248 source: &ImageView<'_, Self, $layout>,
249 source_offset: Point,
250 destination: &mut ImageViewMut<'_, Self, $layout>,
251 border_type: BorderType,
252 ) -> Result<()> {
253 $name(
254 stream_context,
255 source,
256 source_offset,
257 destination,
258 border_type,
259 )
260 }
261 }
262 };
263}
264
265impl_filter_sharpen_border_dispatch!(u8, C1, filter_sharpen_border_u8_c1);
266impl_filter_sharpen_border_dispatch!(u8, C3, filter_sharpen_border_u8_c3);
267impl_filter_sharpen_border_dispatch!(u8, C4, filter_sharpen_border_u8_c4);
268impl_filter_sharpen_border_dispatch!(u8, AC4, filter_sharpen_border_u8_ac4);
269impl_filter_sharpen_border_dispatch!(u16, C1, filter_sharpen_border_u16_c1);
270impl_filter_sharpen_border_dispatch!(u16, C3, filter_sharpen_border_u16_c3);
271impl_filter_sharpen_border_dispatch!(u16, C4, filter_sharpen_border_u16_c4);
272impl_filter_sharpen_border_dispatch!(u16, AC4, filter_sharpen_border_u16_ac4);
273impl_filter_sharpen_border_dispatch!(i16, C1, filter_sharpen_border_i16_c1);
274impl_filter_sharpen_border_dispatch!(i16, C3, filter_sharpen_border_i16_c3);
275impl_filter_sharpen_border_dispatch!(i16, C4, filter_sharpen_border_i16_c4);
276impl_filter_sharpen_border_dispatch!(i16, AC4, filter_sharpen_border_i16_ac4);
277impl_filter_sharpen_border_dispatch!(f32, C1, filter_sharpen_border_f32_c1);
278impl_filter_sharpen_border_dispatch!(f32, C3, filter_sharpen_border_f32_c3);
279impl_filter_sharpen_border_dispatch!(f32, C4, filter_sharpen_border_f32_c4);
280impl_filter_sharpen_border_dispatch!(f32, AC4, filter_sharpen_border_f32_ac4);
281
282pub fn filter_sharpen_border<T, L>(
283 stream_context: &StreamContext,
284 source: &ImageView<'_, T, L>,
285 source_offset: Point,
286 destination: &mut ImageViewMut<'_, T, L>,
287 border_type: BorderType,
288) -> Result<()>
289where
290 T: FilterSharpenBorder<L>,
291 L: ChannelLayout,
292{
293 T::filter_sharpen_border(
294 stream_context,
295 source,
296 source_offset,
297 destination,
298 border_type,
299 )
300}
301
302impl_filter_unsharp_border!(
303 filter_unsharp_border_u8_c1_buffer_size,
304 filter_unsharp_border_u8_c1,
305 u8,
306 C1,
307 nppiFilterUnsharpGetBufferSize_8u_C1R,
308 nppiFilterUnsharpBorder_8u_C1R_Ctx
309);
310impl_filter_unsharp_border!(
311 filter_unsharp_border_u8_c3_buffer_size,
312 filter_unsharp_border_u8_c3,
313 u8,
314 C3,
315 nppiFilterUnsharpGetBufferSize_8u_C3R,
316 nppiFilterUnsharpBorder_8u_C3R_Ctx
317);
318impl_filter_unsharp_border!(
319 filter_unsharp_border_u8_c4_buffer_size,
320 filter_unsharp_border_u8_c4,
321 u8,
322 C4,
323 nppiFilterUnsharpGetBufferSize_8u_C4R,
324 nppiFilterUnsharpBorder_8u_C4R_Ctx
325);
326impl_filter_unsharp_border!(
327 filter_unsharp_border_u8_ac4_buffer_size,
328 filter_unsharp_border_u8_ac4,
329 u8,
330 AC4,
331 nppiFilterUnsharpGetBufferSize_8u_AC4R,
332 nppiFilterUnsharpBorder_8u_AC4R_Ctx
333);
334impl_filter_unsharp_border!(
335 filter_unsharp_border_u16_c1_buffer_size,
336 filter_unsharp_border_u16_c1,
337 u16,
338 C1,
339 nppiFilterUnsharpGetBufferSize_16u_C1R,
340 nppiFilterUnsharpBorder_16u_C1R_Ctx
341);
342impl_filter_unsharp_border!(
343 filter_unsharp_border_u16_c3_buffer_size,
344 filter_unsharp_border_u16_c3,
345 u16,
346 C3,
347 nppiFilterUnsharpGetBufferSize_16u_C3R,
348 nppiFilterUnsharpBorder_16u_C3R_Ctx
349);
350impl_filter_unsharp_border!(
351 filter_unsharp_border_u16_c4_buffer_size,
352 filter_unsharp_border_u16_c4,
353 u16,
354 C4,
355 nppiFilterUnsharpGetBufferSize_16u_C4R,
356 nppiFilterUnsharpBorder_16u_C4R_Ctx
357);
358impl_filter_unsharp_border!(
359 filter_unsharp_border_u16_ac4_buffer_size,
360 filter_unsharp_border_u16_ac4,
361 u16,
362 AC4,
363 nppiFilterUnsharpGetBufferSize_16u_AC4R,
364 nppiFilterUnsharpBorder_16u_AC4R_Ctx
365);
366impl_filter_unsharp_border!(
367 filter_unsharp_border_i16_c1_buffer_size,
368 filter_unsharp_border_i16_c1,
369 i16,
370 C1,
371 nppiFilterUnsharpGetBufferSize_16s_C1R,
372 nppiFilterUnsharpBorder_16s_C1R_Ctx
373);
374impl_filter_unsharp_border!(
375 filter_unsharp_border_i16_c3_buffer_size,
376 filter_unsharp_border_i16_c3,
377 i16,
378 C3,
379 nppiFilterUnsharpGetBufferSize_16s_C3R,
380 nppiFilterUnsharpBorder_16s_C3R_Ctx
381);
382impl_filter_unsharp_border!(
383 filter_unsharp_border_i16_c4_buffer_size,
384 filter_unsharp_border_i16_c4,
385 i16,
386 C4,
387 nppiFilterUnsharpGetBufferSize_16s_C4R,
388 nppiFilterUnsharpBorder_16s_C4R_Ctx
389);
390impl_filter_unsharp_border!(
391 filter_unsharp_border_i16_ac4_buffer_size,
392 filter_unsharp_border_i16_ac4,
393 i16,
394 AC4,
395 nppiFilterUnsharpGetBufferSize_16s_AC4R,
396 nppiFilterUnsharpBorder_16s_AC4R_Ctx
397);
398impl_filter_unsharp_border!(
399 filter_unsharp_border_f32_c1_buffer_size,
400 filter_unsharp_border_f32_c1,
401 f32,
402 C1,
403 nppiFilterUnsharpGetBufferSize_32f_C1R,
404 nppiFilterUnsharpBorder_32f_C1R_Ctx
405);
406impl_filter_unsharp_border!(
407 filter_unsharp_border_f32_c3_buffer_size,
408 filter_unsharp_border_f32_c3,
409 f32,
410 C3,
411 nppiFilterUnsharpGetBufferSize_32f_C3R,
412 nppiFilterUnsharpBorder_32f_C3R_Ctx
413);
414impl_filter_unsharp_border!(
415 filter_unsharp_border_f32_c4_buffer_size,
416 filter_unsharp_border_f32_c4,
417 f32,
418 C4,
419 nppiFilterUnsharpGetBufferSize_32f_C4R,
420 nppiFilterUnsharpBorder_32f_C4R_Ctx
421);
422impl_filter_unsharp_border!(
423 filter_unsharp_border_f32_ac4_buffer_size,
424 filter_unsharp_border_f32_ac4,
425 f32,
426 AC4,
427 nppiFilterUnsharpGetBufferSize_32f_AC4R,
428 nppiFilterUnsharpBorder_32f_AC4R_Ctx
429);
430
431pub trait FilterUnsharpBorder<L: ChannelLayout>: DataTypeLike {
432 fn filter_unsharp_border_buffer_size(radius: f32, sigma: f32) -> Result<usize>;
433
434 fn filter_unsharp_border(
435 stream_context: &StreamContext,
436 source: &ImageView<'_, Self, L>,
437 source_offset: Point,
438 destination: &mut ImageViewMut<'_, Self, L>,
439 radius: f32,
440 sigma: f32,
441 weight: f32,
442 threshold: f32,
443 border_type: BorderType,
444 ) -> Result<()>;
445}
446
447macro_rules! impl_filter_unsharp_border_dispatch {
448 ($pixel_ty:ty, $layout:ty, $buffer_size_name:ident, $name:ident) => {
449 impl FilterUnsharpBorder<$layout> for $pixel_ty {
450 fn filter_unsharp_border_buffer_size(radius: f32, sigma: f32) -> Result<usize> {
451 $buffer_size_name(radius, sigma)
452 }
453
454 fn filter_unsharp_border(
455 stream_context: &StreamContext,
456 source: &ImageView<'_, Self, $layout>,
457 source_offset: Point,
458 destination: &mut ImageViewMut<'_, Self, $layout>,
459 radius: f32,
460 sigma: f32,
461 weight: f32,
462 threshold: f32,
463 border_type: BorderType,
464 ) -> Result<()> {
465 $name(
466 stream_context,
467 source,
468 source_offset,
469 destination,
470 radius,
471 sigma,
472 weight,
473 threshold,
474 border_type,
475 )
476 }
477 }
478 };
479}
480
481impl_filter_unsharp_border_dispatch!(
482 u8,
483 C1,
484 filter_unsharp_border_u8_c1_buffer_size,
485 filter_unsharp_border_u8_c1
486);
487impl_filter_unsharp_border_dispatch!(
488 u8,
489 C3,
490 filter_unsharp_border_u8_c3_buffer_size,
491 filter_unsharp_border_u8_c3
492);
493impl_filter_unsharp_border_dispatch!(
494 u8,
495 C4,
496 filter_unsharp_border_u8_c4_buffer_size,
497 filter_unsharp_border_u8_c4
498);
499impl_filter_unsharp_border_dispatch!(
500 u8,
501 AC4,
502 filter_unsharp_border_u8_ac4_buffer_size,
503 filter_unsharp_border_u8_ac4
504);
505impl_filter_unsharp_border_dispatch!(
506 u16,
507 C1,
508 filter_unsharp_border_u16_c1_buffer_size,
509 filter_unsharp_border_u16_c1
510);
511impl_filter_unsharp_border_dispatch!(
512 u16,
513 C3,
514 filter_unsharp_border_u16_c3_buffer_size,
515 filter_unsharp_border_u16_c3
516);
517impl_filter_unsharp_border_dispatch!(
518 u16,
519 C4,
520 filter_unsharp_border_u16_c4_buffer_size,
521 filter_unsharp_border_u16_c4
522);
523impl_filter_unsharp_border_dispatch!(
524 u16,
525 AC4,
526 filter_unsharp_border_u16_ac4_buffer_size,
527 filter_unsharp_border_u16_ac4
528);
529impl_filter_unsharp_border_dispatch!(
530 i16,
531 C1,
532 filter_unsharp_border_i16_c1_buffer_size,
533 filter_unsharp_border_i16_c1
534);
535impl_filter_unsharp_border_dispatch!(
536 i16,
537 C3,
538 filter_unsharp_border_i16_c3_buffer_size,
539 filter_unsharp_border_i16_c3
540);
541impl_filter_unsharp_border_dispatch!(
542 i16,
543 C4,
544 filter_unsharp_border_i16_c4_buffer_size,
545 filter_unsharp_border_i16_c4
546);
547impl_filter_unsharp_border_dispatch!(
548 i16,
549 AC4,
550 filter_unsharp_border_i16_ac4_buffer_size,
551 filter_unsharp_border_i16_ac4
552);
553impl_filter_unsharp_border_dispatch!(
554 f32,
555 C1,
556 filter_unsharp_border_f32_c1_buffer_size,
557 filter_unsharp_border_f32_c1
558);
559impl_filter_unsharp_border_dispatch!(
560 f32,
561 C3,
562 filter_unsharp_border_f32_c3_buffer_size,
563 filter_unsharp_border_f32_c3
564);
565impl_filter_unsharp_border_dispatch!(
566 f32,
567 C4,
568 filter_unsharp_border_f32_c4_buffer_size,
569 filter_unsharp_border_f32_c4
570);
571impl_filter_unsharp_border_dispatch!(
572 f32,
573 AC4,
574 filter_unsharp_border_f32_ac4_buffer_size,
575 filter_unsharp_border_f32_ac4
576);
577
578pub fn filter_unsharp_border_buffer_size<T, L>(radius: f32, sigma: f32) -> Result<usize>
579where
580 T: FilterUnsharpBorder<L>,
581 L: ChannelLayout,
582{
583 T::filter_unsharp_border_buffer_size(radius, sigma)
584}
585
586pub fn filter_unsharp_border<T, L>(
587 stream_context: &StreamContext,
588 source: &ImageView<'_, T, L>,
589 source_offset: Point,
590 destination: &mut ImageViewMut<'_, T, L>,
591 radius: f32,
592 sigma: f32,
593 weight: f32,
594 threshold: f32,
595 border_type: BorderType,
596) -> Result<()>
597where
598 T: FilterUnsharpBorder<L>,
599 L: ChannelLayout,
600{
601 T::filter_unsharp_border(
602 stream_context,
603 source,
604 source_offset,
605 destination,
606 radius,
607 sigma,
608 weight,
609 threshold,
610 border_type,
611 )
612}