Krita Source Code Documentation
Loading...
Searching...
No Matches
KisPaintOpUtils Namespace Reference

Classes

class  PositionHistory
 

Functions

QPointF calcAutoSpacing (const QPointF &pt, qreal coeff, qreal lodScale)
 
qreal calcAutoSpacing (qreal value, qreal coeff)
 
bool checkSizeTooSmall (qreal scale, qreal width, qreal height)
 
KisSpacingInformation effectiveSpacing (qreal dabWidth, qreal dabHeight, qreal extraScale, bool distanceSpacingEnabled, bool isotropicSpacing, qreal rotation, bool axesFlipped, qreal spacingVal, bool autoSpacingActive, qreal autoSpacingCoeff, qreal lodScale)
 
KisTimingInformation effectiveTiming (bool timingEnabled, qreal timingInterval, qreal rateExtraScale)
 
template<class PaintOp >
bool paintFan (PaintOp &op, const KisPaintInformation &pi1, const KisPaintInformation &pi2, KisDistanceInformation *currentDistance, qreal fanCornersStep)
 
template<class PaintOp >
void paintLine (PaintOp &op, const KisPaintInformation &pi1, const KisPaintInformation &pi2, KisDistanceInformation *currentDistance, bool fanCornersEnabled, qreal fanCornersStep)
 
QVector< QRect > splitAndFilterDabRect (const QRect &totalRect, const QVector< QRect > &dabRects, int idealPatchSize)
 
QVector< QRect > splitDabsIntoRects (const QVector< QRect > &dabRects, int idealNumRects, int diameter, qreal spacing)
 

Variables

const char MaskingBrushCompositeOpTag [] = "MaskingBrush/MaskingCompositeOp"
 
const char MaskingBrushEnabledTag [] = "MaskingBrush/Enabled"
 
const char MaskingBrushMasterSizeCoeffTag [] = "MaskingBrush/MasterSizeCoeff"
 
const char MaskingBrushPaintOpId [] = "paintbrush"
 
const char MaskingBrushPresetPrefix [] = "MaskingBrush/Preset/"
 
const char MaskingBrushUseMasterSizeTag [] = "MaskingBrush/UseMasterSize"
 

Function Documentation

◆ calcAutoSpacing() [1/2]

QPointF KisPaintOpUtils::calcAutoSpacing ( const QPointF & pt,
qreal coeff,
qreal lodScale )
inline

Definition at line 167 of file kis_paintop_utils.h.

168{
169 const qreal invLodScale = 1.0 / lodScale;
170 const QPointF lod0Point = invLodScale * pt;
171
172 return lodScale * QPointF(calcAutoSpacing(lod0Point.x(), coeff), calcAutoSpacing(lod0Point.y(), coeff));
173}
qreal calcAutoSpacing(qreal value, qreal coeff)

References calcAutoSpacing().

◆ calcAutoSpacing() [2/2]

qreal KisPaintOpUtils::calcAutoSpacing ( qreal value,
qreal coeff )
inline

Definition at line 162 of file kis_paintop_utils.h.

163{
164 return coeff * (value < 1.0 ? value : sqrt(value));
165}
float value(const T *src, size_t ch)

References value().

◆ checkSizeTooSmall()

bool KisPaintOpUtils::checkSizeTooSmall ( qreal scale,
qreal width,
qreal height )
inline

Definition at line 157 of file kis_paintop_utils.h.

158{
159 return scale * width < 0.01 || scale * height < 0.01;
160}

◆ effectiveSpacing()

KRITAIMAGE_EXPORT KisSpacingInformation KisPaintOpUtils::effectiveSpacing ( qreal dabWidth,
qreal dabHeight,
qreal extraScale,
bool distanceSpacingEnabled,
bool isotropicSpacing,
qreal rotation,
bool axesFlipped,
qreal spacingVal,
bool autoSpacingActive,
qreal autoSpacingCoeff,
qreal lodScale )

Definition at line 18 of file kis_paintop_utils.cpp.

19{
20 QPointF spacing;
21
22 if (!isotropicSpacing) {
23 if (autoSpacingActive) {
24 spacing = calcAutoSpacing(QPointF(dabWidth, dabHeight), autoSpacingCoeff, lodScale);
25 } else {
26 spacing = QPointF(dabWidth, dabHeight);
27 spacing *= spacingVal;
28 }
29 }
30 else {
31 qreal significantDimension = qMax(dabWidth, dabHeight);
32 if (autoSpacingActive) {
33 significantDimension = calcAutoSpacing(significantDimension, autoSpacingCoeff);
34 } else {
35 significantDimension *= spacingVal;
36 }
37 spacing = QPointF(significantDimension, significantDimension);
38 rotation = 0.0;
39 axesFlipped = false;
40 }
41
42 spacing *= extraScale;
43
44 return KisSpacingInformation(distanceSpacingEnabled, spacing, rotation, axesFlipped);
45}

