Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_simple_noise_reducer.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2005 Cyrille Berger <cberger@cberger.net>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
8
9#include <kundo2command.h>
10
11#include <KoColorSpace.h>
12#include <KoCompositeOp.h>
13#include <KoUpdater.h>
14
15#include <kis_mask_generator.h>
18#include <kis_global.h>
23#include <kis_paint_device.h>
24#include <kis_selection.h>
26#include "kis_lod_transform.h"
27
28
30 : KisFilter(id(), FiltersCategoryEnhanceId, i18n("&Gaussian Noise Reduction..."))
31{
34}
35
39
41{
42 Q_UNUSED(dev);
44 param.push_back(KisIntegerWidgetParam(0, 255, 15, i18n("Threshold"), "threshold"));
45 param.push_back(KisIntegerWidgetParam(0, 10, 1, i18n("Window size"), "windowsize"));
46 return new KisMultiIntegerFilterWidget(id().id(), parent, id().id(), param);
47}
48
50{
51 KisFilterConfigurationSP config = factoryConfiguration(resourcesInterface);
52 config->setProperty("threshold", 15);
53 config->setProperty("windowsize", 1);
54 return config;
55}
56
57inline int ABS(int v)
58{
59 if (v < 0) return -v;
60 return v;
61}
62
64 const QRect& applyRect,
65 const KisFilterConfigurationSP config,
66 KoUpdater* progressUpdater
67 ) const
68{
69 QPoint srcTopLeft = applyRect.topLeft();
70 Q_ASSERT(device);
71
73
74 const int threshold = config->getInt("threshold", 15);
75 const int windowsize = config->getInt("windowsize", 1);
76
77 const KoColorSpace* cs = device->colorSpace();
78
79 // Compute the blur mask
80 KisCircleMaskGenerator* kas = new KisCircleMaskGenerator(2*windowsize + 1, 1, windowsize, windowsize, 2, true);
81
83 delete kas;
84
85 KisPaintDeviceSP interm = new KisPaintDevice(*device); // TODO no need for a full copy and then a transaction
86 KisConvolutionPainter painter(interm);
87 painter.beginTransaction();
88 painter.applyMatrix(kernel, interm, srcTopLeft, srcTopLeft, applyRect.size(), BORDER_REPEAT);
89 painter.deleteTransaction();
90
91
92 KisSequentialConstIteratorProgress intermIt(interm, applyRect, progressUpdater);
93 KisSequentialIterator dstIt(device, applyRect);
94
95 while (dstIt.nextPixel() && intermIt.nextPixel()) {
96 const quint8 diff = cs->difference(dstIt.oldRawData(), intermIt.oldRawData());
97 if (diff > threshold) {
98 memcpy(dstIt.rawData(), intermIt.oldRawData(), cs->pixelSize());
99 }
100 }
101}
102
103QRect KisSimpleNoiseReducer::neededRect(const QRect & rect, const KisFilterConfigurationSP _config, int lod) const
104{
106
107 const int windowsize = _config->getInt("windowsize", 1);
108 const int margin = qCeil(t.scale(qreal(windowsize))) + 1;
109 return kisGrowRect(rect, margin);
110}
111
112QRect KisSimpleNoiseReducer::changedRect(const QRect & rect, const KisFilterConfigurationSP _config, int lod) const
113{
114 return neededRect(rect, _config, lod);
115}
qreal v
The KisConvolutionPainter class applies a convolution kernel to a paint device.
void applyMatrix(const KisConvolutionKernelSP kernel, const KisPaintDeviceSP src, QPoint srcPos, QPoint dstPos, QSize areaSize, KisConvolutionBorderOp borderOp=BORDER_REPEAT)
void setSupportsLevelOfDetail(bool value)
qreal scale(qreal value) const
const KoColorSpace * colorSpace() const
void deleteTransaction()
void beginTransaction(const KUndo2MagicString &transactionName=KUndo2MagicString(), int timedID=-1)
Begin an undoable paint operation.
ALWAYS_INLINE quint8 * rawData()
ALWAYS_INLINE const quint8 * oldRawData() const
void processImpl(KisPaintDeviceSP device, const QRect &applyRect, const KisFilterConfigurationSP config, KoUpdater *progressUpdater) const override
QRect neededRect(const QRect &rect, const KisFilterConfigurationSP _config, int lod) const override
KisConfigWidget * createConfigurationWidget(QWidget *parent, const KisPaintDeviceSP dev, bool useForMasks) const override
QRect changedRect(const QRect &rect, const KisFilterConfigurationSP _config, int lod) const override
KisFilterConfigurationSP defaultConfiguration(KisResourcesInterfaceSP resourcesInterface) const override
virtual quint32 pixelSize() const =0
virtual quint8 difference(const quint8 *src1, const quint8 *src2) const =0
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
const KoID FiltersCategoryEnhanceId("enhance_filters", ki18nc("The category of enhancement filters, like sharpen. Verb.", "Enhance"))
T kisGrowRect(const T &rect, U offset)
Definition kis_global.h:186
std::vector< KisIntegerWidgetParam > vKisIntegerWidgetParam
int ABS(int v)
virtual KisFilterConfigurationSP factoryConfiguration(KisResourcesInterfaceSP resourcesInterface) const
void setSupportsPainting(bool v)
static KisConvolutionKernelSP fromMaskGenerator(KisMaskGenerator *, qreal angle=0.0)