Krita Source Code Documentation
Loading...
Searching...
No Matches
wavefilter.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 *
6 * SPDX-License-Identifier: GPL-2.0-or-later
7 */
8
9#include "wavefilter.h"
10#include <stdlib.h>
11#include <vector>
12#include <math.h>
13#include <QPoint>
14
15#include <kis_debug.h>
16#include <kpluginfactory.h>
17
18#include <klocalizedstring.h>
19
20#include <KoUpdater.h>
21
22#include <kis_image.h>
24#include <kis_global.h>
25#include <kis_layer.h>
27#include <kis_selection.h>
28#include <kis_types.h>
29#include <kis_paint_device.h>
33#include "kis_wdg_wave.h"
34#include "ui_wdgwaveoptions.h"
35#include <kis_iterator_ng.h>
37
38K_PLUGIN_FACTORY_WITH_JSON(KritaWaveFilterFactory, "kritawavefilter.json", registerPlugin<KritaWaveFilter>();)
39
41{
42public:
43 virtual ~KisWaveCurve() {}
44 virtual double valueAt(int x, int y) = 0;
45};
46
48{
49public:
50
51 KisSinusoidalWaveCurve(int amplitude, int wavelength, int shift)
52 : m_amplitude(amplitude)
53 , m_shift(shift)
54 {
55 m_wavelength = wavelength == 0 ? 1 : wavelength;
56 }
57
59
60 double valueAt(int x, int y) override {
62 return y + m_amplitude * cos((double)(m_shift + x) / m_wavelength);
63 }
64private:
66};
67
69{
70public:
71
72 KisTriangleWaveCurve(int amplitude, int wavelength, int shift)
73 : m_amplitude(amplitude)
74 , m_shift(shift)
75 {
76 m_wavelength = wavelength == 0 ? 1 : wavelength;
77 }
78
80
81 double valueAt(int x, int y) override {
83 return y + m_amplitude * pow(-1.0, (m_shift + x) / m_wavelength) *(0.5 - (double)((m_shift + x) % m_wavelength) / m_wavelength);
84 }
85private:
87}; KritaWaveFilter::KritaWaveFilter(QObject *parent, const QVariantList &)
88 : QObject(parent)
89{
91}
92
96
103
105{
106 KisFilterConfigurationSP config = factoryConfiguration(resourcesInterface);
107 config->setProperty("horizontalwavelength", 50);
108 config->setProperty("horizontalshift", 50);
109 config->setProperty("horizontalamplitude", 4);
110 config->setProperty("horizontalshape", 0);
111 config->setProperty("verticalwavelength", 50);
112 config->setProperty("verticalshift", 50);
113 config->setProperty("verticalamplitude", 4);
114 config->setProperty("verticalshape", 0);
115 return config;
116}
117
119{
120 return new KisWdgWave((KisFilter*)this, (QWidget*)parent);
121}
122
124 const QRect& applyRect,
125 const KisFilterConfigurationSP config,
126 KoUpdater* progressUpdater
127 ) const
128{
129 Q_ASSERT(device.data() != 0);
130
131 QVariant value;
132 int horizontalwavelength = (config && config->getProperty("horizontalwavelength", value)) ? value.toInt() : 50;
133 int horizontalshift = (config && config->getProperty("horizontalshift", value)) ? value.toInt() : 50;
134 int horizontalamplitude = (config && config->getProperty("horizontalamplitude", value)) ? value.toInt() : 4;
135 int horizontalshape = (config && config->getProperty("horizontalshape", value)) ? value.toInt() : 0;
136 int verticalwavelength = (config && config->getProperty("verticalwavelength", value)) ? value.toInt() : 50;
137 int verticalshift = (config && config->getProperty("verticalshift", value)) ? value.toInt() : 50;
138 int verticalamplitude = (config && config->getProperty("verticalamplitude", value)) ? value.toInt() : 4;
139 int verticalshape = (config && config->getProperty("verticalshape", value)) ? value.toInt() : 0;
140
141 KisWaveCurve* verticalWave;
142 if (verticalshape == 1)
143 verticalWave = new KisTriangleWaveCurve(verticalamplitude, verticalwavelength, verticalshift);
144 else
145 verticalWave = new KisSinusoidalWaveCurve(verticalamplitude, verticalwavelength, verticalshift);
146
147 KisWaveCurve* horizontalWave;
148 if (horizontalshape == 1)
149 horizontalWave = new KisTriangleWaveCurve(horizontalamplitude, horizontalwavelength, horizontalshift);
150 else
151 horizontalWave = new KisSinusoidalWaveCurve(horizontalamplitude, horizontalwavelength, horizontalshift);
152
153 KisSequentialIteratorProgress destination(device, applyRect, progressUpdater);
155
156 while (destination.nextPixel()) {
157 double xv = horizontalWave->valueAt(destination.y(), destination.x());
158 double yv = verticalWave->valueAt(destination.x(), destination.y());
159 source->moveTo(QPointF(xv, yv));
160 source->sampledOldRawData(destination.rawData());
161 }
162
163 delete verticalWave;
164 delete horizontalWave;
165}
166
167QRect KisFilterWave::changedRect(const QRect &rect, const KisFilterConfigurationSP config, int lod) const
168{
169 Q_UNUSED(lod);
170
171 QVariant value;
172 int horizontalamplitude = (config && config->getProperty("horizontalamplitude", value)) ? value.toInt() : 4;
173 int verticalamplitude = (config && config->getProperty("verticalamplitude", value)) ? value.toInt() : 4;
174 return rect.adjusted(-horizontalamplitude, -verticalamplitude, horizontalamplitude, verticalamplitude);
175}
176
177QRect KisFilterWave::neededRect(const QRect& rect, const KisFilterConfigurationSP config, int lod) const
178{
179 return changedRect(rect, config, lod);
180}
181
182#include "wavefilter.moc"
float value(const T *src, size_t ch)
KisMagneticGraph::vertex_descriptor source(typename KisMagneticGraph::edge_descriptor e, KisMagneticGraph g)
@ FULLY_INDEPENDENT
void add(KisFilterSP item)
static KisFilterRegistry * instance()
KisConfigWidget * createConfigurationWidget(QWidget *parent, const KisPaintDeviceSP dev, bool useForMasks) const override
QRect neededRect(const QRect &rect, const KisFilterConfigurationSP config=0, int lod=0) const override
QRect changedRect(const QRect &rect, const KisFilterConfigurationSP config=0, int lod=0) const override
KisFilterConfigurationSP defaultConfiguration(KisResourcesInterfaceSP resourcesInterface) const override
void processImpl(KisPaintDeviceSP device, const QRect &applyRect, const KisFilterConfigurationSP config, KoUpdater *progressUpdater) const override
KisRandomSubAccessorSP createRandomSubAccessor() const
ALWAYS_INLINE quint8 * rawData()
ALWAYS_INLINE int x() const
ALWAYS_INLINE int y() const
KisSinusoidalWaveCurve(int amplitude, int wavelength, int shift)
double valueAt(int x, int y) override
~KisSinusoidalWaveCurve() override
KisTriangleWaveCurve(int amplitude, int wavelength, int shift)
double valueAt(int x, int y) override
~KisTriangleWaveCurve() override
virtual ~KisWaveCurve()
virtual double valueAt(int x, int y)=0
~KritaWaveFilter() override
KritaWaveFilter(QObject *parent, const QVariantList &)
K_PLUGIN_FACTORY_WITH_JSON(KritaASCCDLFactory, "kritaasccdl.json", registerPlugin< KritaASCCDL >();) KritaASCCDL
#define KIS_ASSERT(cond)
Definition kis_assert.h:33
const KoID FiltersCategoryOtherId("other_filters", ki18nc("The category of filters that do not fit in a category. Noun.", "Other"))
virtual KisFilterConfigurationSP factoryConfiguration(KisResourcesInterfaceSP resourcesInterface) const
void setSupportsAdjustmentLayers(bool v)
void setSupportsPainting(bool v)
void setColorSpaceIndependence(ColorSpaceIndependence v)