Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_blur_filter.cpp
Go to the documentation of this file.
1/*
2 * This file is part of Krita
3 *
4 * SPDX-FileCopyrightText: 2006 Cyrille Berger <cberger@cberger.net>
5 *
6 * SPDX-License-Identifier: GPL-2.0-or-later
7 */
8
9#include "kis_blur_filter.h"
10
11#include <KoCompositeOp.h>
12
15
16#include "kis_wdg_blur.h"
17#include "ui_wdgblur.h"
20#include <kis_selection.h>
21#include <kis_paint_device.h>
23#include "kis_mask_generator.h"
24#include "kis_lod_transform.h"
25
26
34
36{
37 return new KisWdgBlur(parent);
38}
39
41{
42 KisFilterConfigurationSP config = factoryConfiguration(resourcesInterface);
43 config->setProperty("lockAspect", true);
44 config->setProperty("halfWidth", 5);
45 config->setProperty("halfHeight", 5);
46 config->setProperty("rotate", 0);
47 config->setProperty("strength", 0);
48 config->setProperty("shape", 0);
49 return config;
50}
51
53 const QRect& rect,
54 const KisFilterConfigurationSP config,
55 KoUpdater* progressUpdater
56 ) const
57{
58 QPoint srcTopLeft = rect.topLeft();
59 Q_ASSERT(device != 0);
61
62 KisLodTransformScalar t(device);
63
64 QVariant value;
65 const uint halfWidth = t.scale((config->getProperty("halfWidth", value)) ? value.toUInt() : 5);
66 const uint halfHeight = t.scale((config->getProperty("halfHeight", value)) ? value.toUInt() : 5);
67
68 int shape = (config->getProperty("shape", value)) ? value.toInt() : 0;
69 uint width = 2 * halfWidth + 1;
70 uint height = 2 * halfHeight + 1;
71 qreal aspectRatio = (qreal) height / width;
72 int rotate = (config->getProperty("rotate", value)) ? value.toInt() : 0;
73 qreal strength = (config->getProperty("strength", value) ? value.toUInt() : 0) / (qreal) 100;
74 qreal hFade = strength;
75 qreal vFade = strength;
76
78 switch (shape) {
79 case 1:
80 kas = new KisRectangleMaskGenerator(width, aspectRatio, hFade, vFade, 2, true);
81 break;
82 case 0:
83 default:
84 kas = new KisCircleMaskGenerator(width, aspectRatio, hFade, vFade, 2, true);
85 break;
86 }
87
88 QBitArray channelFlags;
89 if (config) {
90 channelFlags = config->channelFlags();
91 }
92 if (channelFlags.isEmpty() || !config) {
93 channelFlags = QBitArray(device->colorSpace()->channelCount(), true);
94 }
95
97 delete kas;
98 KisConvolutionPainter painter(device);
99 painter.setChannelFlags(channelFlags);
100 painter.setProgress(progressUpdater);
101 painter.applyMatrix(kernel, device, srcTopLeft, srcTopLeft, rect.size(), BORDER_REPEAT);
102
103}
104
105QRect KisBlurFilter::neededRect(const QRect & rect, const KisFilterConfigurationSP _config, int lod) const
106{
108
109 QVariant value;
110 const int halfWidth = t.scale(_config->getProperty("halfWidth", value) ? value.toUInt() : 5);
111 const int halfHeight = t.scale(_config->getProperty("halfHeight", value) ? value.toUInt() : 5);
112
113 return rect.adjusted(-halfWidth * 2, -halfHeight * 2, halfWidth * 2, halfHeight * 2);
114}
115
116QRect KisBlurFilter::changedRect(const QRect & rect, const KisFilterConfigurationSP _config, int lod) const
117{
119
120 QVariant value;
121 const int halfWidth = t.scale(_config->getProperty("halfWidth", value) ? value.toUInt() : 5);
122 const int halfHeight = t.scale(_config->getProperty("halfHeight", value) ? value.toUInt() : 5);
123
124 return rect.adjusted(-halfWidth, -halfHeight, halfWidth, halfHeight);
125}
float value(const T *src, size_t ch)
@ FULLY_INDEPENDENT
unsigned int uint
QRect changedRect(const QRect &rect, const KisFilterConfigurationSP _config, int lod) const override
KisFilterConfigurationSP defaultConfiguration(KisResourcesInterfaceSP resourcesInterface) const override
KisConfigWidget * createConfigurationWidget(QWidget *parent, const KisPaintDeviceSP dev, bool useForMasks) const override
void processImpl(KisPaintDeviceSP device, const QRect &size, const KisFilterConfigurationSP config, KoUpdater *progressUpdater) const override
QRect neededRect(const QRect &rect, const KisFilterConfigurationSP _config, int lod) const override
The KisConvolutionPainter class applies a convolution kernel to a paint device.
void applyMatrix(const KisConvolutionKernelSP kernel, const KisPaintDeviceSP src, QPoint srcPos, QPoint dstPos, QSize areaSize, KisConvolutionBorderOp borderOp=BORDER_REPEAT)
void setSupportsLevelOfDetail(bool value)
qreal scale(qreal value) const
const KoColorSpace * colorSpace() const
void setProgress(KoUpdater *progressUpdater)
void setChannelFlags(QBitArray channelFlags)
virtual quint32 channelCount() const =0
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
const KoID FiltersCategoryBlurId("blur_filters", ki18nc("The category of blur filters, like gaussian blur. Verb.", "Blur"))
#define M_PI
Definition kis_global.h:111
virtual KisFilterConfigurationSP factoryConfiguration(KisResourcesInterfaceSP resourcesInterface) const
void setSupportsAdjustmentLayers(bool v)
void setSupportsPainting(bool v)
void setColorSpaceIndependence(ColorSpaceIndependence v)
static KisConvolutionKernelSP fromMaskGenerator(KisMaskGenerator *, qreal angle=0.0)