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

#include <kis_colorsmudgeop.h>

+ Inheritance diagram for KisColorSmudgeOp:

Public Member Functions

 KisColorSmudgeOp (const KisPaintOpSettingsSP settings, KisPainter *painter, KisNodeSP node, KisImageSP image)
 
 ~KisColorSmudgeOp () override
 
- Public Member Functions inherited from KisBrushBasedPaintOp
bool canPaint () const override
 Reimplemented, false if brush is 0.
 
bool checkSizeTooSmall (qreal scale)
 
KisSpacingInformation effectiveSpacing (qreal scale) const
 
KisSpacingInformation effectiveSpacing (qreal scale, qreal rotation, const KisAirbrushOptionData *airbrushOption, const KisSpacingOption *spacingOption, const KisPaintInformation &pi) const
 
KisSpacingInformation effectiveSpacing (qreal scale, qreal rotation, const KisPaintInformation &pi) const
 
KisSpacingInformation effectiveSpacing (qreal scale, qreal rotation, const KisSpacingOption &spacingOption, const KisPaintInformation &pi) const
 
 KisBrushBasedPaintOp (const KisPaintOpSettingsSP settings, KisPainter *painter, KisBrushTextureFlags textureFlags=None)
 
 ~KisBrushBasedPaintOp () override
 
- Public Member Functions inherited from KisPaintOp
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 ()
 

Static Public Member Functions

static KisInterstrokeDataFactorycreateInterstrokeDataFactory (const KisPaintOpSettingsSP settings, KisResourcesInterfaceSP resourcesInterface)
 
- Static Public Member Functions inherited from KisBrushBasedPaintOp
static QList< KoResourceLoadResultprepareEmbeddedResources (const KisPaintOpSettingsSP settings, KisResourcesInterfaceSP resourcesInterface)
 
static QList< KoResourceLoadResultprepareLinkedResources (const KisPaintOpSettingsSP settings, KisResourcesInterfaceSP resourcesInterface)
 
- Static Public Member Functions inherited from KisPaintOp
static void splitCoordinate (qreal coordinate, qint32 *whole, qreal *fraction)
 

Protected Member Functions

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

Private Attributes

KisAirbrushOptionData m_airbrushData
 
KisColorRateOption2 m_colorRateOption
 
QRect m_dstDabRect
 
bool m_firstRun
 
KoAbstractGradientSP m_gradient
 
KisGradientOption m_gradientOption
 
QList< KisHSVOption * > m_hsvOptions
 
KoColorTransformationm_hsvTransform {0}
 
QPointF m_lastPaintPos
 
KisOpacityOption m_opacityOption
 
KisSmudgeOverlayModeOptionData m_overlayModeData
 
KoColor m_paintColor
 
KisPaintThicknessOption m_paintThicknessOption
 
KisRateOption m_rateOption
 
KisRatioOption m_ratioOption
 
KisRotationOption m_rotationOption
 
KisScatterOption m_scatterOption
 
KisSizeOption m_sizeOption
 
KisSmudgeRadiusOption2 m_smudgeRadiusOption
 
KisSmudgeLengthOption m_smudgeRateOption
 
KisSpacingOption m_spacingOption
 
QScopedPointer< KisColorSmudgeStrategym_strategy
 

Additional Inherited Members

- 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
 
- Protected Attributes inherited from KisBrushBasedPaintOp
KisBrushSP m_brush
 
KisDabCachem_dabCache
 
KisMirrorOption m_mirrorOption
 
KisPrecisionOption m_precisionOption
 

Detailed Description

Definition at line 41 of file kis_colorsmudgeop.h.

Constructor & Destructor Documentation

◆ KisColorSmudgeOp()

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

color transformation must be created after the color space of m_paintColor has been set up

Definition at line 48 of file kis_colorsmudgeop.cpp.

