Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_wavelet_noise_reduction.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the KDE project
3 *
4 * SPDX-FileCopyrightText: 2005 Cyrille Berger <cberger@cberger.net>
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 */
7
9
10
11#include <cmath>
12
13#include <KoUpdater.h>
14
15#include <kis_layer.h>
16#include <kis_math_toolbox.h>
19#include <kis_paint_device.h>
23#include "kis_global.h"
24
26 : KisFilter(id(), FiltersCategoryEnhanceId, i18n("&Wavelet Noise Reducer..."))
27{
30}
31
32
36
38{
40 param.push_back(KisDoubleWidgetParam(0.0, 256.0, BEST_WAVELET_THRESHOLD_VALUE, i18n("Threshold"), "threshold"));
41 return new KisMultiDoubleFilterWidget(id().id(), parent, id().id(), param);
42}
43
45{
46 KisFilterConfigurationSP config = factoryConfiguration(resourcesInterface);
47 config->setProperty("threshold", BEST_WAVELET_THRESHOLD_VALUE);
48 return config;
49}
50
52 const QRect& applyRect,
53 const KisFilterConfigurationSP config,
54 KoUpdater* progressUpdater
55 ) const
56{
57 Q_ASSERT(device);
58
60 const float threshold = config->getDouble("threshold", BEST_WAVELET_THRESHOLD_VALUE);
61
62 KisMathToolbox mathToolbox;
63
64 // dbgFilters << size <<"" << maxrectsize <<"" << srcTopLeft.x() <<"" << srcTopLeft.y();
65
66 // dbgFilters <<"Transforming...";
69
70 try {
71 buff = mathToolbox.initWavelet(device, applyRect);
72 } catch (const std::bad_alloc&) {
73 if (buff) delete buff;
74 return;
75 }
76 try {
77 wav = mathToolbox.fastWaveletTransformation(device, applyRect, buff);
78 } catch (const std::bad_alloc&) {
79 if (wav) delete wav;
80 return;
81 }
82
83 float* const fin = wav->coeffs + wav->depth * pow2(wav->size);
84 float* const begin = wav->coeffs + wav->depth;
85
86 const int size = fin - begin;
87 const int progressOffset = int(std::ceil(std::log2(size / 100)));
88 const int progressMask = (1 << progressOffset) - 1;
89 const int numProgressSteps = size >> progressOffset;
90 int pointsProcessed = 0;
91
92 progressUpdater->setRange(0, numProgressSteps);
93
94 for (float* it = begin; it < fin; it++) {
95 if (*it > threshold) {
96 *it -= threshold;
97 } else if (*it < -threshold) {
98 *it += threshold;
99 } else {
100 *it = 0.;
101 }
102
103 if (!(pointsProcessed & progressMask)) {
104 progressUpdater->setValue(pointsProcessed >> progressOffset);
105 }
106 pointsProcessed++;
107 }
108
109 mathToolbox.fastWaveletUntransformation(device, applyRect, wav, buff);
110
111 delete wav;
112 delete buff;
113}
KisWavelet * initWavelet(KisPaintDeviceSP lay, const QRect &)
void fastWaveletUntransformation(KisPaintDeviceSP dst, const QRect &, KisWavelet *wav, KisWavelet *buff=0)
KisWavelet * fastWaveletTransformation(KisPaintDeviceSP src, const QRect &, KisWavelet *buff=0)
KisFilterConfigurationSP defaultConfiguration(KisResourcesInterfaceSP resourcesInterface) const override
KisConfigWidget * createConfigurationWidget(QWidget *parent, const KisPaintDeviceSP dev, bool useForMasks) const override
void processImpl(KisPaintDeviceSP device, const QRect &applyRect, const KisFilterConfigurationSP config, KoUpdater *progressUpdater) const override
void setValue(int value) override
Definition KoUpdater.cpp:64
void setRange(int minimum, int maximum) override
Definition KoUpdater.cpp:79
#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 pow2(const T &x)
Definition kis_global.h:166
std::vector< KisDoubleWidgetParam > vKisDoubleWidgetParam
#define BEST_WAVELET_THRESHOLD_VALUE
void setSupportsThreading(bool v)
virtual KisFilterConfigurationSP factoryConfiguration(KisResourcesInterfaceSP resourcesInterface) const
void setSupportsPainting(bool v)