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