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

#include <kis_oilpaint_filter.h>

+ Inheritance diagram for KisOilPaintFilter:

Public Member Functions

QRect changedRect (const QRect &rect, const KisFilterConfigurationSP _config, int lod) const override
 
KisConfigWidgetcreateConfigurationWidget (QWidget *parent, const KisPaintDeviceSP dev, bool useForMasks) const override
 
KisFilterConfigurationSP defaultConfiguration (KisResourcesInterfaceSP resourcesInterface) const override
 
 KisOilPaintFilter ()
 
QRect neededRect (const QRect &rect, const KisFilterConfigurationSP _config, int lod) const override
 
void processImpl (KisPaintDeviceSP device, const QRect &applyRect, const KisFilterConfigurationSP config, KoUpdater *progressUpdater) const override
 
- Public Member Functions inherited from KisFilter
virtual bool configurationAllowedForMask (KisFilterConfigurationSP config) const
 
virtual void fixLoadedFilterConfigurationForMasks (KisFilterConfigurationSP config) const
 
 KisFilter (const KoID &id, const KoID &category, const QString &entry)
 
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 ()
 

Private Member Functions

void MostFrequentColor (KisPaintDeviceSP src, quint8 *dst, const QRect &bounds, int X, int Y, int Radius, int Intensity) const
 
void OilPaint (const KisPaintDeviceSP src, KisPaintDeviceSP dst, const QRect &applyRect, int BrushSize, int Smoothness, KoUpdater *progressUpdater) const
 

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 15 of file kis_oilpaint_filter.h.

Constructor & Destructor Documentation

◆ KisOilPaintFilter()

KisOilPaintFilter::KisOilPaintFilter ( )

Definition at line 44 of file kis_oilpaint_filter.cpp.

44 : KisFilter(id(), FiltersCategoryArtisticId, i18n("&Oilpaint..."))
45{
49}
KisFilter(const KoID &id, const KoID &category, const QString &entry)
Definition kis_filter.cc:22
const KoID FiltersCategoryArtisticId("artistic_filters", ki18nc("The category of artistic filters, like raindrops. Adjective.", "Artistic"))
void setSupportsThreading(bool v)
void setSupportsAdjustmentLayers(bool v)
void setSupportsPainting(bool v)

References KisBaseProcessor::setSupportsAdjustmentLayers(), KisBaseProcessor::setSupportsPainting(), and KisBaseProcessor::setSupportsThreading().

Member Function Documentation

◆ changedRect()

QRect KisOilPaintFilter::changedRect ( const QRect & rect,
const KisFilterConfigurationSP config,
int lod ) const
overridevirtual

Similar to neededRect : some filters will alter a lot of pixels that are near to each other at the same time. So when you changed a single rectangle in a device, the actual rectangle that will feel the influence of this change might be bigger. Use this function to determine that rect.

Reimplemented from KisFilter.

Definition at line 194 of file kis_oilpaint_filter.cpp.

195{
196 const quint32 brushSize = _config ? _config->getInt("brushSize", 1) : 1;
197
198 return rect.adjusted( -brushSize*2, -brushSize*2, brushSize*2, brushSize*2);
199}

◆ createConfigurationWidget()

KisConfigWidget * KisOilPaintFilter::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 202 of file kis_oilpaint_filter.cpp.

203{
205 param.push_back(KisIntegerWidgetParam(1, 5, 1, i18n("Brush size"), "brushSize"));
206 param.push_back(KisIntegerWidgetParam(10, 255, 30, i18nc("smooth out the painting strokes the filter creates", "Smooth"), "smooth"));
207 KisMultiIntegerFilterWidget * w = new KisMultiIntegerFilterWidget(id().id(), parent, id().id(), param);
209 return w;
210}
static KisResourcesInterfaceSP instance()
KisFilterConfigurationSP defaultConfiguration(KisResourcesInterfaceSP resourcesInterface) const override
std::vector< KisIntegerWidgetParam > vKisIntegerWidgetParam

References defaultConfiguration(), and KisGlobalResourcesInterface::instance().

◆ defaultConfiguration()

KisFilterConfigurationSP KisOilPaintFilter::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 212 of file kis_oilpaint_filter.cpp.

213{
214 KisFilterConfigurationSP config = factoryConfiguration(resourcesInterface);
215 config->setProperty("brushSize", 1);
216 config->setProperty("smooth", 30);
217
218 return config;
219}
virtual KisFilterConfigurationSP factoryConfiguration(KisResourcesInterfaceSP resourcesInterface) const

References KisBaseProcessor::factoryConfiguration().

◆ id()

static KoID KisOilPaintFilter::id ( )
inlinestatic

Definition at line 25 of file kis_oilpaint_filter.h.

25 {
26 return KoID("oilpaint", i18n("Oilpaint"));
27 }
Definition KoID.h:30

◆ MostFrequentColor()

void KisOilPaintFilter::MostFrequentColor ( KisPaintDeviceSP src,
quint8 * dst,
const QRect & bounds,
int X,
int Y,
int Radius,
int Intensity ) const
private

Definition at line 107 of file kis_oilpaint_filter.cpp.

