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

#include <kis_selection_filters.h>

+ Inheritance diagram for KisDilateSelectionFilter:

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 50 of file kis_selection_filters.h.

Member Function Documentation

◆ changeRect()

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

Reimplemented from KisSelectionFilter.

Definition at line 185 of file kis_selection_filters.cpp.

186{
187 Q_UNUSED(defaultBounds);
188
189 const qint32 radius = 1;
190 return rect.adjusted(-radius, -radius, radius, radius);
191}

◆ name()

KUndo2MagicString KisDilateSelectionFilter::name ( )
overridevirtual

Reimplemented from KisSelectionFilter.

Definition at line 180 of file kis_selection_filters.cpp.

181{
182 return kundo2_i18n("Dilate Selection");
183}
KUndo2MagicString kundo2_i18n(const char *text)

References kundo2_i18n().

◆ process()

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

Implements KisSelectionFilter.

Definition at line 193 of file kis_selection_filters.cpp.

194 {
195 // dilate (radius 1 pixel) a mask (1bpp)
196 quint8* buf[3];
197
198 qint32 width = rect.width();
199 qint32 height = rect.height();
200
201 quint8* out = new quint8[width];
202 for (qint32 i = 0; i < 3; i++)
203 buf[i] = new quint8[width + 2];
204
205
206 // load top of image
207 pixelSelection->readBytes(buf[0] + 1, rect.x(), rect.y(), width, 1);
208
209 buf[0][0] = buf[0][1];
210 buf[0][width + 1] = buf[0][width];
211
212 memcpy(buf[1], buf[0], width + 2);
213
214 for (qint32 y = 0; y < height; y++) {
215 if (y + 1 < height) {
216 pixelSelection->readBytes(buf[2] + 1, rect.x(), rect.y() + y + 1, width, 1);
217
218 buf[2][0] = buf[2][1];
219 buf[2][width + 1] = buf[2][width];
220 } else {
221 memcpy(buf[2], buf[1], width + 2);
222 }
223
224 for (qint32 x = 0 ; x < width; x++) {
225 qint32 max = 0;
226
227 if (buf[0][x+1] > max) max = buf[0][x+1];
228 if (buf[1][x] > max) max = buf[1][x];
229 if (buf[1][x+1] > max) max = buf[1][x+1];
230 if (buf[1][x+2] > max) max = buf[1][x+2];
231 if (buf[2][x+1] > max) max = buf[2][x+1];
232
233 out[x] = max;
234 }
235
236 pixelSelection->writeBytes(out, rect.x(), rect.y() + y, width, 1);
237 rotatePointers(buf, 3);
238 }
239
240 for (qint32 i = 0; i < 3; i++)
241 delete[] buf[i];
242 delete[] out;
243}
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)
constexpr std::enable_if< sizeof...(values)==0, size_t >::type max()

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


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