Krita Source Code Documentation
Loading...
Searching...
No Matches
KisGridPaintOp Class Reference

#include <kis_grid_paintop.h>

+ Inheritance diagram for KisGridPaintOp:

Public Member Functions

 KisGridPaintOp (const KisPaintOpSettingsSP settings, KisPainter *painter, KisNodeSP node, KisImageSP image)
 
 ~KisGridPaintOp () override
 
- Public Member Functions inherited from KisPaintOp
virtual bool canPaint () const
 
virtual std::pair< int, bool > doAsynchronousUpdate (QVector< KisRunnableStrokeJobData * > &jobs)
 
 KisPaintOp (KisPainter *painter)
 
void paintAt (const KisPaintInformation &info, KisDistanceInformation *currentDistance)
 
virtual void paintBezierCurve (const KisPaintInformation &pi1, const QPointF &control1, const QPointF &control2, const KisPaintInformation &pi2, KisDistanceInformation *currentDistance)
 
virtual void paintLine (const KisPaintInformation &pi1, const KisPaintInformation &pi2, KisDistanceInformation *currentDistance)
 
 Private (KisPaintOp *_q)
 
void updateSpacing (const KisPaintInformation &info, KisDistanceInformation &currentDistance) const
 
void updateTiming (const KisPaintInformation &info, KisDistanceInformation &currentDistance) const
 
virtual ~KisPaintOp ()
 
- Public Member Functions inherited from Private
 Private (KisCanvas2 *c)
 
- Public Member Functions inherited from KisShared
bool deref ()
 
bool ref ()
 
int refCount ()
 
QAtomicInt * sharedWeakReference ()
 

Protected Member Functions

KisSpacingInformation paintAt (const KisPaintInformation &info) override
 
KisSpacingInformation updateSpacingImpl (const KisPaintInformation &info) const override
 
- Protected Member Functions inherited from KisPaintOp
KisFixedPaintDeviceSP cachedDab ()
 
KisFixedPaintDeviceSP cachedDab (const KoColorSpace *cs)
 
KisPainterpainter () const
 
KisPaintDeviceSP source () const
 
virtual KisTimingInformation updateTimingImpl (const KisPaintInformation &info) const
 
- Protected Member Functions inherited from KisShared
 KisShared ()
 
 ~KisShared ()
 

Private Member Functions

KisSpacingInformation computeSpacing (qreal lodScale) const
 

Private Attributes

KisColorOptionData m_colorProperties
 
KisPaintDeviceSP m_dab
 
KisNodeSP m_node
 
KisPainterm_painter
 
KisGridOpOptionData m_properties
 
KisGridPaintOpSettingsSP m_settings
 
KisGridShapeOptionData m_shapeProperties
 
qreal m_spacing
 
qreal m_xSpacing
 
qreal m_ySpacing
 

Additional Inherited Members

- Static Public Member Functions inherited from KisPaintOp
static void splitCoordinate (qreal coordinate, qint32 *whole, qreal *fraction)
 
- Public Attributes inherited from KisPaintOp
KisFixedPaintDeviceSP dab
 
bool fanCornersEnabled {false}
 
qreal fanCornersStep {1.0}
 
KisPainterpainter {nullptr}
 
KisPaintOpq {nullptr}
 
- Public Attributes inherited from Private
KisCanvas2canvas
 
int displayedFrame
 
int intendedFrame
 

Detailed Description

Definition at line 24 of file kis_grid_paintop.h.

Constructor & Destructor Documentation

◆ KisGridPaintOp()

KisGridPaintOp::KisGridPaintOp ( const KisPaintOpSettingsSP settings,
KisPainter * painter,
KisNodeSP node,
KisImageSP image )

Definition at line 37 of file kis_grid_paintop.cpp.

39 , m_settings(static_cast<KisGridPaintOpSettings*>(const_cast<KisPaintOpSettings*>(settings.data())))
40 , m_node(node)
41{
42
43 m_properties.read(settings.data());
44 m_colorProperties.read(settings.data());
45 m_shapeProperties.read(settings.data());
46
50
55#ifdef BENCHMARK
56 m_count = m_total = 0;
57#endif
58
59}
KisPainter * m_painter
KisColorOptionData m_colorProperties
KisGridPaintOpSettingsSP m_settings
KisGridOpOptionData m_properties
KisGridShapeOptionData m_shapeProperties
KisPaintDeviceSP m_dab
KisPaintDeviceSP createCompositionSourceDevice() const
@ FillStyleForegroundColor
KoColor paintColor
void setFillStyle(FillStyle fillStyle)
Set the current style with which to fill.
void setPaintColor(const KoColor &color)
bool read(const KisPropertiesConfiguration *setting)
bool read(const KisPropertiesConfiguration *setting)
bool read(const KisPropertiesConfiguration *setting)
KisPainter * painter
KisPaintOp(KisPainter *painter)
KisPaintDeviceSP source() const

