Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_selection_filters.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2005 Michael Thaler
3 * SPDX-FileCopyrightText: 2011 Dmitry Kazakov <dimula73@gmail.com>
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 */
7
8
9#ifndef KIS_SELECTION_FILTERS_H
10#define KIS_SELECTION_FILTERS_H
11
12#include "kis_types.h"
13#include "kritaimage_export.h"
15
16#include <QRect>
17
19class KoColorSpace;
20
21class KRITAIMAGE_EXPORT KisSelectionFilter
22{
23public:
24 virtual ~KisSelectionFilter();
25
26 virtual void process(KisPixelSelectionSP pixelSelection,
27 const QRect &rect) = 0;
28
29 virtual KUndo2MagicString name();
30 virtual QRect changeRect(const QRect &rect, KisDefaultBoundsBaseSP defaultBounds);
31
32protected:
33 void computeBorder(qint32 *circ, qint32 xradius, qint32 yradius);
34
35 void rotatePointers(quint8 **p, quint32 n);
36
37 void computeTransition(quint8* transition, quint8** buf, qint32 width);
38};
39
40class KRITAIMAGE_EXPORT KisErodeSelectionFilter : public KisSelectionFilter
41{
42public:
43 KUndo2MagicString name() override;
44
45 QRect changeRect(const QRect &rect, KisDefaultBoundsBaseSP defaultBounds) override;
46
47 void process(KisPixelSelectionSP pixelSelection, const QRect &rect) override;
48};
49
50class KRITAIMAGE_EXPORT KisDilateSelectionFilter : public KisSelectionFilter
51{
52public:
53 KUndo2MagicString name() override;
54
55 QRect changeRect(const QRect &rect, KisDefaultBoundsBaseSP defaultBounds) override;
56
57 void process(KisPixelSelectionSP pixelSelection, const QRect &rect) override;
58};
59
60class KRITAIMAGE_EXPORT KisBorderSelectionFilter : public KisSelectionFilter
61{
62public:
63 KisBorderSelectionFilter(qint32 xRadius, qint32 yRadius, bool fade);
64
65 KUndo2MagicString name() override;
66
67 QRect changeRect(const QRect &rect, KisDefaultBoundsBaseSP defaultBounds) override;
68
69 void process(KisPixelSelectionSP pixelSelection, const QRect &rect) override;
70
71private:
72 qint32 m_xRadius;
73 qint32 m_yRadius;
75};
76
77class KRITAIMAGE_EXPORT KisFeatherSelectionFilter : public KisSelectionFilter
78{
79public:
80 KisFeatherSelectionFilter(qint32 radius);
81
82 KUndo2MagicString name() override;
83
84 QRect changeRect(const QRect &rect, KisDefaultBoundsBaseSP defaultBounds) override;
85
86 void process(KisPixelSelectionSP pixelSelection, const QRect &rect) override;
87private:
88 qint32 m_radius;
89};
90
91class KRITAIMAGE_EXPORT KisGrowSelectionFilter : public KisSelectionFilter
92{
93public:
94 KisGrowSelectionFilter(qint32 xRadius, qint32 yRadius);
95
96 KUndo2MagicString name() override;
97
98 QRect changeRect(const QRect &rect, KisDefaultBoundsBaseSP defaultBounds) override;
99
100 void process(KisPixelSelectionSP pixelSelection, const QRect &rect) override;
101
102private:
103 qint32 m_xRadius;
104 qint32 m_yRadius;
105};
106
107class KRITAIMAGE_EXPORT KisShrinkSelectionFilter : public KisSelectionFilter
108{
109public:
110 KisShrinkSelectionFilter(qint32 xRadius, qint32 yRadius, bool edgeLock);
111
112 KUndo2MagicString name() override;
113
114 QRect changeRect(const QRect &rect, KisDefaultBoundsBaseSP defaultBounds) override;
115
116 void process(KisPixelSelectionSP pixelSelection, const QRect &rect) override;
117
118private:
119 qint32 m_xRadius;
120 qint32 m_yRadius;
122};
123
124class KRITAIMAGE_EXPORT KisSmoothSelectionFilter : public KisSelectionFilter
125{
126public:
127 KUndo2MagicString name() override;
128
129 QRect changeRect(const QRect &rect, KisDefaultBoundsBaseSP defaultBounds) override;
130
131 void process(KisPixelSelectionSP pixelSelection, const QRect &rect) override;
132};
133
134class KRITAIMAGE_EXPORT KisInvertSelectionFilter : public KisSelectionFilter
135{
136public:
137 KUndo2MagicString name() override;
138
139 QRect changeRect(const QRect &rect, KisDefaultBoundsBaseSP defaultBounds) override;
140
141 void process(KisPixelSelectionSP pixelSelection, const QRect &rect) override;
142};
143
147class KRITAIMAGE_EXPORT KisAntiAliasSelectionFilter : public KisSelectionFilter
148{
149public:
150 KUndo2MagicString name() override;
151 void process(KisPixelSelectionSP pixelSelection, const QRect &rect) override;
152
153private:
157 static constexpr qint32 edgeThreshold {4};
162 static constexpr qint32 numSteps {30};
167 static constexpr qint32 offsets[numSteps] {
168 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
169 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
170 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
171 };
177 static constexpr qint32 horizontalBorderSize {2};
183 static constexpr qint32 verticalBorderSize {40};
187 static constexpr qint32 numberOfScanlines {2 * verticalBorderSize + 1};
191 static constexpr qint32 currentScanlineIndex {verticalBorderSize};
197 bool getInterpolationValue(qint32 negativeSpanEndDistance, qint32 positiveSpanEndDistance,
198 qint32 negativePixelDiff, qint32 positivePixelDiff, qint32 currentPixelDiff,
199 bool negativeSpanExtremeValid, bool positiveSpanExtremeValid,
200 qint32 *interpolationValue) const;
205 void findSpanExtreme(quint8 **scanlines, qint32 x, qint32 pixelOffset,
206 qint32 rowMultiplier, qint32 colMultiplier, qint32 direction,
207 qint32 pixelAvg, qint32 scaledGradient, qint32 currentPixelDiff,
208 qint32 *spanEndDistance, qint32 *pixelDiff, bool *spanExtremeValidType) const;
212 void findSpanExtremes(quint8 **scanlines, qint32 x, qint32 pixelOffset,
213 qint32 rowMultiplier, qint32 colMultiplier,
214 qint32 pixelAvg, qint32 scaledGradient, qint32 currentPixelDiff,
215 qint32 *negativeSpanEndDistance, qint32 *positiveSpanEndDistance,
216 qint32 *negativePixelDiff, qint32 *positivePixelDiff,
217 bool *negativeSpanExtremeValid, bool *positiveSpanExtremeValid) const;
218};
219
227{
228public:
234 KisGrowUntilDarkestPixelSelectionFilter(qint32 radius, KisPaintDeviceSP referenceDevice);
235
236 KUndo2MagicString name() override;
237 QRect changeRect(const QRect &rect, KisDefaultBoundsBaseSP defaultBounds) override;
238 void process(KisPixelSelectionSP pixelSelection, const QRect &rect) override;
239
240private:
241 qint32 m_radius;
243};
244
245#endif // KIS_SELECTION_FILTERS_H
const Params2D p
AntiAlias filter for selections inspired by FXAA.
Filter that dilates a selection and that can stop dilating adaptively at areas of higher darkness or ...
virtual void process(KisPixelSelectionSP pixelSelection, const QRect &rect)=0