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