References KisPaintDevice::createCompositionSourceDevice(), KisSharedPtr< T >::data(), KisPainter::FillStyleForegroundColor, KisGridOpOptionData::grid_height, KisGridOpOptionData::grid_scale, KisGridOpOptionData::grid_width, m_colorProperties, m_dab, m_painter, m_properties, m_shapeProperties, m_spacing, m_xSpacing, m_ySpacing, KisPainter::paintColor, KisPaintOp::painter, KisGridOpOptionData::read(), KisGridShapeOptionData::read(), KisColorOptionData::read(), KisPainter::setFillStyle(), KisPainter::setPaintColor(), and KisPaintOp::source().

◆ ~KisGridPaintOp()

KisGridPaintOp::~KisGridPaintOp ( )
override

Definition at line 61 of file kis_grid_paintop.cpp.

62{
63 delete m_painter;
64}

References m_painter.

Member Function Documentation

◆ computeSpacing()

KisSpacingInformation KisGridPaintOp::computeSpacing ( qreal lodScale) const
private

Definition at line 244 of file kis_grid_paintop.cpp.

References m_spacing.

◆ paintAt()

KisSpacingInformation KisGridPaintOp::paintAt ( const KisPaintInformation & info)
overrideprotectedvirtual

The implementation of painting of a dab and updating spacing. This does NOT need to update the timing information.

Implements KisPaintOp.

Definition at line 66 of file kis_grid_paintop.cpp.

