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

#include <kis_lens_blur_filter.h>

+ Inheritance diagram for KisLensBlurFilter:

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
 
 KisLensBlurFilter ()
 
QRect neededRect (const QRect &rect, const KisFilterConfigurationSP _config, int lod) const override
 
void processImpl (KisPaintDeviceSP src, const QRect &size, 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 QSize getKernelHalfSize (const KisFilterConfigurationSP config, int lod)
 
static KoID id ()
 

Static Private Member Functions

static QPolygonF getIrisPolygon (const KisFilterConfigurationSP config, int lod)
 

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 18 of file kis_lens_blur_filter.h.

Constructor & Destructor Documentation

◆ KisLensBlurFilter()

KisLensBlurFilter::KisLensBlurFilter ( )

Definition at line 33 of file kis_lens_blur_filter.cpp.

33 : KisFilter(id(), FiltersCategoryBlurId, i18n("&Lens Blur..."))
34{
39
40}
@ FULLY_INDEPENDENT
void setSupportsLevelOfDetail(bool value)
KisFilter(const KoID &id, const KoID &category, const QString &entry)
Definition kis_filter.cc:22
const KoID FiltersCategoryBlurId("blur_filters", ki18nc("The category of blur filters, like gaussian blur. Verb.", "Blur"))
void setSupportsAdjustmentLayers(bool v)
void setSupportsPainting(bool v)
void setColorSpaceIndependence(ColorSpaceIndependence v)

References FULLY_INDEPENDENT, KisBaseProcessor::setColorSpaceIndependence(), KisBaseProcessor::setSupportsAdjustmentLayers(), KisFilter::setSupportsLevelOfDetail(), and KisBaseProcessor::setSupportsPainting().

Member Function Documentation

◆ changedRect()

QRect KisLensBlurFilter::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 181 of file kis_lens_blur_filter.cpp.

182{
184
185 QVariant value;
186 const int halfWidth = t.scale(_config->getProperty("halfWidth", value) ? value.toUInt() : 5);
187 const int halfHeight = t.scale(_config->getProperty("halfHeight", value) ? value.toUInt() : 5);
188
189 return rect.adjusted(-halfWidth, -halfHeight, halfWidth, halfHeight);
190}
float value(const T *src, size_t ch)

References KisLodTransformScalar::scale(), and value().

◆ createConfigurationWidget()

KisConfigWidget * KisLensBlurFilter::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 42 of file kis_lens_blur_filter.cpp.

43{
44 return new KisWdgLensBlur(parent);
45}

◆ defaultConfiguration()

KisFilterConfigurationSP KisLensBlurFilter::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 58 of file kis_lens_blur_filter.cpp.

59{
60 KisFilterConfigurationSP config = factoryConfiguration(resourcesInterface);
61 config->setProperty("irisShape", "Pentagon (5)");
62 config->setProperty("irisRadius", 5);
63 config->setProperty("irisRotation", 0);
64
65 QSize halfSize = getKernelHalfSize(config, 0);
66 config->setProperty("halfWidth", halfSize.width());
67 config->setProperty("halfHeight", halfSize.height());
68
69 return config;
70}
static QSize getKernelHalfSize(const KisFilterConfigurationSP config, int lod)
virtual KisFilterConfigurationSP factoryConfiguration(KisResourcesInterfaceSP resourcesInterface) const

References KisBaseProcessor::factoryConfiguration(), and getKernelHalfSize().

◆ getIrisPolygon()

QPolygonF KisLensBlurFilter::getIrisPolygon ( const KisFilterConfigurationSP config,
int lod )
staticprivate

Definition at line 72 of file kis_lens_blur_filter.cpp.

73{
74 KIS_ASSERT_RECOVER(config) { return QPolygonF(); }
75
77
78 QVariant value;
79 config->getProperty("irisShape", value);
80 QString irisShape = value.toString();
81 config->getProperty("irisRadius", value);
82 uint irisRadius = t.scale(value.toUInt());
83 config->getProperty("irisRotation", value);
84 uint irisRotation = value.toUInt();
85
86 if (irisRadius < 1)
87 return QPolygon();
88
89 QPolygonF irisShapePoly;
90
91 int sides = 1;
92 qreal angle = 0;
93
94 if (irisShape == "Triangle") sides = 3;
95 else if (irisShape == "Quadrilateral (4)") sides = 4;
96 else if (irisShape == "Pentagon (5)") sides = 5;
97 else if (irisShape == "Hexagon (6)") sides = 6;
98 else if (irisShape == "Heptagon (7)") sides = 7;
99 else if (irisShape == "Octagon (8)") sides = 8;
100 else return QPolygonF();
101
102 for (int i = 0; i < sides; ++i) {
103 irisShapePoly << QPointF(0.5 * cos(angle), 0.5 * sin(angle));
104 angle += 2 * M_PI / sides;
105 }
106
107 QTransform transform;
108 transform.rotate(irisRotation);
109 transform.scale(irisRadius * 2, irisRadius * 2);
110
111 QPolygonF transformedIris = transform.map(irisShapePoly);
112
113 return transformedIris;
114}
unsigned int uint
#define KIS_ASSERT_RECOVER(cond)
Definition kis_assert.h:55
#define M_PI
Definition kis_global.h:111

References KIS_ASSERT_RECOVER, M_PI, KisLodTransformScalar::scale(), and value().

◆ getKernelHalfSize()

QSize KisLensBlurFilter::getKernelHalfSize ( const KisFilterConfigurationSP config,
int lod )
static

Definition at line 47 of file kis_lens_blur_filter.cpp.

48{
49 QPolygonF iris = getIrisPolygon(config, lod);
50 QRect rect = iris.boundingRect().toAlignedRect();
51
52 int w = std::ceil(qreal(rect.width()) / 2.0);
53 int h = std::ceil(qreal(rect.height()) / 2.0);
54
55 return QSize(w, h);
56}
static QPolygonF getIrisPolygon(const KisFilterConfigurationSP config, int lod)

References getIrisPolygon().

◆ id()

static KoID KisLensBlurFilter::id ( )
inlinestatic

Definition at line 29 of file kis_lens_blur_filter.h.

29 {
30 return KoID("lens blur", i18n("Lens Blur"));
31 }
Definition KoID.h:30

◆ neededRect()

QRect KisLensBlurFilter::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 170 of file kis_lens_blur_filter.cpp.

171{
173
174 QVariant value;
175 const int halfWidth = t.scale(_config->getProperty("halfWidth", value) ? value.toUInt() : 5);
176 const int halfHeight = t.scale(_config->getProperty("halfHeight", value) ? value.toUInt() : 5);
177
178 return rect.adjusted(-halfWidth * 2, -halfHeight * 2, halfWidth * 2, halfHeight * 2);
179}

References KisLodTransformScalar::scale(), and value().

◆ processImpl()

void KisLensBlurFilter::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 116 of file kis_lens_blur_filter.cpp.

121{
122 QPoint srcTopLeft = rect.topLeft();
123
124 Q_ASSERT(device != 0);
126
127 QBitArray channelFlags = config->channelFlags();
128 if (channelFlags.isEmpty()) {
129 channelFlags = QBitArray(device->colorSpace()->channelCount(), true);
130 }
131
132 const int lod = device->defaultBounds()->currentLevelOfDetail();
133 QPolygonF transformedIris = getIrisPolygon(config, lod);
134 if (transformedIris.isEmpty()) return;
135
136 QRectF boundingRect = transformedIris.boundingRect();
137
138 int kernelWidth = boundingRect.toAlignedRect().width();
139 int kernelHeight = boundingRect.toAlignedRect().height();
140
141 QImage kernelRepresentation(kernelWidth, kernelHeight, QImage::Format_RGB32);
142 kernelRepresentation.fill(0);
143
144 QPainter imagePainter(&kernelRepresentation);
145 imagePainter.setRenderHint(QPainter::Antialiasing);
146 imagePainter.setBrush(QColor::fromRgb(255, 255, 255));
147
148 QTransform offsetTransform;
149 offsetTransform.translate(-boundingRect.x(), -boundingRect.y());
150 imagePainter.setTransform(offsetTransform);
151 imagePainter.drawPolygon(transformedIris, Qt::WindingFill);
152
153 // construct kernel from image
154 Eigen::Matrix<qreal, Eigen::Dynamic, Eigen::Dynamic> irisKernel(kernelHeight, kernelWidth);
155 for (int j = 0; j < kernelHeight; ++j) {
156 for (int i = 0; i < kernelWidth; ++i) {
157 irisKernel(j, i) = qRed(kernelRepresentation.pixel(i, j));
158 }
159 }
160
161 // apply convolution
162 KisConvolutionPainter painter(device);
163 painter.setChannelFlags(channelFlags);
164 painter.setProgress(progressUpdater);
165
166 KisConvolutionKernelSP kernel = KisConvolutionKernel::fromMatrix(irisKernel, 0, irisKernel.sum());
167 painter.applyMatrix(kernel, device, srcTopLeft, srcTopLeft, rect.size(), BORDER_REPEAT);
168}
The KisConvolutionPainter class applies a convolution kernel to a paint device.
virtual int currentLevelOfDetail() const =0
const KoColorSpace * colorSpace() const
KisDefaultBoundsBaseSP defaultBounds() const
virtual quint32 channelCount() const =0
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
static KisConvolutionKernelSP fromMatrix(Eigen::Matrix< qreal, Eigen::Dynamic, Eigen::Dynamic > matrix, qreal offset, qreal factor)

References KisConvolutionPainter::applyMatrix(), BORDER_REPEAT, KoColorSpace::channelCount(), KisPaintDevice::colorSpace(), KisDefaultBoundsBase::currentLevelOfDetail(), KisPaintDevice::defaultBounds(), KisConvolutionKernel::fromMatrix(), getIrisPolygon(), KIS_SAFE_ASSERT_RECOVER_RETURN, KisPainter::setChannelFlags(), and KisPainter::setProgress().


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