Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_curve_paintop.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2008-2011 Lukáš Tvrdý <lukast.dev@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#include "kis_curve_paintop.h"
8
9#include <cmath>
10
11#include <QPainterPath>
12#include <QRect>
13
14#include <kis_image.h>
15#include <kis_debug.h>
16#include "kis_global.h"
17#include "kis_paint_device.h"
18#include "kis_painter.h"
19#include "kis_types.h"
21#include <kis_lod_transform.h>
23
24
26 : KisPaintOp(painter)
27 , m_opacityOption(settings.data(), node)
28 , m_lineWidthOption(settings.data())
29 , m_curvesOpacityOption(settings.data())
30 , m_painter(0)
31{
32 Q_ASSERT(settings);
33 Q_UNUSED(image);
34 Q_UNUSED(node);
35
36 m_curveOpOption.read(settings.data());
37}
38
43
48
50{
51 Q_UNUSED(info);
52 return KisSpacingInformation(1.0);
53}
54
56{
57 Q_UNUSED(currentDistance);
58 if (!painter()) return;
59
60 if (!m_dab) {
62 }
63 else {
64 m_dab->clear();
65 }
66
67 paintLine(m_dab, pi1, pi2);
68
69 QRect rc = m_dab->extent();
70
72 painter()->bitBlt(rc.topLeft(), m_dab, rc);
74}
75
77{
78 if (!m_painter) {
80 m_painter->setPaintColor(painter()->paintColor());
81 }
82
84
85 m_points.append(pi2.pos());
86
87 while (m_points.length() > maxPoints) {
88 m_points.removeFirst();
89 }
90
91 const qreal additionalScale = KisLodTransform::lodToScale(painter()->device());
92 const qreal lineWidth = additionalScale * m_lineWidthOption.apply(pi2) * m_curveOpOption.curve_line_width;
93
94 QPen pen(QBrush(Qt::white), lineWidth);
95 QPainterPath path;
96
98 path.moveTo(pi1.pos());
99 path.lineTo(pi2.pos());
100 m_painter->drawPainterPath(path, pen);
101 path = QPainterPath();
102 }
103
104 if (m_points.length() >= maxPoints) {
105 // alpha * 0.2;
106 path.moveTo(m_points.first());
107
109 path.quadTo(m_points.at(maxPoints / 2), m_points.last());
110 }
111 else {
112 // control point is at 1/3 of the history, 2/3 of the history and endpoint at 3/3
113 int step = maxPoints / 3;
114 path.cubicTo(m_points.at(step), m_points.at(step + step), m_points.last());
115 }
116
118 m_painter->setOpacityF(curveOpacity);
119 m_painter->drawPainterPath(path, pen);
121 }
122}
KisPaintDeviceSP m_dab
KisPainter * m_painter
~KisCurvePaintOp() override
KisOpacityOption m_opacityOption
KisCurveOpOptionData m_curveOpOption
void paintLine(const KisPaintInformation &pi1, const KisPaintInformation &pi2, KisDistanceInformation *currentDistance) override
QList< QPointF > m_points
KisCurvesOpacityOption m_curvesOpacityOption
KisCurvePaintOp(const KisPaintOpSettingsSP settings, KisPainter *painter, KisNodeSP node, KisImageSP image)
KisSpacingInformation updateSpacingImpl(const KisPaintInformation &info) const override
KisLineWidthOption m_lineWidthOption
KisSpacingInformation paintAt(const KisPaintInformation &info) override
static qreal lodToScale(int levelOfDetail)
void apply(KisPainter *painter, const KisPaintInformation &info) const
virtual void clear()
KisPaintDeviceSP createCompositionSourceDevice() const
QRect extent() const
const QPointF & pos() const
void drawPainterPath(const QPainterPath &path, const QPen &pen, const QRect &requestedRect)
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 setOpacityToUnit()
void setPaintColor(const KoColor &color)
qreal apply(const KisPaintInformation &info) const
bool read(const KisPropertiesConfiguration *setting)
KisPainter * painter
KisFixedPaintDeviceSP dab
KisPaintDeviceSP source() const