67{
68#ifdef BENCHMARK
69 QTime time;
70 time.start();
71#endif
72
73 KisRandomSourceSP randomSource = info.randomSource();
74 const qreal additionalScale = KisLodTransform::lodToScale(painter()->device());
75
76 m_dab->clear();
77
78 qreal gridWidth = m_properties.diameter * m_properties.grid_scale * additionalScale;
79 qreal gridHeight = m_properties.diameter * m_properties.grid_scale * additionalScale;
80
81 qreal cellWidth = m_properties.grid_width * m_properties.grid_scale * additionalScale;
82 qreal cellHeight = m_properties.grid_height * m_properties.grid_scale * additionalScale;
83
84 qreal horizontalOffset = m_properties.horizontal_offset;
85 qreal verticalOffset = m_properties.vertical_offset;
86
87 int divide;
90 }
91 else {
93 }
94
95 divide = qRound(m_properties.grid_scale * divide);
96
97 //Adjust the start position of the drawn grid to the top left of the brush instead of in the center
98 qreal posX = info.pos().x() - (gridWidth/2) + (cellWidth/2) - horizontalOffset;
99 qreal posY = info.pos().y() - (gridHeight/2) + (cellHeight/2) - verticalOffset;
100
101 //Lock the grid alignment
102 posX = posX - std::fmod(posX, cellWidth) + horizontalOffset;
103 posY = posY - std::fmod(posY, cellHeight) + verticalOffset;
104 const QRectF dabRect(posX , posY , cellWidth, cellHeight);
105 const QRect dabRectAligned = dabRect.toAlignedRect();
106
107 divide = qMax(1, divide);
108 const qreal yStep = cellHeight / (qreal)divide;
109 const qreal xStep = cellWidth / (qreal)divide;
110
111 QRectF tile;
112 KoColor color(painter()->paintColor());
113
114 QScopedPointer<KisCrossDeviceColorSampler> colorSampler;
115 if (m_node) {
116 colorSampler.reset(new KisCrossDeviceColorSampler(m_node->paintDevice(), color));
117 }
118
119 qreal vertBorder = m_properties.grid_vertical_border * additionalScale;
120 qreal horzBorder = m_properties.grid_horizontal_border * additionalScale;
122 if (vertBorder == horzBorder) {
123 vertBorder = horzBorder = vertBorder * randomSource->generateNormalized();
124 }
125 else {
126 vertBorder *= randomSource->generateNormalized();
127 horzBorder *= randomSource->generateNormalized();
128 }
129 }
130
131 bool shouldColor = true;
132 // fill the tile
134 m_dab->fill(dabRectAligned, painter()->backgroundColor());
135 }
136 for (int y = 0; y < (gridHeight)/yStep; y++) {
137 for (int x = 0; x < (gridWidth)/xStep; x++) {
138 // determine the tile size
139 tile = QRectF(dabRect.x() + x * xStep, dabRect.y() + y * yStep, xStep, yStep);
140 tile.adjust(vertBorder, horzBorder, -vertBorder, -horzBorder);
141 tile = tile.normalized();
142
143 // do color transformation
144 if (shouldColor) {
145 if (colorSampler && m_colorProperties.sampleInputColor) {
146 colorSampler->sampleOldColor(tile.center().x(), tile.center().y(), color.data());
147 }
148
149 // mix the color with background color
151 KoMixColorsOp * mixOp = source()->colorSpace()->mixColorsOp();
152
153 const quint8 *colors[2];
154 colors[0] = color.data();
155 colors[1] = painter()->backgroundColor().data();
156
157 qint16 colorWeights[2];
158 int MAX_16BIT = 255;
159 qreal blend = info.pressure();
160
161 colorWeights[0] = static_cast<quint16>(blend * MAX_16BIT);
162 colorWeights[1] = static_cast<quint16>((1.0 - blend) * MAX_16BIT);
163 mixOp->mixColors(colors, colorWeights, 2, color.data());
164 }
165
167 QHash<QString, QVariant> params;
168 params["h"] = (m_colorProperties.hue / 180.0) * randomSource->generateNormalized();
169 params["s"] = (m_colorProperties.saturation / 100.0) * randomSource->generateNormalized();
170 params["v"] = (m_colorProperties.value / 100.0) * randomSource->generateNormalized();
171 KoColorTransformation* transfo;
172 transfo = m_dab->colorSpace()->createColorTransformation("hsv_adjustment", params);
173 transfo->setParameter(3, 1);//sets the type to HSV. For some reason 0 is not an option.
174 transfo->setParameter(4, false);//sets the colorize to false.
175 transfo->transform(color.data(), color.data() , 1);
176 }
177
179 const qreal alpha = randomSource->generateNormalized();
180 color.setOpacity(alpha);
181 m_painter->setOpacityF(alpha);
182 }
183
185 shouldColor = false;
186 }
187 m_painter->setPaintColor(color);
188 }
189
190 // paint some element
191 switch (m_shapeProperties.shape) {
192 case 0: {
193 m_painter->paintEllipse(tile);
194 break;
195 }
196 case 1: {
197 // anti-aliased version
198 //m_painter->paintRect(tile);
199 m_dab->fill(tile.topLeft().x(), tile.topLeft().y(), tile.width(), tile.height(), color.data());
200 break;
201 }
202 case 2: {
203 m_painter->drawDDALine(tile.topRight(), tile.bottomLeft());
204 break;
205 }
206 case 3: {
207 m_painter->drawLine(tile.topRight(), tile.bottomLeft());
208 break;
209 }
210 case 4: {
211 m_painter->drawThickLine(tile.topRight(), tile.bottomLeft() , 1, 10);
212 break;
213 }
214 default: {
215 break;
216 }
217 }
218
220 color=painter()->paintColor();//reset color//
221 }
222 }
223 }
224
225 QRect rc = m_dab->extent();
226 painter()->bitBlt(rc.topLeft(), m_dab, rc);
228
229#ifdef BENCHMARK
230 int msec = time.elapsed();
231 dbgKrita << msec << " ms/dab " << "[average: " << m_total / (qreal)m_count << "]";
232 m_total += msec;
233 m_count++;
234#endif
235 return computeSpacing(additionalScale);
236}
KisSpacingInformation computeSpacing(qreal lodScale) const
static qreal lodToScale(int levelOfDetail)
virtual void clear()
QRect extent() const
void fill(const QRect &rc, const KoColor &color)
const KoColorSpace * colorSpace() const
KisRandomSourceSP randomSource() const
const QPointF & pos() const
qreal pressure() const
The pressure of the value (from 0.0 to 1.0)
void paintEllipse(const QRectF &rect)
void drawDDALine(const QPointF &start, const QPointF &end)
void drawThickLine(const QPointF &start, const QPointF &end, int startWidth, int endWidth)
void renderMirrorMask(QRect rc, KisFixedPaintDeviceSP dab)
void setOpacityF(qreal opacity)
void bitBlt(qint32 dstX, qint32 dstY, const KisPaintDeviceSP srcDev, qint32 srcX, qint32 srcY, qint32 srcWidth, qint32 srcHeight)
void drawLine(const QPointF &start, const QPointF &end)
KoColor backgroundColor
qreal generateNormalized() const
KoColorTransformation * createColorTransformation(const QString &id, const QHash< QString, QVariant > &parameters) const
KoMixColorsOp * mixColorsOp
virtual void setParameter(int id, const QVariant &parameter)
virtual void transform(const quint8 *src, quint8 *dst, qint32 nPixels) const =0
quint8 * data()
Definition KoColor.h:144
virtual void mixColors(const quint8 *const *colors, const qint16 *weights, int nColors, quint8 *dst, int weightSum=255) const =0
KisCrossDeviceColorSamplerImpl< SamplerTraitReal > KisCrossDeviceColorSampler
#define dbgKrita
Definition kis_debug.h:45
T blend(T src, T srcAlpha, T dst, T dstAlpha, T cfValue)
virtual KisPaintDeviceSP paintDevice() const =0
int shape
Ellipse, rectangle, line, pixel, anti-aliased pixel.

