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

#include <kis_ls_stroke_filter.h>

+ Inheritance diagram for KisLsStrokeFilter:

Public Member Functions

QRect changedRect (const QRect &rect, KisPSDLayerStyleSP style, KisLayerStyleFilterEnvironment *env) const override
 
KisLayerStyleFilterclone () const override
 
 KisLsStrokeFilter ()
 
QRect neededRect (const QRect &rect, KisPSDLayerStyleSP style, KisLayerStyleFilterEnvironment *env) const override
 
void processDirectly (KisPaintDeviceSP src, KisMultipleProjection *dst, KisLayerStyleKnockoutBlower *blower, const QRect &applyRect, KisPSDLayerStyleSP style, KisLayerStyleFilterEnvironment *env) const override
 
KritaUtils::ThresholdMode sourcePlaneOpacityThresholdRequirement (KisPSDLayerStyleSP style) const
 
- Public Member Functions inherited from KisLayerStyleFilter
QString id () const
 
 KisLayerStyleFilter (const KoID &id)
 
virtual ~KisLayerStyleFilter ()
 
- Public Member Functions inherited from Private
 Private (KisCanvas2 *c)
 
- Public Member Functions inherited from KisShared
bool deref ()
 
bool ref ()
 
int refCount ()
 
QAtomicInt * sharedWeakReference ()
 

Private Member Functions

void applyStroke (KisPaintDeviceSP srcDevice, KisMultipleProjection *dst, KisLayerStyleKnockoutBlower *blower, const QRect &applyRect, const psd_layer_effects_stroke *config, KisResourcesInterfaceSP resourcesInterface, KisLayerStyleFilterEnvironment *env) const
 
 KisLsStrokeFilter (const KisLsStrokeFilter &rhs)
 

Additional Inherited Members

- Public Attributes inherited from KisLayerStyleFilter
KoID id
 
- Public Attributes inherited from Private
KisCanvas2canvas
 
int displayedFrame
 
int intendedFrame
 
- Protected Member Functions inherited from KisLayerStyleFilter
 KisLayerStyleFilter (const KisLayerStyleFilter &rhs)
 
- Protected Member Functions inherited from KisShared
 KisShared ()
 
 ~KisShared ()
 

Detailed Description

Definition at line 18 of file kis_ls_stroke_filter.h.

Constructor & Destructor Documentation

◆ KisLsStrokeFilter() [1/2]

KisLsStrokeFilter::KisLsStrokeFilter ( )

Definition at line 66 of file kis_ls_stroke_filter.cpp.

67 : KisLayerStyleFilter(KoID("lsstroke", i18n("Stroke (style)")))
68{
69}
Definition KoID.h:30
KisLayerStyleFilter(const KoID &id)

◆ KisLsStrokeFilter() [2/2]

KisLsStrokeFilter::KisLsStrokeFilter ( const KisLsStrokeFilter & rhs)
private

Definition at line 71 of file kis_ls_stroke_filter.cpp.

73{
74}

Member Function Documentation

◆ applyStroke()

void KisLsStrokeFilter::applyStroke ( KisPaintDeviceSP srcDevice,
KisMultipleProjection * dst,
KisLayerStyleKnockoutBlower * blower,
const QRect & applyRect,
const psd_layer_effects_stroke * config,
KisResourcesInterfaceSP resourcesInterface,
KisLayerStyleFilterEnvironment * env ) const
private

Definition at line 81 of file kis_ls_stroke_filter.cpp.

88{
89 if (applyRect.isEmpty()) return;
90
91 const QRect needRect = kisGrowRect(applyRect, borderSize(config->position(), config->size()));
92
93 KisSelectionSP baseSelection = blower->knockoutSelectionLazy();
94 KisPixelSelectionSP selection = baseSelection->pixelSelection();
95
97 KisPixelSelectionSP dilatedSelection = s1.selection()->pixelSelection();
98 KisLsUtils::selectionFromAlphaChannel(srcDevice, s1.selection(), needRect);
99
100 {
102 KisPixelSelectionSP erodedSelection = s2.selection()->pixelSelection();
103 erodedSelection->makeCloneFromRough(dilatedSelection, needRect);
104
105 if (config->position() == psd_stroke_outside) {
106 KisGaussianKernel::applyDilate(dilatedSelection, needRect, config->size(), QBitArray(), 0, true);
107 } else if (config->position() == psd_stroke_inside) {
108 KisGaussianKernel::applyErodeU8(erodedSelection, needRect, config->size(), QBitArray(), 0, true);
109 } else if (config->position() == psd_stroke_center) {
110 KisGaussianKernel::applyDilate(dilatedSelection, needRect, 0.5 * config->size(), QBitArray(), 0, true);
111 KisGaussianKernel::applyErodeU8(erodedSelection, needRect, 0.5 * config->size(), QBitArray(), 0, true);
112 }
113
114 KisPainter gc(selection);
115
116 gc.setCompositeOpId(COMPOSITE_COPY);
117 gc.bitBlt(applyRect.topLeft(), dilatedSelection, applyRect);
118
119 gc.setCompositeOpId(COMPOSITE_ERASE);
120 gc.bitBlt(applyRect.topLeft(), erodedSelection, applyRect);
121 gc.end();
122 }
123
124 const QString compositeOp = config->blendMode();
125 const quint8 opacityU8 = quint8(qRound(255.0 / 100.0 * config->opacity()));
127 compositeOp,
128 opacityU8,
129 QBitArray(),
130 srcDevice);
131 KisLsUtils::fillOverlayDevice(dstDevice, applyRect, config, resourcesInterface, env);
132}
QPointF s1
QPointF s2
const QString COMPOSITE_COPY
const QString COMPOSITE_ERASE
static void applyErodeU8(KisPaintDeviceSP device, const QRect &rect, qreal radius, const QBitArray &channelFlags, KoUpdater *progressUpdater, bool createTransaction=false)
static void applyDilate(KisPaintDeviceSP device, const QRect &rect, qreal radius, const QBitArray &channelFlags, KoUpdater *progressUpdater, bool createTransaction=false)
KisPaintDeviceSP getProjection(const QString &id, const QString &compositeOpId, quint8 opacity, const QBitArray &channelFlags, KisPaintDeviceSP prototype)
void makeCloneFromRough(KisPaintDeviceSP src, const QRect &minimalRect)
qint32 opacity() const
Definition psd.h:281
QString blendMode() const
Definition psd.h:266
qint32 size() const
Definition psd.h:306
T kisGrowRect(const T &rect, U offset)
Definition kis_global.h:186
void fillOverlayDevice(KisPaintDeviceSP fillDevice, const QRect &applyRect, const psd_layer_effects_overlay_base *config, KisResourcesInterfaceSP resourcesInterface, KisLayerStyleFilterEnvironment *env)
void selectionFromAlphaChannel(KisPaintDeviceSP srcDevice, KisSelectionSP dstSelection, const QRect &srcRect)
@ psd_stroke_outside
Definition psd.h:121
@ psd_stroke_inside
Definition psd.h:121
@ psd_stroke_center
Definition psd.h:121
KisPixelSelectionSP pixelSelection
psd_stroke_position position() const
Definition psd.h:1280

References KisGaussianKernel::applyDilate(), KisGaussianKernel::applyErodeU8(), KisPainter::bitBlt(), psd_layer_effects_shadow_base::blendMode(), KisLayerStyleFilterEnvironment::cachedSelection(), COMPOSITE_COPY, COMPOSITE_ERASE, KisMultipleProjection::defaultProjectionId(), KisPainter::end(), KisLsUtils::fillOverlayDevice(), KisMultipleProjection::getProjection(), kisGrowRect(), KisLayerStyleKnockoutBlower::knockoutSelectionLazy(), KisPaintDevice::makeCloneFromRough(), psd_layer_effects_shadow_base::opacity(), KisSelection::pixelSelection, psd_layer_effects_stroke::position(), psd_stroke_center, psd_stroke_inside, psd_stroke_outside, s1, s2, KisLsUtils::selectionFromAlphaChannel(), KisPainter::setCompositeOpId(), and psd_layer_effects_shadow_base::size().

◆ changedRect()

QRect KisLsStrokeFilter::changedRect ( const QRect & rect,
KisPSDLayerStyleSP style,
KisLayerStyleFilterEnvironment * env ) const
overridevirtual

Similar to neededRect: some filters will alter a lot of pixels that are near to each other at the same time. So when you changed a single rectangle in a device, the actual rectangle that will feel the influence of this change might be bigger. Use this function to determine that rect.

Implements KisLayerStyleFilter.

Definition at line 160 of file kis_ls_stroke_filter.cpp.

161{
162 return neededRect(rect, style, env);
163}
QRect neededRect(const QRect &rect, KisPSDLayerStyleSP style, KisLayerStyleFilterEnvironment *env) const override

References neededRect().

◆ clone()

KisLayerStyleFilter * KisLsStrokeFilter::clone ( ) const
overridevirtual

Implements KisLayerStyleFilter.

Definition at line 76 of file kis_ls_stroke_filter.cpp.

77{
78 return new KisLsStrokeFilter(*this);
79}

References KisLsStrokeFilter().

◆ neededRect()

QRect KisLsStrokeFilter::neededRect ( const QRect & rect,
KisPSDLayerStyleSP style,
KisLayerStyleFilterEnvironment * env ) const
overridevirtual

Some filters need pixels outside the current processing rect to compute the new value (for instance, convolution filters)

Implements KisLayerStyleFilter.

Definition at line 151 of file kis_ls_stroke_filter.cpp.

152{
153 const psd_layer_effects_stroke *config = style->stroke();
154 if (!config->effectEnabled()) return rect;
155
157 return kisGrowRect(rect, borderSize(w.config->position(), w.config->size()));
158}
bool effectEnabled() const
Definition psd.h:261

References KisLayerStyleFilterEnvironment::currentLevelOfDetail(), psd_layer_effects_shadow_base::effectEnabled(), and kisGrowRect().

◆ processDirectly()

void KisLsStrokeFilter::processDirectly ( KisPaintDeviceSP src,
KisMultipleProjection * dst,
KisLayerStyleKnockoutBlower * blower,
const QRect & applyRect,
KisPSDLayerStyleSP style,
KisLayerStyleFilterEnvironment * env ) const
overridevirtual

Implements KisLayerStyleFilter.

Definition at line 134 of file kis_ls_stroke_filter.cpp.

140{
141 Q_UNUSED(env);
143
144 const psd_layer_effects_stroke *config = style->stroke();
145 if (!KisLsUtils::checkEffectEnabled(config, dst)) return;
146
148 applyStroke(src, dst, blower, applyRect, w.config, style->resourcesInterface(), env);
149}
void applyStroke(KisPaintDeviceSP srcDevice, KisMultipleProjection *dst, KisLayerStyleKnockoutBlower *blower, const QRect &applyRect, const psd_layer_effects_stroke *config, KisResourcesInterfaceSP resourcesInterface, KisLayerStyleFilterEnvironment *env) const
#define KIS_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:75
bool checkEffectEnabled(const psd_layer_effects_shadow_base *config, KisMultipleProjection *dst)

References applyStroke(), KisLsUtils::checkEffectEnabled(), KisLayerStyleFilterEnvironment::currentLevelOfDetail(), and KIS_ASSERT_RECOVER_RETURN.

◆ sourcePlaneOpacityThresholdRequirement()


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