Krita Source Code Documentation
Loading...
Searching...
No Matches
indexcolors.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2014 Manuel Riecke <spell1337@gmail.com>
3 *
4 * SPDX-License-Identifier: ICS
5 */
6
7#include "indexcolors.h"
8
9#include <kpluginfactory.h>
11#include <kis_global.h>
12#include <KoColorSpaceMaths.h>
17
18#include "kiswdgindexcolors.h"
20
21K_PLUGIN_FACTORY_WITH_JSON(IndexColorsFactory, "kritaindexcolors.json", registerPlugin<IndexColors>();)
22
23IndexColors::IndexColors(QObject *parent, const QVariantList &)
24 : QObject(parent)
25{
27}
28
32
34{
35 setColorSpaceIndependence(FULLY_INDEPENDENT); // Technically it is TO_LAB16 but that would only display a warning we don't want
36 // This filter will always degrade the color space, that is it's purpose
39}
40
42{
44
46 palCfg.fromByteArray(config->getProperty("paletteGen").toByteArray());
47 pal = palCfg.generate();
48 if(config->getBool("reduceColorsEnabled"))
49 {
50 int maxClrs = config->getInt("colorLimit");
51 while(pal.numColors() > maxClrs)
53 }
54
55 pal.similarityFactors.L = config->getFloat("LFactor");
56 pal.similarityFactors.a = config->getFloat("aFactor");
57 pal.similarityFactors.b = config->getFloat("bFactor");
58 return new KisIndexColorTransformation(pal, cs, config->getInt("alphaSteps"));
59}
60
62{
63 Q_UNUSED(dev);
64 KisWdgIndexColors* w = new KisWdgIndexColors(parent);
65 w->setup(
66 QStringList() << i18nc("Color palette shade", "Bright") << i18nc("Color palette shade", "Light") << i18nc("Color palette shade", "Base") << i18nc("Color palette shade", "Shadow")
67 , 4
68 );
69 return w;
70}
71
73{
74 KisFilterConfigurationSP config = factoryConfiguration(resourcesInterface);
75
76 PaletteGeneratorConfig palCfg; // Default constructor is factory config
77 config->setProperty("paletteGen", palCfg.toByteArray());
78
79 config->setProperty("LFactor", 1.f);
80 config->setProperty("aFactor", 1.f);
81 config->setProperty("bFactor", 1.f);
82 config->setProperty("reduceColorsEnabled", false);
83 config->setProperty("colorLimit", 32);
84 config->setProperty("alphaSteps", 1);
85 return config;
86}
87
89 : m_colorSpace(cs),
90 m_psize(cs->pixelSize())
91{
93
94 static const qreal max = KoColorSpaceMathsTraits<quint16>::max;
95 if(alphaSteps > 0)
96 {
97 m_alphaStep = max / alphaSteps;
99 }
100 else
101 {
102 m_alphaStep = 0;
103 m_alphaHalfStep = 0;
104 }
105}
106
107void KisIndexColorTransformation::transform(const quint8* src, quint8* dst, qint32 nPixels) const
108{
109 if (m_palette.numColors() <= 0) {
110 memcpy(dst, src, nPixels * m_colorSpace->pixelSize());
111 return;
112 }
113
114 union
115 {
116 quint16 laba[4];
117 LabColor lab;
118 } clr;
119 while (nPixels--)
120 {
121 m_colorSpace->toLabA16(src, reinterpret_cast<quint8 *>(clr.laba), 1);
122 clr.lab = m_palette.getNearestIndex(clr.lab);
123 if(m_alphaStep)
124 {
125 quint16 amod = clr.laba[3] % m_alphaStep;
126 clr.laba[3] = clr.laba[3] + (amod > m_alphaHalfStep ? m_alphaStep - amod : -amod);
127 }
128 m_colorSpace->fromLabA16(reinterpret_cast<quint8 *>(clr.laba), dst, 1);
129 src += m_psize;
130 dst += m_psize;
131 }
132}
133
134#include "indexcolors.moc"
QList< QString > QStringList
@ FULLY_INDEPENDENT
IndexColors(QObject *parent, const QVariantList &)
~IndexColors() override
KisFilterConfigurationSP factoryConfiguration(KisResourcesInterfaceSP resourcesInterface) const override
KisFilterConfigurationSP defaultConfiguration(KisResourcesInterfaceSP resourcesInterface) const override
KisConfigWidget * createConfigurationWidget(QWidget *parent, const KisPaintDeviceSP dev, bool useForMasks) const override
KoColorTransformation * createTransformation(const KoColorSpace *cs, const KisFilterConfigurationSP config) const override
void add(KisFilterSP item)
static KisFilterRegistry * instance()
void transform(const quint8 *src, quint8 *dst, qint32 nPixels) const override
KisIndexColorTransformation(IndexColorPalette palette, const KoColorSpace *cs, int alphaSteps)
const KoColorSpace * m_colorSpace
Definition indexcolors.h:46
IndexColorPalette m_palette
Definition indexcolors.h:48
virtual quint32 pixelSize() const =0
virtual void toLabA16(const quint8 *src, quint8 *dst, quint32 nPixels) const
virtual void fromLabA16(const quint8 *src, quint8 *dst, quint32 nPixels) const
K_PLUGIN_FACTORY_WITH_JSON(KritaASCCDLFactory, "kritaasccdl.json", registerPlugin< KritaASCCDL >();) KritaASCCDL
const KoID FiltersCategoryArtisticId("artistic_filters", ki18nc("The category of artistic filters, like raindrops. Adjective.", "Artistic"))
KisSharedPtr< KisFilter > KisFilterSP
Definition kis_types.h:167
rgba palette[MAX_PALETTE]
Definition palette.c:35
LabColor getNearestIndex(LabColor clr) const
struct IndexColorPalette::@11 similarityFactors
void setShowConfigurationWidget(bool v)
void setSupportsPainting(bool v)
void setColorSpaceIndependence(ColorSpaceIndependence v)
void fromByteArray(const QByteArray &str)