Krita Source Code Documentation
Loading...
Searching...
No Matches
Filter.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2016 Boudewijn Rempt <boud@valdyas.org>
3 *
4 * SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6#include "Filter.h"
7
9
11#include <kis_filter.h>
14#include <kis_filter_manager.h>
15#include <kis_filter_registry.h>
16#include <KisDocument.h>
17#include <kis_paint_device.h>
19#include <KisPart.h>
20#include <KisView.h>
21
23#include <krita_utils.h>
25
26#include "Krita.h"
27#include "Document.h"
28#include "InfoObject.h"
29#include "Node.h"
30
36
38 : QObject(0)
39 , d(new Private)
40{
41}
42
44{
45 delete d->configuration;
46 delete d;
47}
48
49bool Filter::operator==(const Filter &other) const
50{
51 return (d->name == other.d->name
52 && d->configuration == other.d->configuration);
53}
54
55bool Filter::operator!=(const Filter &other) const
56{
57 return !(operator==(other));
58}
59
60
61QString Filter::name() const
62{
63 return d->name;
64}
65
74
76{
77 return d->configuration;
78}
79
84
85bool Filter::apply(Node *node, int x, int y, int w, int h)
86{
87 if (node->locked()) return false;
88
90 if (!filter) return false;
91
92 KisPaintDeviceSP dev = node->paintDevice();
93 if (!dev) return false;
94
95 QRect applyRect = QRect(x, y, w, h);
97 filter->process(dev, applyRect, config->cloneWithResourcesSnapshot());
98 return true;
99}
100
101bool Filter::startFilter(Node *node, int x, int y, int w, int h)
102{
103 if (node->locked()) return false;
104
106 if (!filter) return false;
107
108 KisImageWSP image = node->image();
109 if (!image) return false;
110
112
113 image->waitForDone();
114 QRect initialApplyRect = QRect(x, y, w, h);
115
116 QRect applyRect = initialApplyRect;
117
118 KisPaintDeviceSP paintDevice = node->paintDevice();
119 if (paintDevice && filter->needsTransparentPixels(filterConfig.data(), paintDevice->colorSpace())) {
120 applyRect |= image->bounds();
121 }
122
123 KisResourcesSnapshotSP resources = new KisResourcesSnapshot(image, node->node());
124
125 Document *document = Krita::instance()->activeDocument();
126 if (document && KisPart::instance()->viewCount(document->document()) > 0) {
127 Q_FOREACH (QPointer<KisView> view, KisPart::instance()->views()) {
128 if (view && view->document() == document->document()) {
129 resources = new KisResourcesSnapshot(image, node->node(), view->resourceProvider()->resourceManager());
130 break;
131 }
132 }
133 }
134 delete document;
135
136 KisStrokeId currentStrokeId = image->startStroke(new KisFilterStrokeStrategy(filter,
138 resources));
139
140 QRect processRect = filter->changedRect(applyRect, filterConfig.data(), 0);
141 processRect &= image->bounds();
142
143 image->addJob(currentStrokeId, new KisFilterStrokeStrategy::FilterJobData());
144
145
146 image->endStroke(currentStrokeId);
147 image->waitForDone();
148
149 return true;
150}
151
153{
155 Q_FOREACH(const QString property, d->configuration->properties().keys()) {
156 config->setProperty(property, d->configuration->property(property));
157 }
158 return config;
159}
float value(const T *src, size_t ch)
KisFilterConfigurationSP filterConfig()
Definition Filter.cpp:152
~Filter() override
Definition Filter.cpp:43
bool operator==(const Filter &other) const
Definition Filter.cpp:49
bool startFilter(Node *node, int x, int y, int w, int h)
startFilter starts the given filter on the given node.
Definition Filter.cpp:101
QString name() const
name the internal name of this filter.
Definition Filter.cpp:61
void setConfiguration(InfoObject *value)
setConfiguration set the configuration object for the filter
Definition Filter.cpp:80
InfoObject * configuration() const
Definition Filter.cpp:75
bool operator!=(const Filter &other) const
Definition Filter.cpp:55
Private *const d
Definition Filter.h:102
Filter()
Filter: create an empty filter object. Until a name is set, the filter cannot be applied.
Definition Filter.cpp:37
void setName(const QString &name)
setName set the filter's name to the given name.
Definition Filter.cpp:66
bool apply(Node *node, int x, int y, int w, int h)
Apply the filter to the given node.
Definition Filter.cpp:85
QVariant property(const QString &key)
QMap< QString, QVariant > properties() const
KisPropertiesConfigurationSP configuration() const
configuration gives access to the internal configuration object. Must be used internally in libkis
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 bool needsTransparentPixels(const KisFilterConfigurationSP config, const KoColorSpace *cs) const
virtual QRect changedRect(const QRect &rect, const KisFilterConfigurationSP config, int lod) const
Definition kis_filter.cc:98
static KisResourcesInterfaceSP instance()
void waitForDone()
void addJob(KisStrokeId id, KisStrokeJobData *data) override
KisStrokeId startStroke(KisStrokeStrategy *strokeStrategy) override
QRect bounds() const override
void endStroke(KisStrokeId id) override
const KoColorSpace * colorSpace() const
static KisPart * instance()
Definition KisPart.cpp:131
The KisResourcesSnapshot class takes a snapshot of the various resources like colors and settings use...
const T value(const QString &id) const
T get(const QString &id) const
Document * activeDocument() const
Definition Krita.cpp:104
static Krita * instance()
instance retrieve the singleton instance of the Application object.
Definition Krita.cpp:390
Definition Node.h:24
bool locked() const
locked checks whether the Node is locked. A locked node cannot be changed.
Definition Node.cpp:411
KisNodeSP node() const
Definition Node.cpp:827
KisImageSP image() const
Definition Node.cpp:822
KisPaintDeviceSP paintDevice() const
paintDevice gives access to the internal paint device of this Node
Definition Node.cpp:817
KisPinnedSharedPtr< KisFilterConfiguration > KisFilterConfigurationSP
Definition kis_types.h:275
QString name
Definition Filter.cpp:33
InfoObject * configuration
Definition Filter.cpp:34
virtual KisFilterConfigurationSP factoryConfiguration(KisResourcesInterfaceSP resourcesInterface) const
virtual KisFilterConfigurationSP defaultConfiguration(KisResourcesInterfaceSP resourcesInterface) const