49 : KisBrushBasedPaintOp(settings, painter)
50 , m_firstRun(true)
51 , m_sizeOption(settings.data())
52 , m_ratioOption(settings.data())
53 , m_opacityOption(settings.data(), node)
54 , m_spacingOption(settings.data())
55 , m_rateOption(settings.data())
56 , m_rotationOption(settings.data())
57 , m_scatterOption(settings.data())
58 , m_paintThicknessOption(settings.data())
59 , m_gradientOption(settings.data())
60 , m_smudgeRateOption(settings.data())
61 , m_colorRateOption(settings.data())
62 , m_smudgeRadiusOption(settings.data())
63{
64 Q_UNUSED(node);
65 Q_ASSERT(painter);
66
67 m_airbrushData.read(settings.data());
68 m_overlayModeData.read(settings.data());
69
71
72 // useNewEngine should be true if brushApplication is not ALPHAMASK
74
75 const bool useSmearAlpha = m_smudgeRateOption.smearAlpha();
76 const bool useDullingMode = m_smudgeRateOption.mode() == KisSmudgeLengthOptionData::DULLING_MODE;
77 const bool useOverlayMode = m_overlayModeData.isChecked;
78
80
81 if (m_brush->brushApplication() == LIGHTNESSMAP) {
82 KisPaintThicknessOptionData::ThicknessMode thicknessMode =
85 KisPaintThicknessOptionData::OVERWRITE;
86
88 useSmearAlpha,
89 useDullingMode,
90 thicknessMode));
91 } else if (m_smudgeRateOption.useNewEngine() &&
92 m_brush->brushApplication() == ALPHAMASK) {
94 image,
95 useSmearAlpha,
96 useDullingMode,
97 useOverlayMode));
98 } else if (m_brush->brushApplication() == IMAGESTAMP ||
99 m_brush->brushApplication() == GRADIENTMAP) {
101 image,
102 useSmearAlpha,
103 useDullingMode,
104 useOverlayMode));
105 } else {
107 image,
108 useSmearAlpha,
109 useDullingMode,
110 useOverlayMode));
111 }
112
113 m_strategy->initializePainting();
114 m_paintColor = painter->paintColor().convertedTo(m_strategy->preciseColorSpace());
115
119
122 Q_FOREACH (KisHSVOption * option, m_hsvOptions) {
123 if (option->isChecked() && !m_hsvTransform) {
124 m_hsvTransform = m_paintColor.colorSpace()->createColorTransformation("hsv_adjustment", QHash<QString, QVariant>());
125 }
126 }
127}
KisBrushBasedPaintOp(const KisPaintOpSettingsSP settings, KisPainter *painter, KisBrushTextureFlags textureFlags=None)
KisSpacingOption m_spacingOption
KisAirbrushOptionData m_airbrushData
KoAbstractGradientSP m_gradient
KisRateOption m_rateOption
KisSmudgeOverlayModeOptionData m_overlayModeData
KisSmudgeRadiusOption2 m_smudgeRadiusOption
QScopedPointer< KisColorSmudgeStrategy > m_strategy
KisColorRateOption2 m_colorRateOption
QList< KisHSVOption * > m_hsvOptions
KisRotationOption m_rotationOption
KisOpacityOption m_opacityOption
KisPaintThicknessOption m_paintThicknessOption
KisGradientOption m_gradientOption
KisScatterOption m_scatterOption
KisSmudgeLengthOption m_smudgeRateOption
KisSizeOption m_sizeOption
KisRatioOption m_ratioOption
KoColorTransformation * m_hsvTransform
bool isChecked() const
static KisHSVOption * createSaturationOption(const KisPropertiesConfiguration *setting)
static KisHSVOption * createValueOption(const KisPropertiesConfiguration *setting)
static KisHSVOption * createHueOption(const KisPropertiesConfiguration *setting)
KisPaintThicknessOptionData::ThicknessMode mode() const
KoColor paintColor
KoAbstractGradientSP gradient
void applyFanCornersInfo(KisPaintOp *op)
KisSmudgeLengthOptionData::Mode mode() const
KoColorTransformation * createColorTransformation(const QString &id, const QHash< QString, QVariant > &parameters) const
KoColor convertedTo(const KoColorSpace *cs, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags) const
Definition KoColor.cpp:163
const KoColorSpace * colorSpace() const
return the current colorSpace
Definition KoColor.h:82
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:130
@ ALPHAMASK
Definition kis_brush.h:39
@ IMAGESTAMP
Definition kis_brush.h:40
@ GRADIENTMAP
Definition kis_brush.h:42
@ LIGHTNESSMAP
Definition kis_brush.h:41
bool read(const KisPropertiesConfiguration *setting)
KisPainter * painter
bool read(const KisPropertiesConfiguration *setting)

