Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_color_source.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2006-2007, 2009 Cyrille Berger <cberger@cberger.net>
3 *
4 * SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6
7#include "kis_color_source.h"
8#include <kis_paint_device.h>
9
13#include <KoMixColorsOp.h>
14#include <kis_datamanager.h>
15#include <kis_fill_painter.h>
16#include "kis_iterator_ng.h"
17#include "kis_selection.h"
18#include <kis_random_source.h>
20
21#include <random>
22
23
25
29
33
36
37void KisUniformColorSource::resize(double , double)
38{
39 // Do nothing as plain color does not have size
40}
41
42void KisUniformColorSource::colorize(KisPaintDeviceSP dev, const QRect& size, const QPoint&) const
43{
44 Q_UNUSED(size);
45 KoColor c(dev->colorSpace());
47 dev->dataManager()->setDefaultPixel(c.data());
48 dev->clear();
49}
50
52{
53 return m_color;
54}
55
60
65
66//-------------------------------------------------//
67//---------------- KisPlainColorSource ---------------//
68//-------------------------------------------------//
69
70KisPlainColorSource::KisPlainColorSource(const KoColor& backGroundColor, const KoColor& foreGroundColor)
71 : m_backGroundColor(backGroundColor)
72 , m_cachedBackGroundColor(backGroundColor)
73 , m_foreGroundColor(foreGroundColor)
74{
75}
76
80
82{
83 Q_UNUSED(pi);
84
89 }
90
91 const quint8 *colors[2];
92 colors[0] = m_cachedBackGroundColor.data();
93 colors[1] = m_foreGroundColor.data();
94
95 // equally distribute mix factor over [0..255]
96 // mix * 256 ensures that, with exception of mix==1.0, which gets special handling
97 const int weight = (mix == 1.0) ? 255 : (int)(mix * 256);
98 const qint16 weights[2] = { (qint16)(255 - weight), (qint16)weight };
99
100 m_color.colorSpace()->mixColorsOp()->mixColors(colors, weights, 2, m_color.data());
101}
102
103//-------------------------------------------------//
104//--------------- KisGradientColorSource -------------//
105//-------------------------------------------------//
106
108 : m_gradient(gradient)
109{
110 m_color = KoColor(workingCS);
111
112 Q_ASSERT(gradient);
113}
114
118
120{
121 Q_UNUSED(pi);
122 if (m_gradient) {
123 m_gradient->colorAt(m_color, mix);
124 }
125}
126
127//-------------------------------------------------//
128//--------------- KisGradientColorSource -------------//
129//-------------------------------------------------//
130
134
138
140{
141 Q_UNUSED(pi);
142 Q_UNUSED(mix);
143
145 m_color.fromQColor(QColor((int)source->generate(0, 255),
146 (int)source->generate(0, 255),
147 (int)source->generate(0, 255)));
148}
149
150
151//------------------------------------------------------//
152//--------------- KisTotalRandomColorSource ---------------//
153//------------------------------------------------------//
154
158
162
164{
165 Q_UNUSED(mix);
166 Q_UNUSED(pi);
167}
168
174
175void KisTotalRandomColorSource::colorize(KisPaintDeviceSP dev, const QRect& rect, const QPoint&) const
176{
177 KoColor kc(dev->colorSpace());
178
179 QColor qc;
180
181 std::random_device rand_dev;
182 std::default_random_engine rand_engine{rand_dev()};
183 std::uniform_int_distribution<> rand_distr(0, 255);
184
185 int pixelSize = dev->colorSpace()->pixelSize();
186
187 KisHLineIteratorSP it = dev->createHLineIteratorNG(rect.x(), rect.y(), rect.width());
188 for (int y = 0; y < rect.height(); y++) {
189 do {
190 qc.setRgb(rand_distr(rand_engine), rand_distr(rand_engine), rand_distr(rand_engine));
191 kc.fromQColor(qc);
192 memcpy(it->rawData(), kc.data(), pixelSize);
193 } while (it->nextPixel());
194 it->nextRow();
195 }
196
197}
198
200void KisTotalRandomColorSource::resize(double , double) {}
201
202
203
204KoPatternColorSource::KoPatternColorSource(KisPaintDeviceSP _pattern, int _width, int _height, bool _locked)
205 : m_device(_pattern)
206 , m_bounds(QRect(0, 0, _width, _height))
207 , m_locked(_locked)
208{
209}
210
214
216{
217 Q_UNUSED(mix);
218 Q_UNUSED(pi);
219}
220
222{
223 Q_UNUSED(transfo);
224}
225
227{
228 return m_device->colorSpace();
229}
230
231void KoPatternColorSource::colorize(KisPaintDeviceSP device, const QRect& rect, const QPoint& offset) const
232{
233 KisFillPainter painter(device);
234 if (m_locked) {
235 painter.fillRect(rect.x(), rect.y(), rect.width(), rect.height(), m_device, m_bounds);
236 }
237 else {
238 int x = offset.x() % m_bounds.width();
239 int y = offset.y() % m_bounds.height();
240
241 // Change the position, because the pattern is always applied starting
242 // from (0,0) in the paint device reference
243 device->setX(x);
244 device->setY(y);
245 painter.fillRect(rect.x() + x, rect.y() + y, rect.width(), rect.height(), m_device, m_bounds);
246 device->setX(0);
247 device->setY(0);
248 }
249}
250
252{
253 Q_UNUSED(r);
254}
255
256void KoPatternColorSource::resize(double xs, double ys)
257{
258 Q_UNUSED(xs);
259 Q_UNUSED(ys);
260}
261
KisMagneticGraph::vertex_descriptor source(typename KisMagneticGraph::edge_descriptor e, KisMagneticGraph g)
PythonPluginManager * instance
virtual ~KisColorSource()
void setDefaultPixel(const quint8 *defPixel)
void fillRect(qint32 x, qint32 y, qint32 w, qint32 h, const KoColor &c, quint8 opacity)
KisGradientColorSource(const KoAbstractGradientSP gradient, const KoColorSpace *workingCS)
void selectColor(double mix, const KisPaintInformation &pi) override
const KoAbstractGradientSP m_gradient
void setX(qint32 x)
virtual void clear()
KisHLineIteratorSP createHLineIteratorNG(qint32 x, qint32 y, qint32 w)
const KoColorSpace * colorSpace() const
KisDataManagerSP dataManager() const
void setY(qint32 y)
KisRandomSourceSP randomSource() const
void selectColor(double mix, const KisPaintInformation &pi) override
KisPlainColorSource(const KoColor &backGroundColor, const KoColor &foreGroundColor)
void colorize(KisPaintDeviceSP, const QRect &rect, const QPoint &offset) const override
void applyColorTransformation(const KoColorTransformation *transfo) override
virtual void rotate(double r)
void selectColor(double mix, const KisPaintInformation &pi) override
const KoColorSpace * m_colorSpace
virtual void resize(double xs, double ys)
const KoColorSpace * colorSpace() const override
const KoColor & uniformColor() const
virtual void resize(double, double)
virtual void rotate(double)
void colorize(KisPaintDeviceSP, const QRect &rect, const QPoint &offset) const override
void applyColorTransformation(const KoColorTransformation *transfo) override
const KoColorSpace * colorSpace() const override
void selectColor(double mix, const KisPaintInformation &pi) override
virtual quint32 pixelSize() const =0
KoMixColorsOp * mixColorsOp
virtual void transform(const quint8 *src, quint8 *dst, qint32 nPixels) const =0
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
void fromKoColor(const KoColor &src)
Definition KoColor.cpp:294
virtual void mixColors(const quint8 *const *colors, const qint16 *weights, int nColors, quint8 *dst, int weightSum=255) const =0
void selectColor(double mix, const KisPaintInformation &pi) override
void colorize(KisPaintDeviceSP, const QRect &rect, const QPoint &_offset) const override
virtual void rotate(double r)
void applyColorTransformation(const KoColorTransformation *transfo) override
const KoColorSpace * colorSpace() const override
const KisPaintDeviceSP m_device
KoPatternColorSource(KisPaintDeviceSP _pattern, int _width, int _height, bool _locked)
virtual void resize(double xs, double ys)