Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_gaussian_blur_filter.cpp
Go to the documentation of this file.
1/*
2 * This file is part of Krita
3 *
4 * SPDX-FileCopyrightText: 2009 Edward Apap <schumifer@hotmail.com>
5 *
6 * SPDX-License-Identifier: GPL-2.0-or-later
7 */
8
9
12
13#include <KoCompositeOp.h>
14
17#include <kis_gaussian_kernel.h>
18
19#include "ui_wdg_gaussian_blur.h"
20
23#include <kis_selection.h>
24#include <kis_paint_device.h>
26#include "kis_lod_transform.h"
27
28
29#include <math.h>
30
31
39
41{
42 return new KisWdgGaussianBlur(usedForMasks, parent);
43}
44
46{
47 KisFilterConfigurationSP config = factoryConfiguration(resourcesInterface);
48 config->setProperty("horizRadius", 5);
49 config->setProperty("vertRadius", 5);
50 config->setProperty("lockAspect", true);
51
52 return config;
53}
54
56 const QRect& rect,
57 const KisFilterConfigurationSP config,
58 KoUpdater* progressUpdater
59 ) const
60{
61 Q_ASSERT(device != 0);
62
64
65 KisLodTransformScalar t(device);
66
67 const qreal horizontalRadius = t.scale(config->getDouble("horizRadius", 5));
68 const qreal verticalRadius = t.scale(config->getDouble("vertRadius", 5));
69
70 QBitArray channelFlags;
71 if (config) {
72 channelFlags = config->channelFlags();
73 }
74 if (channelFlags.isEmpty() || !config) {
75 channelFlags = QBitArray(device->colorSpace()->channelCount(), true);
76 }
77
79 horizontalRadius, verticalRadius,
80 channelFlags, progressUpdater);
81}
82
83QRect KisGaussianBlurFilter::neededRect(const QRect & rect, const KisFilterConfigurationSP _config, int lod) const
84{
86
87 QVariant value;
92 const int halfWidth = _config->getProperty("horizRadius", value) ? KisGaussianKernel::kernelSizeFromRadius(t.scale(value.toFloat())) / 2 : 5;
93 const int halfHeight = _config->getProperty("vertRadius", value) ? KisGaussianKernel::kernelSizeFromRadius(t.scale(value.toFloat())) / 2 : 5;
94
95 return rect.adjusted(-halfWidth * 2, -halfHeight * 2, halfWidth * 2, halfHeight * 2);
96}
97
98QRect KisGaussianBlurFilter::changedRect(const QRect & rect, const KisFilterConfigurationSP _config, int lod) const
99{
101
102 QVariant value;
103
104 const int halfWidth = _config->getProperty("horizRadius", value) ? KisGaussianKernel::kernelSizeFromRadius(t.scale(value.toFloat())) / 2 : 5;
105 const int halfHeight = _config->getProperty("vertRadius", value) ? KisGaussianKernel::kernelSizeFromRadius(t.scale(value.toFloat())) / 2 : 5;
106
107 return rect.adjusted( -halfWidth, -halfHeight, halfWidth, halfHeight);
108}
109
111{
112 //ENTER_FUNCTION() << config->getFloat("horizRadius", 5.0) << config->getFloat("vertRadius", 5.0);
113
114 const float maxRadiusForMask = 100.0;
115
116 return config->getFloat("horizRadius", 5.0) <= maxRadiusForMask &&
117 config->getFloat("vertRadius", 5.0) <= maxRadiusForMask;
118}
119
121{
123
124 const float maxRadiusForMask = 100.0;
125
126 if (config->getFloat("horizRadius", 5.0) > maxRadiusForMask) {
127 config->setProperty("horizRadius", maxRadiusForMask);
128 }
129
130 if (config->getFloat("vertRadius", 5.0) > maxRadiusForMask) {
131 config->setProperty("vertRadius", maxRadiusForMask);
132 }
133}
float value(const T *src, size_t ch)
@ FULLY_INDEPENDENT
void setSupportsLevelOfDetail(bool value)
void processImpl(KisPaintDeviceSP device, const QRect &rect, const KisFilterConfigurationSP config, KoUpdater *progressUpdater) const override
bool configurationAllowedForMask(KisFilterConfigurationSP config) const override
void fixLoadedFilterConfigurationForMasks(KisFilterConfigurationSP config) const override
QRect neededRect(const QRect &rect, const KisFilterConfigurationSP _config, int lod) const override
KisFilterConfigurationSP defaultConfiguration(KisResourcesInterfaceSP resourcesInterface) const override
QRect changedRect(const QRect &rect, const KisFilterConfigurationSP _config, int lod) const override
KisConfigWidget * createConfigurationWidget(QWidget *parent, const KisPaintDeviceSP dev, bool useForMasks) const override
static void applyGaussian(KisPaintDeviceSP device, const QRect &rect, qreal xRadius, qreal yRadius, const QBitArray &channelFlags, KoUpdater *updater, bool createTransaction=false, KisConvolutionBorderOp borderOp=BORDER_REPEAT)
static int kernelSizeFromRadius(qreal radius)
qreal scale(qreal value) const
const KoColorSpace * colorSpace() const
virtual quint32 channelCount() const =0
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
#define ENTER_FUNCTION()
Definition kis_debug.h:178
const KoID FiltersCategoryBlurId("blur_filters", ki18nc("The category of blur filters, like gaussian blur. Verb.", "Blur"))
virtual KisFilterConfigurationSP factoryConfiguration(KisResourcesInterfaceSP resourcesInterface) const
void setSupportsAdjustmentLayers(bool v)
void setSupportsPainting(bool v)
void setColorSpaceIndependence(ColorSpaceIndependence v)