LCOV - code coverage report
Current view: top level - core/symbology - qgsfillsymbollayer.h (source / functions) Hit Total Coverage
Test: coverage.info.cleaned Lines: 43 86 50.0 %
Date: 2021-04-10 08:29:14 Functions: 0 0 -
Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : /***************************************************************************
       2                 :            :  qgsfillsymbollayer.h
       3                 :            :  ---------------------
       4                 :            :  begin                : November 2009
       5                 :            :  copyright            : (C) 2009 by Martin Dobias
       6                 :            :  email                : wonder dot sk at gmail dot com
       7                 :            :  ***************************************************************************
       8                 :            :  *                                                                         *
       9                 :            :  *   This program is free software; you can redistribute it and/or modify  *
      10                 :            :  *   it under the terms of the GNU General Public License as published by  *
      11                 :            :  *   the Free Software Foundation; either version 2 of the License, or     *
      12                 :            :  *   (at your option) any later version.                                   *
      13                 :            :  *                                                                         *
      14                 :            :  ***************************************************************************/
      15                 :            : 
      16                 :            : #ifndef QGSFILLSYMBOLLAYER_H
      17                 :            : #define QGSFILLSYMBOLLAYER_H
      18                 :            : 
      19                 :            : #include "qgis_core.h"
      20                 :            : #include "qgis.h"
      21                 :            : #include "qgssymbollayer.h"
      22                 :            : 
      23                 :            : #define DEFAULT_SIMPLEFILL_COLOR        QColor(0,0,255)
      24                 :            : #define DEFAULT_SIMPLEFILL_STYLE        Qt::SolidPattern
      25                 :            : #define DEFAULT_SIMPLEFILL_BORDERCOLOR  QColor( 35, 35, 35 )
      26                 :            : #define DEFAULT_SIMPLEFILL_BORDERSTYLE  Qt::SolidLine
      27                 :            : #define DEFAULT_SIMPLEFILL_BORDERWIDTH  DEFAULT_LINE_WIDTH
      28                 :            : #define DEFAULT_SIMPLEFILL_JOINSTYLE    Qt::BevelJoin
      29                 :            : 
      30                 :            : #define INF 1E20
      31                 :            : 
      32                 :            : #include <QPen>
      33                 :            : #include <QBrush>
      34                 :            : 
      35                 :            : /**
      36                 :            :  * \ingroup core
      37                 :            :  * \class QgsSimpleFillSymbolLayer
      38                 :            :  */
      39                 :        270 : class CORE_EXPORT QgsSimpleFillSymbolLayer : public QgsFillSymbolLayer
      40                 :            : {
      41                 :            :   public:
      42                 :            :     QgsSimpleFillSymbolLayer( const QColor &color = DEFAULT_SIMPLEFILL_COLOR,
      43                 :            :                               Qt::BrushStyle style = DEFAULT_SIMPLEFILL_STYLE,
      44                 :            :                               const QColor &strokeColor = DEFAULT_SIMPLEFILL_BORDERCOLOR,
      45                 :            :                               Qt::PenStyle strokeStyle = DEFAULT_SIMPLEFILL_BORDERSTYLE,
      46                 :            :                               double strokeWidth = DEFAULT_SIMPLEFILL_BORDERWIDTH,
      47                 :            :                               Qt::PenJoinStyle penJoinStyle = DEFAULT_SIMPLEFILL_JOINSTYLE
      48                 :            :                             );
      49                 :            : 
      50                 :            :     // static stuff
      51                 :            : 
      52                 :            :     /**
      53                 :            :      * Creates a new QgsSimpleFillSymbolLayer using the specified \a properties map containing symbol properties (see properties()).
      54                 :            :      *
      55                 :            :      * Caller takes ownership of the returned symbol layer.
      56                 :            :      */
      57                 :            :     static QgsSymbolLayer *create( const QVariantMap &properties = QVariantMap() ) SIP_FACTORY;
      58                 :            :     static QgsSymbolLayer *createFromSld( QDomElement &element ) SIP_FACTORY;
      59                 :            : 
      60                 :            :     // implemented from base classes
      61                 :            : 
      62                 :            :     QString layerType() const override;
      63                 :            : 
      64                 :            :     void startRender( QgsSymbolRenderContext &context ) override;
      65                 :            : 
      66                 :            :     void stopRender( QgsSymbolRenderContext &context ) override;
      67                 :            : 
      68                 :            :     void renderPolygon( const QPolygonF &points, const QVector<QPolygonF> *rings, QgsSymbolRenderContext &context ) override;
      69                 :            : 
      70                 :            :     QVariantMap properties() const override;
      71                 :            : 
      72                 :            :     QgsSimpleFillSymbolLayer *clone() const override SIP_FACTORY;
      73                 :            : 
      74                 :            :     void toSld( QDomDocument &doc, QDomElement &element, const QVariantMap &props ) const override;
      75                 :            : 
      76                 :            :     QString ogrFeatureStyle( double mmScaleFactor, double mapUnitScaleFactor ) const override;
      77                 :            : 
      78                 :          0 :     Qt::BrushStyle brushStyle() const { return mBrushStyle; }
      79                 :          0 :     void setBrushStyle( Qt::BrushStyle style ) { mBrushStyle = style; }
      80                 :            : 
      81                 :          0 :     QColor strokeColor() const override { return mStrokeColor; }
      82                 :          0 :     void setStrokeColor( const QColor &strokeColor ) override { mStrokeColor = strokeColor; }
      83                 :            : 
      84                 :          0 :     QColor fillColor() const override { return color(); }
      85                 :          0 :     void setFillColor( const QColor &color ) override { setColor( color ); }
      86                 :            : 
      87                 :            :     Qt::PenStyle strokeStyle() const { return mStrokeStyle; }
      88                 :          0 :     void setStrokeStyle( Qt::PenStyle strokeStyle ) { mStrokeStyle = strokeStyle; }
      89                 :            : 
      90                 :            :     double strokeWidth() const { return mStrokeWidth; }
      91                 :          0 :     void setStrokeWidth( double strokeWidth ) { mStrokeWidth = strokeWidth; }
      92                 :            : 
      93                 :            :     Qt::PenJoinStyle penJoinStyle() const { return mPenJoinStyle; }
      94                 :            :     void setPenJoinStyle( Qt::PenJoinStyle style ) { mPenJoinStyle = style; }
      95                 :            : 
      96                 :            :     /**
      97                 :            :      * Sets an \a offset by which polygons will be translated during rendering.
      98                 :            :      *
      99                 :            :      * Units are specified by offsetUnit().
     100                 :            :      *
     101                 :            :      * \see offset()
     102                 :            :      * \see setOffsetUnit()
     103                 :            :      */
     104                 :        175 :     void setOffset( QPointF offset ) { mOffset = offset; }
     105                 :            : 
     106                 :            :     /**
     107                 :            :      * Returns the offset by which polygons will be translated during rendering.
     108                 :            :      *
     109                 :            :      * Units are specified by offsetUnit().
     110                 :            :      *
     111                 :            :      * \see setOffset()
     112                 :            :      * \see offsetUnit()
     113                 :            :      */
     114                 :            :     QPointF offset() { return mOffset; }
     115                 :            : 
     116                 :            :     /**
     117                 :            :      * Sets the units for the width of the fill's stroke.
     118                 :            :      * \param unit width units
     119                 :            :      * \see strokeWidthUnit()
     120                 :            :     */
     121                 :        165 :     void setStrokeWidthUnit( QgsUnitTypes::RenderUnit unit ) { mStrokeWidthUnit = unit; }
     122                 :            : 
     123                 :            :     /**
     124                 :            :      * Returns the units for the width of the fill's stroke.
     125                 :            :      * \see setStrokeWidthUnit()
     126                 :            :     */
     127                 :            :     QgsUnitTypes::RenderUnit strokeWidthUnit() const { return mStrokeWidthUnit; }
     128                 :            : 
     129                 :        165 :     void setStrokeWidthMapUnitScale( const QgsMapUnitScale &scale ) { mStrokeWidthMapUnitScale = scale; }
     130                 :            :     const QgsMapUnitScale &strokeWidthMapUnitScale() const { return mStrokeWidthMapUnitScale; }
     131                 :            : 
     132                 :            :     /**
     133                 :            :      * Sets the \a unit for the fill's offset.
     134                 :            :      * \see offset()
     135                 :            :      * \see offsetUnit()
     136                 :            :     */
     137                 :        170 :     void setOffsetUnit( QgsUnitTypes::RenderUnit unit ) { mOffsetUnit = unit; }
     138                 :            : 
     139                 :            :     /**
     140                 :            :      * Returns the units for the fill's offset.
     141                 :            :      * \see setOffsetUnit()
     142                 :            :      * \see offset()
     143                 :            :     */
     144                 :            :     QgsUnitTypes::RenderUnit offsetUnit() const { return mOffsetUnit; }
     145                 :            : 
     146                 :            :     /**
     147                 :            :      * Sets the map unit \a scale for the fill's offset.
     148                 :            :      * \see setOffset()
     149                 :            :      * \see offsetMapUnitScale()
     150                 :            :     */
     151                 :        165 :     void setOffsetMapUnitScale( const QgsMapUnitScale &scale ) { mOffsetMapUnitScale = scale; }
     152                 :            : 
     153                 :            :     /**
     154                 :            :      * Returns the map unit scale for the fill's offset.
     155                 :            :      * \see offset()
     156                 :            :      * \see setOffsetMapUnitScale()
     157                 :            :     */
     158                 :            :     const QgsMapUnitScale &offsetMapUnitScale() const { return mOffsetMapUnitScale; }
     159                 :            : 
     160                 :            :     void setOutputUnit( QgsUnitTypes::RenderUnit unit ) override;
     161                 :            :     QgsUnitTypes::RenderUnit outputUnit() const override;
     162                 :            :     bool usesMapUnits() const override;
     163                 :            : 
     164                 :            :     void setMapUnitScale( const QgsMapUnitScale &scale ) override;
     165                 :            :     QgsMapUnitScale mapUnitScale() const override;
     166                 :            : 
     167                 :            :     double estimateMaxBleed( const QgsRenderContext &context ) const override;
     168                 :            : 
     169                 :            :     double dxfWidth( const QgsDxfExport &e, QgsSymbolRenderContext &context ) const override;
     170                 :            :     QColor dxfColor( QgsSymbolRenderContext &context ) const override;
     171                 :            :     double dxfAngle( QgsSymbolRenderContext &context ) const override;
     172                 :            : 
     173                 :            :     Qt::PenStyle dxfPenStyle() const override;
     174                 :            :     QColor dxfBrushColor( QgsSymbolRenderContext &context ) const override;
     175                 :            :     Qt::BrushStyle dxfBrushStyle() const override;
     176                 :            : 
     177                 :            :   protected:
     178                 :            :     QBrush mBrush;
     179                 :            :     QBrush mSelBrush;
     180                 :            :     Qt::BrushStyle mBrushStyle;
     181                 :            :     QColor mStrokeColor;
     182                 :            :     Qt::PenStyle mStrokeStyle;
     183                 :            :     double mStrokeWidth;
     184                 :            :     QgsUnitTypes::RenderUnit mStrokeWidthUnit = QgsUnitTypes::RenderMillimeters;
     185                 :            :     QgsMapUnitScale mStrokeWidthMapUnitScale;
     186                 :            :     Qt::PenJoinStyle mPenJoinStyle;
     187                 :            :     QPen mPen;
     188                 :            :     QPen mSelPen;
     189                 :            : 
     190                 :            :     QPointF mOffset;
     191                 :            :     QgsUnitTypes::RenderUnit mOffsetUnit = QgsUnitTypes::RenderMillimeters;
     192                 :            :     QgsMapUnitScale mOffsetMapUnitScale;
     193                 :            : 
     194                 :            :   private:
     195                 :            :     //helper functions for data defined symbology
     196                 :            :     void applyDataDefinedSymbology( QgsSymbolRenderContext &context, QBrush &brush, QPen &pen, QPen &selPen );
     197                 :            : };
     198                 :            : 
     199                 :            : class QgsColorRamp;
     200                 :            : 
     201                 :            : /**
     202                 :            :  * \ingroup core
     203                 :            :  * \class QgsGradientFillSymbolLayer
     204                 :            :  */
     205                 :            : class CORE_EXPORT QgsGradientFillSymbolLayer : public QgsFillSymbolLayer
     206                 :            : {
     207                 :            :   public:
     208                 :            : 
     209                 :            :     enum GradientColorType
     210                 :            :     {
     211                 :            :       SimpleTwoColor,
     212                 :            :       ColorRamp
     213                 :            :     };
     214                 :            : 
     215                 :            :     enum GradientType
     216                 :            :     {
     217                 :            :       Linear,
     218                 :            :       Radial,
     219                 :            :       Conical
     220                 :            :     };
     221                 :            : 
     222                 :            :     enum GradientCoordinateMode
     223                 :            :     {
     224                 :            :       Feature,
     225                 :            :       Viewport
     226                 :            :     };
     227                 :            : 
     228                 :            :     enum GradientSpread
     229                 :            :     {
     230                 :            :       Pad,
     231                 :            :       Reflect,
     232                 :            :       Repeat
     233                 :            :     };
     234                 :            : 
     235                 :            :     QgsGradientFillSymbolLayer( const QColor &color = DEFAULT_SIMPLEFILL_COLOR,
     236                 :            :                                 const QColor &color2 = Qt::white,
     237                 :            :                                 GradientColorType gradientColorType = SimpleTwoColor,
     238                 :            :                                 GradientType gradientType = Linear,
     239                 :            :                                 GradientCoordinateMode coordinateMode = Feature,
     240                 :            :                                 GradientSpread gradientSpread = Pad
     241                 :            :                               );
     242                 :            : 
     243                 :            :     ~QgsGradientFillSymbolLayer() override;
     244                 :            : 
     245                 :            :     // static stuff
     246                 :            : 
     247                 :            :     /**
     248                 :            :      * Creates a new QgsGradientFillSymbolLayer using the specified \a properties map containing symbol properties (see properties()).
     249                 :            :      *
     250                 :            :      * Caller takes ownership of the returned symbol layer.
     251                 :            :      */
     252                 :            :     static QgsSymbolLayer *create( const QVariantMap &properties = QVariantMap() ) SIP_FACTORY;
     253                 :            : 
     254                 :            :     // implemented from base classes
     255                 :            : 
     256                 :            :     QString layerType() const override;
     257                 :            :     void startRender( QgsSymbolRenderContext &context ) override;
     258                 :            :     void stopRender( QgsSymbolRenderContext &context ) override;
     259                 :            :     void renderPolygon( const QPolygonF &points, const QVector<QPolygonF> *rings, QgsSymbolRenderContext &context ) override;
     260                 :            :     QVariantMap properties() const override;
     261                 :            :     QgsGradientFillSymbolLayer *clone() const override SIP_FACTORY;
     262                 :            :     double estimateMaxBleed( const QgsRenderContext &context ) const override;
     263                 :            :     bool canCauseArtifactsBetweenAdjacentTiles() const override;
     264                 :            : 
     265                 :            :     //! Type of gradient, e.g., linear or radial
     266                 :            :     GradientType gradientType() const { return mGradientType; }
     267                 :            :     void setGradientType( GradientType gradientType ) { mGradientType = gradientType; }
     268                 :            : 
     269                 :            :     //! Gradient color mode, controls how gradient color stops are created
     270                 :            :     GradientColorType gradientColorType() const { return mGradientColorType; }
     271                 :            :     void setGradientColorType( GradientColorType gradientColorType ) { mGradientColorType = gradientColorType; }
     272                 :            : 
     273                 :            :     /**
     274                 :            :      * Returns the color ramp used for the gradient fill. This is only
     275                 :            :      * used if the gradient color type is set to ColorRamp.
     276                 :            :      * \see setColorRamp()
     277                 :            :      * \see gradientColorType()
     278                 :            :      */
     279                 :            :     QgsColorRamp *colorRamp() { return mGradientRamp; }
     280                 :            : 
     281                 :            :     /**
     282                 :            :      * Sets the color ramp used for the gradient fill. This is only
     283                 :            :      * used if the gradient color type is set to ColorRamp.
     284                 :            :      * \param ramp color ramp. Ownership is transferred.
     285                 :            :      * \see colorRamp()
     286                 :            :      * \see setGradientColorType()
     287                 :            :      */
     288                 :            :     void setColorRamp( QgsColorRamp *ramp SIP_TRANSFER );
     289                 :            : 
     290                 :            :     //! Color for endpoint of gradient, only used if the gradient color type is set to SimpleTwoColor
     291                 :            :     QColor color2() const { return mColor2; }
     292                 :            :     void setColor2( const QColor &color2 ) { mColor2 = color2; }
     293                 :            : 
     294                 :            :     //! Coordinate mode for gradient. Controls how the gradient stops are positioned.
     295                 :            :     GradientCoordinateMode coordinateMode() const { return mCoordinateMode; }
     296                 :            :     void setCoordinateMode( GradientCoordinateMode coordinateMode ) { mCoordinateMode = coordinateMode; }
     297                 :            : 
     298                 :            :     //! Gradient spread mode. Controls how the gradient behaves outside of the predefined stops
     299                 :            :     GradientSpread gradientSpread() const { return mGradientSpread; }
     300                 :            :     void setGradientSpread( GradientSpread gradientSpread ) { mGradientSpread = gradientSpread; }
     301                 :            : 
     302                 :            :     //! Starting point of gradient fill, in the range [0,0] - [1,1]
     303                 :         50 :     void setReferencePoint1( QPointF referencePoint ) { mReferencePoint1 = referencePoint; }
     304                 :            :     QPointF referencePoint1() const { return mReferencePoint1; }
     305                 :            : 
     306                 :            :     //! Sets the starting point of the gradient to be the feature centroid
     307                 :         50 :     void setReferencePoint1IsCentroid( bool isCentroid ) { mReferencePoint1IsCentroid = isCentroid; }
     308                 :            :     bool referencePoint1IsCentroid() const { return mReferencePoint1IsCentroid; }
     309                 :            : 
     310                 :            :     //! End point of gradient fill, in the range [0,0] - [1,1]
     311                 :         50 :     void setReferencePoint2( QPointF referencePoint ) { mReferencePoint2 = referencePoint; }
     312                 :            :     QPointF referencePoint2() const { return mReferencePoint2; }
     313                 :            : 
     314                 :            :     //! Sets the end point of the gradient to be the feature centroid
     315                 :         50 :     void setReferencePoint2IsCentroid( bool isCentroid ) { mReferencePoint2IsCentroid = isCentroid; }
     316                 :            :     bool referencePoint2IsCentroid() const { return mReferencePoint2IsCentroid; }
     317                 :            : 
     318                 :            :     /**
     319                 :            :      * Sets an \a offset by which polygons will be translated during rendering.
     320                 :            :      *
     321                 :            :      * Units are specified by offsetUnit().
     322                 :            :      *
     323                 :            :      * \see offset()
     324                 :            :      * \see setOffsetUnit()
     325                 :            :      */
     326                 :         50 :     void setOffset( QPointF offset ) { mOffset = offset; }
     327                 :            : 
     328                 :            :     /**
     329                 :            :      * Returns the offset by which polygons will be translated during rendering.
     330                 :            :      *
     331                 :            :      * Units are specified by offsetUnit().
     332                 :            :      *
     333                 :            :      * \see setOffset()
     334                 :            :      * \see offsetUnit()
     335                 :            :      */
     336                 :            :     QPointF offset() const { return mOffset; }
     337                 :            : 
     338                 :            :     /**
     339                 :            :      * Sets the \a unit for the fill's offset.
     340                 :            :      * \see offset()
     341                 :            :      * \see offsetUnit()
     342                 :            :     */
     343                 :         50 :     void setOffsetUnit( QgsUnitTypes::RenderUnit unit ) { mOffsetUnit = unit; }
     344                 :            : 
     345                 :            :     /**
     346                 :            :      * Returns the units for the fill's offset.
     347                 :            :      * \see setOffsetUnit()
     348                 :            :      * \see offset()
     349                 :            :     */
     350                 :            :     QgsUnitTypes::RenderUnit offsetUnit() const { return mOffsetUnit; }
     351                 :            : 
     352                 :            :     /**
     353                 :            :      * Sets the map unit \a scale for the fill's offset.
     354                 :            :      * \see setOffset()
     355                 :            :      * \see offsetMapUnitScale()
     356                 :            :     */
     357                 :         50 :     void setOffsetMapUnitScale( const QgsMapUnitScale &scale ) { mOffsetMapUnitScale = scale; }
     358                 :            : 
     359                 :            :     /**
     360                 :            :      * Returns the map unit scale for the fill's offset.
     361                 :            :      * \see offset()
     362                 :            :      * \see setOffsetMapUnitScale()
     363                 :            :     */
     364                 :            :     const QgsMapUnitScale &offsetMapUnitScale() const { return mOffsetMapUnitScale; }
     365                 :            : 
     366                 :            :     void setOutputUnit( QgsUnitTypes::RenderUnit unit ) override;
     367                 :            :     QgsUnitTypes::RenderUnit outputUnit() const override;
     368                 :            :     bool usesMapUnits() const override;
     369                 :            : 
     370                 :            :     void setMapUnitScale( const QgsMapUnitScale &scale ) override;
     371                 :            :     QgsMapUnitScale mapUnitScale() const override;
     372                 :            : 
     373                 :            :   protected:
     374                 :            :     QBrush mBrush;
     375                 :            :     QBrush mSelBrush;
     376                 :            : 
     377                 :            :     GradientColorType mGradientColorType;
     378                 :            :     QColor mColor2;
     379                 :            :     QgsColorRamp *mGradientRamp = nullptr;
     380                 :            :     GradientType mGradientType;
     381                 :            :     GradientCoordinateMode mCoordinateMode;
     382                 :            :     GradientSpread mGradientSpread;
     383                 :            : 
     384                 :            :     QPointF mReferencePoint1;
     385                 :            :     bool mReferencePoint1IsCentroid = false;
     386                 :            :     QPointF mReferencePoint2;
     387                 :            :     bool mReferencePoint2IsCentroid = false;
     388                 :            : 
     389                 :            :     QPointF mOffset;
     390                 :            :     QgsUnitTypes::RenderUnit mOffsetUnit = QgsUnitTypes::RenderMillimeters;
     391                 :            :     QgsMapUnitScale mOffsetMapUnitScale;
     392                 :            : 
     393                 :            :   private:
     394                 :            : 
     395                 :            :     //helper functions for data defined symbology
     396                 :            :     void applyDataDefinedSymbology( QgsSymbolRenderContext &context, const QPolygonF &points );
     397                 :            : 
     398                 :            :     //! Applies the gradient to a brush
     399                 :            :     void applyGradient( const QgsSymbolRenderContext &context, QBrush &brush, const QColor &color, const QColor &color2,
     400                 :            :                         GradientColorType gradientColorType, QgsColorRamp *gradientRamp, GradientType gradientType,
     401                 :            :                         GradientCoordinateMode coordinateMode, GradientSpread gradientSpread,
     402                 :            :                         QPointF referencePoint1, QPointF referencePoint2, double angle );
     403                 :            : 
     404                 :            :     //! Rotates a reference point by a specified angle around the point (0.5, 0.5)
     405                 :            :     QPointF rotateReferencePoint( QPointF refPoint, double angle );
     406                 :            : };
     407                 :            : 
     408                 :            : /**
     409                 :            :  * \ingroup core
     410                 :            :  * \class QgsShapeburstFillSymbolLayer
     411                 :            :  */
     412                 :            : class CORE_EXPORT QgsShapeburstFillSymbolLayer : public QgsFillSymbolLayer
     413                 :            : {
     414                 :            :   public:
     415                 :            : 
     416                 :            :     enum ShapeburstColorType
     417                 :            :     {
     418                 :            :       SimpleTwoColor,
     419                 :            :       ColorRamp
     420                 :            :     };
     421                 :            : 
     422                 :            :     QgsShapeburstFillSymbolLayer( const QColor &color = DEFAULT_SIMPLEFILL_COLOR, const QColor &color2 = Qt::white,
     423                 :            :                                   ShapeburstColorType colorType = SimpleTwoColor,
     424                 :            :                                   int blurRadius = 0, bool useWholeShape = true, double maxDistance = 5 );
     425                 :            : 
     426                 :            :     ~QgsShapeburstFillSymbolLayer() override;
     427                 :            : 
     428                 :            :     /**
     429                 :            :      * QgsShapeburstFillSymbolLayer cannot be copied.
     430                 :            :      * \see clone()
     431                 :            :      */
     432                 :            :     QgsShapeburstFillSymbolLayer( const QgsShapeburstFillSymbolLayer &other ) = delete;
     433                 :            : 
     434                 :            :     /**
     435                 :            :      * QgsShapeburstFillSymbolLayer cannot be copied.
     436                 :            :      * \see clone()
     437                 :            :      */
     438                 :            :     QgsShapeburstFillSymbolLayer &operator=( const QgsShapeburstFillSymbolLayer &other ) = delete;
     439                 :            : 
     440                 :            :     // static stuff
     441                 :            : 
     442                 :            :     /**
     443                 :            :      * Creates a new QgsShapeburstFillSymbolLayer using the specified \a properties map containing symbol properties (see properties()).
     444                 :            :      *
     445                 :            :      * Caller takes ownership of the returned symbol layer.
     446                 :            :      */
     447                 :            :     static QgsSymbolLayer *create( const QVariantMap &properties = QVariantMap() ) SIP_FACTORY;
     448                 :            : 
     449                 :            :     // implemented from base classes
     450                 :            : 
     451                 :            :     QString layerType() const override;
     452                 :            :     void startRender( QgsSymbolRenderContext &context ) override;
     453                 :            :     void stopRender( QgsSymbolRenderContext &context ) override;
     454                 :            :     void renderPolygon( const QPolygonF &points, const QVector<QPolygonF> *rings, QgsSymbolRenderContext &context ) override;
     455                 :            :     QVariantMap properties() const override;
     456                 :            :     QgsShapeburstFillSymbolLayer *clone() const override SIP_FACTORY;
     457                 :            :     double estimateMaxBleed( const QgsRenderContext &context ) const override;
     458                 :            :     bool canCauseArtifactsBetweenAdjacentTiles() const override;
     459                 :            : 
     460                 :            :     /**
     461                 :            :      * Sets the blur radius, which controls the amount of blurring applied to the fill.
     462                 :            :      * \param blurRadius Radius for fill blur. Values between 0 - 17 are valid, where higher values results in a stronger blur. Set to 0 to disable blur.
     463                 :            :      * \see blurRadius
     464                 :            :      * \since QGIS 2.3
     465                 :            :      */
     466                 :            :     void setBlurRadius( int blurRadius ) { mBlurRadius = blurRadius; }
     467                 :            : 
     468                 :            :     /**
     469                 :            :      * Returns the blur radius, which controls the amount of blurring applied to the fill.
     470                 :            :      * \returns Integer representing the radius for fill blur. Higher values indicate a stronger blur. A 0 value indicates that blurring is disabled.
     471                 :            :      * \see setBlurRadius
     472                 :            :      * \since QGIS 2.3
     473                 :            :      */
     474                 :            :     int blurRadius() const { return mBlurRadius; }
     475                 :            : 
     476                 :            :     /**
     477                 :            :      * Sets whether the shapeburst fill should be drawn using the entire shape.
     478                 :            :      * \param useWholeShape Set to TRUE if shapeburst should cover entire shape. If FALSE, setMaxDistance is used to calculate how far from the boundary of the shape should
     479                 :            :      * be shaded
     480                 :            :      * \see useWholeShape
     481                 :            :      * \see setMaxDistance
     482                 :            :      * \since QGIS 2.3
     483                 :            :      */
     484                 :            :     void setUseWholeShape( bool useWholeShape ) { mUseWholeShape = useWholeShape; }
     485                 :            : 
     486                 :            :     /**
     487                 :            :      * Returns whether the shapeburst fill is set to cover the entire shape.
     488                 :            :      * \returns TRUE if shapeburst fill will cover the entire shape. If FALSE, shapeburst is drawn to a distance of maxDistance from the polygon's boundary.
     489                 :            :      * \see setUseWholeShape
     490                 :            :      * \see maxDistance
     491                 :            :      * \since QGIS 2.3
     492                 :            :      */
     493                 :            :     bool useWholeShape() const { return mUseWholeShape; }
     494                 :            : 
     495                 :            :     /**
     496                 :            :      * Sets the maximum distance to shape inside of the shape from the polygon's boundary.
     497                 :            :      * \param maxDistance distance from boundary to shade. setUseWholeShape must be set to FALSE for this parameter to take effect. Distance unit is controlled by setDistanceUnit.
     498                 :            :      * \see maxDistance
     499                 :            :      * \see setUseWholeShape
     500                 :            :      * \see setDistanceUnit
     501                 :            :      * \since QGIS 2.3
     502                 :            :      */
     503                 :            :     void setMaxDistance( double maxDistance ) { mMaxDistance = maxDistance; }
     504                 :            : 
     505                 :            :     /**
     506                 :            :      * Returns the maximum distance from the shape's boundary which is shaded. This parameter is only effective if useWholeShape is FALSE.
     507                 :            :      * \returns the maximum distance from the polygon's boundary which is shaded. Distance units are indicated by distanceUnit.
     508                 :            :      * \see useWholeShape
     509                 :            :      * \see setMaxDistance
     510                 :            :      * \see distanceUnit
     511                 :            :      * \since QGIS 2.3
     512                 :            :      */
     513                 :            :     double maxDistance() const { return mMaxDistance; }
     514                 :            : 
     515                 :            :     /**
     516                 :            :      * Sets the unit for the maximum distance to shade inside of the shape from the polygon's boundary.
     517                 :            :      * \param unit distance unit for the maximum distance
     518                 :            :      * \see setMaxDistance
     519                 :            :      * \see distanceUnit
     520                 :            :      * \since QGIS 2.3
     521                 :            :      */
     522                 :          0 :     void setDistanceUnit( QgsUnitTypes::RenderUnit unit ) { mDistanceUnit = unit; }
     523                 :            : 
     524                 :            :     /**
     525                 :            :      * Returns the unit for the maximum distance to shade inside of the shape from the polygon's boundary.
     526                 :            :      * \returns distance unit for the maximum distance
     527                 :            :      * \see maxDistance
     528                 :            :      * \see setDistanceUnit
     529                 :            :      * \since QGIS 2.3
     530                 :            :      */
     531                 :            :     QgsUnitTypes::RenderUnit distanceUnit() const { return mDistanceUnit; }
     532                 :            : 
     533                 :          0 :     void setDistanceMapUnitScale( const QgsMapUnitScale &scale ) { mDistanceMapUnitScale = scale; }
     534                 :            :     const QgsMapUnitScale &distanceMapUnitScale() const { return mDistanceMapUnitScale; }
     535                 :            : 
     536                 :            :     /**
     537                 :            :      * Sets the color mode to use for the shapeburst fill. Shapeburst can either be drawn using a QgsColorRamp color ramp
     538                 :            :      * or by simply specificing a start and end color. setColorType is used to specify which mode to use for the fill.
     539                 :            :      * \param colorType color type to use for shapeburst fill
     540                 :            :      * \see colorType
     541                 :            :      * \see setColor
     542                 :            :      * \see setColor2
     543                 :            :      * \see setColorRamp
     544                 :            :      * \since QGIS 2.3
     545                 :            :      */
     546                 :            :     void setColorType( ShapeburstColorType colorType ) { mColorType = colorType; }
     547                 :            : 
     548                 :            :     /**
     549                 :            :      * Returns the color mode used for the shapeburst fill. Shapeburst can either be drawn using a QgsColorRamp color ramp
     550                 :            :      * or by simply specificing a start and end color.
     551                 :            :      * \returns current color mode used for the shapeburst fill
     552                 :            :      * \see setColorType
     553                 :            :      * \see color
     554                 :            :      * \see color2
     555                 :            :      * \see colorRamp
     556                 :            :      * \since QGIS 2.3
     557                 :            :      */
     558                 :            :     ShapeburstColorType colorType() const { return mColorType; }
     559                 :            : 
     560                 :            :     /**
     561                 :            :      * Sets the color \a ramp used to draw the shapeburst fill. Color ramps are only used if setColorType is set ShapeburstColorType::ColorRamp.
     562                 :            :      *
     563                 :            :      * Ownership of \a ramp is transferred to the fill.
     564                 :            :      *
     565                 :            :      * \see setColorType
     566                 :            :      * \see colorRamp
     567                 :            :      * \since QGIS 2.3
     568                 :            :      */
     569                 :            :     void setColorRamp( QgsColorRamp *ramp SIP_TRANSFER );
     570                 :            : 
     571                 :            :     /**
     572                 :            :      * Returns the color ramp used for the shapeburst fill. The color ramp is only used if the colorType is set to ShapeburstColorType::ColorRamp
     573                 :            :      * \returns a QgsColorRamp color ramp
     574                 :            :      * \see setColorRamp
     575                 :            :      * \see colorType
     576                 :            :      * \since QGIS 2.3
     577                 :            :      */
     578                 :            :     QgsColorRamp *colorRamp() { return mGradientRamp.get(); }
     579                 :            : 
     580                 :            :     /**
     581                 :            :      * Sets the color for the endpoint of the shapeburst fill. This color is only used if setColorType is set ShapeburstColorType::SimpleTwoColor.
     582                 :            :      * \param color2 QColor to use for endpoint of gradient
     583                 :            :      * \see setColorType
     584                 :            :      * \see color2
     585                 :            :      * \since QGIS 2.3
     586                 :            :      */
     587                 :            :     void setColor2( const QColor &color2 ) { mColor2 = color2; }
     588                 :            : 
     589                 :            :     /**
     590                 :            :      * Returns the color used for the endpoint of the shapeburst fill. This color is only used if the colorType is set to ShapeburstColorType::SimpleTwoColor
     591                 :            :      * \returns a QColor indicating the color of the endpoint of the gradient
     592                 :            :      * \see setColor2
     593                 :            :      * \see colorType
     594                 :            :      * \since QGIS 2.3
     595                 :            :      */
     596                 :            :     QColor color2() const { return mColor2; }
     597                 :            : 
     598                 :            :     /**
     599                 :            :      * Sets whether the shapeburst fill should ignore polygon rings when calculating
     600                 :            :      * the buffered shading.
     601                 :            :      * \param ignoreRings Set to TRUE if buffers should ignore interior rings for polygons.
     602                 :            :      * \see ignoreRings
     603                 :            :      * \since QGIS 2.3
     604                 :            :      */
     605                 :          0 :     void setIgnoreRings( bool ignoreRings ) { mIgnoreRings = ignoreRings; }
     606                 :            : 
     607                 :            :     /**
     608                 :            :      * Returns whether the shapeburst fill is set to ignore polygon interior rings.
     609                 :            :      * \returns TRUE if the shapeburst fill will ignore interior rings when calculating buffered shading.
     610                 :            :      * \see setIgnoreRings
     611                 :            :      * \since QGIS 2.3
     612                 :            :      */
     613                 :            :     bool ignoreRings() const { return mIgnoreRings; }
     614                 :            : 
     615                 :            :     /**
     616                 :            :      * Sets the offset for the shapeburst fill.
     617                 :            :      * \param offset QPointF indicating the horizontal/vertical offset amount
     618                 :            :      * \see offset
     619                 :            :      * \see setOffsetUnit
     620                 :            :      * \since QGIS 2.3
     621                 :            :      */
     622                 :          0 :     void setOffset( QPointF offset ) { mOffset = offset; }
     623                 :            : 
     624                 :            :     /**
     625                 :            :      * Returns the offset for the shapeburst fill.
     626                 :            :      * \returns a QPointF indicating the horizontal/vertical offset amount
     627                 :            :      * \see setOffset
     628                 :            :      * \see offsetUnit
     629                 :            :      * \since QGIS 2.3
     630                 :            :      */
     631                 :            :     QPointF offset() const { return mOffset; }
     632                 :            : 
     633                 :            :     /**
     634                 :            :      * Sets the units used for the offset for the shapeburst fill.
     635                 :            :      * \param unit units for fill offset
     636                 :            :      * \see setOffset
     637                 :            :      * \see offsetUnit
     638                 :            :      * \since QGIS 2.3
     639                 :            :      */
     640                 :          0 :     void setOffsetUnit( QgsUnitTypes::RenderUnit unit ) { mOffsetUnit = unit; }
     641                 :            : 
     642                 :            :     /**
     643                 :            :      * Returns the units used for the offset of the shapeburst fill.
     644                 :            :      * \returns units used for the fill offset
     645                 :            :      * \see offset
     646                 :            :      * \see setOffsetUnit
     647                 :            :      * \since QGIS 2.3
     648                 :            :      */
     649                 :            :     QgsUnitTypes::RenderUnit offsetUnit() const { return mOffsetUnit; }
     650                 :            : 
     651                 :          0 :     void setOffsetMapUnitScale( const QgsMapUnitScale &scale ) { mOffsetMapUnitScale = scale; }
     652                 :            :     const QgsMapUnitScale &offsetMapUnitScale() const { return mOffsetMapUnitScale; }
     653                 :            : 
     654                 :            :     void setOutputUnit( QgsUnitTypes::RenderUnit unit ) override;
     655                 :            :     QgsUnitTypes::RenderUnit outputUnit() const override;
     656                 :            :     bool usesMapUnits() const override;
     657                 :            : 
     658                 :            :     void setMapUnitScale( const QgsMapUnitScale &scale ) override;
     659                 :            :     QgsMapUnitScale mapUnitScale() const override;
     660                 :            : 
     661                 :            :   private:
     662                 :            :     QBrush mBrush;
     663                 :            :     QBrush mSelBrush;
     664                 :            : 
     665                 :            :     int mBlurRadius = 0;
     666                 :            : 
     667                 :            :     bool mUseWholeShape = true;
     668                 :            :     double mMaxDistance = 5.0;
     669                 :            :     QgsUnitTypes::RenderUnit mDistanceUnit = QgsUnitTypes::RenderMillimeters;
     670                 :            :     QgsMapUnitScale mDistanceMapUnitScale;
     671                 :            : 
     672                 :            :     ShapeburstColorType mColorType = SimpleTwoColor;
     673                 :            :     QColor mColor2;
     674                 :            : 
     675                 :            :     bool mIgnoreRings = false;
     676                 :            : 
     677                 :            :     QPointF mOffset;
     678                 :            :     QgsUnitTypes::RenderUnit mOffsetUnit = QgsUnitTypes::RenderMillimeters;
     679                 :            :     QgsMapUnitScale mOffsetMapUnitScale;
     680                 :            : 
     681                 :            :     std::unique_ptr< QgsColorRamp > mGradientRamp;
     682                 :            : 
     683                 :            :     //helper functions for data defined symbology
     684                 :            :     void applyDataDefinedSymbology( QgsSymbolRenderContext &context, QColor &color, QColor &color2, int &blurRadius, bool &useWholeShape,
     685                 :            :                                     double &maxDistance, bool &ignoreRings );
     686                 :            : 
     687                 :            :     /* distance transform of a 1d function using squared distance */
     688                 :            :     void distanceTransform1d( double *f, int n, int *v, double *z, double *d );
     689                 :            :     /* distance transform of 2d function using squared distance */
     690                 :            :     void distanceTransform2d( double *im, int width, int height, QgsRenderContext &context );
     691                 :            :     /* distance transform of a binary QImage */
     692                 :            :     double *distanceTransform( QImage *im, QgsRenderContext &context );
     693                 :            : 
     694                 :            :     /* fills a QImage with values from an array of doubles containing squared distance transform values */
     695                 :            :     void dtArrayToQImage( double *array, QImage *im, QgsColorRamp *ramp, QgsRenderContext &context, bool useWholeShape = true, int maxPixelDistance = 0 );
     696                 :            : 
     697                 :            : #ifdef SIP_RUN
     698                 :            :     QgsShapeburstFillSymbolLayer( const QgsShapeburstFillSymbolLayer &other );
     699                 :            : #endif
     700                 :            : };
     701                 :            : 
     702                 :            : /**
     703                 :            :  * \ingroup core
     704                 :            :  * \brief Base class for polygon renderers generating texture images
     705                 :            : */
     706                 :         60 : class CORE_EXPORT QgsImageFillSymbolLayer: public QgsFillSymbolLayer
     707                 :            : {
     708                 :            :   public:
     709                 :            : 
     710                 :            :     QgsImageFillSymbolLayer();
     711                 :            :     void renderPolygon( const QPolygonF &points, const QVector<QPolygonF> *rings, QgsSymbolRenderContext &context ) override;
     712                 :            : 
     713                 :          0 :     QgsSymbol *subSymbol() override { return mStroke.get(); }
     714                 :            :     bool setSubSymbol( QgsSymbol *symbol SIP_TRANSFER ) override;
     715                 :            : 
     716                 :            :     /**
     717                 :            :      * Sets the \a units fo the symbol's stroke width.
     718                 :            :      * \see strokeWidthUnit()
     719                 :            :      * \see setStrokeWidthMapUnitScale()
     720                 :            :     */
     721                 :        100 :     void setStrokeWidthUnit( QgsUnitTypes::RenderUnit unit ) { mStrokeWidthUnit = unit; }
     722                 :            : 
     723                 :            :     /**
     724                 :            :      * Returns the units for the symbol's stroke width.
     725                 :            :      * \see setStrokeWidthUnit()
     726                 :            :      * \see strokeWidthMapUnitScale()
     727                 :            :     */
     728                 :            :     QgsUnitTypes::RenderUnit strokeWidthUnit() const { return mStrokeWidthUnit; }
     729                 :            : 
     730                 :            :     /**
     731                 :            :      * Sets the stroke width map unit \a scale.
     732                 :            :      *
     733                 :            :      * \see strokeWidthMapUnitScale()
     734                 :            :      * \see setStrokeWidthUnit()
     735                 :            :      */
     736                 :        100 :     void setStrokeWidthMapUnitScale( const QgsMapUnitScale &scale ) { mStrokeWidthMapUnitScale = scale; }
     737                 :            : 
     738                 :            :     /**
     739                 :            :      * Returns the stroke width map unit scale.
     740                 :            :      *
     741                 :            :      * \see setStrokeWidthMapUnitScale()
     742                 :            :      * \see strokeWidthUnit()
     743                 :            :      *
     744                 :            :      * \since QGIS 2.16
     745                 :            :     */
     746                 :            :     const QgsMapUnitScale &strokeWidthMapUnitScale() const { return mStrokeWidthMapUnitScale; }
     747                 :            : 
     748                 :            :     void setOutputUnit( QgsUnitTypes::RenderUnit unit ) override;
     749                 :            :     QgsUnitTypes::RenderUnit outputUnit() const override;
     750                 :            :     void setMapUnitScale( const QgsMapUnitScale &scale ) override;
     751                 :            :     QgsMapUnitScale mapUnitScale() const override;
     752                 :            :     double estimateMaxBleed( const QgsRenderContext &context ) const override;
     753                 :            :     double dxfWidth( const QgsDxfExport &e, QgsSymbolRenderContext &context ) const override;
     754                 :            :     QColor dxfColor( QgsSymbolRenderContext &context ) const override;
     755                 :            :     Qt::PenStyle dxfPenStyle() const override;
     756                 :            :     QSet<QString> usedAttributes( const QgsRenderContext &context ) const override;
     757                 :            :     bool hasDataDefinedProperties() const override;
     758                 :            : 
     759                 :            :   protected:
     760                 :            :     QBrush mBrush;
     761                 :            :     double mNextAngle = 0.0; // mAngle / data defined angle
     762                 :            : 
     763                 :            :     //! Stroke width
     764                 :            :     double mStrokeWidth = 0.0;
     765                 :            :     QgsUnitTypes::RenderUnit mStrokeWidthUnit = QgsUnitTypes::RenderMillimeters;
     766                 :            :     QgsMapUnitScale mStrokeWidthMapUnitScale;
     767                 :            : 
     768                 :            :     //! Custom stroke
     769                 :            :     std::unique_ptr< QgsLineSymbol > mStroke;
     770                 :            : 
     771                 :          0 :     virtual void applyDataDefinedSettings( QgsSymbolRenderContext &context ) { Q_UNUSED( context ) }
     772                 :            : 
     773                 :            :     /**
     774                 :            :      * Returns TRUE if the image brush should be transformed using the render context's texture origin.
     775                 :            :      *
     776                 :            :      * \since QGIS 3.16
     777                 :            :      */
     778                 :            :     virtual bool applyBrushTransformFromContext() const;
     779                 :            : 
     780                 :            :   private:
     781                 :            : #ifdef SIP_RUN
     782                 :            :     QgsImageFillSymbolLayer( const QgsImageFillSymbolLayer &other );
     783                 :            : #endif
     784                 :            : };
     785                 :            : 
     786                 :            : /**
     787                 :            :  * \ingroup core
     788                 :            :  * \class QgsRasterFillSymbolLayer
     789                 :            :  * \brief A class for filling symbols with a repeated raster image.
     790                 :            :  * \since QGIS 2.7
     791                 :            :  */
     792                 :          0 : class CORE_EXPORT QgsRasterFillSymbolLayer: public QgsImageFillSymbolLayer
     793                 :            : {
     794                 :            :   public:
     795                 :            : 
     796                 :            :     //! Fill coordinate modes, dictates fill tiling behavior
     797                 :            :     enum FillCoordinateMode
     798                 :            :     {
     799                 :            :       Feature, //!< Tiling is based on feature bounding box
     800                 :            :       Viewport, //!< Tiling is based on complete map viewport
     801                 :            :     };
     802                 :            : 
     803                 :            :     /**
     804                 :            :      * Constructor for QgsRasterFillSymbolLayer, using a raster fill from the
     805                 :            :      * specified \a imageFilePath.
     806                 :            :      */
     807                 :            :     QgsRasterFillSymbolLayer( const QString &imageFilePath = QString() );
     808                 :            : 
     809                 :            :     /**
     810                 :            :      * Creates a new QgsRasterFillSymbolLayer from a \a properties map. The caller takes
     811                 :            :      * ownership of the returned object.
     812                 :            :      */
     813                 :            :     static QgsSymbolLayer *create( const QVariantMap &properties = QVariantMap() ) SIP_FACTORY;
     814                 :            : 
     815                 :            :     /**
     816                 :            :      * Turns relative paths in properties map to absolute when reading and vice versa when writing.
     817                 :            :      * Used internally when reading/writing symbols.
     818                 :            :      * \since QGIS 3.0
     819                 :            :      */
     820                 :            :     static void resolvePaths( QVariantMap &properties, const QgsPathResolver &pathResolver, bool saving );
     821                 :            : 
     822                 :            :     // implemented from base classes
     823                 :            :     QString layerType() const override;
     824                 :            :     void renderPolygon( const QPolygonF &points, const QVector<QPolygonF> *rings, QgsSymbolRenderContext &context ) override;
     825                 :            :     void startRender( QgsSymbolRenderContext &context ) override;
     826                 :            :     void stopRender( QgsSymbolRenderContext &context ) override;
     827                 :            :     QVariantMap properties() const override;
     828                 :            :     QgsRasterFillSymbolLayer *clone() const override SIP_FACTORY;
     829                 :            :     double estimateMaxBleed( const QgsRenderContext &context ) const override;
     830                 :            :     bool usesMapUnits() const override;
     831                 :            : 
     832                 :            :     //override QgsImageFillSymbolLayer's support for sub symbols
     833                 :          0 :     QgsSymbol *subSymbol() override { return nullptr; }
     834                 :            :     bool setSubSymbol( QgsSymbol *symbol SIP_TRANSFER ) override;
     835                 :            : 
     836                 :            :     /**
     837                 :            :      * Sets the path to the raster image used for the fill.
     838                 :            :      * \param imagePath path to image file
     839                 :            :      * \see imageFilePath
     840                 :            :      */
     841                 :            :     void setImageFilePath( const QString &imagePath );
     842                 :            : 
     843                 :            :     /**
     844                 :            :      * The path to the raster image used for the fill.
     845                 :            :      * \returns path to image file
     846                 :            :      * \see setImageFilePath
     847                 :            :      */
     848                 :            :     QString imageFilePath() const { return mImageFilePath; }
     849                 :            : 
     850                 :            :     /**
     851                 :            :      * Set the coordinate mode for fill. Controls how the top left corner of the image
     852                 :            :      * fill is positioned relative to the feature.
     853                 :            :      * \param mode coordinate mode
     854                 :            :      * \see coordinateMode
     855                 :            :      */
     856                 :            :     void setCoordinateMode( FillCoordinateMode mode );
     857                 :            : 
     858                 :            :     /**
     859                 :            :      * Coordinate mode for fill. Controls how the top left corner of the image
     860                 :            :      * fill is positioned relative to the feature.
     861                 :            :      * \returns coordinate mode
     862                 :            :      * \see setCoordinateMode
     863                 :            :      */
     864                 :            :     FillCoordinateMode coordinateMode() const { return mCoordinateMode; }
     865                 :            : 
     866                 :            :     /**
     867                 :            :      * Sets the \a opacity for the raster image used in the fill.
     868                 :            :      * \param opacity opacity value between 0 (fully transparent) and 1 (fully opaque)
     869                 :            :      * \see opacity()
     870                 :            :      */
     871                 :            :     void setOpacity( double opacity );
     872                 :            : 
     873                 :            :     /**
     874                 :            :      * Returns the opacity for the raster image used in the fill.
     875                 :            :      * \returns opacity value between 0 (fully transparent) and 1 (fully opaque)
     876                 :            :      * \see setOpacity()
     877                 :            :      */
     878                 :            :     double opacity() const { return mOpacity; }
     879                 :            : 
     880                 :            :     /**
     881                 :            :      * Sets the offset for the fill.
     882                 :            :      * \param offset offset for fill
     883                 :            :      * \see offset
     884                 :            :      * \see setOffsetUnit
     885                 :            :      * \see setOffsetMapUnitScale
     886                 :            :      */
     887                 :          0 :     void setOffset( QPointF offset ) { mOffset = offset; }
     888                 :            : 
     889                 :            :     /**
     890                 :            :      * Returns the offset for the fill.
     891                 :            :      * \returns offset for fill
     892                 :            :      * \see setOffset
     893                 :            :      * \see offsetUnit
     894                 :            :      * \see offsetMapUnitScale
     895                 :            :      */
     896                 :            :     QPointF offset() const { return mOffset; }
     897                 :            : 
     898                 :            :     /**
     899                 :            :      * Sets the units for the fill's offset.
     900                 :            :      * \param unit units for offset
     901                 :            :      * \see offsetUnit
     902                 :            :      * \see setOffset
     903                 :            :      * \see setOffsetMapUnitScale
     904                 :            :      */
     905                 :          0 :     void setOffsetUnit( const QgsUnitTypes::RenderUnit unit ) { mOffsetUnit = unit; }
     906                 :            : 
     907                 :            :     /**
     908                 :            :      * Returns the units for the fill's offset.
     909                 :            :      * \returns units for offset
     910                 :            :      * \see setOffsetUnit
     911                 :            :      * \see offset
     912                 :            :      * \see offsetMapUnitScale
     913                 :            :      */
     914                 :            :     QgsUnitTypes::RenderUnit offsetUnit() const { return mOffsetUnit; }
     915                 :            : 
     916                 :            :     /**
     917                 :            :      * Sets the map unit scale for the fill's offset.
     918                 :            :      * \param scale map unit scale for offset
     919                 :            :      * \see offsetMapUnitScale
     920                 :            :      * \see setOffset
     921                 :            :      * \see setOffsetUnit
     922                 :            :      */
     923                 :          0 :     void setOffsetMapUnitScale( const QgsMapUnitScale &scale ) { mOffsetMapUnitScale = scale; }
     924                 :            : 
     925                 :            :     /**
     926                 :            :      * Returns the map unit scale for the fill's offset.
     927                 :            :      * \returns map unit scale for offset
     928                 :            :      * \see setOffsetMapUnitScale
     929                 :            :      * \see offset
     930                 :            :      * \see offsetUnit
     931                 :            :      */
     932                 :            :     const QgsMapUnitScale &offsetMapUnitScale() const { return mOffsetMapUnitScale; }
     933                 :            : 
     934                 :            :     /**
     935                 :            :      * Sets the width for scaling the image used in the fill. The image's height will also be
     936                 :            :      * scaled to maintain the image's aspect ratio.
     937                 :            :      * \param width width for scaling the image
     938                 :            :      * \see width
     939                 :            :      * \see setWidthUnit
     940                 :            :      * \see setWidthMapUnitScale
     941                 :            :      */
     942                 :          0 :     void setWidth( const double width ) { mWidth = width; }
     943                 :            : 
     944                 :            :     /**
     945                 :            :      * Returns the width used for scaling the image used in the fill. The image's height is
     946                 :            :      * scaled to maintain the image's aspect ratio.
     947                 :            :      * \returns width used for scaling the image
     948                 :            :      * \see setWidth
     949                 :            :      * \see widthUnit
     950                 :            :      * \see widthMapUnitScale
     951                 :            :      */
     952                 :            :     double width() const { return mWidth; }
     953                 :            : 
     954                 :            :     /**
     955                 :            :      * Sets the units for the image's width.
     956                 :            :      * \param unit units for width
     957                 :            :      * \see widthUnit
     958                 :            :      * \see setWidth
     959                 :            :      * \see setWidthMapUnitScale
     960                 :            :      */
     961                 :          0 :     void setWidthUnit( const QgsUnitTypes::RenderUnit unit ) { mWidthUnit = unit; }
     962                 :            : 
     963                 :            :     /**
     964                 :            :      * Returns the units for the image's width.
     965                 :            :      * \returns units for width
     966                 :            :      * \see setWidthUnit
     967                 :            :      * \see width
     968                 :            :      * \see widthMapUnitScale
     969                 :            :      */
     970                 :            :     QgsUnitTypes::RenderUnit widthUnit() const { return mWidthUnit; }
     971                 :            : 
     972                 :            :     /**
     973                 :            :      * Sets the map unit scale for the image's width.
     974                 :            :      * \param scale map unit scale for width
     975                 :            :      * \see widthMapUnitScale
     976                 :            :      * \see setWidth
     977                 :            :      * \see setWidthUnit
     978                 :            :      */
     979                 :          0 :     void setWidthMapUnitScale( const QgsMapUnitScale &scale ) { mWidthMapUnitScale = scale; }
     980                 :            : 
     981                 :            :     /**
     982                 :            :      * Returns the map unit scale for the image's width.
     983                 :            :      * \returns map unit scale for width
     984                 :            :      * \see setWidthMapUnitScale
     985                 :            :      * \see width
     986                 :            :      * \see widthUnit
     987                 :            :      */
     988                 :            :     const QgsMapUnitScale &widthMapUnitScale() const { return mWidthMapUnitScale; }
     989                 :            : 
     990                 :            :   protected:
     991                 :            : 
     992                 :            :     void applyDataDefinedSettings( QgsSymbolRenderContext &context ) override;
     993                 :            :     bool applyBrushTransformFromContext() const override;
     994                 :            :   private:
     995                 :            : 
     996                 :            :     //! Path to the image file
     997                 :            :     QString mImageFilePath;
     998                 :            :     FillCoordinateMode mCoordinateMode = QgsRasterFillSymbolLayer::Feature;
     999                 :            :     double mOpacity = 1.0;
    1000                 :            : 
    1001                 :            :     QPointF mOffset;
    1002                 :            :     QgsUnitTypes::RenderUnit mOffsetUnit = QgsUnitTypes::RenderMillimeters;
    1003                 :            :     QgsMapUnitScale mOffsetMapUnitScale;
    1004                 :            : 
    1005                 :            :     double mWidth = 0.0;
    1006                 :            :     QgsUnitTypes::RenderUnit mWidthUnit = QgsUnitTypes::RenderPixels;
    1007                 :            :     QgsMapUnitScale mWidthMapUnitScale;
    1008                 :            : 
    1009                 :            :     //! Applies the image pattern to the brush
    1010                 :            :     void applyPattern( QBrush &brush, const QString &imageFilePath, double width, double opacity,
    1011                 :            :                        const QgsSymbolRenderContext &context );
    1012                 :            : };
    1013                 :            : 
    1014                 :            : /**
    1015                 :            :  * \ingroup core
    1016                 :            :  * \brief A class for filling symbols with a repeated SVG file.
    1017                 :            : */
    1018                 :          0 : class CORE_EXPORT QgsSVGFillSymbolLayer: public QgsImageFillSymbolLayer
    1019                 :            : {
    1020                 :            :   public:
    1021                 :            : 
    1022                 :            :     /**
    1023                 :            :      * Constructor for QgsSVGFillSymbolLayer, using the SVG picture at the specified absolute file path.
    1024                 :            :      */
    1025                 :            :     QgsSVGFillSymbolLayer( const QString &svgFilePath, double width = 20, double rotation = 0.0 );
    1026                 :            : 
    1027                 :            :     /**
    1028                 :            :      * Constructor for QgsSVGFillSymbolLayer, using the specified SVG picture data.
    1029                 :            :      */
    1030                 :            :     QgsSVGFillSymbolLayer( const QByteArray &svgData, double width = 20, double rotation = 0.0 );
    1031                 :            : 
    1032                 :            :     /**
    1033                 :            :      * Creates a new QgsSVGFillSymbolLayer from a \a properties map. The caller takes
    1034                 :            :      * ownership of the returned object.
    1035                 :            :      */
    1036                 :            :     static QgsSymbolLayer *create( const QVariantMap &properties = QVariantMap() ) SIP_FACTORY;
    1037                 :            : 
    1038                 :            :     /**
    1039                 :            :      * Creates a new QgsSVGFillSymbolLayer from a SLD \a element. The caller takes
    1040                 :            :      * ownership of the returned object.
    1041                 :            :      */
    1042                 :            :     static QgsSymbolLayer *createFromSld( QDomElement &element ) SIP_FACTORY;
    1043                 :            : 
    1044                 :            :     /**
    1045                 :            :      * Turns relative paths in properties map to absolute when reading and vice versa when writing.
    1046                 :            :      * Used internally when reading/writing symbols.
    1047                 :            :      * \since QGIS 3.0
    1048                 :            :      */
    1049                 :            :     static void resolvePaths( QVariantMap &properties, const QgsPathResolver &pathResolver, bool saving );
    1050                 :            : 
    1051                 :            :     // implemented from base classes
    1052                 :            : 
    1053                 :            :     QString layerType() const override;
    1054                 :            :     void startRender( QgsSymbolRenderContext &context ) override;
    1055                 :            :     void stopRender( QgsSymbolRenderContext &context ) override;
    1056                 :            :     QVariantMap properties() const override;
    1057                 :            :     QgsSVGFillSymbolLayer *clone() const override SIP_FACTORY;
    1058                 :            :     void toSld( QDomDocument &doc, QDomElement &element, const QVariantMap &props ) const override;
    1059                 :            :     bool usesMapUnits() const override;
    1060                 :            : 
    1061                 :            :     /**
    1062                 :            :      * Sets the path to the SVG file to render in the fill.
    1063                 :            :      *
    1064                 :            :      * This is usually an absolute file path. Other supported options include
    1065                 :            :      *
    1066                 :            :      * - relative paths to folders from the user's SVG search paths
    1067                 :            :      * - base64 encoded content, prefixed with a 'base64:' string
    1068                 :            :      * - http(s) paths
    1069                 :            :      *
    1070                 :            :      * \see svgFilePath()
    1071                 :            :      */
    1072                 :            :     void setSvgFilePath( const QString &svgPath );
    1073                 :            : 
    1074                 :            :     /**
    1075                 :            :      * Returns the path to the SVG file used to render the fill.
    1076                 :            :      *
    1077                 :            :      * \see setSvgFilePath()
    1078                 :            :      */
    1079                 :            :     QString svgFilePath() const { return mSvgFilePath; }
    1080                 :            : 
    1081                 :            :     /**
    1082                 :            :      * Sets the \a width to render the SVG content as within the fill (i.e. the pattern repeat/tile size).
    1083                 :            :      *
    1084                 :            :      * Units are specified by setPatternWidthUnit()
    1085                 :            :      *
    1086                 :            :      * \see patternWidth()
    1087                 :            :      * \see setPatternWidthUnit()
    1088                 :            :      * \see setPatternWidthMapUnitScale()
    1089                 :            :      */
    1090                 :            :     void setPatternWidth( double width ) { mPatternWidth = width;}
    1091                 :            : 
    1092                 :            :     /**
    1093                 :            :      * Returns the width of the rendered SVG content within the fill (i.e. the pattern repeat/tile size).
    1094                 :            :      *
    1095                 :            :      * Units are retrieved by patternWidthUnit()
    1096                 :            :      *
    1097                 :            :      * \see setPatternWidth()
    1098                 :            :      * \see patternWidthUnit()
    1099                 :            :      * \see patternWidthMapUnitScale()
    1100                 :            :      */
    1101                 :            :     double patternWidth() const { return mPatternWidth; }
    1102                 :            : 
    1103                 :            :     /**
    1104                 :            :      * Sets the fill color used for rendering the SVG content.
    1105                 :            :      *
    1106                 :            :      * Fill color is only supported for parametrized SVG files. Color opacity is
    1107                 :            :      * ignored if the SVG file does not support parametrized fill opacity.
    1108                 :            :      *
    1109                 :            :      * \see svgFillColor()
    1110                 :            :      * \see setSvgStrokeColor()
    1111                 :            :      */
    1112                 :          0 :     void setSvgFillColor( const QColor &c ) { setColor( c );  }
    1113                 :            : 
    1114                 :            :     /**
    1115                 :            :      * Returns the fill color used for rendering the SVG content.
    1116                 :            :      *
    1117                 :            :      * Fill color is only supported for parametrized SVG files.
    1118                 :            :      *
    1119                 :            :      * \see setSvgFillColor()
    1120                 :            :      * \see svgStrokeColor()
    1121                 :            :      */
    1122                 :            :     QColor svgFillColor() const { return color(); }
    1123                 :            : 
    1124                 :            :     /**
    1125                 :            :      * Sets the stroke color used for rendering the SVG content.
    1126                 :            :      *
    1127                 :            :      * Stroke color is only supported for parametrized SVG files. Color opacity is
    1128                 :            :      * ignored if the SVG file does not support parametrized outline opacity.
    1129                 :            :      *
    1130                 :            :      * \see svgStrokeColor()
    1131                 :            :      * \see setSvgFillColor()
    1132                 :            :      */
    1133                 :          0 :     void setSvgStrokeColor( const QColor &c ) { mSvgStrokeColor = c; }
    1134                 :            : 
    1135                 :            :     /**
    1136                 :            :      * Returns the stroke color used for rendering the SVG content.
    1137                 :            :      *
    1138                 :            :      * Stroke color is only supported for parametrized SVG files.
    1139                 :            :      *
    1140                 :            :      * \see setSvgStrokeColor()
    1141                 :            :      * \see svgFillColor()
    1142                 :            :      */
    1143                 :            :     QColor svgStrokeColor() const { return mSvgStrokeColor; }
    1144                 :            : 
    1145                 :            :     /**
    1146                 :            :      * Sets the stroke width used for rendering the SVG content.
    1147                 :            :      *
    1148                 :            :      * Stroke width is only supported for parametrized SVG files. Units are
    1149                 :            :      * specified via setSvgStrokeWidthUnit()
    1150                 :            :      *
    1151                 :            :      * \see svgStrokeWidth()
    1152                 :            :      * \see setSvgStrokeWidthUnit()
    1153                 :            :      * \see setSvgStrokeWidthMapUnitScale()
    1154                 :            :      */
    1155                 :          0 :     void setSvgStrokeWidth( double w ) { mSvgStrokeWidth = w; }
    1156                 :            : 
    1157                 :            :     /**
    1158                 :            :      * Returns the stroke width used for rendering the SVG content.
    1159                 :            :      *
    1160                 :            :      * Stroke width is only supported for parametrized SVG files. Units are
    1161                 :            :      * retrieved via setSvgStrokeWidthUnit()
    1162                 :            :      *
    1163                 :            :      * \see setSvgStrokeWidth()
    1164                 :            :      * \see svgStrokeWidthUnit()
    1165                 :            :      * \see svgStrokeWidthMapUnitScale()
    1166                 :            :      */
    1167                 :            :     double svgStrokeWidth() const { return mSvgStrokeWidth; }
    1168                 :            : 
    1169                 :            :     /**
    1170                 :            :      * Sets the \a unit for the width of the SVG images in the pattern.
    1171                 :            :      *
    1172                 :            :      * \see patternWidthUnit()
    1173                 :            :      * \see setPatternWidth()
    1174                 :            :      * \see setPatternWidthMapUnitScale()
    1175                 :            :     */
    1176                 :          0 :     void setPatternWidthUnit( QgsUnitTypes::RenderUnit unit ) { mPatternWidthUnit = unit; }
    1177                 :            : 
    1178                 :            :     /**
    1179                 :            :      * Returns the units for the width of the SVG images in the pattern.
    1180                 :            :      *
    1181                 :            :      * \see setPatternWidthUnit()
    1182                 :            :      * \see patternWidth()
    1183                 :            :      * \see patternWidthMapUnitScale()
    1184                 :            :     */
    1185                 :            :     QgsUnitTypes::RenderUnit patternWidthUnit() const { return mPatternWidthUnit; }
    1186                 :            : 
    1187                 :            :     /**
    1188                 :            :      * Sets the map unit \a scale for the pattern's width.
    1189                 :            :      *
    1190                 :            :      * \see patternWidthMapUnitScale()
    1191                 :            :      * \see setPatternWidth()
    1192                 :            :      * \see setPatternWidthUnit()
    1193                 :            :      */
    1194                 :          0 :     void setPatternWidthMapUnitScale( const QgsMapUnitScale &scale ) { mPatternWidthMapUnitScale = scale; }
    1195                 :            : 
    1196                 :            :     /**
    1197                 :            :      * Returns the map unit scale for the pattern's width.
    1198                 :            :      *
    1199                 :            :      * \see setPatternWidthMapUnitScale()
    1200                 :            :      * \see patternWidth()
    1201                 :            :      * \see patternWidthUnit()
    1202                 :            :      */
    1203                 :            :     const QgsMapUnitScale &patternWidthMapUnitScale() const { return mPatternWidthMapUnitScale; }
    1204                 :            : 
    1205                 :            :     /**
    1206                 :            :      * Sets the \a unit for the stroke width.
    1207                 :            :      *
    1208                 :            :      * \see svgStrokeWidthUnit()
    1209                 :            :      * \see setSvgStrokeWidth()
    1210                 :            :      * \see setSvgStrokeWidthMapUnitScale()
    1211                 :            :     */
    1212                 :          0 :     void setSvgStrokeWidthUnit( QgsUnitTypes::RenderUnit unit ) { mSvgStrokeWidthUnit = unit; }
    1213                 :            : 
    1214                 :            :     /**
    1215                 :            :      * Returns the units for the stroke width.
    1216                 :            :      *
    1217                 :            :      * \see setSvgStrokeWidthUnit()
    1218                 :            :      * \see svgStrokeWidth()
    1219                 :            :      * \see svgStrokeWidthMapUnitScale()
    1220                 :            :     */
    1221                 :            :     QgsUnitTypes::RenderUnit svgStrokeWidthUnit() const { return mSvgStrokeWidthUnit; }
    1222                 :            : 
    1223                 :            :     /**
    1224                 :            :      * Sets the map unit \a scale for the pattern's stroke.
    1225                 :            :      *
    1226                 :            :      * \see svgStrokeWidthMapUnitScale()
    1227                 :            :      * \see setSvgStrokeWidth()
    1228                 :            :      * \see setSvgStrokeWidthUnit()
    1229                 :            :      */
    1230                 :          0 :     void setSvgStrokeWidthMapUnitScale( const QgsMapUnitScale &scale ) { mSvgStrokeWidthMapUnitScale = scale; }
    1231                 :            : 
    1232                 :            :     /**
    1233                 :            :      * Returns the map unit scale for the pattern's stroke.
    1234                 :            :      *
    1235                 :            :      * \see setSvgStrokeWidthMapUnitScale()
    1236                 :            :      * \see svgStrokeWidth()
    1237                 :            :      * \see svgStrokeWidthUnit()
    1238                 :            :      */
    1239                 :            :     const QgsMapUnitScale &svgStrokeWidthMapUnitScale() const { return mSvgStrokeWidthMapUnitScale; }
    1240                 :            : 
    1241                 :            :     void setOutputUnit( QgsUnitTypes::RenderUnit unit ) override;
    1242                 :            :     QgsUnitTypes::RenderUnit outputUnit() const override;
    1243                 :            : 
    1244                 :            :     void setMapUnitScale( const QgsMapUnitScale &scale ) override;
    1245                 :            :     QgsMapUnitScale mapUnitScale() const override;
    1246                 :            : 
    1247                 :            :     /**
    1248                 :            :      * Returns the dynamic SVG parameters
    1249                 :            :      * \since QGIS 3.18
    1250                 :            :      */
    1251                 :            :     QMap<QString, QgsProperty> parameters() const { return mParameters; }
    1252                 :            : 
    1253                 :            :     /**
    1254                 :            :      * Sets the dynamic SVG parameters
    1255                 :            :      * \since QGIS 3.18
    1256                 :            :      */
    1257                 :            :     void setParameters( const QMap<QString, QgsProperty> &parameters );
    1258                 :            : 
    1259                 :            :   protected:
    1260                 :            : 
    1261                 :            :     void applyDataDefinedSettings( QgsSymbolRenderContext &context ) override;
    1262                 :            : 
    1263                 :            :   private:
    1264                 :            : 
    1265                 :            :     //! Width of the pattern (in output units)
    1266                 :            :     double mPatternWidth = 20;
    1267                 :            :     QgsUnitTypes::RenderUnit mPatternWidthUnit = QgsUnitTypes::RenderMillimeters;
    1268                 :            :     QgsMapUnitScale mPatternWidthMapUnitScale;
    1269                 :            :     QMap<QString, QgsProperty> mParameters;
    1270                 :            : 
    1271                 :            :     //! SVG data
    1272                 :            :     QByteArray mSvgData;
    1273                 :            :     //! Path to the svg file (or empty if constructed directly from data)
    1274                 :            :     QString mSvgFilePath;
    1275                 :            :     //! SVG view box (to keep the aspect ratio
    1276                 :            :     QRectF mSvgViewBox;
    1277                 :            : 
    1278                 :            :     //param(fill), param(stroke), param(stroke-width) are going
    1279                 :            :     //to be replaced in memory
    1280                 :            :     QColor mSvgStrokeColor = QColor( 35, 35, 35 );
    1281                 :            :     double mSvgStrokeWidth = 0.2;
    1282                 :            :     QgsUnitTypes::RenderUnit mSvgStrokeWidthUnit = QgsUnitTypes::RenderMillimeters;
    1283                 :            :     QgsMapUnitScale mSvgStrokeWidthMapUnitScale;
    1284                 :            : 
    1285                 :            :     //! Helper function that gets the view box from the byte array
    1286                 :            :     void storeViewBox();
    1287                 :            :     void setDefaultSvgParams(); //fills mSvgFillColor, mSvgStrokeColor, mSvgStrokeWidth with default values for mSvgFilePath
    1288                 :            : 
    1289                 :            :     //! Applies the svg pattern to the brush
    1290                 :            :     void applyPattern( QBrush &brush, const QString &svgFilePath, double patternWidth, QgsUnitTypes::RenderUnit patternWidthUnit, const QColor &svgFillColor, const QColor &svgStrokeColor,
    1291                 :            :                        double svgStrokeWidth, QgsUnitTypes::RenderUnit svgStrokeWidthUnit, const QgsSymbolRenderContext &context, const QgsMapUnitScale &patternWidthMapUnitScale, const QgsMapUnitScale &svgStrokeWidthMapUnitScale,
    1292                 :            :                        const QgsStringMap svgParameters );
    1293                 :            : };
    1294                 :            : 
    1295                 :            : /**
    1296                 :            :  * \ingroup core
    1297                 :            :  * \class QgsLinePatternFillSymbolLayer
    1298                 :            :  * \brief A symbol fill consisting of repeated parallel lines.
    1299                 :            :  */
    1300                 :            : class CORE_EXPORT QgsLinePatternFillSymbolLayer: public QgsImageFillSymbolLayer
    1301                 :            : {
    1302                 :            :   public:
    1303                 :            :     QgsLinePatternFillSymbolLayer();
    1304                 :            :     ~QgsLinePatternFillSymbolLayer() override;
    1305                 :            : 
    1306                 :            :     /**
    1307                 :            :      * Creates a new QgsLinePatternFillSymbolLayer from a \a properties map. The caller takes
    1308                 :            :      * ownership of the returned object.
    1309                 :            :      */
    1310                 :            :     static QgsSymbolLayer *create( const QVariantMap &properties = QVariantMap() ) SIP_FACTORY;
    1311                 :            : 
    1312                 :            :     /**
    1313                 :            :      * Creates a new QgsLinePatternFillSymbolLayer from a SLD \a element. The caller takes
    1314                 :            :      * ownership of the returned object.
    1315                 :            :      */
    1316                 :            :     static QgsSymbolLayer *createFromSld( QDomElement &element ) SIP_FACTORY;
    1317                 :            : 
    1318                 :            :     QString layerType() const override;
    1319                 :            :     void startRender( QgsSymbolRenderContext &context ) override;
    1320                 :            :     void stopRender( QgsSymbolRenderContext &context ) override;
    1321                 :            :     QVariantMap properties() const override;
    1322                 :            :     QgsLinePatternFillSymbolLayer *clone() const override SIP_FACTORY;
    1323                 :            :     void toSld( QDomDocument &doc, QDomElement &element, const QVariantMap &props ) const override;
    1324                 :            :     double estimateMaxBleed( const QgsRenderContext &context ) const override;
    1325                 :            : 
    1326                 :            :     QString ogrFeatureStyleWidth( double widthScaleFactor ) const;
    1327                 :            : 
    1328                 :            :     /**
    1329                 :            :      * Sets the angle for the parallel lines used to fill the symbol.
    1330                 :            :      *
    1331                 :            :      * Angles are in degrees, clockwise from North.
    1332                 :            :      *
    1333                 :            :      * \see lineAngle()
    1334                 :            :      */
    1335                 :         70 :     void setLineAngle( double a ) { mLineAngle = a; }
    1336                 :            : 
    1337                 :            :     /**
    1338                 :            :      * Returns the angle for the parallel lines used to fill the symbol.
    1339                 :            :      *
    1340                 :            :      * Angles are in degrees, clockwise from North.
    1341                 :            :      *
    1342                 :            :      * \see setLineAngle()
    1343                 :            :      */
    1344                 :            :     double lineAngle() const { return mLineAngle; }
    1345                 :            : 
    1346                 :            :     /**
    1347                 :            :      * Sets the distance between lines in the fill pattern.
    1348                 :            :      * \param d distance. Units are specified by setDistanceUnit()
    1349                 :            :      * \see distance()
    1350                 :            :      * \see setDistanceUnit()
    1351                 :            :     */
    1352                 :         70 :     void setDistance( double d ) { mDistance = d; }
    1353                 :            : 
    1354                 :            :     /**
    1355                 :            :      * Returns the distance between lines in the fill pattern. Units are retrieved by distanceUnit().
    1356                 :            :      * \see setDistance()
    1357                 :            :      * \see distanceUnit()
    1358                 :            :     */
    1359                 :            :     double distance() const { return mDistance; }
    1360                 :            : 
    1361                 :            :     /**
    1362                 :            :      * Sets the width of the line subsymbol used to render the parallel lines
    1363                 :            :      * in the fill.
    1364                 :            :      *
    1365                 :            :      * \see lineWidth()
    1366                 :            :      */
    1367                 :            :     void setLineWidth( double w );
    1368                 :            : 
    1369                 :            :     /**
    1370                 :            :      * Returns the width of the line subsymbol used to render the parallel lines
    1371                 :            :      * in the fill.
    1372                 :            :      *
    1373                 :            :      * \see setLineWidth()
    1374                 :            :      */
    1375                 :            :     double lineWidth() const { return mLineWidth; }
    1376                 :            : 
    1377                 :            :     void setColor( const QColor &c ) override;
    1378                 :            :     QColor color() const override;
    1379                 :            : 
    1380                 :            :     /**
    1381                 :            :      * Sets the \a offset distance for lines within the fill, which is
    1382                 :            :      * the distance to offset the parallel lines from their normal
    1383                 :            :      * position.
    1384                 :            :      *
    1385                 :            :      * Units are specified via setOffsetUnit().
    1386                 :            :      *
    1387                 :            :      * \see offset()
    1388                 :            :      * \see setOffsetUnit()
    1389                 :            :      * \see setOffsetMapUnitScale()
    1390                 :            :      */
    1391                 :         70 :     void setOffset( double offset ) { mOffset = offset; }
    1392                 :            : 
    1393                 :            :     /**
    1394                 :            :      * Returns the offset distance for lines within the fill, which is
    1395                 :            :      * the distance to offset the parallel lines from their normal
    1396                 :            :      * position.
    1397                 :            :      *
    1398                 :            :      * Units are retrieved via offsetUnit().
    1399                 :            :      *
    1400                 :            :      * \see setOffset()
    1401                 :            :      * \see offsetUnit()
    1402                 :            :      * \see offsetMapUnitScale()
    1403                 :            :      */
    1404                 :            :     double offset() const { return mOffset; }
    1405                 :            : 
    1406                 :            :     /**
    1407                 :            :      * Sets the \a unit for the distance between lines in the fill pattern.
    1408                 :            :      *
    1409                 :            :      * \see distanceUnit()
    1410                 :            :      * \see setDistance()
    1411                 :            :     */
    1412                 :         70 :     void setDistanceUnit( QgsUnitTypes::RenderUnit unit ) { mDistanceUnit = unit; }
    1413                 :            : 
    1414                 :            :     /**
    1415                 :            :      * Returns the units for the distance between lines in the fill pattern.
    1416                 :            :      *
    1417                 :            :      * \see setDistanceUnit()
    1418                 :            :      * \see distance()
    1419                 :            :     */
    1420                 :            :     QgsUnitTypes::RenderUnit distanceUnit() const { return mDistanceUnit; }
    1421                 :            : 
    1422                 :            :     /**
    1423                 :            :      * Sets the map unit \a scale for the pattern's line distance.
    1424                 :            :      *
    1425                 :            :      * \see distanceMapUnitScale()
    1426                 :            :      * \see setDistance()
    1427                 :            :      * \see setDistanceUnit()
    1428                 :            :      */
    1429                 :         70 :     void setDistanceMapUnitScale( const QgsMapUnitScale &scale ) { mDistanceMapUnitScale = scale; }
    1430                 :            : 
    1431                 :            :     /**
    1432                 :            :      * Returns the map unit scale for the pattern's line distance.
    1433                 :            :      *
    1434                 :            :      * \see setDistanceMapUnitScale()
    1435                 :            :      * \see distance()
    1436                 :            :      * \see distanceUnit()
    1437                 :            :      */
    1438                 :            :     const QgsMapUnitScale &distanceMapUnitScale() const { return mDistanceMapUnitScale; }
    1439                 :            : 
    1440                 :            :     /**
    1441                 :            :      * Sets the \a unit for the line's width.
    1442                 :            :      *
    1443                 :            :      * \see lineWidthUnit()
    1444                 :            :     */
    1445                 :         70 :     void setLineWidthUnit( QgsUnitTypes::RenderUnit unit ) { mLineWidthUnit = unit; }
    1446                 :            : 
    1447                 :            :     /**
    1448                 :            :      * Returns the units for the line's width.
    1449                 :            :      *
    1450                 :            :      * \see setLineWidthUnit()
    1451                 :            :     */
    1452                 :            :     QgsUnitTypes::RenderUnit lineWidthUnit() const { return mLineWidthUnit; }
    1453                 :            : 
    1454                 :            :     /**
    1455                 :            :      * Sets the map unit \a scale for the pattern's line width.
    1456                 :            :      *
    1457                 :            :      * \see lineWidthMapUnitScale()
    1458                 :            :      * \see setLineWidth()
    1459                 :            :      * \see setLineWidthUnit()
    1460                 :            :      */
    1461                 :         70 :     void setLineWidthMapUnitScale( const QgsMapUnitScale &scale ) { mLineWidthMapUnitScale = scale; }
    1462                 :            : 
    1463                 :            :     /**
    1464                 :            :      * Returns the map unit scale for the pattern's line width.
    1465                 :            :      *
    1466                 :            :      * \see setLineWidthMapUnitScale()
    1467                 :            :      * \see lineWidth()
    1468                 :            :      * \see lineWidthUnit()
    1469                 :            :      */
    1470                 :            :     const QgsMapUnitScale &lineWidthMapUnitScale() const { return mLineWidthMapUnitScale; }
    1471                 :            : 
    1472                 :            :     /**
    1473                 :            :      * Sets the \a unit for the line pattern's offset.
    1474                 :            : 
    1475                 :            :      * \see offsetUnit()
    1476                 :            :     */
    1477                 :         70 :     void setOffsetUnit( QgsUnitTypes::RenderUnit unit ) { mOffsetUnit = unit; }
    1478                 :            : 
    1479                 :            :     /**
    1480                 :            :      * Returns the units for the line pattern's offset.
    1481                 :            :      *
    1482                 :            :      * \see setOffsetUnit()
    1483                 :            :     */
    1484                 :            :     QgsUnitTypes::RenderUnit offsetUnit() const { return mOffsetUnit; }
    1485                 :            : 
    1486                 :            :     /**
    1487                 :            :      * Sets the map unit \a scale for the pattern's line offset.
    1488                 :            :      *
    1489                 :            :      * \see offsetMapUnitScale()
    1490                 :            :      * \see setOffset()
    1491                 :            :      * \see setOffsetUnit()
    1492                 :            :      */
    1493                 :         70 :     void setOffsetMapUnitScale( const QgsMapUnitScale &scale ) { mOffsetMapUnitScale = scale; }
    1494                 :            : 
    1495                 :            :     /**
    1496                 :            :      * Returns the map unit scale for the pattern's line offset.
    1497                 :            :      *
    1498                 :            :      * \see setOffsetMapUnitScale()
    1499                 :            :      * \see offset()
    1500                 :            :      * \see offsetUnit()
    1501                 :            :      */
    1502                 :            :     const QgsMapUnitScale &offsetMapUnitScale() const { return mOffsetMapUnitScale; }
    1503                 :            : 
    1504                 :            :     void setOutputUnit( QgsUnitTypes::RenderUnit unit ) override;
    1505                 :            :     QgsUnitTypes::RenderUnit outputUnit() const override;
    1506                 :            :     bool usesMapUnits() const override;
    1507                 :            :     void setMapUnitScale( const QgsMapUnitScale &scale ) override;
    1508                 :            :     QgsMapUnitScale mapUnitScale() const override;
    1509                 :            :     bool setSubSymbol( QgsSymbol *symbol SIP_TRANSFER ) override;
    1510                 :            :     QgsSymbol *subSymbol() override;
    1511                 :            :     QSet<QString> usedAttributes( const QgsRenderContext &context ) const override;
    1512                 :            :     bool hasDataDefinedProperties() const override;
    1513                 :            : 
    1514                 :            :   protected:
    1515                 :            : 
    1516                 :            :     void applyDataDefinedSettings( QgsSymbolRenderContext &context ) override;
    1517                 :            : 
    1518                 :            :   private:
    1519                 :            :     //! Distance (in mm or map units) between lines
    1520                 :            :     double mDistance = 5.0;
    1521                 :            :     QgsUnitTypes::RenderUnit mDistanceUnit = QgsUnitTypes::RenderMillimeters;
    1522                 :            :     QgsMapUnitScale mDistanceMapUnitScale;
    1523                 :            :     //! Line width (in mm or map units)
    1524                 :            :     double mLineWidth = 0;
    1525                 :            :     QgsUnitTypes::RenderUnit mLineWidthUnit = QgsUnitTypes::RenderMillimeters;
    1526                 :            :     QgsMapUnitScale mLineWidthMapUnitScale;
    1527                 :            :     //! Vector line angle in degrees (0 = horizontal, counterclockwise)
    1528                 :            :     double mLineAngle = 45.0;
    1529                 :            :     //! Offset perpendicular to line direction
    1530                 :            :     double mOffset = 0.0;
    1531                 :            :     QgsUnitTypes::RenderUnit mOffsetUnit = QgsUnitTypes::RenderMillimeters;
    1532                 :            :     QgsMapUnitScale mOffsetMapUnitScale;
    1533                 :            : 
    1534                 :            : #ifdef SIP_RUN
    1535                 :            :     QgsLinePatternFillSymbolLayer( const QgsLinePatternFillSymbolLayer &other );
    1536                 :            : #endif
    1537                 :            : 
    1538                 :            :     //! Applies the svg pattern to the brush
    1539                 :            :     void applyPattern( const QgsSymbolRenderContext &context, QBrush &brush, double lineAngle, double distance );
    1540                 :            : 
    1541                 :            :     //! Fill line
    1542                 :            :     QgsLineSymbol *mFillLineSymbol = nullptr;
    1543                 :            : };
    1544                 :            : 
    1545                 :            : /**
    1546                 :            :  * \ingroup core
    1547                 :            :  * \class QgsPointPatternFillSymbolLayer
    1548                 :            :  */
    1549                 :            : class CORE_EXPORT QgsPointPatternFillSymbolLayer: public QgsImageFillSymbolLayer
    1550                 :            : {
    1551                 :            :   public:
    1552                 :            :     QgsPointPatternFillSymbolLayer();
    1553                 :            :     ~QgsPointPatternFillSymbolLayer() override;
    1554                 :            : 
    1555                 :            :     /**
    1556                 :            :      * Creates a new QgsPointPatternFillSymbolLayer using the specified \a properties map containing symbol properties (see properties()).
    1557                 :            :      *
    1558                 :            :      * Caller takes ownership of the returned symbol layer.
    1559                 :            :      */
    1560                 :            :     static QgsSymbolLayer *create( const QVariantMap &properties = QVariantMap() ) SIP_FACTORY;
    1561                 :            :     static QgsSymbolLayer *createFromSld( QDomElement &element ) SIP_FACTORY;
    1562                 :            : 
    1563                 :            :     QString layerType() const override;
    1564                 :            : 
    1565                 :            :     void startRender( QgsSymbolRenderContext &context ) override;
    1566                 :            :     void stopRender( QgsSymbolRenderContext &context ) override;
    1567                 :            :     void renderPolygon( const QPolygonF &points, const QVector<QPolygonF> *rings, QgsSymbolRenderContext &context ) override;
    1568                 :            : 
    1569                 :            :     QVariantMap properties() const override;
    1570                 :            : 
    1571                 :            :     QgsPointPatternFillSymbolLayer *clone() const override SIP_FACTORY;
    1572                 :            : 
    1573                 :            :     void toSld( QDomDocument &doc, QDomElement &element, const QVariantMap &props ) const override;
    1574                 :            : 
    1575                 :            :     double estimateMaxBleed( const QgsRenderContext &context ) const override;
    1576                 :            : 
    1577                 :            :     //getters and setters
    1578                 :            :     double distanceX() const { return mDistanceX; }
    1579                 :         30 :     void setDistanceX( double d ) { mDistanceX = d; }
    1580                 :            : 
    1581                 :            :     double distanceY() const { return mDistanceY; }
    1582                 :         30 :     void setDistanceY( double d ) { mDistanceY = d; }
    1583                 :            : 
    1584                 :            :     double displacementX() const { return mDisplacementX; }
    1585                 :         30 :     void setDisplacementX( double d ) { mDisplacementX = d; }
    1586                 :            : 
    1587                 :            :     double displacementY() const { return mDisplacementY; }
    1588                 :         30 :     void setDisplacementY( double d ) { mDisplacementY = d; }
    1589                 :            : 
    1590                 :            :     /**
    1591                 :            :      * Sets the horizontal offset values for points in the pattern.
    1592                 :            :      * \param offset offset value
    1593                 :            :      * \see offsetX()
    1594                 :            :      * \see setOffsetY()
    1595                 :            :      * \since QGIS 3.8
    1596                 :            :     */
    1597                 :         30 :     void setOffsetX( double offset ) { mOffsetX = offset; }
    1598                 :            : 
    1599                 :            :     /**
    1600                 :            :      * Returns the horizontal offset values for points in the pattern.
    1601                 :            :      * \see setOffsetX()
    1602                 :            :      * \see offsetY()
    1603                 :            :      * \since QGIS 3.8
    1604                 :            :     */
    1605                 :            :     double offsetX() const { return mOffsetX; }
    1606                 :            : 
    1607                 :            :     /**
    1608                 :            :      * Sets the vertical offset values for points in the pattern.
    1609                 :            :      * \param offset offset value
    1610                 :            :      * \see offsetY()
    1611                 :            :      * \see setOffsetX()
    1612                 :            :      * \since QGIS 3.8
    1613                 :            :     */
    1614                 :         30 :     void setOffsetY( double offset ) { mOffsetY = offset; }
    1615                 :            : 
    1616                 :            :     /**
    1617                 :            :      * Returns the vertical offset values for points in the pattern.
    1618                 :            :      * \see setOffsetY()
    1619                 :            :      * \see offsetX()
    1620                 :            :      * \since QGIS 3.8
    1621                 :            :     */
    1622                 :            :     double offsetY() const { return mOffsetY; }
    1623                 :            : 
    1624                 :            :     bool setSubSymbol( QgsSymbol *symbol SIP_TRANSFER ) override;
    1625                 :          0 :     QgsSymbol *subSymbol() override { return mMarkerSymbol; }
    1626                 :            : 
    1627                 :            :     /**
    1628                 :            :      * Sets the units for the horizontal distance between points in the pattern.
    1629                 :            :      * \param unit distance units
    1630                 :            :      * \see distanceXUnit()
    1631                 :            :      * \see setDistanceYUnit()
    1632                 :            :     */
    1633                 :         30 :     void setDistanceXUnit( QgsUnitTypes::RenderUnit unit ) { mDistanceXUnit = unit; }
    1634                 :            : 
    1635                 :            :     /**
    1636                 :            :      * Returns the units for the horizontal distance between points in the pattern.
    1637                 :            :      * \see setDistanceXUnit()
    1638                 :            :      * \see distanceYUnit()
    1639                 :            :     */
    1640                 :            :     QgsUnitTypes::RenderUnit distanceXUnit() const { return mDistanceXUnit; }
    1641                 :            : 
    1642                 :         30 :     void setDistanceXMapUnitScale( const QgsMapUnitScale &scale ) { mDistanceXMapUnitScale = scale; }
    1643                 :            :     const QgsMapUnitScale &distanceXMapUnitScale() const { return mDistanceXMapUnitScale; }
    1644                 :            : 
    1645                 :            :     /**
    1646                 :            :      * Sets the units for the vertical distance between points in the pattern.
    1647                 :            :      * \param unit distance units
    1648                 :            :      * \see distanceYUnit()
    1649                 :            :      * \see setDistanceXUnit()
    1650                 :            :     */
    1651                 :         30 :     void setDistanceYUnit( QgsUnitTypes::RenderUnit unit ) { mDistanceYUnit = unit; }
    1652                 :            : 
    1653                 :            :     /**
    1654                 :            :      * Returns the units for the vertical distance between points in the pattern.
    1655                 :            :      * \see setDistanceYUnit()
    1656                 :            :      * \see distanceXUnit()
    1657                 :            :     */
    1658                 :            :     QgsUnitTypes::RenderUnit distanceYUnit() const { return mDistanceYUnit; }
    1659                 :            : 
    1660                 :         30 :     void setDistanceYMapUnitScale( const QgsMapUnitScale &scale ) { mDistanceYMapUnitScale = scale; }
    1661                 :            :     const QgsMapUnitScale &distanceYMapUnitScale() const { return mDistanceYMapUnitScale; }
    1662                 :            : 
    1663                 :            :     /**
    1664                 :            :      * Sets the units for the horizontal displacement between rows in the pattern.
    1665                 :            :      * \param unit displacement units
    1666                 :            :      * \see displacementXUnit()
    1667                 :            :      * \see setDisplacementYUnit()
    1668                 :            :     */
    1669                 :         30 :     void setDisplacementXUnit( QgsUnitTypes::RenderUnit unit ) { mDisplacementXUnit = unit; }
    1670                 :            : 
    1671                 :            :     /**
    1672                 :            :      * Returns the units for the horizontal displacement between rows in the pattern.
    1673                 :            :      * \see setDisplacementXUnit()
    1674                 :            :      * \see displacementYUnit()
    1675                 :            :     */
    1676                 :            :     QgsUnitTypes::RenderUnit displacementXUnit() const { return mDisplacementXUnit; }
    1677                 :            : 
    1678                 :         30 :     void setDisplacementXMapUnitScale( const QgsMapUnitScale &scale ) { mDisplacementXMapUnitScale = scale; }
    1679                 :            :     const QgsMapUnitScale &displacementXMapUnitScale() const { return mDisplacementXMapUnitScale; }
    1680                 :            : 
    1681                 :            :     /**
    1682                 :            :      * Sets the units for the vertical displacement between rows in the pattern.
    1683                 :            :      * \param unit displacement units
    1684                 :            :      * \see displacementYUnit()
    1685                 :            :      * \see setDisplacementXUnit()
    1686                 :            :     */
    1687                 :         30 :     void setDisplacementYUnit( QgsUnitTypes::RenderUnit unit ) { mDisplacementYUnit = unit; }
    1688                 :            : 
    1689                 :            :     /**
    1690                 :            :      * Returns the units for the vertical displacement between rows in the pattern.
    1691                 :            :      * \see setDisplacementYUnit()
    1692                 :            :      * \see displacementXUnit()
    1693                 :            :     */
    1694                 :            :     QgsUnitTypes::RenderUnit displacementYUnit() const { return mDisplacementYUnit; }
    1695                 :            : 
    1696                 :         30 :     void setDisplacementYMapUnitScale( const QgsMapUnitScale &scale ) { mDisplacementYMapUnitScale = scale; }
    1697                 :            :     const QgsMapUnitScale &displacementYMapUnitScale() const { return mDisplacementYMapUnitScale; }
    1698                 :            : 
    1699                 :            :     /**
    1700                 :            :      * Sets the units for the horizontal offset between rows in the pattern.
    1701                 :            :      * \param unit offset units
    1702                 :            :      * \see offsetXUnit()
    1703                 :            :      * \see setOffsetYUnit()
    1704                 :            :      * \since QGIS 3.8
    1705                 :            :     */
    1706                 :         30 :     void setOffsetXUnit( QgsUnitTypes::RenderUnit unit ) { mOffsetXUnit = unit; }
    1707                 :            : 
    1708                 :            :     /**
    1709                 :            :      * Returns the units for the horizontal offset for rows in the pattern.
    1710                 :            :      * \see setOffsetXUnit()
    1711                 :            :      * \see offsetYUnit()
    1712                 :            :      * \since QGIS 3.8
    1713                 :            :     */
    1714                 :            :     QgsUnitTypes::RenderUnit offsetXUnit() const { return mOffsetXUnit; }
    1715                 :            : 
    1716                 :            :     /**
    1717                 :            :      * Sets the unit scale for the horizontal offset for rows in the pattern.
    1718                 :            :      * \param scale offset unit scale
    1719                 :            :      * \see offsetXMapUnitScale()
    1720                 :            :      * \see setOffsetYMapUnitScale()
    1721                 :            :      * \since QGIS 3.8
    1722                 :            :     */
    1723                 :         30 :     void setOffsetXMapUnitScale( const QgsMapUnitScale &scale ) { mOffsetXMapUnitScale = scale; }
    1724                 :            : 
    1725                 :            :     /**
    1726                 :            :      * Returns the unit scale for the horizontal offset for rows in the pattern.
    1727                 :            :      * \see setOffsetXMapUnitScale()
    1728                 :            :      * \see offsetYMapUnitScale()
    1729                 :            :      * \since QGIS 3.8
    1730                 :            :     */
    1731                 :            :     const QgsMapUnitScale &offsetXMapUnitScale() const { return mOffsetXMapUnitScale; }
    1732                 :            : 
    1733                 :            :     /**
    1734                 :            :      * Sets the units for the vertical offset for rows in the pattern.
    1735                 :            :      * \param unit offset units
    1736                 :            :      * \see offsetYUnit()
    1737                 :            :      * \see setOffsetXUnit()
    1738                 :            :      * \since QGIS 3.8
    1739                 :            :     */
    1740                 :         30 :     void setOffsetYUnit( QgsUnitTypes::RenderUnit unit ) { mOffsetYUnit = unit; }
    1741                 :            : 
    1742                 :            :     /**
    1743                 :            :      * Returns the units for the vertical offset for rows in the pattern.
    1744                 :            :      * \see setOffsetYUnit()
    1745                 :            :      * \see offsetXUnit()
    1746                 :            :      * \since QGIS 3.8
    1747                 :            :     */
    1748                 :            :     QgsUnitTypes::RenderUnit offsetYUnit() const { return mOffsetYUnit; }
    1749                 :            : 
    1750                 :            :     /**
    1751                 :            :      * Sets the unit scale for the vertical offset for rows in the pattern.
    1752                 :            :      * \param scale offset unit scale
    1753                 :            :      * \see offsetYMapUnitScale()
    1754                 :            :      * \see setOffsetXMapUnitScale()
    1755                 :            :      * \since QGIS 3.8
    1756                 :            :     */
    1757                 :         30 :     void setOffsetYMapUnitScale( const QgsMapUnitScale &scale ) { mOffsetYMapUnitScale = scale; }
    1758                 :            : 
    1759                 :            :     /**
    1760                 :            :      * Returns the unit scale for the vertical offset between rows in the pattern.
    1761                 :            :      * \see setOffsetYMapUnitScale()
    1762                 :            :      * \see offsetXMapUnitScale()
    1763                 :            :      * \since QGIS 3.8
    1764                 :            :     */
    1765                 :            :     const QgsMapUnitScale &offsetYMapUnitScale() const { return mOffsetYMapUnitScale; }
    1766                 :            : 
    1767                 :            :     void setOutputUnit( QgsUnitTypes::RenderUnit unit ) override;
    1768                 :            :     QgsUnitTypes::RenderUnit outputUnit() const override;
    1769                 :            :     bool usesMapUnits() const override;
    1770                 :            : 
    1771                 :            :     void setMapUnitScale( const QgsMapUnitScale &scale ) override;
    1772                 :            :     QgsMapUnitScale mapUnitScale() const override;
    1773                 :            : 
    1774                 :            :     QSet<QString> usedAttributes( const QgsRenderContext &context ) const override;
    1775                 :            :     bool hasDataDefinedProperties() const override;
    1776                 :            :     void setColor( const QColor &c ) override;
    1777                 :            :     QColor color() const override;
    1778                 :            : 
    1779                 :            :   protected:
    1780                 :            :     QgsMarkerSymbol *mMarkerSymbol = nullptr;
    1781                 :            :     double mDistanceX = 15;
    1782                 :            :     QgsUnitTypes::RenderUnit mDistanceXUnit = QgsUnitTypes::RenderMillimeters;
    1783                 :            :     QgsMapUnitScale mDistanceXMapUnitScale;
    1784                 :            :     double mDistanceY = 15;
    1785                 :            :     QgsUnitTypes::RenderUnit mDistanceYUnit = QgsUnitTypes::RenderMillimeters;
    1786                 :            :     QgsMapUnitScale mDistanceYMapUnitScale;
    1787                 :            :     double mDisplacementX = 0;
    1788                 :            :     QgsUnitTypes::RenderUnit mDisplacementXUnit = QgsUnitTypes::RenderMillimeters;
    1789                 :            :     QgsMapUnitScale mDisplacementXMapUnitScale;
    1790                 :            :     double mDisplacementY = 0;
    1791                 :            :     QgsUnitTypes::RenderUnit mDisplacementYUnit = QgsUnitTypes::RenderMillimeters;
    1792                 :            :     QgsMapUnitScale mDisplacementYMapUnitScale;
    1793                 :            :     double mOffsetX = 0;
    1794                 :            :     QgsUnitTypes::RenderUnit mOffsetXUnit = QgsUnitTypes::RenderMillimeters;
    1795                 :            :     QgsMapUnitScale mOffsetXMapUnitScale;
    1796                 :            :     double mOffsetY = 0;
    1797                 :            :     QgsUnitTypes::RenderUnit mOffsetYUnit = QgsUnitTypes::RenderMillimeters;
    1798                 :            :     QgsMapUnitScale mOffsetYMapUnitScale;
    1799                 :            : 
    1800                 :            :     void applyDataDefinedSettings( QgsSymbolRenderContext &context ) override;
    1801                 :            : 
    1802                 :            :   private:
    1803                 :            : #ifdef SIP_RUN
    1804                 :            :     QgsPointPatternFillSymbolLayer( const QgsPointPatternFillSymbolLayer &other );
    1805                 :            : #endif
    1806                 :            : 
    1807                 :            :     void applyPattern( const QgsSymbolRenderContext &context, QBrush &brush, double distanceX, double distanceY,
    1808                 :            :                        double displacementX, double displacementY, double offsetX, double offsetY );
    1809                 :            : 
    1810                 :            :     bool mRenderUsingMarkers = false;
    1811                 :            : };
    1812                 :            : 
    1813                 :            : /**
    1814                 :            :  * \ingroup core
    1815                 :            :  * \class QgsRandomMarkerFillSymbolLayer
    1816                 :            :  *
    1817                 :            :  * \brief A fill symbol layer which places markers at random locations within polygons.
    1818                 :            :  *
    1819                 :            :  * \since QGIS 3.12
    1820                 :            :  */
    1821                 :          0 : class CORE_EXPORT QgsRandomMarkerFillSymbolLayer : public QgsFillSymbolLayer
    1822                 :            : {
    1823                 :            :   public:
    1824                 :            : 
    1825                 :            :     //! Methods to define the number of points randomly filling the polygon
    1826                 :            :     enum CountMethod
    1827                 :            :     {
    1828                 :            :       AbsoluteCount, //!< The point count is used as an absolute count of markers
    1829                 :            :       DensityBasedCount, //!< The point count is part of a marker density count
    1830                 :            :     };
    1831                 :            : 
    1832                 :            :     /**
    1833                 :            :      * Constructor for QgsRandomMarkerFillSymbolLayer, with the specified \a pointCount.
    1834                 :            :      *
    1835                 :            :      * Optionally a specific random number \a seed can be used when generating points. A \a seed of 0 indicates that
    1836                 :            :      * a truly random sequence will be used on every rendering, causing points to appear in different locations with every map refresh.
    1837                 :            :      */
    1838                 :            :     QgsRandomMarkerFillSymbolLayer( int pointCount = 10, CountMethod method = AbsoluteCount, double densityArea = 250.0, unsigned long seed = 0 );
    1839                 :            : 
    1840                 :            :     /**
    1841                 :            :      * Creates a new QgsRandomMarkerFillSymbolLayer using the specified \a properties map containing symbol properties (see properties()).
    1842                 :            :      *
    1843                 :            :      * Caller takes ownership of the returned symbol layer.
    1844                 :            :      */
    1845                 :            :     static QgsSymbolLayer *create( const QVariantMap &properties = QVariantMap() ) SIP_FACTORY;
    1846                 :            : 
    1847                 :            :     QString layerType() const override;
    1848                 :            :     void startRender( QgsSymbolRenderContext &context ) override;
    1849                 :            :     void stopRender( QgsSymbolRenderContext &context ) override;
    1850                 :            :     void renderPolygon( const QPolygonF &points, const QVector<QPolygonF> *rings, QgsSymbolRenderContext &context ) override;
    1851                 :            :     QVariantMap properties() const override;
    1852                 :            :     QgsRandomMarkerFillSymbolLayer *clone() const override SIP_FACTORY;
    1853                 :            :     bool canCauseArtifactsBetweenAdjacentTiles() const override;
    1854                 :            : 
    1855                 :            :     void setColor( const QColor &color ) override;
    1856                 :            :     QColor color() const override;
    1857                 :            : 
    1858                 :            :     QgsSymbol *subSymbol() override;
    1859                 :            :     bool setSubSymbol( QgsSymbol *symbol SIP_TRANSFER ) override;
    1860                 :            : 
    1861                 :            :     void setOutputUnit( QgsUnitTypes::RenderUnit unit ) override;
    1862                 :            :     QgsUnitTypes::RenderUnit outputUnit() const override;
    1863                 :            :     bool usesMapUnits() const override;
    1864                 :            : 
    1865                 :            :     void setMapUnitScale( const QgsMapUnitScale &scale ) override;
    1866                 :            :     QgsMapUnitScale mapUnitScale() const override;
    1867                 :            : 
    1868                 :            :     QSet<QString> usedAttributes( const QgsRenderContext &context ) const override;
    1869                 :            :     bool hasDataDefinedProperties() const override;
    1870                 :            : 
    1871                 :            :     /**
    1872                 :            :      * Returns the count of random points to render in the fill.
    1873                 :            :      *
    1874                 :            :      * \see setPointCount()
    1875                 :            :      */
    1876                 :            :     int pointCount() const;
    1877                 :            : 
    1878                 :            :     /**
    1879                 :            :      * Sets the \a count of random points to render in the fill.
    1880                 :            :      *
    1881                 :            :      * \see pointCount()
    1882                 :            :      */
    1883                 :            :     void setPointCount( int count );
    1884                 :            : 
    1885                 :            :     /**
    1886                 :            :      * Returns the random number seed to use when generating points, or 0 if
    1887                 :            :      * a truly random sequence will be used (causing points to appear in different locations with every map refresh).
    1888                 :            :      * \see setSeed()
    1889                 :            :      */
    1890                 :            :     unsigned long seed() const;
    1891                 :            : 
    1892                 :            :     /**
    1893                 :            :      * Sets the random number \a seed to use when generating points, or 0 if
    1894                 :            :      * a truly random sequence will be used on every rendering (causing points to appear
    1895                 :            :      * in different locations with every map refresh).
    1896                 :            :      *
    1897                 :            :      * \see seed()
    1898                 :            :      */
    1899                 :            :     void setSeed( unsigned long seed );
    1900                 :            : 
    1901                 :            :     /**
    1902                 :            :      * Returns TRUE if point markers should be clipped to the polygon boundary.
    1903                 :            :      *
    1904                 :            :      * \see setClipPoints()
    1905                 :            :      */
    1906                 :            :     bool clipPoints() const;
    1907                 :            : 
    1908                 :            :     /**
    1909                 :            :      * Sets whether point markers should be \a clipped to the polygon boundary.
    1910                 :            :      *
    1911                 :            :      * \see clipPoints()
    1912                 :            :      */
    1913                 :            :     void setClipPoints( bool clipped );
    1914                 :            : 
    1915                 :            :     /**
    1916                 :            :      * Returns the count method used to randomly fill the polygon.
    1917                 :            :      *
    1918                 :            :      * \see setCountMethod()
    1919                 :            :      */
    1920                 :            :     CountMethod countMethod() const;
    1921                 :            : 
    1922                 :            :     /**
    1923                 :            :      * Sets the count \a method used to randomly fill the polygon.
    1924                 :            :      *
    1925                 :            :      * \see countMethod()
    1926                 :            :      */
    1927                 :            :     void setCountMethod( CountMethod method );
    1928                 :            : 
    1929                 :            :     /**
    1930                 :            :      * Returns the density area used to count the number of points to randomly fill the polygon.
    1931                 :            :      *
    1932                 :            :      * Only used when the count method is set to QgsRandomMarkerFillSymbolLayer::DensityBasedCount.
    1933                 :            :      *
    1934                 :            :      * Units are specified by setDensityAreaUnit().
    1935                 :            :      *
    1936                 :            :      * \see setDensityArea()
    1937                 :            :      */
    1938                 :            :     double densityArea() const;
    1939                 :            : 
    1940                 :            :     /**
    1941                 :            :      * Sets the density \a area used to count the number of points to randomly fill the polygon.
    1942                 :            :      *
    1943                 :            :      * \see densityArea()
    1944                 :            :      */
    1945                 :            :     void setDensityArea( double area );
    1946                 :            : 
    1947                 :            :     /**
    1948                 :            :      * Sets the units for the density area.
    1949                 :            :      * \param unit width units
    1950                 :            :      * \see densityAreaUnit()
    1951                 :            :     */
    1952                 :          0 :     void setDensityAreaUnit( QgsUnitTypes::RenderUnit unit ) { mDensityAreaUnit = unit; }
    1953                 :            : 
    1954                 :            :     /**
    1955                 :            :      * Returns the units for the density area.
    1956                 :            :      * \see setDensityAreaUnit()
    1957                 :            :     */
    1958                 :            :     QgsUnitTypes::RenderUnit densityAreaUnit() const { return mDensityAreaUnit; }
    1959                 :            : 
    1960                 :            :     /**
    1961                 :            :      * Sets the map scale for the density area.
    1962                 :            :      * \param scale density area map unit scale
    1963                 :            :      * \see densityAreaUnitScale()
    1964                 :            :      * \see setDensityArea()
    1965                 :            :      * \see setDensityAreaUnit()
    1966                 :            :      */
    1967                 :          0 :     void setDensityAreaUnitScale( const QgsMapUnitScale &scale ) { mDensityAreaUnitScale = scale; }
    1968                 :            : 
    1969                 :            :     /**
    1970                 :            :      * Returns the map scale for the density area.
    1971                 :            :      * \see setDensityAreaUnitScale()
    1972                 :            :      * \see densityArea()
    1973                 :            :      * \see densityAreaUnit()
    1974                 :            :      */
    1975                 :            :     const QgsMapUnitScale &densityAreaUnitScale() const { return mDensityAreaUnitScale; }
    1976                 :            : 
    1977                 :            :     void startFeatureRender( const QgsFeature &feature, QgsRenderContext &context ) override;
    1978                 :            :     void stopFeatureRender( const QgsFeature &feature, QgsRenderContext &context ) override;
    1979                 :            : 
    1980                 :            :   private:
    1981                 :            : #ifdef SIP_RUN
    1982                 :            :     QgsRandomMarkerFillSymbolLayer( const QgsRandomMarkerFillSymbolLayer &other );
    1983                 :            : #endif
    1984                 :            : 
    1985                 :          0 :     struct Part
    1986                 :            :     {
    1987                 :            :       QPolygonF exterior;
    1988                 :            :       QVector<QPolygonF> rings;
    1989                 :            :     };
    1990                 :            : 
    1991                 :            :     QVector< Part > mCurrentParts;
    1992                 :            : 
    1993                 :            :     void render( QgsRenderContext &context, const QVector< Part > &parts, const QgsFeature &feature, bool selected );
    1994                 :            : 
    1995                 :            :     std::unique_ptr< QgsMarkerSymbol > mMarker;
    1996                 :            :     CountMethod mCountMethod = AbsoluteCount;
    1997                 :            :     int mPointCount = 10;
    1998                 :            :     double mDensityArea = 250.0;
    1999                 :            :     QgsUnitTypes::RenderUnit mDensityAreaUnit = QgsUnitTypes::RenderMillimeters;
    2000                 :            :     QgsMapUnitScale mDensityAreaUnitScale;
    2001                 :            :     unsigned long mSeed = 0;
    2002                 :            :     bool mClipPoints = false;
    2003                 :            : 
    2004                 :            :     bool mRenderingFeature = false;
    2005                 :            :     double mFeatureSymbolOpacity = 1;
    2006                 :            : };
    2007                 :            : 
    2008                 :            : 
    2009                 :            : /**
    2010                 :            :  * \ingroup core
    2011                 :            :  * \class QgsCentroidFillSymbolLayer
    2012                 :            :  */
    2013                 :          0 : class CORE_EXPORT QgsCentroidFillSymbolLayer : public QgsFillSymbolLayer
    2014                 :            : {
    2015                 :            :   public:
    2016                 :            :     QgsCentroidFillSymbolLayer();
    2017                 :            : 
    2018                 :            :     // static stuff
    2019                 :            : 
    2020                 :            :     /**
    2021                 :            :      * Creates a new QgsCentroidFillSymbolLayer using the specified \a properties map containing symbol properties (see properties()).
    2022                 :            :      *
    2023                 :            :      * Caller takes ownership of the returned symbol layer.
    2024                 :            :      */
    2025                 :            :     static QgsSymbolLayer *create( const QVariantMap &properties = QVariantMap() ) SIP_FACTORY;
    2026                 :            :     static QgsSymbolLayer *createFromSld( QDomElement &element ) SIP_FACTORY;
    2027                 :            : 
    2028                 :            :     // implemented from base classes
    2029                 :            : 
    2030                 :            :     QString layerType() const override;
    2031                 :            :     void startRender( QgsSymbolRenderContext &context ) override;
    2032                 :            :     void stopRender( QgsSymbolRenderContext &context ) override;
    2033                 :            :     void renderPolygon( const QPolygonF &points, const QVector<QPolygonF> *rings, QgsSymbolRenderContext &context ) override;
    2034                 :            :     QVariantMap properties() const override;
    2035                 :            :     QgsCentroidFillSymbolLayer *clone() const override SIP_FACTORY;
    2036                 :            :     void toSld( QDomDocument &doc, QDomElement &element, const QVariantMap &props ) const override;
    2037                 :            :     void setColor( const QColor &color ) override;
    2038                 :            :     QColor color() const override;
    2039                 :            :     QgsSymbol *subSymbol() override;
    2040                 :            :     bool setSubSymbol( QgsSymbol *symbol SIP_TRANSFER ) override;
    2041                 :            :     void setOutputUnit( QgsUnitTypes::RenderUnit unit ) override;
    2042                 :            :     QgsUnitTypes::RenderUnit outputUnit() const override;
    2043                 :            :     bool usesMapUnits() const override;
    2044                 :            :     void setMapUnitScale( const QgsMapUnitScale &scale ) override;
    2045                 :            :     QgsMapUnitScale mapUnitScale() const override;
    2046                 :            :     QSet<QString> usedAttributes( const QgsRenderContext &context ) const override;
    2047                 :            :     bool hasDataDefinedProperties() const override;
    2048                 :            :     bool canCauseArtifactsBetweenAdjacentTiles() const override;
    2049                 :            : 
    2050                 :          0 :     void setPointOnSurface( bool pointOnSurface ) { mPointOnSurface = pointOnSurface; }
    2051                 :            :     bool pointOnSurface() const { return mPointOnSurface; }
    2052                 :            : 
    2053                 :            :     /**
    2054                 :            :      * Sets whether a point is drawn for all parts or only on the biggest part of multi-part features.
    2055                 :            :      * \see pointOnAllParts()
    2056                 :            :      * \since QGIS 2.16
    2057                 :            :     */
    2058                 :          0 :     void setPointOnAllParts( bool pointOnAllParts ) { mPointOnAllParts = pointOnAllParts; }
    2059                 :            : 
    2060                 :            :     /**
    2061                 :            :      * Returns whether a point is drawn for all parts or only on the biggest part of multi-part features.
    2062                 :            :      * \see setPointOnAllParts()
    2063                 :            :      * \since QGIS 2.16
    2064                 :            :     */
    2065                 :            :     bool pointOnAllParts() const { return mPointOnAllParts; }
    2066                 :            : 
    2067                 :            :     /**
    2068                 :            :      * Returns TRUE if point markers should be clipped to the polygon boundary.
    2069                 :            :      *
    2070                 :            :      * \see setClipPoints()
    2071                 :            :      * \since 3.14
    2072                 :            :      */
    2073                 :            :     bool clipPoints() const { return mClipPoints; }
    2074                 :            : 
    2075                 :            :     /**
    2076                 :            :      * Sets whether point markers should be \a clipped to the polygon boundary.
    2077                 :            :      *
    2078                 :            :      * \see clipPoints()
    2079                 :            :      * \since 3.14
    2080                 :            :      */
    2081                 :          0 :     void setClipPoints( bool clipPoints ) { mClipPoints = clipPoints; }
    2082                 :            : 
    2083                 :            :     /**
    2084                 :            :      * Returns TRUE if point markers should be clipped to the current part boundary only.
    2085                 :            :      *
    2086                 :            :      * \see setClipPoints()
    2087                 :            :      * \since 3.14
    2088                 :            :      */
    2089                 :            :     bool clipOnCurrentPartOnly() const { return mClipOnCurrentPartOnly; }
    2090                 :            : 
    2091                 :            :     /**
    2092                 :            :      * Sets whether point markers should be \a clipped to the current part boundary only.
    2093                 :            :      *
    2094                 :            :      * \see clipOnCurrentPartOnly()
    2095                 :            :      * \since 3.14
    2096                 :            :      */
    2097                 :          0 :     void setClipOnCurrentPartOnly( bool clipOnCurrentPartOnly ) { mClipOnCurrentPartOnly = clipOnCurrentPartOnly; }
    2098                 :            : 
    2099                 :            :     void startFeatureRender( const QgsFeature &feature, QgsRenderContext &context ) override;
    2100                 :            :     void stopFeatureRender( const QgsFeature &feature, QgsRenderContext &context ) override;
    2101                 :            : 
    2102                 :            :   protected:
    2103                 :            : 
    2104                 :            :     std::unique_ptr< QgsMarkerSymbol > mMarker;
    2105                 :            :     bool mPointOnSurface = false;
    2106                 :            :     bool mPointOnAllParts = true;
    2107                 :            :     bool mClipPoints = false;
    2108                 :            :     bool mClipOnCurrentPartOnly = false;
    2109                 :            : 
    2110                 :            :     bool mRenderingFeature = false;
    2111                 :            :     double mFeatureSymbolOpacity = 1;
    2112                 :            : 
    2113                 :            :     QgsFeatureId mCurrentFeatureId = -1;
    2114                 :            :     int mBiggestPartIndex = -1;
    2115                 :            : 
    2116                 :            :   private:
    2117                 :            : #ifdef SIP_RUN
    2118                 :            :     QgsCentroidFillSymbolLayer( const QgsCentroidFillSymbolLayer &other );
    2119                 :            : #endif
    2120                 :          0 :     struct Part
    2121                 :            :     {
    2122                 :            :       QPolygonF exterior;
    2123                 :            :       QVector<QPolygonF> rings;
    2124                 :            :     };
    2125                 :            : 
    2126                 :            :     void render( QgsRenderContext &context, const QVector<Part> &parts, const QgsFeature &feature, bool selected );
    2127                 :            :     QVector<Part> mCurrentParts;
    2128                 :            : };
    2129                 :            : 
    2130                 :            : #endif
    2131                 :            : 
    2132                 :            : 

Generated by: LCOV version 1.14