References ALPHAMASK, KisRotationOption::applyFanCornersInfo(), KoColor::colorSpace(), KoColor::convertedTo(), KoColorSpace::createColorTransformation(), KisHSVOption::createHueOption(), KisHSVOption::createSaturationOption(), KisHSVOption::createValueOption(), KisSharedPtr< T >::data(), KisPainter::gradient, GRADIENTMAP, IMAGESTAMP, KisSmudgeOverlayModeOptionData::isChecked, KisCurveOption::isChecked(), KIS_SAFE_ASSERT_RECOVER_NOOP, LIGHTNESSMAP, m_airbrushData, KisBrushBasedPaintOp::m_brush, m_gradient, m_hsvOptions, m_hsvTransform, m_overlayModeData, m_paintColor, m_paintThicknessOption, m_rotationOption, m_smudgeRateOption, m_strategy, KisPaintThicknessOption::mode(), KisSmudgeLengthOption::mode(), KisPainter::paintColor, KisPaintOp::painter, KisSmudgeOverlayModeOptionData::read(), KisAirbrushOptionData::read(), KisSmudgeLengthOption::smearAlpha(), and KisSmudgeLengthOption::useNewEngine().

◆ ~KisColorSmudgeOp()

KisColorSmudgeOp::~KisColorSmudgeOp ( )
override

Definition at line 129 of file kis_colorsmudgeop.cpp.

130{
131 qDeleteAll(m_hsvOptions);
132 delete m_hsvTransform;
133}

References m_hsvOptions, and m_hsvTransform.

Member Function Documentation

◆ createInterstrokeDataFactory()

KisInterstrokeDataFactory * KisColorSmudgeOp::createInterstrokeDataFactory ( const KisPaintOpSettingsSP settings,
KisResourcesInterfaceSP resourcesInterface )
static

Definition at line 242 of file kis_colorsmudgeop.cpp.

243{
244
245 KisBrushOptionProperties brushOption;
246 const bool needsInterstrokeData =
247 brushOption.brushApplication(settings.data(), resourcesInterface) == LIGHTNESSMAP;
248
249 const bool needsNewEngine = settings->getBool(QString("SmudgeRate") + "UseNewEngine", false);
250 KIS_SAFE_ASSERT_RECOVER_NOOP(!needsInterstrokeData || needsNewEngine);
251
252 return needsInterstrokeData ? new ColorSmudgeInterstrokeDataFactory() : 0;
253}
enumBrushApplication brushApplication(const KisPropertiesConfiguration *settings, KisResourcesInterfaceSP resourcesInterface)

References KisBrushOptionProperties::brushApplication(), KisSharedPtr< T >::data(), KIS_SAFE_ASSERT_RECOVER_NOOP, and LIGHTNESSMAP.

◆ paintAt()

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

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

Disable handling of the subpixel precision. In the smudge op we should read from the aligned areas of the image, so having additional internal offsets, created by the subpixel precision, will worsen the quality (at least because QRectF(m_dstDabRect).center() will not point to the real center of the brush anymore). Of course, this only really matters with smearing_mode (bug:327235), and you only notice the lack of subpixel precision in the dulling methods.

Save the center of the current dab to know where to read the data during the next pass. We do not save scatteredPos here, because it may differ slightly from the real center of the brush (due to rounding effects), which will result in a really weird quality.

Implements KisPaintOp.

Definition at line 135 of file kis_colorsmudgeop.cpp.

