Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_spray_paintop.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2008-2012 Lukáš Tvrdý <lukast.dev@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#include "kis_spray_paintop.h"
9
10#include <cmath>
11
12#include <QRect>
13#include <kis_global.h>
14#include <kis_paint_device.h>
15#include <kis_painter.h>
16#include <kis_types.h>
18#include <kis_node.h>
19
21#include <kis_brush_option.h>
22#include <kis_lod_transform.h>
25
26
28 : KisPaintOp(painter)
29 , m_sprayOpOption(settings.data())
30 , m_isPresetValid(true)
31 , m_rotationOption(settings.data())
32 , m_sizeOption(settings.data())
33 , m_opacityOption(settings.data(), node)
34 , m_rateOption(settings.data())
35 , m_node(node)
36
37{
38 Q_ASSERT(settings);
39 Q_ASSERT(painter);
40 Q_UNUSED(image);
41
42 m_airbrushData.read(settings.data());
43
44 m_brushOption.readOptionSetting(settings, settings->resourcesInterface(), settings->canvasResourcesInterface());
45
46 m_colorProperties.read(settings.data());
47 // create the actual distribution objects
49 // first load tip properties as shape properties are dependent on diameter/scale/aspect
50 m_shapeProperties.read(settings.data());
51
52 // TODO: what to do with proportional sizes?
54
56 // in case the preset does not contain the definition for KisBrush
57 m_isPresetValid = false;
58 dbgKrita << "Preset is not valid. Painting is not possible. Use the preset editor to fix current brush engine preset.";
59 }
60
63
65
66 // spacing
67 if ((m_sprayOpOption.data.diameter * 0.5) > 1) {
69 }
70 else {
71 m_ySpacing = m_xSpacing = 1.0;
72 }
74}
75
79
81{
82 KisBrushOptionProperties brushOption;
83 return brushOption.prepareLinkedResources(settings, resourcesInterface);
84}
85
87{
88 if (!painter() || !m_isPresetValid) {
90 }
91
92 if (!m_dab) {
94 }
95 else {
96 m_dab->clear();
97 }
98
99 qreal rotation = m_rotationOption.apply(info);
101 // Spray Brush is capable of working with zero scale,
102 // so no additional checks for 'zero'ness are needed
103 const qreal scale = m_sizeOption.apply(info);
104 const qreal lodScale = KisLodTransform::lodToScale(painter()->device());
105
106
109 info,
110 rotation,
111 scale, lodScale,
112 painter()->paintColor(),
113 painter()->backgroundColor());
114
115 QRect rc = m_dab->extent();
116 painter()->bitBlt(rc.topLeft(), m_dab, rc);
118
119 return computeSpacing(info, lodScale);
120}
121
126
131
133 qreal lodScale) const
134{
135 return KisPaintOpPluginUtils::effectiveSpacing(1.0, 1.0, true, 0.0, false,
136 m_spacing * lodScale, false, 1.0, lodScale,
137 &m_airbrushData, nullptr, info);
138}
static qreal lodToScale(int levelOfDetail)
void apply(KisPainter *painter, const KisPaintInformation &info) const
virtual void clear()
KisPaintDeviceSP createCompositionSourceDevice() const
QRect extent() const
void renderMirrorMask(QRect rc, KisFixedPaintDeviceSP dab)
void bitBlt(qint32 dstX, qint32 dstY, const KisPaintDeviceSP srcDev, qint32 srcX, qint32 srcY, qint32 srcWidth, qint32 srcHeight)
QList< KoResourceLoadResult > prepareLinkedResources(const KisPropertiesConfigurationPointer settings, KisResourcesInterfaceSP resourcesInterface) const
void readOptionSetting(KisPropertiesConfigurationPointer settings, KisResourcesInterfaceSP resourcesInterface, KoCanvasResourcesInterfaceSP canvasResourcesInterface)
qreal apply(const KisPaintInformation &info) const
KisSprayOpOptionData data
KisSpacingInformation paintAt(const KisPaintInformation &info) override
KisPaintDeviceSP m_dab
KisTimingInformation updateTimingImpl(const KisPaintInformation &info) const override
KisSprayOpOption m_sprayOpOption
KisOpacityOption m_opacityOption
KisBrushOptionProperties m_brushOption
KisSpacingInformation updateSpacingImpl(const KisPaintInformation &info) const override
KisRotationOption m_rotationOption
SprayBrush m_sprayBrush
static QList< KoResourceLoadResult > prepareLinkedResources(const KisPaintOpSettingsSP settings, KisResourcesInterfaceSP resourcesInterface)
~KisSprayPaintOp() override
KisSprayPaintOp(const KisPaintOpSettingsSP settings, KisPainter *painter, KisNodeSP node, KisImageSP image)
KisAirbrushOptionData m_airbrushData
KisSprayShapeDynamicsOptionData m_shapeDynamicsProperties
KisColorOptionData m_colorProperties
KisSpacingInformation computeSpacing(const KisPaintInformation &info, qreal lodScale) const
KisSprayShapeOptionData m_shapeProperties
KisSizeOption m_sizeOption
KisRateOption m_rateOption
qreal apply(const KisPaintInformation &info) const
void setFixedDab(KisFixedPaintDeviceSP dab)
void setProperties(KisSprayOpOptionData *properties, KisColorOptionData *colorProperties, KisSprayShapeOptionData *shapeProperties, KisSprayShapeDynamicsOptionData *shapeDynamicsProperties, KisBrushSP brush)
void paint(KisPaintDeviceSP dab, KisPaintDeviceSP source, const KisPaintInformation &info, qreal rotation, qreal scale, qreal additionalScale, const KoColor &color, const KoColor &bgColor)
#define dbgKrita
Definition kis_debug.h:45
KisSpacingInformation effectiveSpacing(qreal dabWidth, qreal dabHeight, bool isotropicSpacing, qreal rotation, bool axesFlipped, qreal spacingVal, bool autoSpacingActive, qreal autoSpacingCoeff, qreal lodScale, const KisAirbrushOptionData *airbrushOption, const KisSpacingOption *spacingOption, const KisPaintInformation &pi)
KisTimingInformation effectiveTiming(const KisAirbrushOptionData *airbrushOption, const KisRateOption *rateOption, const KisPaintInformation &pi)
bool read(const KisPropertiesConfiguration *setting)
virtual KisPaintDeviceSP paintDevice() const =0
bool read(const KisPropertiesConfiguration *setting)
KisPainter * painter
KisPaintDeviceSP source() const
KisFixedPaintDeviceSP cachedDab()
bool read(const KisPropertiesConfiguration *setting)
bool read(const KisPropertiesConfiguration *setting)