Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_roundmarkerop.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2016 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#include "kis_roundmarkerop.h"
8
9#include <cmath>
10#include <memory>
11#include <QRect>
12
14#include <KoColor.h>
15#include <KoColorProfile.h>
17
18#include <kis_brush.h>
19#include <kis_global.h>
20#include <kis_paint_device.h>
21#include <kis_painter.h>
22#include <kis_image.h>
23#include <kis_selection.h>
27#include <kis_lod_transform.h>
29#include "kis_marker_painter.h"
30#include "kis_paintop_utils.h"
31
32
33
35 : KisPaintOp(painter)
36 , m_sizeOption(settings.data())
37 , m_spacingOption(settings.data())
38{
39 Q_UNUSED(node);
40
41 Q_ASSERT(settings);
42 Q_ASSERT(painter);
43
44 m_firstRun = true;
45 m_lastRadius = 1.0;
46
47 m_markerOption.read(settings.data());
48}
49
53
55{
56 // Simple error catching
57 if (!painter()->device()) {
58 return KisSpacingInformation(1.0);
59 }
60
61 // get the scaling factor calculated by the size option
62 const qreal lodScale = KisLodTransform::lodToScale(painter()->device());
63 const qreal scale = m_sizeOption.apply(info) * lodScale;
64 const qreal rotation = 0; // TODO
65
66 const qreal diameter = m_markerOption.diameter * scale;
67 qreal radius = 0.5 * diameter;
68
69 if (KisPaintOpUtils::checkSizeTooSmall(scale, diameter, diameter)) return KisSpacingInformation();
70 KisDabShape shape(scale, 1.0, rotation);
71
72 // The position will need subtracting 0.5, but you cannot do this here
73 // because then the mirroring tools get wrong position to mirror
74 // and the mirroring doesn't work well.
75 // Subtracting must happen just before the painting.
76 QPointF pos = info.pos();
77
78 KisMarkerPainter gc(painter()->device(), painter()->paintColor());
79
80 if (m_firstRun) {
81 const QVector<QPointF> points =
83
84 Q_FOREACH(const QPointF &pt, points) {
85 // Subtracting .5 from both dimensions, because the final dab tends to exaggerate towards the lower right.
86 // This aligns it with the brush cursor.
87 gc.fillFullCircle(pt - QPointF(0.5, 0.5), radius);
88 }
89 } else {
92
93 Q_FOREACH(const auto &pair, pairs) {
94 // Subtracting .5 from both dimensions, because the final dab tends to exaggerate towards the lower right.
95 // This aligns it with the brush cursor.
96 gc.fillCirclesDiff(pair.first - QPointF(0.5, 0.5), m_lastRadius,
97 pair.second - QPointF(0.5, 0.5), radius);
98 }
99 }
100
101 m_firstRun = false;
102 m_lastPaintPos = pos;
103 m_lastRadius = radius;
104
105 QRectF dirtyRect(pos.x() - radius, pos.y() - radius,
106 2 * radius, 2 * radius);
107 dirtyRect = kisGrowRect(dirtyRect, 1);
108
109 const QVector<QRect> allDirtyRects =
110 painter()->calculateAllMirroredRects(dirtyRect.toAlignedRect());
111
112 painter()->addDirtyRects(allDirtyRects);
113
114 // QPointF scatteredPos =
115 // m_scatterOption.apply(info,
116 // brush->maskWidth(shape, 0, 0, info),
117 // brush->maskHeight(shape, 0, 0, info));
118
119
120
121 //updateMask(info, scale, rotation, scatteredPos);
122
123 //QPointF newCenterPos = QRectF(m_dstDabRect).center();
131 //QRect srcDabRect = m_dstDabRect.translated((m_lastPaintPos - newCenterPos).toPoint());
132
133 //m_lastPaintPos = newCenterPos;
134
135 KisSpacingInformation spacingInfo = computeSpacing(info, diameter);
136
137 if (m_firstRun) {
138 m_firstRun = false;
139 return spacingInfo;
140 }
141
142
143 return spacingInfo;
144}
145
147{
148 const qreal lodScale = KisLodTransform::lodToScale(painter()->device());
149 const qreal diameter = m_markerOption.diameter * m_sizeOption.apply(info) * lodScale;
150
151 return computeSpacing(info, diameter);
152}
153
155 qreal diameter) const
156{
157 const qreal rotation = 0; // TODO
158 const bool axesFlipped = false; // TODO
159
160 qreal extraSpacingScale = 1.0;
162 extraSpacingScale = m_spacingOption.apply(info);
163 }
164
165 return KisPaintOpUtils::effectiveSpacing(diameter, diameter,
166 extraSpacingScale, true, true, rotation, axesFlipped,
171}
bool isChecked() const
static qreal lodToScale(int levelOfDetail)
void fillFullCircle(const QPointF &center, qreal radius)
void fillCirclesDiff(const QPointF &c1, qreal r1, const QPointF &c2, qreal r2)
const QPointF & pos() const
const QVector< QRect > calculateAllMirroredRects(const QRect &rc)
void addDirtyRects(const QVector< QRect > &rects)
const QVector< QPointF > calculateAllMirroredPoints(const QPointF &pos)
KisSpacingInformation paintAt(const KisPaintInformation &info) override
KisSizeOption m_sizeOption
KisRoundMarkerOpOptionData m_markerOption
KisRoundMarkerOp(KisPaintOpSettingsSP settings, KisPainter *painter, KisNodeSP node, KisImageSP image)
KisSpacingOption m_spacingOption
KisSpacingInformation updateSpacingImpl(const KisPaintInformation &info) const override
KisSpacingInformation computeSpacing(const KisPaintInformation &info, qreal diameter) const
qreal apply(const KisPaintInformation &info) const
qreal apply(const KisPaintInformation &info) const
T kisGrowRect(const T &rect, U offset)
Definition kis_global.h:186
KisSpacingInformation effectiveSpacing(qreal dabWidth, qreal dabHeight, qreal extraScale, bool distanceSpacingEnabled, bool isotropicSpacing, qreal rotation, bool axesFlipped, qreal spacingVal, bool autoSpacingActive, qreal autoSpacingCoeff, qreal lodScale)
bool checkSizeTooSmall(qreal scale, qreal width, qreal height)
KisPainter * painter
bool read(const KisPropertiesConfiguration *setting)