Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_asccdl_filter.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2017 Wolthera van Hövell tot Westerflier <griffinvalley@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#include "kis_asccdl_filter.h"
8#include "kis_wdg_asccdl.h"
9#include <kpluginfactory.h>
10#include <klocalizedstring.h>
14#include <qmath.h>
15
16K_PLUGIN_FACTORY_WITH_JSON(KritaASCCDLFactory,
17 "kritaasccdl.json",
18 registerPlugin<KritaASCCDL>();)
19
20
21KritaASCCDL::KritaASCCDL(QObject *parent, const QVariantList &) : QObject(parent)
22{
24}
25
30
40
42 const KisFilterConfigurationSP config) const
43{
44 KoColor black(Qt::black, cs);
45 KoColor white(Qt::white, cs);
46 return new KisASCCDLTransformation(cs,
47 config->getColor("slope", black),
48 config->getColor("offset", white),
49 config->getColor("power", black));
50}
51
53{
54 return new KisASCCDLConfigWidget(parent, dev->colorSpace());
55}
56
58{
59 KoColor black(Qt::black, cs);
60 KoColor offset = config->getColor("offset", black);
61 offset.convertTo(cs);
62 if (cs->difference(black.data(), offset.data())>0) {
63 return true;
64 }
65 return false;
66}
67
69{
70 KisFilterConfigurationSP config = factoryConfiguration(resourcesInterface);
71 QVariant colorVariant("KoColor");
72 KoColor black;
73 black.fromQColor(QColor(Qt::black));
74 KoColor white;
75 white.fromQColor(QColor(Qt::white));
76 colorVariant.setValue(white);
77 config->setProperty( "slope", colorVariant);
78 config->setProperty( "power", colorVariant);
79 colorVariant.setValue(black);
80 config->setProperty("offset", colorVariant);
81 return config;
82}
83
85{
86 QVector<float> slopeN(cs->channelCount());
87 slope.convertTo(cs);
88 slope.colorSpace()->normalisedChannelsValue(slope.data(), slopeN);
89 m_slope = slopeN;
90 offset.convertTo(cs);
91 QVector<float> offsetN(cs->channelCount());
92 offset.colorSpace()->normalisedChannelsValue(offset.data(), offsetN);
93 m_offset = offsetN;
94 power.convertTo(cs);
95 QVector<float> powerN(cs->channelCount());
96 power.colorSpace()->normalisedChannelsValue(power.data(), powerN);
97 m_power = powerN;
98 m_cs = cs;
99}
100
101void KisASCCDLTransformation::transform(const quint8 *src, quint8 *dst, qint32 nPixels) const
102{
103 QVector<float> normalised(m_cs->channelCount());
104 const int pixelSize = m_cs->pixelSize();
105 const int alphaPos = m_cs->alphaPos();
106 const int channelCount = m_cs->channelCount();
107
108 while (nPixels--) {
109 m_cs->normalisedChannelsValue(src, normalised);
110
111 for (uint c = 0; c < channelCount; c++){
112 if (c != alphaPos) {
113 normalised[c] = qPow( (normalised.at(c)*m_slope.at(c))+m_offset.at(c), m_power.at(c));
114 }
115 }
116 m_cs->fromNormalisedChannelsValue(dst, normalised);
117 src += pixelSize;
118 dst += pixelSize;
119 }
120}
121
122#include "kis_asccdl_filter.moc"
@ FULLY_INDEPENDENT
unsigned int uint
The KisASCCDLConfigWidget class this handles the configuration widget for the slope offset power filt...
const KoColorSpace * m_cs
void transform(const quint8 *src, quint8 *dst, qint32 nPixels) const override
KisASCCDLTransformation(const KoColorSpace *cs, KoColor slope, KoColor offset, KoColor power)
KisFilterConfigurationSP factoryConfiguration(KisResourcesInterfaceSP resourcesInterface) const override
bool needsTransparentPixels(const KisFilterConfigurationSP config, const KoColorSpace *cs) const override
KisConfigWidget * createConfigurationWidget(QWidget *parent, const KisPaintDeviceSP dev, bool useForMasks) const override
KisFilterConfigurationSP defaultConfiguration(KisResourcesInterfaceSP resourcesInterface) const override
KoColorTransformation * createTransformation(const KoColorSpace *cs, const KisFilterConfigurationSP config) const override
void add(KisFilterSP item)
static KisFilterRegistry * instance()
void setSupportsLevelOfDetail(bool value)
const KoColorSpace * colorSpace() const
virtual quint32 alphaPos() const =0
virtual quint32 pixelSize() const =0
virtual quint8 difference(const quint8 *src1, const quint8 *src2) const =0
virtual quint32 channelCount() const =0
virtual void normalisedChannelsValue(const quint8 *pixel, QVector< float > &channels) const =0
virtual void fromNormalisedChannelsValue(quint8 *pixel, const QVector< float > &values) const =0
void convertTo(const KoColorSpace *cs, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags)
Definition KoColor.cpp:136
void fromQColor(const QColor &c)
Convenient function for converting from a QColor.
Definition KoColor.cpp:213
quint8 * data()
Definition KoColor.h:144
const KoColorSpace * colorSpace() const
return the current colorSpace
Definition KoColor.h:82
KritaASCCDL(QObject *parent, const QVariantList &)
~KritaASCCDL() override
K_PLUGIN_FACTORY_WITH_JSON(KritaASCCDLFactory, "kritaasccdl.json", registerPlugin< KritaASCCDL >();) KritaASCCDL
const KoID FiltersCategoryAdjustId("adjust_filters", ki18nc("The category of color adjustment filters, like levels. Verb.", "Adjust"))
KisSharedPtr< KisFilter > KisFilterSP
Definition kis_types.h:167
void setSupportsThreading(bool v)
void setShowConfigurationWidget(bool v)
void setSupportsAdjustmentLayers(bool v)
void setSupportsPainting(bool v)
void setColorSpaceIndependence(ColorSpaceIndependence v)