File indexing completed on 2024-05-26 04:33:50
0001 /* 0002 * SPDX-FileCopyrightText: 2021 Dmitry Kazakov <dimula73@gmail.com> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #ifndef KRITA_KISCOLORSMUDGESTRATEGYBASE_H 0008 #define KRITA_KISCOLORSMUDGESTRATEGYBASE_H 0009 0010 #include <kis_types.h> 0011 0012 #include "KisColorSmudgeStrategy.h" 0013 #include "KisColorSmudgeSource.h" 0014 0015 class KisPainter; 0016 0017 0018 class KisColorSmudgeStrategyBase : public KisColorSmudgeStrategy 0019 { 0020 public: 0021 struct DabColoringStrategy 0022 { 0023 virtual ~DabColoringStrategy() = default; 0024 virtual bool supportsFusedDullingBlending() const = 0; 0025 virtual void blendInColorRate(const KoColor &paintColor, const KoCompositeOp *colorRateOp, quint8 colorRateOpacity, 0026 KisFixedPaintDeviceSP dstDevice, const QRect &dstRect) const = 0; 0027 virtual void blendInFusedBackgroundAndColorRateWithDulling(KisFixedPaintDeviceSP dst, KisColorSmudgeSourceSP src, 0028 const QRect &dstRect, 0029 const KoColor &preparedDullingColor, 0030 const KoCompositeOp *smearOp, 0031 const quint8 smudgeRateOpacity, 0032 const KoColor &paintColor, 0033 const KoCompositeOp *colorRateOp, 0034 const quint8 colorRateOpacity) const = 0; 0035 }; 0036 0037 struct DabColoringStrategyMask : public DabColoringStrategy 0038 { 0039 bool supportsFusedDullingBlending() const override; 0040 0041 void blendInColorRate(const KoColor &paintColor, const KoCompositeOp *colorRateOp, quint8 colorRateOpacity, 0042 KisFixedPaintDeviceSP dstDevice, const QRect &dstRect) const override; 0043 0044 void blendInFusedBackgroundAndColorRateWithDulling(KisFixedPaintDeviceSP dst, 0045 KisColorSmudgeSourceSP src, 0046 const QRect &dstRect, 0047 const KoColor &preparedDullingColor, 0048 const KoCompositeOp *smearOp, 0049 const quint8 smudgeRateOpacity, 0050 const KoColor &paintColor, 0051 const KoCompositeOp *colorRateOp, 0052 const quint8 colorRateOpacity) const override; 0053 }; 0054 0055 struct DabColoringStrategyStamp : public DabColoringStrategy 0056 { 0057 void setStampDab(KisFixedPaintDeviceSP device); 0058 0059 void blendInColorRate(const KoColor &paintColor, const KoCompositeOp *colorRateOp, quint8 colorRateOpacity, 0060 KisFixedPaintDeviceSP dstDevice, const QRect &dstRect) const override; 0061 0062 bool supportsFusedDullingBlending() const override; 0063 0064 void blendInFusedBackgroundAndColorRateWithDulling(KisFixedPaintDeviceSP dst, 0065 KisColorSmudgeSourceSP src, 0066 const QRect &dstRect, 0067 const KoColor &preparedDullingColor, 0068 const KoCompositeOp *smearOp, 0069 const quint8 smudgeRateOpacity, 0070 const KoColor &paintColor, 0071 const KoCompositeOp *colorRateOp, 0072 const quint8 colorRateOpacity) const override; 0073 0074 private: 0075 KisFixedPaintDeviceSP m_origDab; 0076 }; 0077 0078 public: 0079 0080 KisColorSmudgeStrategyBase(bool useDullingMode); 0081 0082 void initializePaintingImpl(const KoColorSpace *dstColorSpace, 0083 bool smearAlpha, 0084 const QString &colorRateCompositeOpId); 0085 0086 virtual DabColoringStrategy& coloringStrategy() = 0; 0087 0088 const KoColorSpace* preciseColorSpace() const override; 0089 0090 virtual QString smearCompositeOp(bool smearAlpha) const; 0091 0092 virtual QString finalCompositeOp(bool smearAlpha) const; 0093 0094 virtual quint8 finalPainterOpacity(qreal opacity, qreal smudgeRateValue); 0095 0096 virtual quint8 colorRateOpacity(qreal opacity, qreal smudgeRateValue, qreal colorRateValue, qreal maxPossibleSmudgeRateValue); 0097 0098 virtual quint8 dullingRateOpacity(qreal opacity, qreal smudgeRateValue); 0099 0100 virtual quint8 smearRateOpacity(qreal opacity, qreal smudgeRateValue); 0101 0102 virtual void sampleDullingColor(const QRect &srcRect, qreal sampleRadiusValue, KisColorSmudgeSourceSP sourceDevice, 0103 KisFixedPaintDeviceSP tempFixedDevice, KisFixedPaintDeviceSP maskDab, 0104 KoColor *resultColor); 0105 0106 void blendBrush(const QVector<KisPainter *> dstPainters, KisColorSmudgeSourceSP srcSampleDevice, 0107 KisFixedPaintDeviceSP maskDab, bool preserveMaskDab, const QRect &srcRect, const QRect &dstRect, 0108 const KoColor ¤tPaintColor, qreal opacity, qreal smudgeRateValue, 0109 qreal maxPossibleSmudgeRateValue, qreal colorRateValue, qreal smudgeRadiusValue); 0110 0111 void blendInBackgroundWithSmearing(KisFixedPaintDeviceSP dst, KisColorSmudgeSourceSP src, const QRect &srcRect, 0112 const QRect &dstRect, const quint8 smudgeRateOpacity); 0113 0114 void blendInBackgroundWithDulling(KisFixedPaintDeviceSP dst, KisColorSmudgeSourceSP src, const QRect &dstRect, 0115 const KoColor &preparedDullingColor, const quint8 smudgeRateOpacity); 0116 0117 protected: 0118 const KoCompositeOp * m_colorRateOp {nullptr}; 0119 KoColor m_preparedDullingColor; 0120 const KoCompositeOp * m_smearOp {nullptr}; 0121 private: 0122 KisFixedPaintDeviceSP m_blendDevice; 0123 bool m_useDullingMode {true}; 0124 }; 0125 0126 0127 #endif //KRITA_KISCOLORSMUDGESTRATEGYBASE_H