File indexing completed on 2024-05-12 15:58:09
0001 /* 0002 * SPDX-FileCopyrightText: 2008-2009 Cyrille Berger <cberger@cberger.net> 0003 * SPDX-FileCopyrightText: 2010 Lukáš Tvrdý <lukast.dev@gmail.com> 0004 * 0005 * SPDX-License-Identifier: GPL-2.0-or-later 0006 */ 0007 0008 #ifndef _KIS_MASK_GENERATOR_H_ 0009 #define _KIS_MASK_GENERATOR_H_ 0010 0011 #include <QScopedPointer> 0012 0013 #include <KoID.h> 0014 #include <klocalizedstring.h> 0015 0016 #include "kritaimage_export.h" 0017 0018 class QDomElement; 0019 class QDomDocument; 0020 class KisBrushMaskApplicatorBase; 0021 0022 const KoID DefaultId("default", ki18n("Default")); ///< generate Krita default mask generator 0023 const KoID SoftId("soft", ki18n("Soft")); ///< generate brush mask from former softbrush paintop, where softness is based on curve 0024 const KoID GaussId("gauss", ki18n("Gaussian")); ///< generate brush mask with a Gaussian-blurred edge 0025 0026 static const int OVERSAMPLING = 4; 0027 0028 /** 0029 * This is the base class for mask shapes 0030 * You should subclass it if you want to create a new 0031 * shape. 0032 */ 0033 class KRITAIMAGE_EXPORT KisMaskGenerator 0034 { 0035 public: 0036 enum Type { 0037 CIRCLE, RECTANGLE 0038 }; 0039 public: 0040 0041 /** 0042 * This function creates an auto brush shape with the following values: 0043 * @param radius radius 0044 * @param ratio aspect ratio 0045 * @param fh horizontal fade 0046 * @param fv vertical fade 0047 * @param spikes number of spikes 0048 * @param antialiasEdges whether to antialias edges 0049 * @param type type 0050 * @param id the brush identifier 0051 */ 0052 KisMaskGenerator(qreal radius, qreal ratio, qreal fh, qreal fv, int spikes, bool antialiasEdges, Type type, const KoID& id = DefaultId); 0053 KisMaskGenerator(const KisMaskGenerator &rhs); 0054 0055 virtual ~KisMaskGenerator(); 0056 0057 virtual KisMaskGenerator* clone() const = 0; 0058 0059 private: 0060 0061 void init(); 0062 0063 public: 0064 /** 0065 * @return the alpha value at the position (x,y) 0066 */ 0067 virtual quint8 valueAt(qreal x, qreal y) const = 0; 0068 0069 virtual bool shouldSupersample() const; 0070 0071 virtual bool shouldVectorize() const; 0072 0073 virtual KisBrushMaskApplicatorBase* applicator(); 0074 0075 virtual void toXML(QDomDocument& , QDomElement&) const; 0076 0077 /** 0078 * Unserialise a \ref KisMaskGenerator 0079 */ 0080 static KisMaskGenerator* fromXML(const QDomElement&); 0081 0082 qreal width() const; 0083 0084 qreal height() const; 0085 0086 qreal diameter() const; 0087 void setDiameter(qreal value); 0088 0089 qreal ratio() const; 0090 qreal horizontalFade() const; 0091 qreal verticalFade() const; 0092 int spikes() const; 0093 Type type() const; 0094 bool isEmpty() const; 0095 void fixRotation(qreal &xr, qreal &yr) const; 0096 0097 inline QString id() const { return m_id.id(); } 0098 inline QString name() const { return m_id.name(); } 0099 0100 static QList<KoID> maskGeneratorIds(); 0101 0102 qreal softness() const; 0103 virtual void setSoftness(qreal softness); 0104 0105 QString curveString() const; 0106 void setCurveString(const QString& curveString); 0107 0108 bool antialiasEdges() const; 0109 virtual void setScale(qreal scaleX, qreal scaleY); 0110 0111 protected: 0112 qreal effectiveSrcWidth() const; 0113 qreal effectiveSrcHeight() const; 0114 0115 private: 0116 struct Private; 0117 const QScopedPointer<Private> d; 0118 const KoID& m_id; 0119 }; 0120 0121 #endif