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