File indexing completed on 2024-06-16 04:16:40

0001 /*
0002  * KDE. Krita Project.
0003  *
0004  * SPDX-FileCopyrightText: 2020 Deif Lou <ginoba@gmail.com>
0005  *
0006  * SPDX-License-Identifier: GPL-2.0-or-later
0007  */
0008 
0009 #ifndef KIS_HALFTONE_FILTER_H
0010 #define KIS_HALFTONE_FILTER_H
0011 
0012 #include <QObject>
0013 #include <QVector>
0014 
0015 #include <filter/kis_filter.h>
0016 #include <kis_filter_configuration.h>
0017 #include <kis_cached_paint_device.h>
0018 
0019 #include "KisHalftoneFilterConfiguration.h"
0020 
0021 class KisConfigWidget;
0022 
0023 class KritaHalftone : public QObject
0024 {
0025     Q_OBJECT
0026 public:
0027     KritaHalftone(QObject *parent, const QVariantList &);
0028     ~KritaHalftone() override;
0029 };
0030 
0031 class KisHalftoneFilter : public KisFilter
0032 {
0033 public:
0034     KisHalftoneFilter();
0035 
0036     static inline KoID id() {
0037         return KoID("halftone", i18n("Halftone"));
0038     }
0039 
0040     void processImpl(KisPaintDeviceSP device,
0041                      const QRect& applyRect,
0042                      const KisFilterConfigurationSP config,
0043                      KoUpdater *progressUpdater) const override;
0044 
0045     KisFilterConfigurationSP defaultConfiguration(KisResourcesInterfaceSP resourcesInterface) const override;
0046     KisFilterConfigurationSP factoryConfiguration(KisResourcesInterfaceSP resourcesInterface) const override;
0047     KisConfigWidget *createConfigurationWidget(QWidget *parent, const KisPaintDeviceSP dev, bool useForMasks) const override;
0048 
0049 private:
0050     mutable KisCachedSelection m_selectionsCache;
0051     mutable KisCachedPaintDevice m_grayDevicesCache;
0052     mutable KisCachedPaintDevice m_genericDevicesCache;
0053 
0054     static QVector<quint8> makeHardnessLut(qreal hardness);
0055     static QVector<quint8> makeNoiseWeightLut(qreal hardness);
0056     
0057     static inline quint8 mapU8ToRange(quint8 value, quint8 new_min, quint8 new_max) {
0058         Q_UNUSED(new_min);
0059         Q_UNUSED(new_max);
0060         return value;
0061     }
0062     template <typename T>
0063     static inline T mapU8ToRange(quint8 value, T new_min, T new_max) {
0064         return value * (new_max - new_min) / 255 + new_min;
0065     }
0066 
0067     KisPaintDeviceSP makeGeneratorPaintDevice(KisPaintDeviceSP prototype,
0068                                               const QString & prefix,
0069                                               const QRect &applyRect,
0070                                               const KisHalftoneFilterConfiguration *config,
0071                                               KoUpdater *progressUpdater) const;
0072 
0073     bool checkUpdaterInterruptedAndSetPercent(KoUpdater *progressUpdater, int percent) const;
0074     
0075     void processIntensity(KisPaintDeviceSP device,
0076                           const QRect& applyRect,
0077                           const KisHalftoneFilterConfiguration *config,
0078                           KoUpdater *progressUpdater) const;
0079     template <typename ChannelType>
0080     void processChannel(KisPaintDeviceSP device,
0081                         KisPaintDeviceSP generatorDevice,
0082                         const QRect &applyRect,
0083                         const KisHalftoneFilterConfiguration *config,
0084                         const QString & prefix,
0085                         KoChannelInfo * channelInfo) const;
0086     void processChannels(KisPaintDeviceSP device,
0087                          const QRect& applyRect,
0088                          const KisHalftoneFilterConfiguration *config,
0089                          KoUpdater *progressUpdater) const;
0090     void processAlpha(KisPaintDeviceSP device,
0091                       const QRect& applyRect,
0092                       const KisHalftoneFilterConfiguration *config,
0093                       KoUpdater *progressUpdater) const;
0094     void processMask(KisPaintDeviceSP device,
0095                      const QRect& applyRect,
0096                      const KisHalftoneFilterConfiguration *config,
0097                      KoUpdater *progressUpdater) const;
0098 
0099 };
0100 
0101 #endif