References calcAutoSpacing().

◆ effectiveTiming()

KRITAIMAGE_EXPORT KisTimingInformation KisPaintOpUtils::effectiveTiming ( bool timingEnabled,
qreal timingInterval,
qreal rateExtraScale )

Definition at line 47 of file kis_paintop_utils.cpp.

48{
49
50 if (!timingEnabled) {
51 return KisTimingInformation();
52 }
53 else {
54 qreal scaledInterval = rateExtraScale <= 0.0 ? LONG_TIME : timingInterval / rateExtraScale;
55 return KisTimingInformation(scaledInterval);
56 }
57}
const qreal LONG_TIME

References LONG_TIME.

◆ paintFan()

template<class PaintOp >
bool KisPaintOpUtils::paintFan ( PaintOp & op,
const KisPaintInformation & pi1,
const KisPaintInformation & pi2,
KisDistanceInformation * currentDistance,
qreal fanCornersStep )

Definition at line 23 of file kis_paintop_utils.h.

28{
29 const qreal angleStep = fanCornersStep;
30 const qreal initialAngle = currentDistance->lastDrawingAngle();
31 const qreal finalAngle = pi2.drawingAngleSafe(*currentDistance);
32 const qreal fullDistance = shortestAngularDistance(initialAngle,
33 finalAngle);
34 qreal lastAngle = initialAngle;
35
36 int i = 0;
37
38 while (shortestAngularDistance(lastAngle, finalAngle) > angleStep) {
39 lastAngle = incrementInDirection(lastAngle, angleStep, finalAngle);
40
41 qreal t = angleStep * i++ / fullDistance;
42
43 QPointF pt = pi1.pos() + t * (pi2.pos() - pi1.pos());
45 pi.overrideDrawingAngle(lastAngle);
46 pi.paintAt(op, currentDistance);
47 }
48
49 return i;
50}
const QPointF & pos() const
qreal drawingAngleSafe(const KisDistanceInformation &distance) const
XXX !!! :-| Please add dox!
static KisPaintInformation mix(const QPointF &p, qreal t, const KisPaintInformation &p1, const KisPaintInformation &p2)
qreal incrementInDirection(qreal a, qreal inc, qreal direction)
Definition kis_global.h:147
qreal shortestAngularDistance(qreal a, qreal b)
Definition kis_global.h:140

References KisPaintInformation::drawingAngleSafe(), incrementInDirection(), KisDistanceInformation::lastDrawingAngle(), KisPaintInformation::mix(), KisPaintInformation::pos(), and shortestAngularDistance().

◆ paintLine()

template<class PaintOp >
void KisPaintOpUtils::paintLine ( PaintOp & op,
const KisPaintInformation & pi1,
const KisPaintInformation & pi2,
KisDistanceInformation * currentDistance,
bool fanCornersEnabled,
qreal fanCornersStep )

A bit complicated part to ensure the registration of the distance information is done in right order

Definition at line 54 of file kis_paintop_utils.h.

60{
61 QPointF end = pi2.pos();
62 qreal endTime = pi2.currentTime();
63
64 KisPaintInformation pi = pi1;
65 qreal t = 0.0;
66
67 while ((t = currentDistance->getNextPointPosition(pi.pos(), end, pi.currentTime(), endTime)) >= 0.0) {
68 pi = KisPaintInformation::mix(t, pi, pi2);
69
70 if (fanCornersEnabled &&
71 currentDistance->hasLastPaintInformation()) {
72
73 paintFan(op,
74 currentDistance->lastPaintInformation(),
75 pi,
76 currentDistance,
77 fanCornersStep);
78 }
79
84 pi.paintAt(op, currentDistance);
85 }
86
87 /*
88 * Perform spacing and/or timing updates between dabs if appropriate. Typically, this will not
89 * happen if the above loop actually painted anything. This is because the
90 * getNextPointPosition() call before the paint operation will reset the accumulators in
91 * currentDistance and therefore make needsSpacingUpdate() and needsTimingUpdate() false. The
92 * temporal distance between pi1 and pi2 is typically too small for the accumulators to build
93 * back up enough to require a spacing or timing update after that. (The accumulated time values
94 * are updated not during the paint operation, but during the call to getNextPointPosition(),
95 * that is, updated during every paintLine() call.)
96 */
97 if (currentDistance->needsSpacingUpdate()) {
98 op.updateSpacing(pi2, *currentDistance);
99 }
100 if (currentDistance->needsTimingUpdate()) {
101 op.updateTiming(pi2, *currentDistance);
102 }
103}
void paintAt(PaintOp &op, KisDistanceInformation *distanceInfo)
qreal currentTime() const
Number of ms since the beginning of the stroke.
bool paintFan(PaintOp &op, const KisPaintInformation &pi1, const KisPaintInformation &pi2, KisDistanceInformation *currentDistance, qreal fanCornersStep)
KisPaintInformation lastPaintInformation
qreal getNextPointPosition(const QPointF &start, const QPointF &end, qreal startTime, qreal endTime)

