1from _typeshed import Self
2from typing import Any, Callable, Iterable, Sequence, Tuple, Type
3from typing_extensions import Literal
4
5from .Image import Image
6
7_FilterArgs = Tuple[Sequence[int], int, int, Sequence[int]]
8
9# filter image parameters below are the C images, i.e. Image().im.
10
11class Filter: ...
12class MultibandFilter(Filter): ...
13
14class BuiltinFilter(MultibandFilter):
15    def filter(self, image) -> Image: ...
16
17class Kernel(BuiltinFilter):
18    name: str
19    filterargs: _FilterArgs
20    def __init__(self, size: Sequence[int], kernel: Sequence[int], scale: Any | None = ..., offset: int = ...) -> None: ...
21
22class RankFilter(Filter):
23    name: str
24    size: int
25    rank: int
26    def __init__(self, size: int, rank: int) -> None: ...
27    def filter(self, image) -> Image: ...
28
29class MedianFilter(RankFilter):
30    name: str
31    size: int
32    rank: int
33    def __init__(self, size: int = ...) -> None: ...
34
35class MinFilter(RankFilter):
36    name: str
37    size: int
38    rank: int
39    def __init__(self, size: int = ...) -> None: ...
40
41class MaxFilter(RankFilter):
42    name: str
43    size: int
44    rank: int
45    def __init__(self, size: int = ...) -> None: ...
46
47class ModeFilter(Filter):
48    name: str
49    size: int
50    def __init__(self, size: int = ...) -> None: ...
51    def filter(self, image) -> Image: ...
52
53class GaussianBlur(MultibandFilter):
54    name: str
55    radius: float
56    def __init__(self, radius: float = ...) -> None: ...
57    def filter(self, image) -> Image: ...
58
59class BoxBlur(MultibandFilter):
60    name: str
61    radius: float
62    def __init__(self, radius: float) -> None: ...
63    def filter(self, image) -> Image: ...
64
65class UnsharpMask(MultibandFilter):
66    name: str
67    radius: float
68    percent: int
69    threshold: int
70    def __init__(self, radius: float = ..., percent: int = ..., threshold: int = ...) -> None: ...
71    def filter(self, image) -> Image: ...
72
73class BLUR(BuiltinFilter):
74    name: str
75    filterargs: _FilterArgs
76
77class CONTOUR(BuiltinFilter):
78    name: str
79    filterargs: _FilterArgs
80
81class DETAIL(BuiltinFilter):
82    name: str
83    filterargs: _FilterArgs
84
85class EDGE_ENHANCE(BuiltinFilter):
86    name: str
87    filterargs: _FilterArgs
88
89class EDGE_ENHANCE_MORE(BuiltinFilter):
90    name: str
91    filterargs: _FilterArgs
92
93class EMBOSS(BuiltinFilter):
94    name: str
95    filterargs: _FilterArgs
96
97class FIND_EDGES(BuiltinFilter):
98    name: str
99    filterargs: _FilterArgs
100
101class SHARPEN(BuiltinFilter):
102    name: str
103    filterargs: _FilterArgs
104
105class SMOOTH(BuiltinFilter):
106    name: str
107    filterargs: _FilterArgs
108
109class SMOOTH_MORE(BuiltinFilter):
110    name: str
111    filterargs: _FilterArgs
112
113class Color3DLUT(MultibandFilter):
114    name: str
115    size: list[int]
116    channels: int
117    mode: str | None
118    table: Any
119    def __init__(
120        self, size: int | Iterable[int], table, channels: int = ..., target_mode: str | None = ..., **kwargs
121    ) -> None: ...
122    @classmethod
123    def generate(
124        cls: Type[Self],
125        size: int | tuple[int, int, int],
126        callback: Callable[[float, float, float], Iterable[float]],
127        channels: int = ...,
128        target_mode: str | None = ...,
129    ) -> Self: ...
130    def transform(
131        self: Self,
132        callback: Callable[..., Iterable[float]],
133        with_normals: bool = ...,
134        channels: Literal[3, 4] | None = ...,
135        target_mode: Any | None = ...,
136    ) -> Self: ...
137    def filter(self, image) -> Image: ...
138