File indexing completed on 2024-05-19 04:26:08

0001 /*
0002  *  SPDX-FileCopyrightText: 2012 Dmitry Kazakov <dimula73@gmail.com>
0003  *  SPDX-FileCopyrightText: 2022 L. E. Segovia <amy@amyspark.me>
0004  *
0005  *  SPDX-License-Identifier: GPL-2.0-or-later
0006  */
0007 
0008 #ifndef __KIS_BRUSH_MASK_APPLICATOR_BASE_H
0009 #define __KIS_BRUSH_MASK_APPLICATOR_BASE_H
0010 
0011 #include <cmath>
0012 
0013 #include "kis_fixed_paint_device.h"
0014 #include "kis_types.h"
0015 
0016 struct MaskProcessingData {
0017     MaskProcessingData(KisFixedPaintDeviceSP _device,
0018                        const KoColorSpace *_colorSpace,
0019                        const quint8 *_color,
0020                        qreal _randomness,
0021                        qreal _density,
0022                        double _centerX,
0023                        double _centerY,
0024                        double _angle)
0025         : device(_device)
0026         , colorSpace(_colorSpace)
0027         , color(_color)
0028         , randomness(_randomness)
0029         , density(_density)
0030         , centerX(_centerX)
0031         , centerY(_centerY)
0032         , cosa(std::cos(_angle))
0033         , sina(std::sin(_angle))
0034         , pixelSize(colorSpace->pixelSize())
0035     {
0036     }
0037 
0038     KisFixedPaintDeviceSP device;
0039     const KoColorSpace* colorSpace;
0040     const quint8* color;
0041     qreal randomness;
0042     qreal density;
0043     double centerX;
0044     double centerY;
0045 
0046     double cosa;
0047     double sina;
0048 
0049     quint32 pixelSize;
0050 };
0051 
0052 class KisBrushMaskApplicatorBase
0053 {
0054 public:
0055     virtual ~KisBrushMaskApplicatorBase() = default;
0056     virtual void process(const QRect &rect) = 0;
0057 
0058     inline void initializeData(const MaskProcessingData *data) {
0059         m_d = data;
0060     }
0061 
0062 protected:
0063     const MaskProcessingData *m_d = nullptr;
0064 };
0065 
0066 struct OperatorWrapper {
0067     OperatorWrapper(KisBrushMaskApplicatorBase *applicator)
0068         : m_applicator(applicator) {}
0069 
0070     inline void operator()(const QRect &rect) const
0071     {
0072         m_applicator->process(rect);
0073     }
0074 
0075     KisBrushMaskApplicatorBase *m_applicator;
0076 };
0077 
0078 #endif /* __KIS_BRUSH_MASK_APPLICATOR_BASE_H */