136{
137 KisBrushSP brush = m_brush;
138
139 // Simple error catching
140 if (!painter()->device() || !brush || !brush->canPaintFor(info)) {
141 return KisSpacingInformation(1.0);
142 }
143 if (m_smudgeRateOption.mode() == KisSmudgeLengthOptionData::SMEARING_MODE) {
155 }
156
157 // get the scaling factor calculated by the size option
158 qreal scale = m_sizeOption.apply(info);
160 qreal rotation = m_rotationOption.apply(info);
161 if (checkSizeTooSmall(scale)) return KisSpacingInformation();
162
163 qreal ratio = m_ratioOption.apply(info);
164
165 KisDabShape shape(scale, ratio, rotation);
166
167 QPointF scatteredPos =
169 brush->maskWidth(shape, 0, 0, info),
170 brush->maskHeight(shape, 0, 0, info));
171
172 const qreal smudgeRadiusPortion = m_smudgeRadiusOption.isChecked() ? m_smudgeRadiusOption.computeSizeLikeValue(info) : 0.0;
173
174 KisSpacingInformation spacingInfo =
175 effectiveSpacing(scale, rotation,
177
179
180
181 const qreal paintThickness = m_paintThicknessOption.apply(info);
182 m_strategy->updateMask(m_dabCache, info, shape, scatteredPos, &m_dstDabRect, paintThickness);
183
184 QPointF newCenterPos = QRectF(m_dstDabRect).center();
192 QRect srcDabRect = m_dstDabRect.translated((m_lastPaintPos - newCenterPos).toPoint());
193
194 m_lastPaintPos = newCenterPos;
195
196 if (m_firstRun) {
197 m_firstRun = false;
198 return spacingInfo;
199 }
200
201 const qreal colorRate = m_colorRateOption.isChecked() ? m_colorRateOption.computeSizeLikeValue(info) : 0.0;
202 const qreal smudgeRate = m_smudgeRateOption.isChecked() ? m_smudgeRateOption.computeSizeLikeValue(info) : 1.0;
203 const qreal maxSmudgeRate = m_smudgeRateOption.strengthValue();
204 const qreal fpOpacity = m_opacityOption.apply(info);
205
206 KoColor paintColor = m_paintColor;
207
208 m_gradientOption.apply(paintColor, m_gradient, info);
209 if (m_hsvTransform) {
210 Q_FOREACH (KisHSVOption *option, m_hsvOptions) {
211 option->apply(m_hsvTransform, info);
212 }
213 m_hsvTransform->transform(paintColor.data(), paintColor.data(), 1);
214 }
215
216 const QVector<QRect> dirtyRects =
217 m_strategy->paintDab(srcDabRect, m_dstDabRect,
218 paintColor,
219 fpOpacity, colorRate,
220 smudgeRate,
221 maxSmudgeRate,
222 paintThickness,
223 smudgeRadiusPortion);
224
225 painter()->addDirtyRects(dirtyRects);
226
227 return spacingInfo;
228}
KisSpacingInformation effectiveSpacing(qreal scale) const
qreal strengthValue() const
qreal computeSizeLikeValue(const KisPaintInformation &info, bool useStrengthValue=true) const
void apply(KoColor &color, const KoAbstractGradientSP gradient, const KisPaintInformation &info) const
void apply(KoColorTransformation *transfo, const KisPaintInformation &info) const
static qreal lodToScale(int levelOfDetail)
void apply(KisPainter *painter, const KisPaintInformation &info) const
qreal apply(const KisPaintInformation &info) const
void addDirtyRects(const QVector< QRect > &rects)
qreal apply(const KisPaintInformation &info) const
QPointF apply(const KisPaintInformation &info, qreal width, qreal height) const
qreal apply(const KisPaintInformation &info) const
virtual void transform(const quint8 *src, quint8 *dst, qint32 nPixels) const =0
quint8 * data()
Definition KoColor.h:144
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:129

References KisPainter::addDirtyRects(), KisPaintThicknessOption::apply(), KisRotationOption::apply(), KisStandardOption< Data >::apply(), KisScatterOption::apply(), KisOpacityOption::apply(), KisGradientOption::apply(), KisHSVOption::apply(), KisBrushBasedPaintOp::checkSizeTooSmall(), KisCurveOption::computeSizeLikeValue(), KoColor::data(), KisDabCacheBase::disableSubpixelPrecision(), KisBrushBasedPaintOp::effectiveSpacing(), KisCurveOption::isChecked(), KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE, KisLodTransformBase::lodToScale(), m_airbrushData, KisBrushBasedPaintOp::m_brush, m_colorRateOption, KisBrushBasedPaintOp::m_dabCache, m_dstDabRect, m_firstRun, m_gradient, m_gradientOption, m_hsvOptions, m_hsvTransform, m_lastPaintPos, m_opacityOption, m_paintColor, m_paintThicknessOption, m_ratioOption, m_rotationOption, m_scatterOption, m_sizeOption, m_smudgeRadiusOption, m_smudgeRateOption, m_spacingOption, m_strategy, KisSmudgeLengthOption::mode(), KisPaintOp::painter, KisCurveOption::strengthValue(), and KoColorTransformation::transform().

◆ updateSpacingImpl()

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

Implementation of a spacing update

Implements KisPaintOp.

Definition at line 230 of file kis_colorsmudgeop.cpp.

231{
232 const qreal scale = m_sizeOption.apply(info) * KisLodTransform::lodToScale(painter()->device());
233 const qreal rotation = m_rotationOption.apply(info);
234 return effectiveSpacing(scale, rotation, &m_airbrushData, &m_spacingOption, info);
235}

References KisRotationOption::apply(), KisStandardOption< Data >::apply(), KisBrushBasedPaintOp::effectiveSpacing(), KisLodTransformBase::lodToScale(), m_airbrushData, m_rotationOption, m_sizeOption, m_spacingOption, and KisPaintOp::painter.

