Skip to main content

singe_npp/image/
filtering_sharpen.rs

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}