File indexing completed on 2024-05-12 15:56:09

0001 /*
0002  *  SPDX-FileCopyrightText: 2010 Lukáš Tvrdý <lukast.dev@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #ifndef KIS_ABR_TRANSLATOR_H
0008 #define KIS_ABR_TRANSLATOR_H
0009 
0010 
0011 #include <QString>
0012 #include <QDomDocument>
0013 const QString ABR_PRESET_START = "START";
0014 
0015 const QString ABR_OBJECT = "Objc";
0016 const QString ABR_PRESET_NAME = "Nm  ";
0017 const QString ABR_BRUSH_DIAMETER = "Dmtr";
0018 const QString ABR_BRUSH_HARDNESS = "Hrdn";
0019 const QString ABR_BRUSH_ANGLE = "Angl";
0020 const QString ABR_BRUSH_ROUNDNESS = "Rndn";
0021 const QString ABR_BRUSH_SPACING = "Spcn";
0022 const QString ABR_BRUSH_INTR = "Intr";
0023 const QString ABR_FLIP_X = "flipX";
0024 const QString ABR_FLIP_Y = "flipY";
0025 const QString ABR_USE_TIP_DYNAMICS = "useTipDynamics";
0026 const QString ABR_TIP_DYNAMICS_MINUMUM_DIAMETER = "minimumDiameter";
0027 const QString ABR_TIP_DYNAMICS_MINUMUM_ROUNDNESS = "minimumRoundness";
0028 const QString ABR_TIP_DYNAMICS_TILT_SCALE = "tiltScale";
0029 const QString ABR_SZVR = "szVr"; // size variance?
0030 const QString ABR_DYNAMICS_FADE_STEP = "fStp";
0031 const QString ABR_DYNAMICS_JITTER = "jitter";
0032 const QString ABR_ANGLE_DYNAMICS = "angleDynamics";
0033 const QString ABR_CONTROL = "bVTy"; // control of the attribute
0034 const QString ABR_ROUNDNESS_DYNAMICS = "roundnessDynamics";
0035 const QString ABR_USE_SCATTER = "useScatter";
0036 const QString ABR_DUAL_BRUSH = "dualBrush";
0037 const QString ABR_USE_DUAL_BRUSH = "useDualBrush";
0038 const QString ABR_BRUSH_GROUP = "brushGroup";
0039 const QString ABR_USE_BRUSH_GROUP = "useBrushGroup";
0040 const QString ABR_USE_TEXTURE = "useTexture";
0041 const QString ABR_USE_PAINT_DYNAMICS = "usePaintDynamics";
0042 const QString ABR_USE_COLOR_DYNAMICS = "useColorDynamics";
0043 const QString ABR_WET_EDGES = "Wtdg";
0044 const QString ABR_NOISE = "Nose";
0045 const QString ABR_AIRBRUSH = "Rpt "; // repeat
0046 
0047 // TODO: if string comparisons would be slow, convert it to enum
0048 enum enumObjectTypes {BRUSH_PRESET, BRUSH, SIZE_VARIANCE, ANGLE_DYNAMICS, ROUNDNESS_DYNAMICS, DUAL_BRUSH, COUNT_DYNAMICS, SCATTER_DYNAMICS, BRUSH_GROUP};
0049 const QString OBJECT_NAME_BRUSH_PRESET = "";
0050 const QString OBJECT_NAME_BRUSH = "Brsh";
0051 const QString OBJECT_NAME_SIZE_VARIANCE = "szVr";
0052 const QString OBJECT_NAME_ANGLE_DYNAMICS = "angleDynamics";
0053 const QString OBJECT_NAME_ROUNDNESS_DYNAMICS = "roundnessDynamics";
0054 const QString OBJECT_NAME_DUAL_BRUSH = "dualBrush";
0055 const QString OBJECT_NAME_COUNT_DYNAMICS = "countDynamics";
0056 const QString OBJECT_NAME_SCATTER_DYNAMICS = "scatterDynamics";
0057 const QString OBJECT_NAME_BRUSH_GROUP = "brushGroup";
0058 const QString OBJECT_NAME_FLOW_JITTER = "prVr";
0059 const QString OBJECT_NAME_OPACITY_VARIANCE = "opVr";
0060 
0061 const QString BRUSH_TYPE_COMPUTED = "computedBrush";
0062 const QString BRUSH_TYPE_SAMPLED = "sampledBrush";
0063 
0064 enum enumAbrControllers { OFF, FADE, PEN_PRESSURE, PEN_TILT, STYLUS_WHEEL, ROTATION, INITIAL_DIRECTION, DIRECTION};
0065 
0066 
0067 class AbrBrushProperties
0068 {
0069 public:
0070     void toXML(QDomDocument& , QDomElement&) const;
0071     void setupProperty(const QString &attributeName, const QString &type, const  QString &value);
0072     void reset();
0073 private:
0074     double m_diameter;
0075     double m_hardness;
0076     double m_angle;
0077     double m_roundness;
0078     double m_spacing;
0079     bool m_intr;
0080     bool m_flipX;
0081     bool m_flipY;
0082 
0083     QString m_brushType;
0084 };
0085 
0086 
0087 class AbrGroupProperties
0088 {
0089 public:
0090     void setupProperty(const QString &attributeName, const QString &type, const  QString &value);
0091 
0092     enumAbrControllers m_bVTy;
0093     int m_fadeStep;
0094     double m_sizeJitter;
0095 };
0096 
0097 #include <QHash>
0098 
0099 class AbrTipDynamicsProperties
0100 {
0101 public:
0102     AbrTipDynamicsProperties();
0103     void toXML(QDomDocument& , QDomElement&) const;
0104     void setupProperty(const QString &attributeName, const QString &type, const  QString &value);
0105     void reset() {
0106         m_groupType.clear();
0107     }
0108 private:
0109     bool m_useTipDynamics;
0110     bool m_flipX;
0111     bool m_flipY;
0112     double m_minumumDiameter;
0113     double m_minumumRoundness;
0114     double m_tiltScale;
0115 
0116     AbrGroupProperties m_sizeVarianceProperties;
0117     AbrGroupProperties m_angleProperties;
0118     AbrGroupProperties m_RoundnessProperties;
0119 
0120     QString m_groupType;
0121 
0122     QHash<QString, AbrGroupProperties*> m_groups;
0123 };
0124 
0125 
0126 class AbrDualBrushProperties
0127 {
0128 public:
0129     bool useDualBrush;
0130     void toXML(QDomDocument& , QDomElement&) const;
0131 };
0132 
0133 class AbrBrushGroupProperties
0134 {
0135 public:
0136     bool useBrushGroup;
0137     bool useTexture;
0138     bool usePaintDynamics;
0139     bool useColorDynamics;
0140     bool wetEdges;
0141     bool noise;
0142     bool repeat;
0143     void toXML(QDomDocument& , QDomElement&) const;
0144 };
0145 
0146 class KisAbrTranslator
0147 {
0148 public:
0149     KisAbrTranslator();
0150     ~KisAbrTranslator();
0151 
0152 
0153     void addEntry(const QString &attributeName, const QString &type, const  QString &value);
0154 
0155     QString toString();
0156     void finishPreset();
0157     void clean();
0158 
0159 private:
0160     void init();
0161     void setupObjectType(const QString &type);
0162     void setupBrush(const QString &attributeName, const QString &type, const  QString &value);
0163 private:
0164     QDomDocument m_doc;
0165     QDomElement m_root;
0166     QString m_currentObjectName;
0167     AbrBrushProperties m_abrBrushProperties;
0168     AbrTipDynamicsProperties m_abrTipDynamics;
0169 };
0170 
0171 #endif