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 &currentPaintColor, 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