1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
//! This file has been automatically generated by `objc2`'s `header-translator`.
//! DO NOT EDIT
use core::ptr::NonNull;
use objc2::__framework_prelude::*;
use objc2_foundation::*;
use objc2_metal::*;
use crate::*;
extern_class!(
/// The MPSImageMedian applies a median filter to an image. A median filter finds the
/// median color value for each channel within a kernelDiameter x kernelDiameter
/// window surrounding the pixel of interest. It is a common means of noise reduction
/// and also as a smoothing filter with edge preserving qualities.
///
/// NOTE: The MPSImageMedian filter currently only supports images with
/// <
/// = 8 bits/channel.
///
/// See also [Apple's documentation](https://developer.apple.com/documentation/metalperformanceshaders/mpsimagemedian?language=objc)
#[unsafe(super(MPSUnaryImageKernel, MPSKernel, NSObject))]
#[derive(Debug, PartialEq, Eq, Hash)]
#[cfg(all(feature = "MPSCore", feature = "MPSImageKernel", feature = "MPSKernel"))]
pub struct MPSImageMedian;
);
#[cfg(all(feature = "MPSCore", feature = "MPSImageKernel", feature = "MPSKernel"))]
extern_conformance!(
unsafe impl NSCoding for MPSImageMedian {}
);
#[cfg(all(feature = "MPSCore", feature = "MPSImageKernel", feature = "MPSKernel"))]
extern_conformance!(
unsafe impl NSCopying for MPSImageMedian {}
);
#[cfg(all(feature = "MPSCore", feature = "MPSImageKernel", feature = "MPSKernel"))]
unsafe impl CopyingHelper for MPSImageMedian {
type Result = Self;
}
#[cfg(all(feature = "MPSCore", feature = "MPSImageKernel", feature = "MPSKernel"))]
extern_conformance!(
unsafe impl NSObjectProtocol for MPSImageMedian {}
);
#[cfg(all(feature = "MPSCore", feature = "MPSImageKernel", feature = "MPSKernel"))]
extern_conformance!(
unsafe impl NSSecureCoding for MPSImageMedian {}
);
#[cfg(all(feature = "MPSCore", feature = "MPSImageKernel", feature = "MPSKernel"))]
impl MPSImageMedian {
extern_methods!(
/// The diameter in pixels of the filter window.
///
/// The median filter is applied to a kernelDiameter x kernelDiameter window
/// of pixels centered on the corresponding source pixel for each destination
/// pixel. The kernel diameter must be an odd number.
#[unsafe(method(kernelDiameter))]
#[unsafe(method_family = none)]
pub unsafe fn kernelDiameter(&self) -> NSUInteger;
/// Initialize a filter for a particular kernel size and device
///
/// Parameter `device`: The device the filter will run on
///
/// Parameter `kernelDiameter`: Diameter of the median filter. Must be an odd number.
///
/// Returns: A valid object or nil, if failure.
#[unsafe(method(initWithDevice:kernelDiameter:))]
#[unsafe(method_family = init)]
pub unsafe fn initWithDevice_kernelDiameter(
this: Allocated<Self>,
device: &ProtocolObject<dyn MTLDevice>,
kernel_diameter: NSUInteger,
) -> Retained<Self>;
/// NSSecureCoding compatability
///
/// While the standard NSSecureCoding/NSCoding method
/// -initWithCoder: should work, since the file can't
/// know which device your data is allocated on, we
/// have to guess and may guess incorrectly. To avoid
/// that problem, use initWithCoder:device instead.
///
/// Parameter `aDecoder`: The NSCoder subclass with your serialized MPSKernel
///
/// Parameter `device`: The MTLDevice on which to make the MPSKernel
///
/// Returns: A new MPSKernel object, or nil if failure.
///
/// # Safety
///
/// `a_decoder` possibly has further requirements.
#[unsafe(method(initWithCoder:device:))]
#[unsafe(method_family = init)]
pub unsafe fn initWithCoder_device(
this: Allocated<Self>,
a_decoder: &NSCoder,
device: &ProtocolObject<dyn MTLDevice>,
) -> Option<Retained<Self>>;
#[unsafe(method(initWithDevice:))]
#[unsafe(method_family = init)]
pub unsafe fn initWithDevice(
this: Allocated<Self>,
device: &ProtocolObject<dyn MTLDevice>,
) -> Retained<Self>;
/// The maximum diameter in pixels of the filter window supported by the median filter.
#[unsafe(method(maxKernelDiameter))]
#[unsafe(method_family = none)]
pub unsafe fn maxKernelDiameter() -> NSUInteger;
/// The minimum diameter in pixels of the filter window supported by the median filter.
#[unsafe(method(minKernelDiameter))]
#[unsafe(method_family = none)]
pub unsafe fn minKernelDiameter() -> NSUInteger;
);
}
/// Methods declared on superclass `MPSKernel`.
#[cfg(all(feature = "MPSCore", feature = "MPSImageKernel", feature = "MPSKernel"))]
impl MPSImageMedian {
extern_methods!(
/// Called by NSCoder to decode MPSKernels
///
/// This isn't the right interface to decode a MPSKernel, but
/// it is the one that NSCoder uses. To enable your NSCoder
/// (e.g. NSKeyedUnarchiver) to set which device to use
/// extend the object to adopt the MPSDeviceProvider
/// protocol. Otherwise, the Metal system default device
/// will be used.
///
/// # Safety
///
/// `a_decoder` possibly has further requirements.
#[unsafe(method(initWithCoder:))]
#[unsafe(method_family = init)]
pub unsafe fn initWithCoder(
this: Allocated<Self>,
a_decoder: &NSCoder,
) -> Option<Retained<Self>>;
);
}
/// Methods declared on superclass `NSObject`.
#[cfg(all(feature = "MPSCore", feature = "MPSImageKernel", feature = "MPSKernel"))]
impl MPSImageMedian {
extern_methods!(
#[unsafe(method(init))]
#[unsafe(method_family = init)]
pub unsafe fn init(this: Allocated<Self>) -> Retained<Self>;
#[unsafe(method(new))]
#[unsafe(method_family = new)]
pub unsafe fn new() -> Retained<Self>;
);
}