108{
109 uint I;
110
111 double Scale = Intensity / 255.0;
112
113 // Alloc some arrays to be used
114 uchar *IntensityCount = new uchar[(Intensity + 1)];
115
116 const KoColorSpace* cs = src->colorSpace();
117
118 QVector<float> channel(cs->channelCount());
119 QVector<float>* AverageChannels = new QVector<float>[(Intensity + 1)];
120
121 // Erase the array
122 memset(IntensityCount, 0, (Intensity + 1) * sizeof(uchar));
123
124 int startx = X - Radius;
125 int starty = Y - Radius;
126 int width = (2 * Radius) + 1;
127 int height = (2 * Radius) + 1;
128
129 qreal middlePointAlpha = 1;
130 {
131 // if the current pixel is transparent, the result must be transparent, too.
132 KisSequentialConstIterator middlePointIt(src, QRect(X, Y, 1, 1));
133 middlePointIt.nextPixel();
134 middlePointAlpha = cs->opacityF(middlePointIt.oldRawData());
135 }
136
137
138 KisSequentialConstIterator srcIt(src, QRect(startx, starty, width, height));
139 while (middlePointAlpha > 0 && srcIt.nextPixel()) {
140
141 cs->normalisedChannelsValue(srcIt.oldRawData(), channel);
142
143 if (cs->opacityU8(srcIt.oldRawData()) == 0) {
144 // if the pixel is transparent, it's not going to provide any useful information
145 continue;
146 }
147
148 I = (uint)(cs->intensity8(srcIt.oldRawData()) * Scale);
149
150 IntensityCount[I]++;
151
152 if (IntensityCount[I] == 1) {
153 AverageChannels[I] = channel;
154 } else {
155 for (int i = 0; i < channel.size(); i++) {
156 AverageChannels[I][i] += channel[i];
157 }
158 }
159 }
160
161 I = 0;
162 int MaxInstance = 0;
163
164 for (int i = 0 ; i <= Intensity ; ++i) {
165 if (IntensityCount[i] > MaxInstance) {
166 I = i;
167 MaxInstance = IntensityCount[i];
168 }
169 }
170
171 if (MaxInstance != 0) {
172 channel = AverageChannels[I];
173 for (int i = 0; i < channel.size(); i++) {
174 channel[i] /= MaxInstance;
175 }
176 cs->fromNormalisedChannelsValue(dst, channel);
177 cs->setOpacity(dst, OPACITY_OPAQUE_U8, middlePointAlpha);
178 } else {
179 memset(dst, 0, cs->pixelSize());
180 cs->setOpacity(dst, OPACITY_OPAQUE_U8, middlePointAlpha);
181 }
182
183
184 delete [] IntensityCount; // free all the arrays
185 delete [] AverageChannels;
186}
const quint8 OPACITY_OPAQUE_U8
unsigned int uint
const QString Y
const QString X

References KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::nextPixel(), KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::oldRawData(), and OPACITY_OPAQUE_U8.

◆ neededRect()

QRect KisOilPaintFilter::neededRect ( const QRect & rect,
const KisFilterConfigurationSP config,
int lod ) const
overridevirtual

Some filters need pixels outside the current processing rect to compute the new value (for instance, convolution filters)

Reimplemented from KisFilter.

Definition at line 188 of file kis_oilpaint_filter.cpp.

189{
190 const quint32 brushSize = _config ? _config->getInt("brushSize", 1) : 1;
191 return rect.adjusted(-brushSize * 2, -brushSize * 2, brushSize * 2, brushSize * 2);
192}

◆ OilPaint()

void KisOilPaintFilter::OilPaint ( const KisPaintDeviceSP src,
KisPaintDeviceSP dst,
const QRect & applyRect,
int BrushSize,
int Smoothness,
KoUpdater * progressUpdater ) const
private

Definition at line 80 of file kis_oilpaint_filter.cpp.

82{
83 KisSequentialConstIteratorProgress it(src, applyRect, progressUpdater);
84 KisSequentialIterator dstIt(dst, applyRect);
85
86 while (it.nextPixel() && dstIt.nextPixel()) {
87 MostFrequentColor(src, dstIt.rawData(), applyRect, it.x(), it.y(), BrushSize, Smoothness);
88 }
89}
void MostFrequentColor(KisPaintDeviceSP src, quint8 *dst, const QRect &bounds, int X, int Y, int Radius, int Intensity) const

References MostFrequentColor(), KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::nextPixel(), KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::rawData(), KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::x(), and KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::y().

◆ processImpl()

void KisOilPaintFilter::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 51 of file kis_oilpaint_filter.cpp.

56{
57 Q_ASSERT(!device.isNull());
58
59 //read the filter configuration values from the KisFilterConfiguration object
60 const quint32 brushSize = config ? config->getInt("brushSize", 1) : 1;
61 const quint32 smooth = config ? config->getInt("smooth", 30) : 30;
62
63 OilPaint(device, device, applyRect, brushSize, smooth, progressUpdater);
64}
void OilPaint(const KisPaintDeviceSP src, KisPaintDeviceSP dst, const QRect &applyRect, int BrushSize, int Smoothness, KoUpdater *progressUpdater) const
bool isNull() const

References KisSharedPtr< T >::isNull(), and OilPaint().


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