• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • krita API Reference
  • KDE Home
  • Contact Us
 

plugins/paintops/libpaintop

  • sources
  • kfour-appscomplete
  • krita
  • plugins
  • paintops
  • libpaintop
kis_color_source.cpp
Go to the documentation of this file.
1 /*
2  * SPDX-FileCopyrightText: 2006-2007, 2009 Cyrille Berger <[email protected]>
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 
10 #include <resources/KoAbstractGradient.h>
11 #include <KoColorSpaceRegistry.h>
12 #include <KoColorTransformation.h>
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 <brushengine/kis_random_source.h>
19 #include <brushengine/kis_paint_information.h>
20 
21 #include <random>
22 
23 
24 KisColorSource::~KisColorSource() { }
25 
26 const KoColor black;
27 
28 const KoColor& KisColorSource::uniformColor() const
29 {
30  qFatal("Not an uniform color.");
31  return black;
32 }
33 
34 
35 KisUniformColorSource::KisUniformColorSource()
36 {
37 }
38 
39 KisUniformColorSource::~KisUniformColorSource()
40 {
41 }
42 
43 void KisUniformColorSource::rotate(double)
44 {}
45 
46 void KisUniformColorSource::resize(double , double)
47 {
48  // Do nothing as plain color does not have size
49 }
50 
51 void KisUniformColorSource::colorize(KisPaintDeviceSP dev, const QRect& size, const QPoint&) const
52 {
53  Q_UNUSED(size);
54  KoColor c(dev->colorSpace());
55  c.fromKoColor(m_color);
56  dev->dataManager()->setDefaultPixel(c.data());
57  dev->clear();
58 }
59 
60 const KoColor& KisUniformColorSource::uniformColor() const
61 {
62  return m_color;
63 }
64 
65 void KisUniformColorSource::applyColorTransformation(const KoColorTransformation* transfo)
66 {
67  transfo->transform(m_color.data(), m_color.data(), 1);
68 }
69 
70 const KoColorSpace* KisUniformColorSource::colorSpace() const
71 {
72  return m_color.colorSpace();
73 }
74 
75 bool KisUniformColorSource::isUniformColor() const
76 {
77  return true;
78 }
79 
80 //-------------------------------------------------//
81 //---------------- KisPlainColorSource ---------------//
82 //-------------------------------------------------//
83 
84 KisPlainColorSource::KisPlainColorSource(const KoColor& backGroundColor, const KoColor& foreGroundColor)
85  : m_backGroundColor(backGroundColor)
86  , m_cachedBackGroundColor(backGroundColor)
87  , m_foreGroundColor(foreGroundColor)
88 {
89 }
90 
91 KisPlainColorSource::~KisPlainColorSource()
92 {
93 }
94 
95 void KisPlainColorSource::selectColor(double mix, const KisPaintInformation &pi)
96 {
97  Q_UNUSED(pi);
98 
99  if (m_color.colorSpace() != m_foreGroundColor.colorSpace()) {
100  m_color = KoColor(m_foreGroundColor.colorSpace());
101  m_cachedBackGroundColor = KoColor(m_foreGroundColor.colorSpace());
102  m_cachedBackGroundColor.fromKoColor(m_backGroundColor);
103  }
104 
105  const quint8 *colors[2];
106  colors[0] = m_cachedBackGroundColor.data();
107  colors[1] = m_foreGroundColor.data();
108 
109  // equally distribute mix factor over [0..255]
110  // mix * 256 ensures that, with exception of mix==1.0, which gets special handling
111  const int weight = (mix == 1.0) ? 255 : (int)(mix * 256);
112  const qint16 weights[2] = { (qint16)(255 - weight), (qint16)weight };
113 
114  m_color.colorSpace()->mixColorsOp()->mixColors(colors, weights, 2, m_color.data());
115 }
116 
117 //-------------------------------------------------//
118 //--------------- KisGradientColorSource -------------//
119 //-------------------------------------------------//
120 
121 KisGradientColorSource::KisGradientColorSource(const KoAbstractGradientSP gradient, const KoColorSpace* workingCS)
122  : m_gradient(gradient)
123 {
124  m_color = KoColor(workingCS);
125 
126  Q_ASSERT(gradient);
127 }
128 
129 KisGradientColorSource::~KisGradientColorSource()
130 {
131 }
132 
133 void KisGradientColorSource::selectColor(double mix, const KisPaintInformation &pi)
134 {
135  Q_UNUSED(pi);
136  if (m_gradient) {
137  m_gradient->colorAt(m_color, mix);
138  }
139 }
140 
141 //-------------------------------------------------//
142 //--------------- KisGradientColorSource -------------//
143 //-------------------------------------------------//
144 
145 KisUniformRandomColorSource::KisUniformRandomColorSource()
146 {
147 }
148 
149 KisUniformRandomColorSource::~KisUniformRandomColorSource()
150 {
151 }
152 
153 void KisUniformRandomColorSource::selectColor(double mix, const KisPaintInformation &pi)
154 {
155  Q_UNUSED(pi);
156  Q_UNUSED(mix);
157 
158  KisRandomSourceSP source = pi.randomSource();
159  m_color.fromQColor(QColor((int)source->generate(0, 255),
160  (int)source->generate(0, 255),
161  (int)source->generate(0, 255)));
162 }
163 
164 
165 //------------------------------------------------------//
166 //--------------- KisTotalRandomColorSource ---------------//
167 //------------------------------------------------------//
168 
169 KisTotalRandomColorSource::KisTotalRandomColorSource() : m_colorSpace(KoColorSpaceRegistry::instance()->rgb8())
170 {
171 }
172 
173 KisTotalRandomColorSource::~KisTotalRandomColorSource()
174 {
175 }
176 
177 void KisTotalRandomColorSource::selectColor(double mix, const KisPaintInformation &pi)
178 {
179  Q_UNUSED(mix);
180  Q_UNUSED(pi);
181 }
182 
183 void KisTotalRandomColorSource::applyColorTransformation(const KoColorTransformation*) {}
184 const KoColorSpace* KisTotalRandomColorSource::colorSpace() const
185 {
186  return m_colorSpace;
187 }
188 
189 void KisTotalRandomColorSource::colorize(KisPaintDeviceSP dev, const QRect& rect, const QPoint&) const
190 {
191  KoColor kc(dev->colorSpace());
192 
193  QColor qc;
194 
195  std::random_device rand_dev;
196  std::default_random_engine rand_engine{rand_dev()};
197  std::uniform_int_distribution<> rand_distr(0, 255);
198 
199  int pixelSize = dev->colorSpace()->pixelSize();
200 
201  KisHLineIteratorSP it = dev->createHLineIteratorNG(rect.x(), rect.y(), rect.width());
202  for (int y = 0; y < rect.height(); y++) {
203  do {
204  qc.setRgb(rand_distr(rand_engine), rand_distr(rand_engine), rand_distr(rand_engine));
205  kc.fromQColor(qc);
206  memcpy(it->rawData(), kc.data(), pixelSize);
207  } while (it->nextPixel());
208  it->nextRow();
209  }
210 
211 }
212 
213 bool KisTotalRandomColorSource::isUniformColor() const
214 {
215  return false;
216 }
217 
218 void KisTotalRandomColorSource::rotate(double) {}
219 void KisTotalRandomColorSource::resize(double , double) {}
220 
221 
222 
223 KoPatternColorSource::KoPatternColorSource(KisPaintDeviceSP _pattern, int _width, int _height, bool _locked)
224  : m_device(_pattern)
225  , m_bounds(QRect(0, 0, _width, _height))
226  , m_locked(_locked)
227 {
228 }
229 
230 KoPatternColorSource::~KoPatternColorSource()
231 {
232 }
233 
234 void KoPatternColorSource::selectColor(double mix, const KisPaintInformation &pi)
235 {
236  Q_UNUSED(mix);
237  Q_UNUSED(pi);
238 }
239 
240 void KoPatternColorSource::applyColorTransformation(const KoColorTransformation* transfo)
241 {
242  Q_UNUSED(transfo);
243 }
244 
245 const KoColorSpace* KoPatternColorSource::colorSpace() const
246 {
247  return m_device->colorSpace();
248 }
249 
250 void KoPatternColorSource::colorize(KisPaintDeviceSP device, const QRect& rect, const QPoint& offset) const
251 {
252  KisFillPainter painter(device);
253  if (m_locked) {
254  painter.fillRect(rect.x(), rect.y(), rect.width(), rect.height(), m_device, m_bounds);
255  }
256  else {
257  int x = offset.x() % m_bounds.width();
258  int y = offset.y() % m_bounds.height();
259 
260  // Change the position, because the pattern is always applied starting
261  // from (0,0) in the paint device reference
262  device->setX(x);
263  device->setY(y);
264  painter.fillRect(rect.x() + x, rect.y() + y, rect.width(), rect.height(), m_device, m_bounds);
265  device->setX(0);
266  device->setY(0);
267  }
268 }
269 
270 void KoPatternColorSource::rotate(double r)
271 {
272  Q_UNUSED(r);
273 }
274 
275 void KoPatternColorSource::resize(double xs, double ys)
276 {
277  Q_UNUSED(xs);
278  Q_UNUSED(ys);
279 }
280 
281 bool KoPatternColorSource::isUniformColor() const
282 {
283  return false;
284 }
285 
KisGradientColorSource::KisGradientColorSource
KisGradientColorSource(const KoAbstractGradientSP gradient, const KoColorSpace *workingCS)
Definition: kis_color_source.cpp:121
QColor
KisUniformColorSource::rotate
virtual void rotate(double)
Definition: kis_color_source.cpp:43
KoPatternColorSource::resize
virtual void resize(double xs, double ys)
Definition: kis_color_source.cpp:275
KoPatternColorSource::rotate
virtual void rotate(double r)
Definition: kis_color_source.cpp:270
KisTotalRandomColorSource::isUniformColor
bool isUniformColor() const override
Definition: kis_color_source.cpp:213
KoPatternColorSource::selectColor
void selectColor(double mix, const KisPaintInformation &pi) override
This is function is called to initialize the color that will be used for the dab.
Definition: kis_color_source.cpp:234
black
const KoColor black
Definition: kis_color_source.cpp:26
KoPatternColorSource::isUniformColor
bool isUniformColor() const override
Definition: kis_color_source.cpp:281
QRect
KisGradientColorSource::~KisGradientColorSource
~KisGradientColorSource() override
Definition: kis_color_source.cpp:129
KisColorSource::~KisColorSource
virtual ~KisColorSource()
Definition: kis_color_source.cpp:24
KisUniformColorSource::~KisUniformColorSource
~KisUniformColorSource() override
Definition: kis_color_source.cpp:39
KisTotalRandomColorSource::rotate
virtual void rotate(double r)
Definition: kis_color_source.cpp:218
KisTotalRandomColorSource::colorize
void colorize(KisPaintDeviceSP, const QRect &rect, const QPoint &offset) const override
Apply the color on a paint device.
Definition: kis_color_source.cpp:189
QRect::width
int width() const
QRect::x
int x() const
QRect::y
int y() const
KisUniformColorSource::resize
virtual void resize(double, double)
Definition: kis_color_source.cpp:46
QPoint::x
int x() const
QPoint::y
int y() const
KoPatternColorSource::KoPatternColorSource
KoPatternColorSource(KisPaintDeviceSP _pattern, int _width, int _height, bool _locked)
Definition: kis_color_source.cpp:223
KoPatternColorSource::colorize
void colorize(KisPaintDeviceSP, const QRect &rect, const QPoint &_offset) const override
Apply the color on a paint device.
Definition: kis_color_source.cpp:250
KisTotalRandomColorSource::applyColorTransformation
void applyColorTransformation(const KoColorTransformation *transfo) override
Apply a color transformation on the selected color.
Definition: kis_color_source.cpp:183
KoPatternColorSource::colorSpace
const KoColorSpace * colorSpace() const override
Definition: kis_color_source.cpp:245
KisUniformColorSource::colorize
void colorize(KisPaintDeviceSP, const QRect &rect, const QPoint &offset) const override
Apply the color on a paint device.
Definition: kis_color_source.cpp:51
KisUniformRandomColorSource::KisUniformRandomColorSource
KisUniformRandomColorSource()
Definition: kis_color_source.cpp:145
KisPlainColorSource::~KisPlainColorSource
~KisPlainColorSource() override
Definition: kis_color_source.cpp:91
kis_color_source.h
KoPatternColorSource::~KoPatternColorSource
~KoPatternColorSource() override
Definition: kis_color_source.cpp:230
KoPatternColorSource::applyColorTransformation
void applyColorTransformation(const KoColorTransformation *transfo) override
Apply a color transformation on the selected color.
Definition: kis_color_source.cpp:240
KisUniformRandomColorSource::~KisUniformRandomColorSource
~KisUniformRandomColorSource() override
Definition: kis_color_source.cpp:149
KisUniformRandomColorSource::selectColor
void selectColor(double mix, const KisPaintInformation &pi) override
This is function is called to initialize the color that will be used for the dab.
Definition: kis_color_source.cpp:153
KisTotalRandomColorSource::selectColor
void selectColor(double mix, const KisPaintInformation &pi) override
This is function is called to initialize the color that will be used for the dab.
Definition: kis_color_source.cpp:177
KisColorSource::uniformColor
virtual const KoColor & uniformColor() const
Definition: kis_color_source.cpp:28
KisTotalRandomColorSource::colorSpace
const KoColorSpace * colorSpace() const override
Definition: kis_color_source.cpp:184
KisUniformColorSource::colorSpace
const KoColorSpace * colorSpace() const override
Definition: kis_color_source.cpp:70
KisUniformColorSource::applyColorTransformation
void applyColorTransformation(const KoColorTransformation *transfo) override
Apply a color transformation on the selected color.
Definition: kis_color_source.cpp:65
KisUniformColorSource::isUniformColor
bool isUniformColor() const override
Definition: kis_color_source.cpp:75
KisTotalRandomColorSource::~KisTotalRandomColorSource
~KisTotalRandomColorSource() override
Definition: kis_color_source.cpp:173
KisUniformColorSource::m_color
KoColor m_color
Definition: kis_color_source.h:72
KisTotalRandomColorSource::resize
virtual void resize(double xs, double ys)
Definition: kis_color_source.cpp:219
KisTotalRandomColorSource::KisTotalRandomColorSource
KisTotalRandomColorSource()
Definition: kis_color_source.cpp:169
KisUniformColorSource::uniformColor
const KoColor & uniformColor() const override
Definition: kis_color_source.cpp:60
QRect::height
int height() const
KisGradientColorSource::selectColor
void selectColor(double mix, const KisPaintInformation &pi) override
This is function is called to initialize the color that will be used for the dab.
Definition: kis_color_source.cpp:133
KisPlainColorSource::KisPlainColorSource
KisPlainColorSource(const KoColor &backGroundColor, const KoColor &foreGroundColor)
Definition: kis_color_source.cpp:84
KisUniformColorSource::KisUniformColorSource
KisUniformColorSource()
Definition: kis_color_source.cpp:35
KisPlainColorSource::selectColor
void selectColor(double mix, const KisPaintInformation &pi) override
This is function is called to initialize the color that will be used for the dab.
Definition: kis_color_source.cpp:95
QPoint
This file is part of the KDE documentation.
Documentation copyright © 1996-2021 The KDE developers.
Generated on Sat Apr 10 2021 23:38:28 by doxygen 1.8.16 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

plugins/paintops/libpaintop

Skip menu "plugins/paintops/libpaintop"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

krita API Reference

Skip menu "krita API Reference"
  • libs
  •   KritaBasicFlakes
  •   brush
  •   KritaUndo2
  •   KritaFlake
  •   image
  •   KritaPlugin
  •   Krita
  •   KritaPigment
  •   KritaResources
  •   KritaStore
  •   ui
  •   KritaWidgets
  •   KritaWidgetUtils
  • plugins
  •   Assitants
  •   Extensions
  •   Filters
  •   Generators
  •   Formats
  •           src
  •   PaintOps
  •     libpaintop

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal