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

#include <kis_marker_painter.h>

Classes

struct  Private
 

Public Member Functions

void fillCirclesDiff (const QPointF &c1, qreal r1, const QPointF &c2, qreal r2)
 
void fillFullCircle (const QPointF &center, qreal radius)
 
void fillHalfBrushDiff (const QPointF &p1, const QPointF &p2, const QPointF &p3, const QPointF &center, qreal radius)
 
 KisMarkerPainter (KisPaintDeviceSP device, const KoColor &color)
 
 ~KisMarkerPainter ()
 

Static Public Attributes

static const qint32 ValidNumberRangeValue = 2140000000
 Any number bigger than this or lower than -this is considered invalid.
 

Private Member Functions

bool isNumberInValidRange (qint32 number)
 
bool isRectInValidRange (const QRect &rect)
 

Private Attributes

const QScopedPointer< Privatem_d
 

Detailed Description

Definition at line 18 of file kis_marker_painter.h.

Constructor & Destructor Documentation

◆ KisMarkerPainter()

KisMarkerPainter::KisMarkerPainter ( KisPaintDeviceSP device,
const KoColor & color )

Definition at line 26 of file kis_marker_painter.cpp.

27 : m_d(new Private(device, color))
28{
29}
const QScopedPointer< Private > m_d

◆ ~KisMarkerPainter()

KisMarkerPainter::~KisMarkerPainter ( )

Definition at line 31 of file kis_marker_painter.cpp.

32{
33}

Member Function Documentation

◆ fillCirclesDiff()

void KisMarkerPainter::fillCirclesDiff ( const QPointF & c1,
qreal r1,
const QPointF & c2,
qreal r2 )

Definition at line 138 of file kis_marker_painter.cpp.

140{
142
143 if (n.size() < 2) {
144 fillFullCircle(c2, r2);
145 } else {
146 const QPointF diff = c2 - c1;
147 const qreal normDiffInv = 1.0 / KisAlgebra2D::norm(diff);
148 const QPointF direction = diff * normDiffInv;
149 const QPointF p = c1 + r1 * direction;
150 const QPointF q = c2 + r2 * direction;
151
152 fillHalfBrushDiff(n[0], p, q, c2, r2);
153 fillHalfBrushDiff(q, p, n[1], c2, r2);
154 }
155}
QPointF r2
const Params2D p
QPointF r1
void fillFullCircle(const QPointF &center, qreal radius)
void fillHalfBrushDiff(const QPointF &p1, const QPointF &p2, const QPointF &p3, const QPointF &center, qreal radius)
QVector< QPointF > intersectTwoCircles(const QPointF &center1, qreal r1, const QPointF &center2, qreal r2)
qreal norm(const T &a)

References fillFullCircle(), fillHalfBrushDiff(), KisAlgebra2D::intersectTwoCircles(), KisAlgebra2D::norm(), p, r1, and r2.

◆ fillFullCircle()

void KisMarkerPainter::fillFullCircle ( const QPointF & center,
qreal radius )

Definition at line 104 of file kis_marker_painter.cpp.

105{
106 KoColor currentColor(m_d->color);
107
108 const int pixelSize = m_d->device->pixelSize();
109 const KoColorSpace *cs = m_d->device->colorSpace();
110
111 const qreal fadedRadius = radius + 1;
112 QRectF boundRect(center.x() - fadedRadius, center.y() - fadedRadius,
113 2 * fadedRadius, 2 * fadedRadius);
114
115 KisAlgebra2D::OuterCircle outer(center, radius);
116
117 QRect alignedRect = boundRect.toAlignedRect();
118
120
121 KisSequentialIterator it(m_d->device, alignedRect);
122 while (it.nextPixel()) {
123 QPoint pt(it.x(), it.y());
124
125 qreal value3 = outer.fadeSq(pt);
126 if (value3 > 1.0) continue;
127
128 const quint8 srcAlpha = value3 > 0 ? quint8((1.0 - value3) * 255.0) : 255;
129 const quint8 dstAlpha = cs->opacityU8(it.rawData());
130
131 if (srcAlpha > dstAlpha) {
132 currentColor.setOpacity(srcAlpha);
133 memcpy(it.rawData(), currentColor.data(), pixelSize);
134 }
135 }
136}
bool isRectInValidRange(const QRect &rect)
virtual quint8 opacityU8(const quint8 *pixel) const =0
void setOpacity(quint8 alpha)
Definition KoColor.cpp:333
quint8 * data()
Definition KoColor.h:144
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
KoColor currentColor(ResourceProvider *provider, ColorRole role)

References KoColor::data(), KisAlgebra2D::OuterCircle::fadeSq(), isRectInValidRange(), KIS_SAFE_ASSERT_RECOVER_RETURN, m_d, KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::nextPixel(), KoColorSpace::opacityU8(), KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::rawData(), KoColor::setOpacity(), KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::x(), and KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::y().

◆ fillHalfBrushDiff()

void KisMarkerPainter::fillHalfBrushDiff ( const QPointF & p1,
const QPointF & p2,
const QPointF & p3,
const QPointF & center,
qreal radius )

Definition at line 52 of file kis_marker_painter.cpp.

54{
55 KoColor currentColor(m_d->color);
56
57 const int pixelSize = m_d->device->pixelSize();
58 const KoColorSpace *cs = m_d->device->colorSpace();
59
60 const qreal fadedRadius = radius + 1;
61 QRectF boundRect(center.x() - fadedRadius, center.y() - fadedRadius,
62 2 * fadedRadius, 2 * fadedRadius);
63
66 KisAlgebra2D::OuterCircle outer(center, radius);
67
68 boundRect = KisAlgebra2D::cutOffRect(boundRect, plane1);
69 boundRect = KisAlgebra2D::cutOffRect(boundRect, plane2);
70
71 QRect alignedRect = boundRect.toAlignedRect();
72
74
75 KisSequentialIterator it(m_d->device, alignedRect);
76
77 while (it.nextPixel()) {
78 QPoint pt(it.x(), it.y());
79
80 qreal value1 = plane1.value(pt);
81 if (value1 < 0) continue;
82
83 qreal value2 = plane2.value(pt);
84 if (value2 < 0) continue;
85
86 qreal value3 = outer.fadeSq(pt);
87 if (value3 > 1.0) continue;
88
89 // qreal fadePos =
90 // value1 < 0 || value2 < 0 ?
91 // qMax(-value1, -value2) : value3;
92 qreal fadePos = value3;
93
94 const quint8 srcAlpha = fadePos > 0 ? quint8((1.0 - fadePos) * 255.0) : 255;
95 const quint8 dstAlpha = cs->opacityU8(it.rawData());
96
97 if (srcAlpha > dstAlpha) {
98 currentColor.setOpacity(srcAlpha);
99 memcpy(it.rawData(), currentColor.data(), pixelSize);
100 }
101 }
102}
QPointF p2
QPointF p3
QPointF p1
QRectF cutOffRect(const QRectF &rc, const KisAlgebra2D::RightHalfPlane &p)

References KisAlgebra2D::cutOffRect(), KoColor::data(), KisAlgebra2D::OuterCircle::fadeSq(), isRectInValidRange(), KIS_SAFE_ASSERT_RECOVER_RETURN, m_d, KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::nextPixel(), KoColorSpace::opacityU8(), p1, p2, p3, KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::rawData(), KoColor::setOpacity(), KisAlgebra2D::RightHalfPlane::value(), KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::x(), and KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::y().

◆ isNumberInValidRange()

bool KisMarkerPainter::isNumberInValidRange ( qint32 number)
private

This method is to check whether the number is not infinite or negative infinite with some epsilon (

See also
ValidNumberRangeValue)
Parameters
numbervalue entered by the user
Returns
true if number is in range, false otherwise

Definition at line 37 of file kis_marker_painter.cpp.

38{
39 if (number < -ValidNumberRangeValue || number > ValidNumberRangeValue)
40 return false;
41 return true;
42}
static const qint32 ValidNumberRangeValue
Any number bigger than this or lower than -this is considered invalid.

References ValidNumberRangeValue.

◆ isRectInValidRange()

bool KisMarkerPainter::isRectInValidRange ( const QRect & rect)
private

This method is to check whether the rectangle has only valid numbers as values for x, y, height and width. If values are not valid, Sequential Iterator can give incorrect values. (

See also
isNumberInValidRange, ValidNumberRangeValue)
Parameters
numbervalue entered by the user
Returns
true if rect's values is in range, false otherwise

Definition at line 44 of file kis_marker_painter.cpp.

45{
46 return isNumberInValidRange(rect.x())
48 && isNumberInValidRange(rect.width())
49 && isNumberInValidRange(rect.height());
50}
bool isNumberInValidRange(qint32 number)

References isNumberInValidRange().

Member Data Documentation

◆ m_d

const QScopedPointer<Private> KisMarkerPainter::m_d
private

Definition at line 37 of file kis_marker_painter.h.

◆ ValidNumberRangeValue

const qint32 KisMarkerPainter::ValidNumberRangeValue = 2140000000
static

Any number bigger than this or lower than -this is considered invalid.

Definition at line 22 of file kis_marker_painter.h.


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