File indexing completed on 2024-05-19 04:26:07

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 shouldSupersample6x6() const;
0072 
0073     virtual bool shouldVectorize() const;
0074 
0075     virtual KisBrushMaskApplicatorBase *applicator() const = 0;
0076 
0077     virtual void toXML(QDomDocument& , QDomElement&) const;
0078 
0079     /**
0080      * Unserialise a \ref KisMaskGenerator
0081      */
0082     static KisMaskGenerator* fromXML(const QDomElement&);
0083 
0084     qreal width() const;
0085 
0086     qreal height() const;
0087 
0088     qreal diameter() const;    
0089     void setDiameter(qreal value);
0090 
0091     qreal ratio() const;
0092     qreal horizontalFade() const;
0093     qreal verticalFade() const;
0094     int spikes() const;
0095     Type type() const;
0096     bool isEmpty() const;
0097     void fixRotation(qreal &xr, qreal &yr) const;
0098     
0099     inline QString id() const { return m_id.id(); }
0100     inline QString name() const { return m_id.name(); }
0101 
0102     static QList<KoID> maskGeneratorIds();
0103     
0104     qreal softness() const;
0105     virtual void setSoftness(qreal softness);
0106     
0107     QString curveString() const;
0108     void setCurveString(const QString& curveString);
0109 
0110     bool antialiasEdges() const;
0111     virtual void setScale(qreal scaleX, qreal scaleY);
0112 
0113 protected:
0114     qreal effectiveSrcWidth() const;
0115     qreal effectiveSrcHeight() const;
0116 
0117 private:
0118     struct Private;
0119     const QScopedPointer<Private> d;
0120     const KoID& m_id;
0121 };
0122 
0123 #endif