File indexing completed on 2024-06-23 04:27:58

0001 /*
0002  *  SPDX-FileCopyrightText: 2008-2010, 2013 Lukáš Tvrdý <lukast.dev@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #ifndef _SPRAY_BRUSH_H_
0008 #define _SPRAY_BRUSH_H_
0009 
0010 #include <KoColor.h>
0011 
0012 #include "kis_types.h"
0013 #include "kis_painter.h"
0014 
0015 #include <brushengine/kis_random_source.h>
0016 #include "KisColorOptionData.h"
0017 #include "KisSprayOpOptionData.h"
0018 #include "KisSprayOpOption.h"
0019 #include "KisSprayShapeDynamicsOptionData.h"
0020 #include "KisSprayShapeOptionData.h"
0021 
0022 
0023 
0024 
0025 
0026 #include <QImage>
0027 #include <kis_brush.h>
0028 
0029 class KisPaintInformation;
0030 
0031 class SprayBrush
0032 {
0033 
0034 public:
0035     SprayBrush();
0036     ~SprayBrush();
0037 
0038     void paint(KisPaintDeviceSP dab,
0039                KisPaintDeviceSP source,
0040                const KisPaintInformation& info,
0041                qreal rotation,
0042                qreal scale,
0043                qreal additionalScale,
0044                const KoColor &color,
0045                const KoColor &bgColor);
0046     void setProperties(KisSprayOpOptionData * properties,
0047                        KisColorOptionData * colorProperties,
0048                        KisSprayShapeOptionData * shapeProperties,
0049                        KisSprayShapeDynamicsOptionData * shapeDynamicsProperties,
0050                        KisBrushSP brush);
0051 
0052     void setFixedDab(KisFixedPaintDeviceSP dab);
0053 
0054 private:
0055     int m_dabSeqNo {0};
0056     KoColor m_inkColor;
0057     qreal m_radius {1.0};
0058     quint32 m_particlesCount {1};
0059     quint8 m_dabPixelSize {1};
0060 
0061     KisPainter * m_painter {nullptr};
0062     KisPaintDeviceSP m_imageDevice;
0063     QImage m_brushQImage;
0064     QImage m_transformed;
0065 
0066     KoColorTransformation* m_transfo {nullptr};
0067 
0068     const KisSprayOpOptionData * m_sprayOpOptionData {nullptr};
0069     KisSprayOpOption * m_sprayOpOption {nullptr};
0070     const KisColorOptionData * m_colorProperties {nullptr};
0071     const KisSprayShapeOptionData * m_shapeProperties {nullptr};
0072     const KisSprayShapeDynamicsOptionData * m_shapeDynamicsProperties {nullptr};
0073 
0074     KisBrushSP m_brush;
0075     KisFixedPaintDeviceSP m_fixedDab;
0076 
0077 private:
0078     template <typename AngularDistribution>
0079     void paintImpl(KisPaintDeviceSP dab,
0080                    KisPaintDeviceSP source,
0081                    const KisPaintInformation& info,
0082                    qreal rotation,
0083                    qreal scale,
0084                    qreal additionalScale,
0085                    const KoColor &color,
0086                    const KoColor &bgColor,
0087                    const AngularDistribution &angularDistribution);
0088     template <typename AngularDistribution, typename RadialDistribution>
0089     void paintImpl(KisPaintDeviceSP dab,
0090                    KisPaintDeviceSP source,
0091                    const KisPaintInformation& info,
0092                    qreal rotation,
0093                    qreal scale,
0094                    qreal additionalScale,
0095                    const KoColor &color,
0096                    const KoColor &bgColor,
0097                    const AngularDistribution &angularDistribution,
0098                    const RadialDistribution &radialDistribution);
0099     /// rotation in radians according the settings (gauss distribution, uniform distribution or fixed angle)
0100     qreal rotationAngle(KisRandomSourceSP randomSource);
0101     /// Paints Wu Particle
0102     void paintParticle(KisRandomAccessorSP &writeAccessor, const KoColor &color, qreal rx, qreal ry);
0103     void paintCircle(KisPainter * painter, qreal x, qreal y, qreal radius);
0104     void paintEllipse(KisPainter * painter, qreal x, qreal y, qreal a, qreal b, qreal angle);
0105     void paintRectangle(KisPainter * painter, qreal x, qreal y, qreal width, qreal height, qreal angle);
0106 
0107     void paintOutline(KisPaintDeviceSP dev, const KoColor& painterColor, qreal posX, qreal posY, qreal radius);
0108 
0109     /// mix a with b.b mix with weight and a with 1.0 - weight
0110     inline qreal linearInterpolation(qreal a, qreal b, qreal weight) const {
0111         return (1.0 - weight) * a + weight * b;
0112     }
0113 
0114     // TODO: move this somewhere where I can reuse it
0115     /// convert radians to degrees
0116     inline qreal rad2deg(qreal rad) const {
0117         return rad * (180.0 / M_PI);
0118     }
0119 
0120     /// convert degrees to radians
0121     inline qreal deg2rad(quint16 deg) const {
0122         return deg * (M_PI / 180.0);
0123     }
0124 };
0125 
0126 #endif