File indexing completed on 2024-05-12 15:58:17

0001 /*
0002  *  SPDX-FileCopyrightText: 2014 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #ifndef __KIS_GAUSSIAN_KERNEL_H
0008 #define __KIS_GAUSSIAN_KERNEL_H
0009 
0010 #include "kritaimage_export.h"
0011 #include "kis_types.h"
0012 #include "kis_convolution_painter.h"
0013 
0014 #include <Eigen/Core>
0015 
0016 class QRect;
0017 
0018 class KRITAIMAGE_EXPORT KisGaussianKernel
0019 {
0020 public:
0021     static Eigen::Matrix<qreal, Eigen::Dynamic, Eigen::Dynamic>
0022         createHorizontalMatrix(qreal radius);
0023 
0024     static Eigen::Matrix<qreal, Eigen::Dynamic, Eigen::Dynamic>
0025         createVerticalMatrix(qreal radius);
0026 
0027     static KisConvolutionKernelSP
0028         createHorizontalKernel(qreal radius);
0029 
0030     static KisConvolutionKernelSP
0031         createVerticalKernel(qreal radius);
0032 
0033     static KisConvolutionKernelSP
0034         createUniform2DKernel(qreal xRadius, qreal yRadius);
0035 
0036     static qreal sigmaFromRadius(qreal radius);
0037     static int kernelSizeFromRadius(qreal radius);
0038 
0039     static void applyGaussian(KisPaintDeviceSP device,
0040                               const QRect& rect,
0041                               qreal xRadius, qreal yRadius,
0042                               const QBitArray &channelFlags,
0043                               KoUpdater *updater,
0044                               bool createTransaction = false,
0045                               KisConvolutionBorderOp borderOp = BORDER_REPEAT);
0046 
0047     static Eigen::Matrix<qreal, Eigen::Dynamic, Eigen::Dynamic> createLoGMatrix(qreal radius, qreal coeff, bool zeroCentered, bool includeWrappedArea);
0048 
0049     static void applyLoG(KisPaintDeviceSP device,
0050                          const QRect& rect,
0051                          qreal radius,
0052                          qreal coeff,
0053                          const QBitArray &channelFlags,
0054                          KoUpdater *progressUpdater);
0055 
0056     static void applyTightLoG(KisPaintDeviceSP device,
0057                               const QRect& rect,
0058                               qreal radius, qreal coeff,
0059                               const QBitArray &channelFlags,
0060                               KoUpdater *progressUpdater);
0061 
0062 
0063     static Eigen::Matrix<qreal, Eigen::Dynamic, Eigen::Dynamic> createDilateMatrix(qreal radius);
0064 
0065     static void applyDilate(KisPaintDeviceSP device,
0066                             const QRect& rect,
0067                             qreal radius,
0068                             const QBitArray &channelFlags,
0069                             KoUpdater *progressUpdater,
0070                             bool createTransaction = false);
0071 
0072     static void applyErodeU8(KisPaintDeviceSP device,
0073                              const QRect& rect,
0074                              qreal radius,
0075                              const QBitArray &channelFlags,
0076                              KoUpdater *progressUpdater,
0077                              bool createTransaction = false);
0078 };
0079 
0080 #endif /* __KIS_GAUSSIAN_KERNEL_H */