References KisPaintInformation::currentTime(), KisDistanceInformation::getNextPointPosition(), KisDistanceInformation::hasLastPaintInformation(), KisDistanceInformation::lastPaintInformation, KisPaintInformation::mix(), KisDistanceInformation::needsSpacingUpdate(), KisDistanceInformation::needsTimingUpdate(), KisPaintInformation::paintAt(), paintFan(), and KisPaintInformation::pos().

◆ splitAndFilterDabRect()

KRITAIMAGE_EXPORT QVector< QRect > KisPaintOpUtils::splitAndFilterDabRect ( const QRect & totalRect,
const QVector< QRect > & dabRects,
int idealPatchSize )

Definition at line 59 of file kis_paintop_utils.cpp.

60{
61 QVector<QRect> rects = KritaUtils::splitRectIntoPatches(totalRect, QSize(idealPatchSize,idealPatchSize));
62
64 [dabRects] (const QRect &rc) {
65 Q_FOREACH (const QRect &dab, dabRects) {
66 if (dab.intersects(rc)) {
67 return true;
68 }
69 }
70 return false;
71 });
72 return rects;
73}
QVector< QRect > splitRectIntoPatches(const QRect &rc, const QSize &patchSize)
auto filterContainer(C &container, KeepIfFunction keepIf) -> decltype(bool(keepIf(container[0])), void())

References KritaUtils::filterContainer(), and KritaUtils::splitRectIntoPatches().

◆ splitDabsIntoRects()

KRITAIMAGE_EXPORT QVector< QRect > KisPaintOpUtils::splitDabsIntoRects ( const QVector< QRect > & dabRects,
int idealNumRects,
int diameter,
qreal spacing )

Definition at line 75 of file kis_paintop_utils.cpp.

76{
77 const QRect totalRect =
78 std::accumulate(dabRects.begin(), dabRects.end(), QRect(), std::bit_or<QRect>());
79
80 constexpr int minPatchSize = 128;
81 constexpr int maxPatchSize = 512;
82 constexpr int patchStep = 64;
83 constexpr int halfPatchStep = patchStep >> 1;
84
85
86 int idealPatchSize = qBound(minPatchSize,
87 (int(diameter * (2.0 - spacing)) + halfPatchStep) & ~(patchStep - 1),
88 maxPatchSize);
89
90
91 QVector<QRect> rects = splitAndFilterDabRect(totalRect, dabRects, idealPatchSize);
92
93 while (rects.size() < idealNumRects && idealPatchSize >minPatchSize) {
94 idealPatchSize = qMax(minPatchSize, idealPatchSize - patchStep);
95 rects = splitAndFilterDabRect(totalRect, dabRects, idealPatchSize);
96 }
97
98 return rects;
99}
QVector< QRect > splitAndFilterDabRect(const QRect &totalRect, const QVector< QRect > &dabRects, int idealPatchSize)

References splitAndFilterDabRect().

Variable Documentation

◆ MaskingBrushCompositeOpTag

KRITAIMAGE_EXPORT const char KisPaintOpUtils::MaskingBrushCompositeOpTag = "MaskingBrush/MaskingCompositeOp"

Definition at line 13 of file KisPaintopSettingsIds.cpp.

◆ MaskingBrushEnabledTag

KRITAIMAGE_EXPORT const char KisPaintOpUtils::MaskingBrushEnabledTag = "MaskingBrush/Enabled"

Definition at line 12 of file KisPaintopSettingsIds.cpp.

◆ MaskingBrushMasterSizeCoeffTag

KRITAIMAGE_EXPORT const char KisPaintOpUtils::MaskingBrushMasterSizeCoeffTag = "MaskingBrush/MasterSizeCoeff"

Definition at line 15 of file KisPaintopSettingsIds.cpp.

◆ MaskingBrushPaintOpId

KRITAIMAGE_EXPORT const char KisPaintOpUtils::MaskingBrushPaintOpId = "paintbrush"

Definition at line 11 of file KisPaintopSettingsIds.cpp.

◆ MaskingBrushPresetPrefix

KRITAIMAGE_EXPORT const char KisPaintOpUtils::MaskingBrushPresetPrefix = "MaskingBrush/Preset/"

Definition at line 16 of file KisPaintopSettingsIds.cpp.

◆ MaskingBrushUseMasterSizeTag

KRITAIMAGE_EXPORT const char KisPaintOpUtils::MaskingBrushUseMasterSizeTag = "MaskingBrush/UseMasterSize"

Definition at line 14 of file KisPaintopSettingsIds.cpp.