Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_filterop.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2002 Patrick Julien <freak@codepimps.org>
3 * SPDX-FileCopyrightText: 2004-2008 Boudewijn Rempt <boud@valdyas.org>
4 * SPDX-FileCopyrightText: 2004 Clarence Dang <dang@kde.org>
5 * SPDX-FileCopyrightText: 2004 Adrian Page <adrian@pagenet.plus.com>
6 * SPDX-FileCopyrightText: 2004 Cyrille Berger <cberger@cberger.net>
7 *
8 * SPDX-License-Identifier: GPL-2.0-or-later
9 */
10
11#include "kis_filterop.h"
12
13#include <kis_debug.h>
14
17#include <KoColor.h>
20
23#include <filter/kis_filter.h>
25#include <kis_brush.h>
26#include <kis_global.h>
27#include <kis_painter.h>
28#include <kis_paint_device.h>
30#include <kis_selection.h>
32#include <kis_iterator_ng.h>
34#include <kis_transaction.h>
35#include <kis_lod_transform.h>
37#include <KisFilterOptionData.h>
38
39
41 : KisBrushBasedPaintOp(settings, painter)
42 , m_sizeOption(settings.data())
43 , m_rotationOption(settings.data())
44 , m_filterConfiguration(0)
45{
46 Q_UNUSED(node);
47 Q_UNUSED(image);
48 Q_ASSERT(settings);
49 Q_ASSERT(painter);
50
52
54 data.read(settings.data());
55
57 if (m_filter) {
58 m_filterConfiguration = m_filter->factoryConfiguration(settings->resourcesInterface());
60 }
62
64}
65
69
71{
72 if (!painter()) {
73 return KisSpacingInformation(1.0);
74 }
75
76 if (!m_filter) {
77 return KisSpacingInformation(1.0);
78 }
79
80 if (!source()) {
81 return KisSpacingInformation(1.0);
82 }
83
84 KisBrushSP brush = m_brush;
85 if (!brush) return KisSpacingInformation(1.0);
86
87 if (! brush->canPaintFor(info))
88 return KisSpacingInformation(1.0);
89
90 qreal scale = m_sizeOption.apply(info);
91 scale *= KisLodTransform::lodToScale(painter()->device());
92 if (checkSizeTooSmall(scale)) return KisSpacingInformation();
93 qreal rotation = m_rotationOption.apply(info);
94 KisDabShape shape(scale, 1.0, rotation);
95
97 static KoColor color(Qt::black, cs);
98
99 QRect dstRect;
100 KisFixedPaintDeviceSP dab = m_dabCache->fetchDab(cs, color, info.pos(),
101 shape,
102 info, 1.0,
103 &dstRect);
104
105 if (dstRect.isEmpty()) return KisSpacingInformation(1.0);
106
107 QRect dabRect = dab->bounds();
108
109 // sanity check
110 Q_ASSERT(dstRect.size() == dabRect.size());
111
112
113 // Filter the paint device
114 QRect neededRect = m_filter->neededRect(dstRect, m_filterConfiguration, painter()->device()->defaultBounds()->currentLevelOfDetail());
115
117 if (!m_smudgeMode) {
118 p.setCompositeOpId(COMPOSITE_COPY);
119 }
120 p.bitBltOldData(neededRect.topLeft(), source(), neededRect);
121
122 KisTransaction transaction(m_tmpDevice);
124 transaction.end();
125
126 painter()->bitBltWithFixedSelection(dstRect.x(), dstRect.y(),
128 0, 0,
129 dstRect.x(), dstRect.y(),
130 dabRect.width(), dabRect.height());
131
132 painter()->renderMirrorMaskSafe(dstRect, m_tmpDevice, 0, 0, dab,
134
135 return effectiveSpacing(scale, rotation, info);
136}
137
139{
140 const qreal scale = m_sizeOption.apply(info) * KisLodTransform::lodToScale(painter()->device());
141 const qreal rotation = m_rotationOption.apply(info);
142 return effectiveSpacing(scale, rotation, info);
143}
144
146{
147 QList<KoResourceLoadResult> resources = KisBrushBasedPaintOp::prepareLinkedResources(settings, resourcesInterface);
148
150 data.read(settings.data());
151
153 if (filter) {
154 KisFilterConfigurationSP config = filter->factoryConfiguration(settings->resourcesInterface());
155 config->fromXML(data.filterConfig);
156 resources << config->linkedResources(resourcesInterface);
157 }
158
159 return resources;
160}
161
163{
164 QList<KoResourceLoadResult> resources = KisBrushBasedPaintOp::prepareEmbeddedResources(settings, resourcesInterface);
165
167 data.read(settings.data());
168
170 if (filter) {
171 KisFilterConfigurationSP config = filter->factoryConfiguration(settings->resourcesInterface());
172 config->fromXML(data.filterConfig);
173 resources << config->embeddedResources(resourcesInterface);
174 }
175
176 return resources;
177}
const Params2D p
const QString COMPOSITE_COPY
static QList< KoResourceLoadResult > prepareLinkedResources(const KisPaintOpSettingsSP settings, KisResourcesInterfaceSP resourcesInterface)
KisSpacingInformation effectiveSpacing(qreal scale) const
static QList< KoResourceLoadResult > prepareEmbeddedResources(const KisPaintOpSettingsSP settings, KisResourcesInterfaceSP resourcesInterface)
bool needSeparateOriginal() const
KisFixedPaintDeviceSP fetchDab(const KoColorSpace *cs, KisColorSource *colorSource, const QPointF &cursorPoint, KisDabShape const &, const KisPaintInformation &info, qreal softnessFactor, QRect *dstDabRect, qreal lightnessStrength=1.0)
bool m_smudgeMode
KisFilterSP m_filter
KisSizeOption m_sizeOption
~KisFilterOp() override
KisFilterConfigurationSP m_filterConfiguration
KisSpacingInformation updateSpacingImpl(const KisPaintInformation &info) const override
static QList< KoResourceLoadResult > prepareLinkedResources(const KisPaintOpSettingsSP settings, KisResourcesInterfaceSP resourcesInterface)
static QList< KoResourceLoadResult > prepareEmbeddedResources(const KisPaintOpSettingsSP settings, KisResourcesInterfaceSP resourcesInterface)
KisPaintDeviceSP m_tmpDevice
KisSpacingInformation paintAt(const KisPaintInformation &info) override
KisRotationOption m_rotationOption
KisFilterOp(const KisPaintOpSettingsSP settings, KisPainter *painter, KisNodeSP node, KisImageSP image)
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 QRect neededRect(const QRect &rect, const KisFilterConfigurationSP config, int lod) const
Definition kis_filter.cc:91
static qreal lodToScale(int levelOfDetail)
KisPaintDeviceSP createCompositionSourceDevice() const
const QPointF & pos() const
void renderMirrorMaskSafe(QRect rc, KisFixedPaintDeviceSP dab, bool preserveDab)
void bitBltWithFixedSelection(qint32 dstX, qint32 dstY, const KisPaintDeviceSP srcDev, const KisFixedPaintDeviceSP selection, qint32 selX, qint32 selY, qint32 srcX, qint32 srcY, qint32 srcWidth, qint32 srcHeight)
qreal apply(const KisPaintInformation &info) const
void applyFanCornersInfo(KisPaintOp *op)
qreal apply(const KisPaintInformation &info) const
T get(const QString &id) const
virtual KisFilterConfigurationSP factoryConfiguration(KisResourcesInterfaceSP resourcesInterface) const
bool read(const KisPropertiesConfiguration *setting)
KisPainter * painter
KisFixedPaintDeviceSP dab
KisPaintDeviceSP source() const
static KoColorSpaceRegistry * instance()
const KoColorSpace * alpha8()