File indexing completed on 2024-05-12 15:58:43

0001 /*
0002  *  SPDX-License-Identifier: GPL-3.0-or-later
0003  */
0004 
0005 #ifndef KIS_SPACING_INFORMATION_H
0006 #define KIS_SPACING_INFORMATION_H
0007 
0008 #include "kritaimage_export.h"
0009 
0010 /**
0011  * Contains information about distance-based spacing settings in a stroke. The spacing settings may
0012  * be different at different parts of a stroke, e.g. if spacing is linked to pressure; a
0013  * KisSpacingInformation represents the effective spacing at a single specific part of the stroke.
0014  */
0015 class KRITAIMAGE_EXPORT KisSpacingInformation {
0016 public:
0017     explicit KisSpacingInformation()
0018         : m_distanceSpacingEnabled(true)
0019         , m_distanceSpacing(0.0, 0.0)
0020         , m_rotation(0.0)
0021         , m_coordinateSystemFlipped(false)
0022     {
0023     }
0024 
0025     explicit KisSpacingInformation(qreal isotropicSpacing)
0026         : m_distanceSpacingEnabled(true)
0027         , m_distanceSpacing(isotropicSpacing, isotropicSpacing)
0028         , m_rotation(0.0)
0029         , m_coordinateSystemFlipped(false)
0030     {
0031     }
0032 
0033     explicit KisSpacingInformation(const QPointF &anisotropicSpacing, qreal rotation,
0034                                    bool coordinateSystemFlipped)
0035         : m_distanceSpacingEnabled(true)
0036         , m_distanceSpacing(anisotropicSpacing)
0037         , m_rotation(rotation)
0038         , m_coordinateSystemFlipped(coordinateSystemFlipped)
0039     {
0040     }
0041 
0042     explicit KisSpacingInformation(bool distanceSpacingEnabled, qreal isotropicSpacing)
0043         : m_distanceSpacingEnabled(distanceSpacingEnabled)
0044         , m_distanceSpacing(isotropicSpacing, isotropicSpacing)
0045         , m_rotation(0.0)
0046         , m_coordinateSystemFlipped(false)
0047     {
0048     }
0049 
0050     explicit KisSpacingInformation(bool distanceSpacingEnabled,
0051                                    const QPointF &anisotropicSpacing,
0052                                    qreal rotation,
0053                                    bool coordinateSystemFlipped)
0054         : m_distanceSpacingEnabled(distanceSpacingEnabled)
0055         , m_distanceSpacing(anisotropicSpacing)
0056         , m_rotation(rotation)
0057         , m_coordinateSystemFlipped(coordinateSystemFlipped)
0058     {
0059     }
0060 
0061     /**
0062      * @return True if and only if distance-based spacing is enabled.
0063      */
0064     inline bool isDistanceSpacingEnabled() const {
0065         return m_distanceSpacingEnabled;
0066     }
0067 
0068     inline QPointF distanceSpacing() const {
0069         return m_distanceSpacing;
0070     }
0071 
0072     inline bool isIsotropic() const {
0073         return m_distanceSpacing.x() == m_distanceSpacing.y();
0074     }
0075 
0076     inline qreal scalarApprox() const {
0077         return isIsotropic() ? m_distanceSpacing.x() : QVector2D(m_distanceSpacing).length();
0078     }
0079 
0080     inline qreal rotation() const {
0081         return m_rotation;
0082     }
0083 
0084     bool coordinateSystemFlipped() const {
0085         return m_coordinateSystemFlipped;
0086     }
0087 
0088 private:
0089 
0090     // Distance-based spacing
0091     bool m_distanceSpacingEnabled;
0092     QPointF m_distanceSpacing;
0093 
0094     qreal m_rotation;
0095     bool m_coordinateSystemFlipped;
0096 };
0097 
0098 #endif // KIS_SPACING_INFORMATION_H