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

0001 /*
0002  *  SPDX-FileCopyrightText: 2022 Agata Cacko <cacko.azh@gmail.com>
0003  *  SPDX-FileCopyrightText: 2008-2010 Lukáš Tvrdý <lukast.dev@gmail.com>
0004  *
0005  *  SPDX-License-Identifier: GPL-2.0-or-later
0006  */
0007 #ifndef KIS_SPRAYOP_OPTION_DATA_H
0008 #define KIS_SPRAYOP_OPTION_DATA_H
0009 
0010 
0011 #include "kis_types.h"
0012 #include <boost/operators.hpp>
0013 #include <kritapaintop_export.h>
0014 
0015 #include <kis_cubic_curve.h>
0016 
0017 #include "KisSprayRandomDistributions.h"
0018 
0019 class KisPropertiesConfiguration;
0020 
0021 
0022 const QString SPRAY_DIAMETER = "Spray/diameter";
0023 const QString SPRAY_ASPECT = "Spray/aspect";
0024 const QString SPRAY_ROTATION = "Spray/rotation";
0025 const QString SPRAY_SCALE = "Spray/scale";
0026 const QString SPRAY_SPACING = "Spray/spacing";
0027 const QString SPRAY_JITTER_MOVEMENT = "Spray/jitterMovement";
0028 const QString SPRAY_JITTER_MOVE_AMOUNT = "Spray/jitterMoveAmount";
0029 const QString SPRAY_USE_DENSITY = "Spray/useDensity";
0030 const QString SPRAY_PARTICLE_COUNT = "Spray/particleCount";
0031 const QString SPRAY_COVERAGE = "Spray/coverage";
0032 const QString SPRAY_ANGULAR_DISTRIBUTION_TYPE = "Spray/angularDistributionType";
0033 const QString SPRAY_ANGULAR_DISTRIBUTION_CURVE = "Spray/angularDistributionCurve";
0034 const QString SPRAY_ANGULAR_DISTRIBUTION_CURVE_REPEAT = "Spray/angularDistributionCurveRepeat";
0035 const QString SPRAY_RADIAL_DISTRIBUTION_TYPE = "Spray/radialDistributionType";
0036 const QString SPRAY_RADIAL_DISTRIBUTION_STD_DEVIATION = "Spray/radialDistributionStdDeviation";
0037 const QString SPRAY_RADIAL_DISTRIBUTION_CLUSTERING_AMOUNT = "Spray/radialDistributionClusteringAmount";
0038 const QString SPRAY_RADIAL_DISTRIBUTION_CURVE = "Spray/radialDistributionCurve";
0039 const QString SPRAY_RADIAL_DISTRIBUTION_CURVE_REPEAT = "Spray/radialDistributionCurveRepeat";
0040 const QString SPRAY_RADIAL_DISTRIBUTION_CENTER_BIASED = "Spray/radialDistributionCenterBiased";
0041 const QString SPRAY_GAUSS_DISTRIBUTION = "Spray/gaussianDistribution";
0042 
0043 
0044 struct KisSprayOpOptionData : boost::equality_comparable<KisSprayOpOptionData>
0045 {
0046     enum ParticleDistribution
0047     {
0048         ParticleDistribution_Uniform,
0049         ParticleDistribution_Gaussian,
0050         ParticleDistribution_ClusterBased,
0051         ParticleDistribution_CurveBased
0052     };
0053     
0054     inline friend bool operator==(const KisSprayOpOptionData &lhs, const KisSprayOpOptionData &rhs) {
0055         return lhs.diameter == rhs.diameter // 10 entries
0056             && lhs.aspect == rhs.aspect
0057             && lhs.brushRotation == rhs.brushRotation
0058             && lhs.scale == rhs.scale
0059             && lhs.spacing == rhs.spacing
0060             && lhs.jitterMovement == rhs.jitterMovement
0061             && lhs.jitterAmount == rhs.jitterAmount
0062             && lhs.useDensity == rhs.useDensity
0063             && lhs.particleCount == rhs.particleCount
0064             && lhs.coverage == rhs.coverage
0065             // 9 entries
0066             && lhs.angularDistributionType == rhs.angularDistributionType
0067             && lhs.angularDistributionCurve == rhs.angularDistributionCurve
0068             && lhs.angularDistributionCurveRepeat == rhs.angularDistributionCurveRepeat
0069             && lhs.radialDistributionType == rhs.radialDistributionType
0070             && lhs.radialDistributionStdDeviation == rhs.radialDistributionStdDeviation
0071             && lhs.radialDistributionClusteringAmount == rhs.radialDistributionClusteringAmount
0072             && lhs.radialDistributionCurve == rhs.radialDistributionCurve
0073             && lhs.radialDistributionCurveRepeat == rhs.radialDistributionCurveRepeat
0074             && lhs.radialDistributionCenterBiased == rhs.radialDistributionCenterBiased;
0075             // 7 entries - but there is no need to compare functors
0076             
0077     }
0078 
0079     // sane defaults (for Coverity)
0080     // NOTE: if you add any new variable, make sure it's present in all places! including == function
0081     // 10 entries
0082     quint16 diameter {100};
0083     qreal aspect {1.0};
0084     qreal brushRotation {0.0};
0085     qreal scale {1.0};
0086     qreal spacing {0.5};
0087     bool jitterMovement {false};
0088     qreal jitterAmount {1.0};
0089     bool useDensity {false};
0090     quint16 particleCount {12};
0091     qreal coverage {0.003};
0092     
0093     // 9 entries
0094     ParticleDistribution angularDistributionType {ParticleDistribution_Uniform};
0095     QString angularDistributionCurve {DEFAULT_CURVE_STRING};
0096     int angularDistributionCurveRepeat {1};
0097     ParticleDistribution radialDistributionType {ParticleDistribution_Uniform};
0098     qreal radialDistributionStdDeviation {0.5};
0099     qreal radialDistributionClusteringAmount {0.0};
0100     QString radialDistributionCurve {DEFAULT_CURVE_STRING};
0101     int radialDistributionCurveRepeat {1};
0102     bool radialDistributionCenterBiased {false};
0103 
0104     // functions
0105     bool read(const KisPropertiesConfiguration *setting);
0106     void write(KisPropertiesConfiguration *setting) const;
0107 };
0108 
0109 #endif // KIS_SPRAYOP_OPTION_DATA_H