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

#include <kis_selection_filters.h>

+ Inheritance diagram for KisSmoothSelectionFilter:

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

Member Function Documentation

◆ changeRect()

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

Reimplemented from KisSelectionFilter.

Definition at line 825 of file kis_selection_filters.cpp.

826{
827 Q_UNUSED(defaultBounds);
828
829 const qint32 radius = 1;
830 return rect.adjusted(-radius, -radius, radius, radius);
831}

◆ name()

KUndo2MagicString KisSmoothSelectionFilter::name ( )
overridevirtual

Reimplemented from KisSelectionFilter.

Definition at line 820 of file kis_selection_filters.cpp.

821{
822 return kundo2_i18n("Smooth Selection");
823}
KUndo2MagicString kundo2_i18n(const char *text)

References kundo2_i18n().

◆ process()

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

Implements KisSelectionFilter.

Definition at line 833 of file kis_selection_filters.cpp.

834{
835 // Simple convolution filter to smooth a mask (1bpp)
836 quint8 *buf[3];
837
838 qint32 width = rect.width();
839 qint32 height = rect.height();
840
841
842 quint8* out = new quint8[width];
843 for (qint32 i = 0; i < 3; i++)
844 buf[i] = new quint8[width + 2];
845
846
847 // load top of image
848 pixelSelection->readBytes(buf[0] + 1, rect.x(), rect.y(), width, 1);
849
850 buf[0][0] = buf[0][1];
851 buf[0][width + 1] = buf[0][width];
852
853 memcpy(buf[1], buf[0], width + 2);
854
855 for (qint32 y = 0; y < height; y++) {
856 if (y + 1 < height) {
857 pixelSelection->readBytes(buf[2] + 1, rect.x(), rect.y() + y + 1, width, 1);
858
859 buf[2][0] = buf[2][1];
860 buf[2][width + 1] = buf[2][width];
861 } else {
862 memcpy(buf[2], buf[1], width + 2);
863 }
864
865 for (qint32 x = 0 ; x < width; x++) {
866 qint32 value = (buf[0][x] + buf[0][x+1] + buf[0][x+2] +
867 buf[1][x] + buf[2][x+1] + buf[1][x+2] +
868 buf[2][x] + buf[1][x+1] + buf[2][x+2]);
869
870 out[x] = value / 9;
871 }
872
873 pixelSelection->writeBytes(out, rect.x(), rect.y() + y, width, 1);
874 rotatePointers(buf, 3);
875 }
876
877 for (qint32 i = 0; i < 3; i++)
878 delete[] buf[i];
879 delete[] out;
880}
float value(const T *src, size_t ch)
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)

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


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