References KisPainter::backgroundColor, KisPainter::bitBlt(), KisPaintDevice::clear(), KisColorOptionData::colorPerParticle, KisPaintDevice::colorSpace(), computeSpacing(), KoColorSpace::createColorTransformation(), KoColor::data(), dbgKrita, KisGridOpOptionData::diameter, KisPainter::drawDDALine(), KisPainter::drawLine(), KisPainter::drawThickLine(), KisPaintDevice::extent(), KisPaintDevice::fill(), KisColorOptionData::fillBackground, KisRandomSource::generateNormalized(), KisGridOpOptionData::grid_division_level, KisGridOpOptionData::grid_height, KisGridOpOptionData::grid_horizontal_border, KisGridOpOptionData::grid_pressure_division, KisGridOpOptionData::grid_random_border, KisGridOpOptionData::grid_scale, KisGridOpOptionData::grid_vertical_border, KisGridOpOptionData::grid_width, KisGridOpOptionData::horizontal_offset, KisColorOptionData::hue, KisLodTransformBase::lodToScale(), m_colorProperties, m_dab, m_node, m_painter, m_properties, m_shapeProperties, KisColorOptionData::mixBgColor, KoMixColorsOp::mixColors(), KoColorSpace::mixColorsOp, KisPainter::paintColor, KisBaseNode::paintDevice(), KisPainter::paintEllipse(), KisPaintOp::painter, KisPaintInformation::pos(), KisPaintInformation::pressure(), KisPaintInformation::randomSource(), KisPainter::renderMirrorMask(), KisColorOptionData::sampleInputColor, KisColorOptionData::saturation, KoColor::setOpacity(), KisPainter::setOpacityF(), KisPainter::setPaintColor(), KoColorTransformation::setParameter(), KisGridShapeOptionData::shape, KisPaintOp::source(), KoColorTransformation::transform(), KisColorOptionData::useRandomHSV, KisColorOptionData::useRandomOpacity, KisColorOptionData::value, and KisGridOpOptionData::vertical_offset.

◆ updateSpacingImpl()

KisSpacingInformation KisGridPaintOp::updateSpacingImpl ( const KisPaintInformation & info) const
overrideprotectedvirtual

Implementation of a spacing update

Implements KisPaintOp.

Definition at line 238 of file kis_grid_paintop.cpp.

239{
240 Q_UNUSED(info);
242}

References computeSpacing(), KisLodTransformBase::lodToScale(), and KisPaintOp::painter.

Member Data Documentation

◆ m_colorProperties

KisColorOptionData KisGridPaintOp::m_colorProperties
private

Definition at line 48 of file kis_grid_paintop.h.

◆ m_dab

KisPaintDeviceSP KisGridPaintOp::m_dab
private

Definition at line 42 of file kis_grid_paintop.h.

◆ m_node

KisNodeSP KisGridPaintOp::m_node
private

Definition at line 50 of file kis_grid_paintop.h.

◆ m_painter

KisPainter* KisGridPaintOp::m_painter
private

Definition at line 43 of file kis_grid_paintop.h.

◆ m_properties

KisGridOpOptionData KisGridPaintOp::m_properties
private

Definition at line 47 of file kis_grid_paintop.h.

◆ m_settings

KisGridPaintOpSettingsSP KisGridPaintOp::m_settings
private

Definition at line 41 of file kis_grid_paintop.h.

◆ m_shapeProperties

KisGridShapeOptionData KisGridPaintOp::m_shapeProperties
private

Definition at line 49 of file kis_grid_paintop.h.

◆ m_spacing

qreal KisGridPaintOp::m_spacing
private

Definition at line 46 of file kis_grid_paintop.h.

◆ m_xSpacing

qreal KisGridPaintOp::m_xSpacing
private

Definition at line 44 of file kis_grid_paintop.h.

◆ m_ySpacing

qreal KisGridPaintOp::m_ySpacing
private

Definition at line 45 of file kis_grid_paintop.h.


The documentation for this class was generated from the following files: