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

#include <noisefilter.h>

+ Inheritance diagram for KisFilterNoise:

Public Member Functions

KisConfigWidgetcreateConfigurationWidget (QWidget *parent, const KisPaintDeviceSP dev, bool useForMasks) const override
 
KisFilterConfigurationSP defaultConfiguration (KisResourcesInterfaceSP resourcesInterface) const override
 
 KisFilterNoise ()
 
void processImpl (KisPaintDeviceSP device, const QRect &applyRect, const KisFilterConfigurationSP config, KoUpdater *progressUpdater) const override
 
- Public Member Functions inherited from KisFilter
virtual QRect changedRect (const QRect &rect, const KisFilterConfigurationSP config, int lod) const
 
virtual bool configurationAllowedForMask (KisFilterConfigurationSP config) const
 
virtual void fixLoadedFilterConfigurationForMasks (KisFilterConfigurationSP config) const
 
 KisFilter (const KoID &id, const KoID &category, const QString &entry)
 
virtual QRect neededRect (const QRect &rect, const KisFilterConfigurationSP config, int lod) const
 
virtual bool needsTransparentPixels (const KisFilterConfigurationSP config, const KoColorSpace *cs) const
 
void process (const KisPaintDeviceSP src, KisPaintDeviceSP dst, KisSelectionSP selection, const QRect &applyRect, const KisFilterConfigurationSP config, KoUpdater *progressUpdater=0) const
 
void process (KisPaintDeviceSP device, const QRect &applyRect, const KisFilterConfigurationSP config, KoUpdater *progressUpdater=0) const
 
virtual bool supportsLevelOfDetail (const KisFilterConfigurationSP config, int lod) const
 
 ~KisFilter () override
 
- Public Member Functions inherited from KisBaseProcessor
KisBookmarkedConfigurationManagerbookmarkManager ()
 
const KisBookmarkedConfigurationManagerbookmarkManager () const
 
ColorSpaceIndependence colorSpaceIndependence () const
 
virtual KisFilterConfigurationSP factoryConfiguration (KisResourcesInterfaceSP resourcesInterface) const
 
QString id () const
 
 KisBaseProcessor (const KoID &id, const KoID &category, const QString &entry)
 
KoID menuCategory () const
 
QString menuEntry () const
 
QString name () const
 
 Private ()
 
QKeySequence shortcut () const
 
bool showConfigurationWidget ()
 If true, the filter wants to show a configuration widget.
 
bool supportsAdjustmentLayers () const
 This filter can be used in adjustment layers.
 
bool supportsPainting () const
 
bool supportsThreading () const
 
virtual ~KisBaseProcessor ()
 
- Public Member Functions inherited from Private
 Private (KisCanvas2 *c)
 
- Public Member Functions inherited from KisShared
bool deref ()
 
bool ref ()
 
int refCount ()
 
QAtomicInt * sharedWeakReference ()
 

Static Public Member Functions

static KoID id ()
 

Additional Inherited Members

- Public Attributes inherited from KisBaseProcessor
KisBookmarkedConfigurationManagerbookmarkManager
 
KoID category
 
ColorSpaceIndependence colorSpaceIndependence
 
QString entry
 
KoID id
 
QKeySequence shortcut
 
bool showConfigurationWidget
 
bool supportsAdjustmentLayers
 
bool supportsPainting
 
bool supportsThreading
 
- Public Attributes inherited from Private
KisCanvas2canvas
 
int displayedFrame
 
int intendedFrame
 
- Protected Member Functions inherited from KisFilter
QString configEntryGroup () const
 
void setSupportsLevelOfDetail (bool value)
 
- Protected Member Functions inherited from KisBaseProcessor
void init (const QString &configEntryGroup)
 
void setColorSpaceIndependence (ColorSpaceIndependence v)
 
void setShortcut (const QKeySequence &shortcut)
 
void setShowConfigurationWidget (bool v)
 
void setSupportsAdjustmentLayers (bool v)
 
void setSupportsPainting (bool v)
 
void setSupportsThreading (bool v)
 
- Protected Member Functions inherited from KisShared
 KisShared ()
 
 ~KisShared ()
 

Detailed Description

Definition at line 26 of file noisefilter.h.

Constructor & Destructor Documentation

◆ KisFilterNoise()

KisFilterNoise::KisFilterNoise ( )

Definition at line 42 of file noisefilter.cpp.

42 : KisFilter(id(), FiltersCategoryOtherId, i18n("&Random Noise..."))
43{
46}
@ FULLY_INDEPENDENT
KisFilter(const KoID &id, const KoID &category, const QString &entry)
Definition kis_filter.cc:22
const KoID FiltersCategoryOtherId("other_filters", ki18nc("The category of filters that do not fit in a category. Noun.", "Other"))
void setSupportsPainting(bool v)
void setColorSpaceIndependence(ColorSpaceIndependence v)

References FULLY_INDEPENDENT, KisBaseProcessor::setColorSpaceIndependence(), and KisBaseProcessor::setSupportsPainting().

Member Function Documentation

◆ createConfigurationWidget()

KisConfigWidget * KisFilterNoise::createConfigurationWidget ( QWidget * parent,
const KisPaintDeviceSP dev,
bool useForMasks ) const
overridevirtual

Create the configuration widget for this processor.

Parameters
parentthe Qt owner widget of this widget
devthe paintdevice this filter will act on
useForMasksshown if the filer is going to be used in a mask. Some filters may provide limited options when applied as a mask (e.g. Gaussian Blur)

Reimplemented from KisBaseProcessor.

Definition at line 61 of file noisefilter.cpp.

62{
63 Q_UNUSED(dev);
64 return new KisWdgNoise((KisFilter*)this, (QWidget*)parent);
65}

◆ defaultConfiguration()

KisFilterConfigurationSP KisFilterNoise::defaultConfiguration ( KisResourcesInterfaceSP resourcesInterface) const
overridevirtual

Return the configuration set as the default by the user or the default configuration from the filter writer as returned by factoryConfiguration.

This configuration is used by default for the configuration widget and given to the process function if there is no configuration widget.

Returns
the default configuration of this widget

Reimplemented from KisBaseProcessor.

Definition at line 48 of file noisefilter.cpp.

49{
50 KisFilterConfigurationSP config = factoryConfiguration(resourcesInterface);
51 config->setProperty("level", 50);
52 config->setProperty("opacity", 100);
53 config->setProperty("seedThreshold", rand());
54 config->setProperty("seedRed", rand());
55 config->setProperty("seedGreen", rand());
56 config->setProperty("seedBlue", rand());
57 config->setProperty("grayscale", false);
58 return config;
59}
virtual KisFilterConfigurationSP factoryConfiguration(KisResourcesInterfaceSP resourcesInterface) const

References KisBaseProcessor::factoryConfiguration().

◆ id()

static KoID KisFilterNoise::id ( )
inlinestatic

Definition at line 37 of file noisefilter.h.

37 {
38 return KoID("noise", i18n("Random Noise"));
39 }
Definition KoID.h:30

◆ processImpl()

void KisFilterNoise::processImpl ( KisPaintDeviceSP device,
const QRect & applyRect,
const KisFilterConfigurationSP config,
KoUpdater * progressUpdater ) const
overridevirtual

Override this function with the implementation of your filter.

This is a low level function that expects all the conditions for the

Parameters
devicebe met. Use usual process() methods instead.
devicethe paint device to filter
applyRectthe rectangle where the filter is applied
configthe parameters of the filter
progressUpdaterto pass on the progress the filter is making

Implements KisFilter.

Definition at line 67 of file noisefilter.cpp.

71{
72 Q_UNUSED(progressUpdater);
73 Q_ASSERT(!device.isNull());
74
75 QVariant value;
76 const int level = (config && config->getProperty("level", value)) ? value.toInt() : 50;
77 const int opacity = (config && config->getProperty("opacity", value)) ? value.toInt() : 100;
78 const bool isGrayscale = (config && config->getProperty("grayscale", value)) ? value.toBool() : false;
79
80 const double threshold = (100.0 - level) * 0.01;
81 const KoColorSpace* colorSpace = device->colorSpace();
82 const quint32 pixelSize = colorSpace->pixelSize();
83 const KoMixColorsOp* mixOp = colorSpace->mixColorsOp();
84
85 std::vector<quint8> scratchPixel(pixelSize);
86
87 constexpr quint32 numMixPixels = 2;
88 qint16 weights[numMixPixels];
89 weights[0] = (255 * opacity) / 100;
90 weights[1] = 255 - weights[0];
91
92 const quint8* pixels[numMixPixels];
93 pixels[0] = scratchPixel.data();
94
95 int seedThreshold = rand();
96 int seedRed = rand();
97 int seedGreen = rand();
98 int seedBlue = rand();
99
100 if (config) {
101 seedThreshold = config->getInt("seedThreshold", seedThreshold);
102 seedRed = config->getInt("seedRed", seedRed);
103 seedGreen = config->getInt("seedGreen", seedGreen);
104 seedBlue = config->getInt("seedBlue", seedBlue);
105 }
106
107 KisRandomGenerator2D randt(seedThreshold);
108 KisRandomGenerator2D randr(seedRed);
109 KisRandomGenerator2D randg(seedGreen);
110 KisRandomGenerator2D randb(seedBlue);
111
113
114 qint32 dstY_ = rect.y();
115 qint32 rowsRemaining = rect.height();
116
117 while (rowsRemaining > 0) {
118 qint32 dstX_ = rect.x();
119 qint32 columnsRemaining = rect.width();
120 qint32 numContiguousDstRows = dstIt->numContiguousRows(dstY_);
121 qint32 rows = qMin(numContiguousDstRows, rowsRemaining);
122
123 while (columnsRemaining > 0) {
124 qint32 numContiguousDstColumns = dstIt->numContiguousColumns(dstX_);
125 qint32 columns = qMin(numContiguousDstColumns, columnsRemaining);
126
127 qint32 dstRowStride = dstIt->rowStride(dstX_, dstY_);
128 dstIt->moveTo(dstX_, dstY_);
129
130 for (int rowIndex = 0; rowIndex < rows; ++rowIndex) {
131 for (int colIndex = 0; colIndex < columns; ++colIndex) {
132 const int px = dstX_ + colIndex;
133 const int py = dstY_ + rowIndex;
134 if (randt.doubleRandomAt(px, py) > threshold) {
135 QColor color;
136 if (isGrayscale) {
137 const int gray = static_cast<int>(randr.doubleRandomAt(px, py) * 255);
138 color = qRgb(gray, gray, gray);
139 } else {
140 color = qRgb(static_cast<int>(randr.doubleRandomAt(px, py) * 255),
141 static_cast<int>(randg.doubleRandomAt(px, py) * 255),
142 static_cast<int>(randb.doubleRandomAt(px, py) * 255));
143 }
144 const quint32 dataOffset = colIndex * pixelSize + rowIndex * dstRowStride;
145 if (opacity == 100) {
146 colorSpace->fromQColor(color, dstIt->rawData() + dataOffset);
147 } else {
148 colorSpace->fromQColor(color, scratchPixel.data());
149 pixels[1] = dstIt->oldRawData() + dataOffset;
150 mixOp->mixColors(pixels, weights, numMixPixels, dstIt->rawData() + dataOffset);
151 }
152 }
153 }
154 }
155
156 dstX_ += columns;
157 columnsRemaining -= columns;
158 }
159
160 dstY_ += rows;
161 rowsRemaining -= rows;
162 }
163}
float value(const T *src, size_t ch)
virtual quint8 * rawData()=0
virtual const quint8 * oldRawData() const =0
const KoColorSpace * colorSpace() const
KisRandomAccessorSP createRandomAccessorNG()
virtual qint32 rowStride(qint32 x, qint32 y) const =0
virtual qint32 numContiguousRows(qint32 y) const =0
virtual void moveTo(qint32 x, qint32 y)=0
virtual qint32 numContiguousColumns(qint32 x) const =0
bool isNull() const
virtual quint32 pixelSize() const =0
virtual void fromQColor(const QColor &color, quint8 *dst) const =0
KoMixColorsOp * mixColorsOp
virtual void mixColors(const quint8 *const *colors, const qint16 *weights, int nColors, quint8 *dst, int weightSum=255) const =0

References KisPaintDevice::colorSpace(), KisPaintDevice::createRandomAccessorNG(), KisRandomGenerator2D::doubleRandomAt(), KoColorSpace::fromQColor(), KisSharedPtr< T >::isNull(), KoMixColorsOp::mixColors(), KoColorSpace::mixColorsOp, KisRandomConstAccessorNG::moveTo(), KisRandomConstAccessorNG::numContiguousColumns(), KisRandomConstAccessorNG::numContiguousRows(), KisBaseConstAccessor::oldRawData(), KoColorSpace::pixelSize(), KisBaseAccessor::rawData(), KisRandomConstAccessorNG::rowStride(), and value().


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