◆ updateTimingImpl()

KisTimingInformation KisColorSmudgeOp::updateTimingImpl ( const KisPaintInformation & info) const
overrideprotectedvirtual

Implementation of a timing update. The default implementation always disables timing. This is suitable for paintops that do not support airbrushing.

Reimplemented from KisPaintOp.

Definition at line 237 of file kis_colorsmudgeop.cpp.

238{
240}
KisTimingInformation effectiveTiming(const KisAirbrushOptionData *airbrushOption, const KisRateOption *rateOption, const KisPaintInformation &pi)

References KisPaintOpPluginUtils::effectiveTiming(), m_airbrushData, and m_rateOption.

Member Data Documentation

◆ m_airbrushData

KisAirbrushOptionData KisColorSmudgeOp::m_airbrushData
private

Definition at line 74 of file kis_colorsmudgeop.h.

◆ m_colorRateOption

KisColorRateOption2 KisColorSmudgeOp::m_colorRateOption
private

Definition at line 70 of file kis_colorsmudgeop.h.

◆ m_dstDabRect

QRect KisColorSmudgeOp::m_dstDabRect
private

Definition at line 77 of file kis_colorsmudgeop.h.

◆ m_firstRun

bool KisColorSmudgeOp::m_firstRun
private

Definition at line 56 of file kis_colorsmudgeop.h.

◆ m_gradient

KoAbstractGradientSP KisColorSmudgeOp::m_gradient
private

Definition at line 59 of file kis_colorsmudgeop.h.

◆ m_gradientOption

KisGradientOption KisColorSmudgeOp::m_gradientOption
private

Definition at line 68 of file kis_colorsmudgeop.h.

◆ m_hsvOptions

QList<KisHSVOption*> KisColorSmudgeOp::m_hsvOptions
private

Definition at line 73 of file kis_colorsmudgeop.h.

◆ m_hsvTransform

KoColorTransformation* KisColorSmudgeOp::m_hsvTransform {0}
private

Definition at line 80 of file kis_colorsmudgeop.h.

80{0};

◆ m_lastPaintPos

QPointF KisColorSmudgeOp::m_lastPaintPos
private

Definition at line 78 of file kis_colorsmudgeop.h.

◆ m_opacityOption

KisOpacityOption KisColorSmudgeOp::m_opacityOption
private

Definition at line 62 of file kis_colorsmudgeop.h.

◆ m_overlayModeData

KisSmudgeOverlayModeOptionData KisColorSmudgeOp::m_overlayModeData
private

Definition at line 75 of file kis_colorsmudgeop.h.

◆ m_paintColor

KoColor KisColorSmudgeOp::m_paintColor
private

Definition at line 58 of file kis_colorsmudgeop.h.

◆ m_paintThicknessOption

KisPaintThicknessOption KisColorSmudgeOp::m_paintThicknessOption
private

Definition at line 67 of file kis_colorsmudgeop.h.

◆ m_rateOption

KisRateOption KisColorSmudgeOp::m_rateOption
private

Definition at line 64 of file kis_colorsmudgeop.h.

◆ m_ratioOption

KisRatioOption KisColorSmudgeOp::m_ratioOption
private

Definition at line 61 of file kis_colorsmudgeop.h.

◆ m_rotationOption

KisRotationOption KisColorSmudgeOp::m_rotationOption
private

Definition at line 65 of file kis_colorsmudgeop.h.

◆ m_scatterOption

KisScatterOption KisColorSmudgeOp::m_scatterOption
private

Definition at line 66 of file kis_colorsmudgeop.h.

◆ m_sizeOption

KisSizeOption KisColorSmudgeOp::m_sizeOption
private

Definition at line 60 of file kis_colorsmudgeop.h.

◆ m_smudgeRadiusOption

KisSmudgeRadiusOption2 KisColorSmudgeOp::m_smudgeRadiusOption
private

Definition at line 71 of file kis_colorsmudgeop.h.

◆ m_smudgeRateOption

KisSmudgeLengthOption KisColorSmudgeOp::m_smudgeRateOption
private

Definition at line 69 of file kis_colorsmudgeop.h.

◆ m_spacingOption

KisSpacingOption KisColorSmudgeOp::m_spacingOption
private

Definition at line 63 of file kis_colorsmudgeop.h.

◆ m_strategy

QScopedPointer<KisColorSmudgeStrategy> KisColorSmudgeOp::m_strategy
private

Definition at line 81 of file kis_colorsmudgeop.h.


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