Krita Source Code Documentation
Loading...
Searching...
No Matches
KisErodeSelectionFilter Class Reference

#include <kis_selection_filters.h>

+ Inheritance diagram for KisErodeSelectionFilter:

Public Member Functions

QRect changeRect (const QRect &rect, KisDefaultBoundsBaseSP defaultBounds) override
 
KUndo2MagicString name () override
 
void process (KisPixelSelectionSP pixelSelection, const QRect &rect) override
 
- Public Member Functions inherited from KisSelectionFilter
virtual ~KisSelectionFilter ()
 

Additional Inherited Members

- Protected Member Functions inherited from KisSelectionFilter
void computeBorder (qint32 *circ, qint32 xradius, qint32 yradius)
 
void computeTransition (quint8 *transition, quint8 **buf, qint32 width)
 
void rotatePointers (quint8 **p, quint32 n)
 

Detailed Description

Definition at line 40 of file kis_selection_filters.h.

Member Function Documentation

◆ changeRect()

QRect KisErodeSelectionFilter::changeRect ( const QRect & rect,
KisDefaultBoundsBaseSP defaultBounds )
overridevirtual

Reimplemented from KisSelectionFilter.

Definition at line 119 of file kis_selection_filters.cpp.

120{
121 Q_UNUSED(defaultBounds);
122
123 const qint32 radius = 1;
124 return rect.adjusted(-radius, -radius, radius, radius);
125}

◆ name()

KUndo2MagicString KisErodeSelectionFilter::name ( )
overridevirtual

Reimplemented from KisSelectionFilter.

Definition at line 114 of file kis_selection_filters.cpp.

115{
116 return kundo2_i18n("Erode Selection");
117}
KUndo2MagicString kundo2_i18n(const char *text)

References kundo2_i18n().

◆ process()

void KisErodeSelectionFilter::process ( KisPixelSelectionSP pixelSelection,
const QRect & rect )
overridevirtual

Implements KisSelectionFilter.

Definition at line 127 of file kis_selection_filters.cpp.

128{
129 // Erode (radius 1 pixel) a mask (1bpp)
130 quint8* buf[3];
131
132 qint32 width = rect.width();
133 qint32 height = rect.height();
134
135 quint8* out = new quint8[width];
136 for (qint32 i = 0; i < 3; i++)
137 buf[i] = new quint8[width + 2];
138
139
140 // load top of image
141 pixelSelection->readBytes(buf[0] + 1, rect.x(), rect.y(), width, 1);
142
143 buf[0][0] = buf[0][1];
144 buf[0][width + 1] = buf[0][width];
145
146 memcpy(buf[1], buf[0], width + 2);
147
148 for (qint32 y = 0; y < height; y++) {
149 if (y + 1 < height) {
150 pixelSelection->readBytes(buf[2] + 1, rect.x(), rect.y() + y + 1, width, 1);
151
152 buf[2][0] = buf[2][1];
153 buf[2][width + 1] = buf[2][width];
154 } else {
155 memcpy(buf[2], buf[1], width + 2);
156 }
157
158 for (qint32 x = 0 ; x < width; x++) {
159 qint32 min = 255;
160
161 if (buf[0][x+1] < min) min = buf[0][x+1];
162 if (buf[1][x] < min) min = buf[1][x];
163 if (buf[1][x+1] < min) min = buf[1][x+1];
164 if (buf[1][x+2] < min) min = buf[1][x+2];
165 if (buf[2][x+1] < min) min = buf[2][x+1];
166
167 out[x] = min;
168 }
169
170 pixelSelection->writeBytes(out, rect.x(), rect.y() + y, width, 1);
171 rotatePointers(buf, 3);
172 }
173
174 for (qint32 i = 0; i < 3; i++)
175 delete[] buf[i];
176 delete[] out;
177}
void readBytes(quint8 *data, qint32 x, qint32 y, qint32 w, qint32 h) const
void writeBytes(const quint8 *data, qint32 x, qint32 y, qint32 w, qint32 h)
void rotatePointers(quint8 **p, quint32 n)
T min(T a, T b, T c)

References KisPaintDevice::readBytes(), KisSelectionFilter::rotatePointers(), and KisPaintDevice::writeBytes().


The documentation for this class was generated from the following files: