Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_edge_detection_filter.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2017 Wolthera van Hövell tot Westerflier <griffinvalley@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
11
14
17#include <kis_selection.h>
18#include <kis_paint_device.h>
20#include "kis_lod_transform.h"
21
22#include <kpluginfactory.h>
23
24#include <klocalizedstring.h>
26
27K_PLUGIN_FACTORY_WITH_JSON(KritaEdgeDetectionFilterFactory, "kritaedgedetection.json", registerPlugin<KritaEdgeDetectionFilter>();)
28
29KritaEdgeDetectionFilter::KritaEdgeDetectionFilter(QObject *parent, const QVariantList &)
30 : QObject(parent)
31{
33}
34
38
47
48void KisEdgeDetectionFilter::processImpl(KisPaintDeviceSP device, const QRect &rect, const KisFilterConfigurationSP config, KoUpdater *progressUpdater) const
49{
50 Q_ASSERT(device != 0);
52
53 KisFilterConfigurationSP configuration = config;
54
55 KisLodTransformScalar t(device);
56
57 QVariant value;
58 configuration->getProperty("horizRadius", value);
59 float horizontalRadius = t.scale(value.toFloat());
60 configuration->getProperty("vertRadius", value);
61 float verticalRadius = t.scale(value.toFloat());
62
63 QBitArray channelFlags;
64 if (configuration) {
65 channelFlags = configuration->channelFlags();
66 }
67
69 if (config->getString("type") == "prewitt") {
71 } else if (config->getString("type") == "simple") {
73 }
74
76 if (config->getString("output") == "xGrowth") {
78 } else if (config->getString("output") == "xFall") {
80 } else if (config->getString("output") == "yGrowth") {
82 } else if (config->getString("output") == "yFall") {
84 } else if (config->getString("output") == "radian") {
86 }
87
89 rect,
90 horizontalRadius,
91 verticalRadius,
92 type,
93 channelFlags,
94 progressUpdater,
95 output,
96 config->getBool("transparency", false));
97}
98
100{
101 KisFilterConfigurationSP config = factoryConfiguration(resourcesInterface);
102 config->setProperty("horizRadius", 1);
103 config->setProperty("vertRadius", 1);
104 config->setProperty("type", "prewitt");
105 config->setProperty("output", "pythagorean");
106 config->setProperty("lockAspect", true);
107 config->setProperty("transparency", false);
108
109 return config;
110}
111
113{
114 Q_UNUSED(dev);
115 return new KisWdgEdgeDetection(parent);
116}
117
118QRect KisEdgeDetectionFilter::neededRect(const QRect &rect, const KisFilterConfigurationSP _config, int lod) const
119{
121
122 QVariant value;
127 const int halfWidth = _config->getProperty("horizRadius", value) ? KisEdgeDetectionKernel::kernelSizeFromRadius(t.scale(value.toFloat())) / 2 : 5;
128 const int halfHeight = _config->getProperty("vertRadius", value) ? KisEdgeDetectionKernel::kernelSizeFromRadius(t.scale(value.toFloat())) / 2 : 5;
129
130 return rect.adjusted(-halfWidth * 2, -halfHeight * 2, halfWidth * 2, halfHeight * 2);
131}
132
133QRect KisEdgeDetectionFilter::changedRect(const QRect &rect, const KisFilterConfigurationSP _config, int lod) const
134{
136
137 QVariant value;
138
139 const int halfWidth = _config->getProperty("horizRadius", value) ? KisEdgeDetectionKernel::kernelSizeFromRadius(t.scale(value.toFloat())) / 2 : 5;
140 const int halfHeight = _config->getProperty("vertRadius", value) ? KisEdgeDetectionKernel::kernelSizeFromRadius(t.scale(value.toFloat())) / 2 : 5;
141
142 return rect.adjusted( -halfWidth, -halfHeight, halfWidth, halfHeight);
143}
144
145#include "kis_edge_detection_filter.moc"
float value(const T *src, size_t ch)
@ FULLY_INDEPENDENT
KisFilterConfigurationSP defaultConfiguration(KisResourcesInterfaceSP resourcesInterface) const override
QRect neededRect(const QRect &rect, const KisFilterConfigurationSP _config, int lod) const override
KisConfigWidget * createConfigurationWidget(QWidget *parent, const KisPaintDeviceSP dev, bool useForMasks) const override
QRect changedRect(const QRect &rect, const KisFilterConfigurationSP _config, int lod) const override
void processImpl(KisPaintDeviceSP device, const QRect &rect, const KisFilterConfigurationSP config, KoUpdater *progressUpdater) const override
static int kernelSizeFromRadius(qreal radius)
static void applyEdgeDetection(KisPaintDeviceSP device, const QRect &rect, qreal xRadius, qreal yRadius, FilterType type, const QBitArray &channelFlags, KoUpdater *progressUpdater, FilterOutput output=pythagorean, bool writeToAlpha=false)
applyEdgeDetection This applies the edge detection filter to the device.
void add(KisFilterSP item)
static KisFilterRegistry * instance()
void setSupportsLevelOfDetail(bool value)
qreal scale(qreal value) const
KritaEdgeDetectionFilter(QObject *parent, const QVariantList &)
K_PLUGIN_FACTORY_WITH_JSON(KritaASCCDLFactory, "kritaasccdl.json", registerPlugin< KritaASCCDL >();) KritaASCCDL
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
const KoID FiltersCategoryEdgeDetectionId("edge_filters", ki18nc("The category of edge detection filters. Noun.", "Edge Detection"))
KisSharedPtr< KisFilter > KisFilterSP
Definition kis_types.h:167
void setShowConfigurationWidget(bool v)
virtual KisFilterConfigurationSP factoryConfiguration(KisResourcesInterfaceSP resourcesInterface) const
void setSupportsAdjustmentLayers(bool v)
void setSupportsPainting(bool v)
void setColorSpaceIndependence(ColorSpaceIndependence v)