Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_filter_mask.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2007 Boudewijn Rempt <boud@valdyas.org>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#include <QMutex>
8#include <QMutexLocker>
9#include <KoIcon.h>
10#include <kis_icon.h>
12
13#include "kis_filter_mask.h"
14#include "filter/kis_filter.h"
17#include "kis_selection.h"
18#include "kis_node.h"
19#include "kis_node_visitor.h"
22#include "kis_painter.h"
23
25{
27 bool value {false};
28 const KoColorSpace *colorSpace {nullptr};
29 };
31 std::optional<NeedsTransparentPixelsCache> needsTransparentPixelsCache;
32};
33
34KisFilterMask::KisFilterMask(KisImageWSP image, const QString &name)
35 : KisEffectMask(image, name)
37 , m_d(new Private())
38{
40}
41
43 : KisEffectMask(rhs)
45 , m_d(new Private())
46{
47}
48
50
52{
53 return KisIconUtils::loadIcon("filterMask");
54}
55
57{
58 const KoColorSpace *cs = this->colorSpace();
59 if (!cs) return false;
60
61 QMutexLocker l(&m_d->transparentPixelsCacheLock);
62
63 if (m_d->needsTransparentPixelsCache) {
64 if (*m_d->needsTransparentPixelsCache->colorSpace != *cs) {
65 m_d->needsTransparentPixelsCache = std::nullopt;
66 } else {
67 return m_d->needsTransparentPixelsCache->value;
68 }
69 }
70
71 l.unlock();
72
73 KisFilterConfigurationSP filterConfig = filter();
74 if (!filterConfig) return false;
75
76 KisFilterSP filter = KisFilterRegistry::instance()->value(filterConfig->name());
77 const bool needsTransparentPixelsValue = filter->needsTransparentPixels(filterConfig, cs);
78
79 l.relock();
80
81 m_d->needsTransparentPixelsCache = {needsTransparentPixelsValue, cs};
82 return needsTransparentPixelsValue;
83}
84
85void KisFilterMask::setFilter(KisFilterConfigurationSP filterConfig, bool checkCompareConfig)
86{
87 KisNodeFilterInterface::setFilter(filterConfig, checkCompareConfig);
88 m_d->needsTransparentPixelsCache = std::nullopt;
89}
90
93 const QRect & rc,
94 PositionToFilthy maskPos,
95 KisRenderPassFlags flags) const
96{
97 Q_UNUSED(maskPos);
98 Q_UNUSED(flags);
99
100 KisFilterConfigurationSP filterConfig = filter();
101
104 src != dst &&
105 "KisFilterMask::decorateRect: "
106 "src must be != dst, because we can't create transactions "
107 "during merge, as it breaks reentrancy",
108 rc);
109
110 if (!filterConfig) {
111 return QRect();
112 }
113
115 KisFilterRegistry::instance()->value(filterConfig->name());
116
117 if (!filter) {
118 warnKrita << "Could not retrieve filter \"" << filterConfig->name() << "\"";
119 return QRect();
120 }
121
123 this->busyProgressIndicator()->update();
124
125 filter->process(src, dst, 0, rc, filterConfig.data(), 0);
126
127 QRect r = filter->changedRect(rc, filterConfig.data(), dst->defaultBounds()->currentLevelOfDetail());
128 return r;
129}
130
132{
133 return v.visit(this);
134}
135
137{
138 return visitor.visit(this, undoAdapter);
139}
140
142{
143 KisNodeSP parentNode = parent();
144
145 if (!parentNode) {
146 return {};
147 }
148
149 QRect rect = KisEffectMask::extent();
150
152 rect &= parentNode->extent();
153 }
154
155 return rect;
156}
157
159{
160 KisNodeSP parentNode = parent();
161
162 if (!parentNode) {
163 return {};
164 }
165
167
169 rect &= parentNode->exactBounds();
170 }
171
172 return rect;
173}
174
175QRect KisFilterMask::changeRect(const QRect &rect, PositionToFilthy pos) const
176{
181 if (rect.isEmpty()) return rect;
182
183 QRect filteredRect = rect;
184
185 KisFilterConfigurationSP filterConfig = filter();
186 if (filterConfig) {
187 KisNodeSP parent = this->parent();
188 const int lod = parent && parent->projection() ?
190
191 KisFilterSP filter = KisFilterRegistry::instance()->value(filterConfig->name());
192 filteredRect = filter->changedRect(rect, filterConfig.data(), lod);
193 }
194
199 filteredRect = KisMask::changeRect(filteredRect, pos);
200
208 return rect | filteredRect;
209}
210
211QRect KisFilterMask::needRect(const QRect& rect, PositionToFilthy pos) const
212{
213 Q_UNUSED(pos);
214
220 if(rect.isEmpty()) return rect;
221
222 KisFilterConfigurationSP filterConfig = filter();
223 if (!filterConfig) return rect;
224
225 KisNodeSP parent = this->parent();
226 const int lod = parent && parent->projection() ?
228
229 KisFilterSP filter = KisFilterRegistry::instance()->value(filterConfig->name());
230
237 return filter->neededRect(rect, filterConfig.data(), lod);
238}
239
qreal v
const QString COMPOSITE_COPY
virtual int currentLevelOfDetail() const =0
QRect changeRect(const QRect &rect, PositionToFilthy pos=N_FILTHY) const override
bool filterNeedsTransparentPixels() const
~KisFilterMask() override
QScopedPointer< Private > m_d
QRect decorateRect(KisPaintDeviceSP &src, KisPaintDeviceSP &dst, const QRect &rc, PositionToFilthy maskPos, KisRenderPassFlags flags) const override
QIcon icon() const override
bool accept(KisNodeVisitor &v) override
QRect exactBounds() const override
void setFilter(KisFilterConfigurationSP filterConfig, bool checkCompareConfig=true) override
KisFilterMask(KisImageWSP image, const QString &name=QString())
QRect extent() const override
QRect needRect(const QRect &rect, PositionToFilthy pos=N_FILTHY) const override
static KisFilterRegistry * instance()
void process(const KisPaintDeviceSP src, KisPaintDeviceSP dst, KisSelectionSP selection, const QRect &applyRect, const KisFilterConfigurationSP config, KoUpdater *progressUpdater=0) const
Definition kis_filter.cc:41
virtual KisFilterConfigurationSP filter() const
virtual void setFilter(KisFilterConfigurationSP filterConfig, bool checkCompareConfig=true)
KisDefaultBoundsBaseSP defaultBounds() const
virtual void visit(KisNode *node, KisUndoAdapter *undoAdapter)=0
const T value(const QString &id) const
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:129
#define KIS_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:97
#define warnKrita
Definition kis_debug.h:87
QIcon loadIcon(const QString &name)
virtual KisPaintDeviceSP projection() const =0
virtual QRect exactBounds() const
virtual QRect extent() const
void setCompositeOpId(const QString &compositeOpId)
std::optional< NeedsTransparentPixelsCache > needsTransparentPixelsCache
const KoColorSpace * colorSpace() const override
Definition kis_mask.cc:135
QRect changeRect(const QRect &rect, PositionToFilthy pos=N_FILTHY) const override
Definition kis_mask.cc:386
KisBusyProgressIndicator * busyProgressIndicator
Definition kis_node.cpp:90
KisNodeProgressProxy * nodeProgressProxy
Definition kis_node.cpp:89
PositionToFilthy
Definition kis_node.h:58
KisNodeWSP parent
Definition kis_node.cpp:86