Krita Source Code Documentation
Loading...
Searching...
No Matches
gaussianhighpass_filter.cpp
Go to the documentation of this file.
1/*
2 * This file is part of Krita
3 *
4 * SPDX-FileCopyrightText: 2019 Miguel Lopez <reptillia39@live.com>
5 *
6 * SPDX-License-Identifier: GPL-2.0-or-later
7 */
8
10#include <QBitArray>
11
12#include <KoColorSpace.h>
13#include <KoChannelInfo.h>
14#include <KoColor.h>
15#include <kis_painter.h>
16#include <kis_paint_device.h>
17#include <kis_paint_layer.h>
18#include <kis_group_layer.h>
19
20#include <kis_mask_generator.h>
21#include <kis_gaussian_kernel.h>
25#include <KoProgressUpdater.h>
26#include <KoUpdater.h>
27#include <KoMixColorsOp.h>
28#include "kis_lod_transform.h"
30
32#include "ui_wdggaussianhighpass.h"
33#include "KoColorSpaceTraits.h"
35
36
45
46KisConfigWidget * KisGaussianHighPassFilter::createConfigurationWidget(QWidget* parent, const KisPaintDeviceSP, bool /* useForMasks */) const
47{
48 return new KisWdgGaussianHighPass(parent);
49}
50
52{
53 KisFilterConfigurationSP config = factoryConfiguration(resourcesInterface);
54 config->setProperty("blurAmount", 1);
55 return config;
56}
57
59 const QRect& applyRect,
60 const KisFilterConfigurationSP config,
61 KoUpdater *
62 ) const
63{
64 QPointer<KoUpdater> convolutionUpdater = 0;
66
67 QVariant value;
68 KisLodTransformScalar t(device);
69 const qreal blurAmount = t.scale(config->getProperty("blurAmount", value) ? value.toDouble() : 1.0);
70 QBitArray channelFlags = config->channelFlags();
71
72 const QRect gaussNeedRect = this->neededRect(applyRect, config, device->defaultBounds()->currentLevelOfDetail());
73
75 KisPaintDeviceSP blur = d1.device();
76 KisPainter::copyAreaOptimizedOldData(gaussNeedRect.topLeft(), device, blur, gaussNeedRect);
78 blurAmount, blurAmount,
79 channelFlags,
80 convolutionUpdater,
81 true); // make sure we create an internal transaction on temp device
82
83 KisPainter painter(device);
85 painter.bitBlt(applyRect.topLeft(), blur, applyRect);
86 painter.end();
87}
88
89
90QRect KisGaussianHighPassFilter::neededRect(const QRect & rect, const KisFilterConfigurationSP config, int lod) const
91{
93
94 QVariant value;
95
96 const int halfSize = config->getProperty("blurAmount", value) ? KisGaussianKernel::kernelSizeFromRadius(t.scale(value.toFloat())) / 2 : 5;
97
98 return rect.adjusted( -halfSize * 2, -halfSize * 2, halfSize * 2, halfSize * 2);
99}
100
101QRect KisGaussianHighPassFilter::changedRect(const QRect & rect, const KisFilterConfigurationSP config, int lod) const
102{
104
105 QVariant value;
106
107 const int halfSize = config->getProperty("blurAmount", value) ? KisGaussianKernel::kernelSizeFromRadius(t.scale(value.toFloat())) / 2 : 5;
108
109 return rect.adjusted( -halfSize, -halfSize, halfSize, halfSize);
110}
float value(const T *src, size_t ch)
@ FULLY_INDEPENDENT
const QString COMPOSITE_GRAIN_EXTRACT
virtual int currentLevelOfDetail() const =0
void setSupportsLevelOfDetail(bool value)
KisFilterConfigurationSP defaultConfiguration(KisResourcesInterfaceSP resourcesInterface) 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
KisCachedPaintDevice m_cachedPaintDevice
void processImpl(KisPaintDeviceSP device, const QRect &applyRect, const KisFilterConfigurationSP config, KoUpdater *) const override
QRect neededRect(const QRect &rect, const KisFilterConfigurationSP _config, int lod) 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
KisDefaultBoundsBaseSP defaultBounds() const
void bitBlt(qint32 dstX, qint32 dstY, const KisPaintDeviceSP srcDev, qint32 srcX, qint32 srcY, qint32 srcWidth, qint32 srcHeight)
static void copyAreaOptimizedOldData(const QPoint &dstPt, KisPaintDeviceSP src, KisPaintDeviceSP dst, const QRect &originalSrcRect)
void setCompositeOpId(const KoCompositeOp *op)
#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"))
void setSupportsThreading(bool v)
virtual KisFilterConfigurationSP factoryConfiguration(KisResourcesInterfaceSP resourcesInterface) const
void setSupportsAdjustmentLayers(bool v)
void setSupportsPainting(bool v)
void setColorSpaceIndependence(ColorSpaceIndependence v)
KisPaintDeviceSP device() const