Krita Source Code Documentation
Loading...
Searching...
No Matches
KisGradientMapFilter.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the KDE project
3 *
4 * SPDX-FileCopyrightText: 2016 Spencer Brown <sbrown655@gmail.com>
5 * SPDX-FileCopyrightText: 2020 Deif Lou <ginoba@gmail.com>
6 *
7 * SPDX-License-Identifier: GPL-2.0-or-later
8 */
9
10#include <KoColorSpace.h>
11#include <KoColor.h>
12#include <kis_paint_device.h>
13#include <kis_global.h>
14#include <kis_types.h>
16#include <KoAbstractGradient.h>
17#include <KoStopGradient.h>
18#include <KoColorSet.h>
19#include <KisDitherUtil.h>
22#include <KoUpdater.h>
23#include <KoCachedGradient.h>
24
30
32 : KisFilter(id(), FiltersCategoryMapId, i18n("&Gradient Map..."))
33{
35}
36
38{
39public:
40 BlendColorModePolicy(const KoCachedGradient *cachedGradient);
41
42 const quint8* colorAt(qreal t, int x, int y) const;
43
44private:
46};
47
49 : m_cachedGradient(cachedGradient)
50{}
51
52const quint8* BlendColorModePolicy::colorAt(qreal t, int x, int y) const
53{
54 Q_UNUSED(x);
55 Q_UNUSED(y);
56
57 return m_cachedGradient->cachedAt(t);
58}
59
61{
62public:
64
65 const quint8* colorAt(qreal t, int x, int y) const;
66
67private:
69};
70
72 : m_cachedGradient(cachedGradient)
73{}
74
75const quint8* NearestColorModePolicy::colorAt(qreal t, int x, int y) const
76{
77 Q_UNUSED(x);
78 Q_UNUSED(y);
79
80 return m_cachedGradient->cachedAt(t);
81}
82
84{
85public:
87
88 const quint8* colorAt(qreal t, int x, int y) const;
89
90private:
93};
94
96 : m_cachedGradient(cachedGradient)
97 , m_ditherUtil(ditherUtil)
98{}
99
100const quint8* DitherColorModePolicy::colorAt(qreal t, int x, int y) const
101{
103 if (cachedEntry.localT < m_ditherUtil->threshold(QPoint(x, y))) {
104 return cachedEntry.leftStop.data();
105 }
106 else {
107 return cachedEntry.rightStop.data();
108 }
109}
110
112 const QRect& applyRect,
113 const KisFilterConfigurationSP config,
114 KoUpdater *progressUpdater) const
115{
116 Q_ASSERT(!device.isNull());
117
118 const KisGradientMapFilterConfiguration *filterConfig =
119 dynamic_cast<const KisGradientMapFilterConfiguration*>(config.data());
120
121 KIS_SAFE_ASSERT_RECOVER_RETURN(filterConfig);
122
123 KoAbstractGradientSP gradient = filterConfig->gradient();
124 const int colorMode = filterConfig->colorMode();
125 const KoColorSpace *colorSpace = device->colorSpace();
126 const int cachedGradientSize = device->extent().width() + device->extent().height();
127
129 KoCachedGradient cachedGradient(gradient, cachedGradientSize, colorSpace);
130 BlendColorModePolicy colorModePolicy(&cachedGradient);
131 processImpl(device, applyRect, config, progressUpdater, colorModePolicy);
132
134 KisGradientMapFilterNearestCachedGradient cachedGradient(gradient, cachedGradientSize, colorSpace);
135 NearestColorModePolicy colorModePolicy(&cachedGradient);
136 processImpl(device, applyRect, config, progressUpdater, colorModePolicy);
137
138 } else /* if colorMode == KisGradientMapFilterConfiguration::ColorMode_Dither */ {
139 KisDitherUtil ditherUtil;
140 KisGradientMapFilterDitherCachedGradient cachedGradient(gradient, cachedGradientSize, colorSpace);
141 ditherUtil.setConfiguration(*filterConfig, "dither/");
142 DitherColorModePolicy colorModePolicy(&cachedGradient, &ditherUtil);
143 processImpl(device, applyRect, config, progressUpdater, colorModePolicy);
144 }
145}
146
147template <typename ColorModeStrategy>
149 const QRect& applyRect,
150 const KisFilterConfigurationSP config,
151 KoUpdater *progressUpdater,
152 const ColorModeStrategy &colorModeStrategy) const
153{
154 Q_UNUSED(config);
155
156 Q_ASSERT(!device.isNull());
157
158 const KoColorSpace *colorSpace = device->colorSpace();
159 const int pixelSize = colorSpace->pixelSize();
160
161 KisSequentialIteratorProgress it(device, applyRect, progressUpdater);
162
163 while (it.nextPixel()) {
164 const qreal t = colorSpace->intensityF(it.oldRawData());
165 const qreal pixelOpacity = colorSpace->opacityF(it.oldRawData());
166 const quint8 *color = colorModeStrategy.colorAt(t, it.x(), it.y());
167 memcpy(it.rawData(), color, pixelSize);
168 colorSpace->setOpacity(it.rawData(), qMin(pixelOpacity, colorSpace->opacityF(color)), 1);
169 }
170}
171
176
178{
180 config->setDefaults();
181 return config;
182}
183
185{
186 return new KisGradientMapFilterConfigWidget(parent);
187}
const KoCachedGradient * m_cachedGradient
const quint8 * colorAt(qreal t, int x, int y) const
BlendColorModePolicy(const KoCachedGradient *cachedGradient)
const KisGradientMapFilterDitherCachedGradient * m_cachedGradient
DitherColorModePolicy(const KisGradientMapFilterDitherCachedGradient *cachedGradient, KisDitherUtil *ditherUtil)
const quint8 * colorAt(qreal t, int x, int y) const
qreal threshold(const QPoint &pos)
void setConfiguration(const KisFilterConfiguration &config, const QString &prefix="")
KoAbstractGradientSP gradient(KoAbstractGradientSP fallbackGradient=nullptr) const
const CachedEntry & cachedAt(qreal t) const
gets the color data at position 0 <= t <= 1
const quint8 * cachedAt(qreal t) const
gets the color data at position 0 <= t <= 1
KisConfigWidget * createConfigurationWidget(QWidget *parent, const KisPaintDeviceSP dev, bool useForMasks) const override
KisFilterConfigurationSP factoryConfiguration(KisResourcesInterfaceSP resourcesInterface) const override
void processImpl(KisPaintDeviceSP device, const QRect &applyRect, const KisFilterConfigurationSP config, KoUpdater *progressUpdater) const override
KisFilterConfigurationSP defaultConfiguration(KisResourcesInterfaceSP resourcesInterface) const override
QRect extent() const
const KoColorSpace * colorSpace() const
ALWAYS_INLINE quint8 * rawData()
ALWAYS_INLINE int x() const
ALWAYS_INLINE const quint8 * oldRawData() const
ALWAYS_INLINE int y() const
bool isNull() const
const quint8 * cachedAt(qreal t) const
gets the color data at position 0 <= t <= 1
virtual qreal intensityF(const quint8 *src) const =0
virtual quint32 pixelSize() const =0
virtual qreal opacityF(const quint8 *pixel) const =0
virtual void setOpacity(quint8 *pixels, quint8 alpha, qint32 nPixels) const =0
quint8 * data()
Definition KoColor.h:144
const quint8 * colorAt(qreal t, int x, int y) const
const KisGradientMapFilterNearestCachedGradient * m_cachedGradient
NearestColorModePolicy(const KisGradientMapFilterNearestCachedGradient *cachedGradient)
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
const KoID FiltersCategoryMapId("map_filters", ki18nc("The category of mapping filters, like bump map or gradient filter map. Verb.", "Map"))
void setSupportsPainting(bool v)