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

           Branch data     Line data    Source code
       1                 :            : /***************************************************************************
       2                 :            :  qgssymbollayerutils.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                 :            : 
      17                 :            : #ifndef QGSSYMBOLLAYERUTILS_H
      18                 :            : #define QGSSYMBOLLAYERUTILS_H
      19                 :            : 
      20                 :            : #include "qgis_core.h"
      21                 :            : #include "qgis_sip.h"
      22                 :            : #include <QMap>
      23                 :            : #include <QFont>
      24                 :            : #include <QColor>
      25                 :            : #include <QPainter>
      26                 :            : #include "qgssymbol.h"
      27                 :            : #include "qgis.h"
      28                 :            : #include "qgsmapunitscale.h"
      29                 :            : #include "qgscolorramp.h"
      30                 :            : #include "qgsarrowsymbollayer.h"
      31                 :            : 
      32                 :            : #include <QFile>
      33                 :            : 
      34                 :            : class QgsExpression;
      35                 :            : class QgsPathResolver;
      36                 :            : class QgsReadWriteContext;
      37                 :            : class QgsSymbolLayer;
      38                 :            : 
      39                 :            : typedef QMap<QString, QString> QgsStringMap;
      40                 :            : typedef QMap<QString, QgsSymbol * > QgsSymbolMap;
      41                 :            : typedef QList< QPair< QColor, QString > > QgsNamedColorList SIP_SKIP;
      42                 :            : 
      43                 :            : class QDomDocument;
      44                 :            : class QDomElement;
      45                 :            : class QIcon;
      46                 :            : class QPixmap;
      47                 :            : class QPointF;
      48                 :            : class QSize;
      49                 :            : class QMimeData;
      50                 :            : 
      51                 :            : /**
      52                 :            :  * \ingroup core
      53                 :            :  * \class QgsSymbolLayerUtils
      54                 :            :  */
      55                 :            : class CORE_EXPORT QgsSymbolLayerUtils
      56                 :            : {
      57                 :            :   public:
      58                 :            : 
      59                 :            :     //! Editing vertex markers
      60                 :            :     enum VertexMarkerType
      61                 :            :     {
      62                 :            :       SemiTransparentCircle,
      63                 :            :       Cross,
      64                 :            :       NoMarker
      65                 :            :     };
      66                 :            : 
      67                 :            :     static QString encodeColor( const QColor &color );
      68                 :            :     static QColor decodeColor( const QString &str );
      69                 :            : 
      70                 :            :     static QString encodeSldAlpha( int alpha );
      71                 :            :     static int decodeSldAlpha( const QString &str );
      72                 :            : 
      73                 :            :     static QString encodeSldFontStyle( QFont::Style style );
      74                 :            :     static QFont::Style decodeSldFontStyle( const QString &str );
      75                 :            : 
      76                 :            :     static QString encodeSldFontWeight( int weight );
      77                 :            :     static int decodeSldFontWeight( const QString &str );
      78                 :            : 
      79                 :            :     static QString encodePenStyle( Qt::PenStyle style );
      80                 :            :     static Qt::PenStyle decodePenStyle( const QString &str );
      81                 :            : 
      82                 :            :     static QString encodePenJoinStyle( Qt::PenJoinStyle style );
      83                 :            :     static Qt::PenJoinStyle decodePenJoinStyle( const QString &str );
      84                 :            : 
      85                 :            :     static QString encodePenCapStyle( Qt::PenCapStyle style );
      86                 :            :     static Qt::PenCapStyle decodePenCapStyle( const QString &str );
      87                 :            : 
      88                 :            :     static QString encodeSldLineJoinStyle( Qt::PenJoinStyle style );
      89                 :            :     static Qt::PenJoinStyle decodeSldLineJoinStyle( const QString &str );
      90                 :            : 
      91                 :            :     static QString encodeSldLineCapStyle( Qt::PenCapStyle style );
      92                 :            :     static Qt::PenCapStyle decodeSldLineCapStyle( const QString &str );
      93                 :            : 
      94                 :            :     static QString encodeBrushStyle( Qt::BrushStyle style );
      95                 :            :     static Qt::BrushStyle decodeBrushStyle( const QString &str );
      96                 :            : 
      97                 :            :     static QString encodeSldBrushStyle( Qt::BrushStyle style );
      98                 :            :     static Qt::BrushStyle decodeSldBrushStyle( const QString &str );
      99                 :            : 
     100                 :            :     /**
     101                 :            :      * Decodes a \a value representing an arrow head type.
     102                 :            :      * \since QGIS 3.2
     103                 :            :      */
     104                 :            :     static QgsArrowSymbolLayer::HeadType decodeArrowHeadType( const QVariant &value, bool *ok SIP_OUT = nullptr );
     105                 :            : 
     106                 :            :     /**
     107                 :            :      * Decodes a \a value representing an arrow type.
     108                 :            :      * \since QGIS 3.2
     109                 :            :      */
     110                 :            :     static QgsArrowSymbolLayer::ArrowType decodeArrowType( const QVariant &value, bool *ok SIP_OUT = nullptr );
     111                 :            : 
     112                 :            :     /**
     113                 :            :      * Encodes a QPointF to a string.
     114                 :            :      * \see decodePoint()
     115                 :            :      * \see encodeSize()
     116                 :            :      */
     117                 :            :     static QString encodePoint( QPointF point );
     118                 :            : 
     119                 :            :     /**
     120                 :            :      * Decodes a QSizeF from a string.
     121                 :            :      * \see encodePoint()
     122                 :            :      * \see decodeSize()
     123                 :            :      */
     124                 :            :     static QPointF decodePoint( const QString &string );
     125                 :            : 
     126                 :            :     /**
     127                 :            :      * Converts a \a value to a point.
     128                 :            :      *
     129                 :            :      * \param value value to convert
     130                 :            :      * \param ok if specified, will be set to TRUE if value was successfully converted
     131                 :            :      *
     132                 :            :      * \returns converted point
     133                 :            :      *
     134                 :            :      * \see decodePoint()
     135                 :            :      * \see toSize()
     136                 :            :      * \since QGIS 3.10
     137                 :            :      */
     138                 :            :     static QPointF toPoint( const QVariant &value, bool *ok SIP_OUT = nullptr );
     139                 :            : 
     140                 :            :     /**
     141                 :            :      * Encodes a QSizeF to a string.
     142                 :            :      * \see decodeSize()
     143                 :            :      * \see encodePoint()
     144                 :            :      * \since QGIS 3.0
     145                 :            :      */
     146                 :            :     static QString encodeSize( QSizeF size );
     147                 :            : 
     148                 :            :     /**
     149                 :            :      * Decodes a QSizeF from a string.
     150                 :            :      * \see encodeSize()
     151                 :            :      * \see decodePoint()
     152                 :            :      * \since QGIS 3.0
     153                 :            :      */
     154                 :            :     static QSizeF decodeSize( const QString &string );
     155                 :            : 
     156                 :            :     /**
     157                 :            :      * Converts a \a value to a size.
     158                 :            :      *
     159                 :            :      * \param value value to convert
     160                 :            :      * \param ok if specified, will be set to TRUE if value was successfully converted
     161                 :            :      *
     162                 :            :      * \returns converted size
     163                 :            :      *
     164                 :            :      * \see decodeSize()
     165                 :            :      * \see toPoint()
     166                 :            :      * \since QGIS 3.10
     167                 :            :      */
     168                 :            :     static QSizeF toSize( const QVariant &value, bool *ok SIP_OUT = nullptr );
     169                 :            : 
     170                 :            :     static QString encodeMapUnitScale( const QgsMapUnitScale &mapUnitScale );
     171                 :            :     static QgsMapUnitScale decodeMapUnitScale( const QString &str );
     172                 :            : 
     173                 :            :     static QString encodeRealVector( const QVector<qreal> &v );
     174                 :            :     static QVector<qreal> decodeRealVector( const QString &s );
     175                 :            : 
     176                 :            :     static QString encodeSldRealVector( const QVector<qreal> &v );
     177                 :            :     static QVector<qreal> decodeSldRealVector( const QString &s );
     178                 :            : 
     179                 :            :     /**
     180                 :            :      * Encodes a render unit into an SLD unit of measure string.
     181                 :            :      * \param unit unit to encode
     182                 :            :      * \param scaleFactor if specified, will be set to scale factor for unit of measure
     183                 :            :      * \returns encoded string
     184                 :            :      * \see decodeSldUom()
     185                 :            :      */
     186                 :            :     static QString encodeSldUom( QgsUnitTypes::RenderUnit unit, double *scaleFactor );
     187                 :            : 
     188                 :            :     /**
     189                 :            :      * Decodes a SLD unit of measure string to a render unit.
     190                 :            :      * \param str string to decode
     191                 :            :      * \param scaleFactor if specified, will be set to scale factor for unit of measure
     192                 :            :      * \returns matching render unit
     193                 :            :      * \see encodeSldUom()
     194                 :            :      */
     195                 :            :     static QgsUnitTypes::RenderUnit decodeSldUom( const QString &str, double *scaleFactor = nullptr );
     196                 :            : 
     197                 :            :     /**
     198                 :            :      * Returns the size scaled in pixels according to the uom attribute.
     199                 :            :      * \param uom The uom attribute from SLD 1.1 version
     200                 :            :      * \param size The original size
     201                 :            :      * \returns the size in pixels
     202                 :            :      * \since QGIS 3.0
     203                 :            :      */
     204                 :            :     static double sizeInPixelsFromSldUom( const QString &uom, double size );
     205                 :            : 
     206                 :            :     static QString encodeScaleMethod( QgsSymbol::ScaleMethod scaleMethod );
     207                 :            :     static QgsSymbol::ScaleMethod decodeScaleMethod( const QString &str );
     208                 :            : 
     209                 :            :     static QPainter::CompositionMode decodeBlendMode( const QString &s );
     210                 :            : 
     211                 :            :     /**
     212                 :            :      * Returns an icon preview for a color ramp.
     213                 :            :      * \param symbol symbol
     214                 :            :      * \param size target pixmap size
     215                 :            :      * \param padding space between icon edge and symbol
     216                 :            :      * \param shape optional legend patch shape to use for rendering the preview icon
     217                 :            :      * \see symbolPreviewPixmap()
     218                 :            :      */
     219                 :            :     static QIcon symbolPreviewIcon( const QgsSymbol *symbol, QSize size, int padding = 0, QgsLegendPatchShape *shape = nullptr );
     220                 :            : 
     221                 :            :     /**
     222                 :            :      * Returns a pixmap preview for a color ramp.
     223                 :            :      * \param symbol symbol
     224                 :            :      * \param size target pixmap size
     225                 :            :      * \param padding space between icon edge and symbol
     226                 :            :      * \param customContext render context to use when rendering symbol
     227                 :            :      * \param selected set to TRUE to render the symbol in a selected state
     228                 :            :      * \param expressionContext optional custom expression context
     229                 :            :      * \param shape optional legend patch shape to use for rendering the preview icon
     230                 :            :      * \note Parameter customContext added in QGIS 2.6
     231                 :            :      * \note Parameter selected added in QGIS 3.10
     232                 :            :      * \note Parameter expressionContext added in QGIS 3.10
     233                 :            :      * \note Parameter shape added in QGIS 3.14
     234                 :            :      * \see symbolPreviewIcon()
     235                 :            :      */
     236                 :            :     static QPixmap symbolPreviewPixmap( const QgsSymbol *symbol, QSize size, int padding = 0, QgsRenderContext *customContext = nullptr, bool selected = false,
     237                 :            :                                         const QgsExpressionContext *expressionContext = nullptr,
     238                 :            :                                         const QgsLegendPatchShape *shape = nullptr );
     239                 :            : 
     240                 :            :     /**
     241                 :            :      * Draws a symbol layer preview to a QPicture
     242                 :            :      * \param layer symbol layer to draw
     243                 :            :      * \param units size units
     244                 :            :      * \param size target size of preview picture
     245                 :            :      * \param scale map unit scale for preview
     246                 :            :      * \returns QPicture containing symbol layer preview
     247                 :            :      * \see symbolLayerPreviewIcon()
     248                 :            :      * \since QGIS 2.9
     249                 :            :      */
     250                 :            :     static QPicture symbolLayerPreviewPicture( const QgsSymbolLayer *layer, QgsUnitTypes::RenderUnit units, QSize size, const QgsMapUnitScale &scale = QgsMapUnitScale() );
     251                 :            : 
     252                 :            :     /**
     253                 :            :      * Draws a symbol layer preview to an icon.
     254                 :            :      * \param layer symbol layer to draw
     255                 :            :      * \param u size units
     256                 :            :      * \param size target size of preview icon
     257                 :            :      * \param scale map unit scale for preview
     258                 :            :      * \returns icon containing symbol layer preview
     259                 :            :      * \see symbolLayerPreviewPicture()
     260                 :            :      */
     261                 :            :     static QIcon symbolLayerPreviewIcon( const QgsSymbolLayer *layer, QgsUnitTypes::RenderUnit u, QSize size, const QgsMapUnitScale &scale = QgsMapUnitScale() );
     262                 :            : 
     263                 :            :     /**
     264                 :            :      * Returns an icon preview for a color ramp.
     265                 :            :      * \param ramp color ramp
     266                 :            :      * \param size target icon size
     267                 :            :      * \param padding space between icon edge and color ramp
     268                 :            :      * \see colorRampPreviewPixmap()
     269                 :            :      */
     270                 :            :     static QIcon colorRampPreviewIcon( QgsColorRamp *ramp, QSize size, int padding = 0 );
     271                 :            : 
     272                 :            :     /**
     273                 :            :      * Returns a pixmap preview for a color ramp.
     274                 :            :      * \param ramp color ramp
     275                 :            :      * \param size target pixmap size
     276                 :            :      * \param padding space between icon edge and color ramp
     277                 :            :      * \param direction direction to render pixmap (since QGIS 3.18)
     278                 :            :      * \param flipDirection set to TRUE to flip the direction of the ramp. For horizontal \a directions, ramps will be
     279                 :            :      * rendered left to right by default. For vertical \a directions, ramps will be rendered top to bottom by default. Setting
     280                 :            :      * this flag to TRUE will reverse these default directions.
     281                 :            :      * \param drawTransparentBackground set to FALSE to disable the checkerboard effect drawn below transparent colors in the ramp
     282                 :            :      * \see colorRampPreviewIcon()
     283                 :            :      */
     284                 :            :     static QPixmap colorRampPreviewPixmap( QgsColorRamp *ramp, QSize size, int padding = 0, Qt::Orientation direction = Qt::Horizontal,
     285                 :            :                                            bool flipDirection = false, bool drawTransparentBackground = true );
     286                 :            : 
     287                 :            :     static void drawStippledBackground( QPainter *painter, QRect rect );
     288                 :            : 
     289                 :            :     /**
     290                 :            :      * Draws a vertex symbol at (painter) coordinates x, y. (Useful to assist vertex editing.)
     291                 :            :      * \since QGIS 3.4.5
     292                 :            :      */
     293                 :            :     static void drawVertexMarker( double x, double y, QPainter &p, QgsSymbolLayerUtils::VertexMarkerType type, int markerSize );
     294                 :            : 
     295                 :            :     //! Returns the maximum estimated bleed for the symbol
     296                 :            :     static double estimateMaxSymbolBleed( QgsSymbol *symbol, const QgsRenderContext &context );
     297                 :            : 
     298                 :            :     /**
     299                 :            :      * Attempts to load a symbol from a DOM element
     300                 :            :      * \param element DOM element representing symbol
     301                 :            :      * \param context object to transform relative to absolute paths
     302                 :            :      * \returns decoded symbol, if possible
     303                 :            :      */
     304                 :            :     static QgsSymbol *loadSymbol( const QDomElement &element, const QgsReadWriteContext &context ) SIP_FACTORY;
     305                 :            : 
     306                 :            :     /**
     307                 :            :      * Attempts to load a symbol from a DOM element and cast it to a particular symbol
     308                 :            :      * type.
     309                 :            :      * \param element DOM element representing symbol
     310                 :            :      * \param context object to transform relative to absolute paths
     311                 :            :      * \returns decoded symbol cast to specified type, if possible
     312                 :            :      * \note not available in Python bindings
     313                 :            :      */
     314                 :          0 :     template <class SymbolType> static SymbolType *loadSymbol( const QDomElement &element, const QgsReadWriteContext &context ) SIP_SKIP
     315                 :            :     {
     316                 :          0 :       QgsSymbol *tmpSymbol = QgsSymbolLayerUtils::loadSymbol( element, context );
     317                 :          0 :       SymbolType *symbolCastToType = dynamic_cast<SymbolType *>( tmpSymbol );
     318                 :            : 
     319                 :          0 :       if ( symbolCastToType )
     320                 :            :       {
     321                 :          0 :         return symbolCastToType;
     322                 :            :       }
     323                 :            :       else
     324                 :            :       {
     325                 :            :         //could not cast
     326                 :          0 :         delete tmpSymbol;
     327                 :          0 :         return nullptr;
     328                 :            :       }
     329                 :          0 :     }
     330                 :            : 
     331                 :            :     //! Reads and returns symbol layer from XML. Caller is responsible for deleting the returned object
     332                 :            :     static QgsSymbolLayer *loadSymbolLayer( QDomElement &element, const QgsReadWriteContext &context ) SIP_FACTORY;
     333                 :            :     //! Writes a symbol definition to XML
     334                 :            :     static QDomElement saveSymbol( const QString &symbolName, const QgsSymbol *symbol, QDomDocument &doc, const QgsReadWriteContext &context );
     335                 :            : 
     336                 :            :     /**
     337                 :            :      * Returns a string representing the symbol. Can be used to test for equality
     338                 :            :      * between symbols.
     339                 :            :      * \since QGIS 2.12
     340                 :            :      */
     341                 :            :     static QString symbolProperties( QgsSymbol *symbol );
     342                 :            : 
     343                 :            :     static bool createSymbolLayerListFromSld( QDomElement &element, QgsWkbTypes::GeometryType geomType, QgsSymbolLayerList &layers );
     344                 :            : 
     345                 :            :     static QgsSymbolLayer *createFillLayerFromSld( QDomElement &element ) SIP_FACTORY;
     346                 :            :     static QgsSymbolLayer *createLineLayerFromSld( QDomElement &element ) SIP_FACTORY;
     347                 :            :     static QgsSymbolLayer *createMarkerLayerFromSld( QDomElement &element ) SIP_FACTORY;
     348                 :            : 
     349                 :            :     static bool convertPolygonSymbolizerToPointMarker( QDomElement &element, QgsSymbolLayerList &layerList );
     350                 :            :     static bool hasExternalGraphic( QDomElement &element );
     351                 :            :     static bool hasWellKnownMark( QDomElement &element );
     352                 :            : 
     353                 :            :     static bool needFontMarker( QDomElement &element );
     354                 :            :     static bool needSvgMarker( QDomElement &element );
     355                 :            :     static bool needEllipseMarker( QDomElement &element );
     356                 :            :     static bool needMarkerLine( QDomElement &element );
     357                 :            :     static bool needLinePatternFill( QDomElement &element );
     358                 :            :     static bool needPointPatternFill( QDomElement &element );
     359                 :            :     static bool needSvgFill( QDomElement &element );
     360                 :            : 
     361                 :            :     static void fillToSld( QDomDocument &doc, QDomElement &element,
     362                 :            :                            Qt::BrushStyle brushStyle, const QColor &color = QColor() );
     363                 :            :     static bool fillFromSld( QDomElement &element,
     364                 :            :                              Qt::BrushStyle &brushStyle, QColor &color );
     365                 :            : 
     366                 :            :     //! \note not available in Python bindings
     367                 :            :     static void lineToSld( QDomDocument &doc, QDomElement &element,
     368                 :            :                            Qt::PenStyle penStyle, const QColor &color, double width = -1,
     369                 :            :                            const Qt::PenJoinStyle *penJoinStyle = nullptr, const Qt::PenCapStyle *penCapStyle = nullptr,
     370                 :            :                            const QVector<qreal> *customDashPattern = nullptr, double dashOffset = 0.0 ) SIP_SKIP;
     371                 :            :     static bool lineFromSld( QDomElement &element,
     372                 :            :                              Qt::PenStyle &penStyle, QColor &color, double &width,
     373                 :            :                              Qt::PenJoinStyle *penJoinStyle = nullptr, Qt::PenCapStyle *penCapStyle = nullptr,
     374                 :            :                              QVector<qreal> *customDashPattern = nullptr, double *dashOffset = nullptr );
     375                 :            : 
     376                 :            :     static void externalGraphicToSld( QDomDocument &doc, QDomElement &element,
     377                 :            :                                       const QString &path, const QString &mime,
     378                 :            :                                       const QColor &color, double size = -1 );
     379                 :            :     static bool externalGraphicFromSld( QDomElement &element,
     380                 :            :                                         QString &path, QString &mime,
     381                 :            :                                         QColor &color, double &size );
     382                 :            : 
     383                 :            :     static void wellKnownMarkerToSld( QDomDocument &doc, QDomElement &element,
     384                 :            :                                       const QString &name, const QColor &color, const QColor &strokeColor, Qt::PenStyle strokeStyle,
     385                 :            :                                       double strokeWidth = -1, double size = -1 );
     386                 :            : 
     387                 :            :     //! \note available in Python as wellKnownMarkerFromSld2
     388                 :            :     static bool wellKnownMarkerFromSld( QDomElement &element,
     389                 :            :                                         QString &name, QColor &color, QColor &strokeColor, Qt::PenStyle &strokeStyle,
     390                 :            :                                         double &strokeWidth, double &size ) SIP_PYNAME( wellKnownMarkerFromSld2 );
     391                 :            : 
     392                 :            :     static void externalMarkerToSld( QDomDocument &doc, QDomElement &element,
     393                 :            :                                      const QString &path, const QString &format, int *markIndex = nullptr,
     394                 :            :                                      const QColor &color = QColor(), double size = -1 );
     395                 :            :     static bool externalMarkerFromSld( QDomElement &element,
     396                 :            :                                        QString &path, QString &format, int &markIndex,
     397                 :            :                                        QColor &color, double &size );
     398                 :            : 
     399                 :            : 
     400                 :            :     static void labelTextToSld( QDomDocument &doc, QDomElement &element, const QString &label,
     401                 :            :                                 const QFont &font, const QColor &color = QColor(), double size = -1 );
     402                 :            : 
     403                 :            :     //! Create ogr feature style string for pen
     404                 :            :     static QString ogrFeatureStylePen( double width, double mmScaleFactor, double mapUnitsScaleFactor, const QColor &c,
     405                 :            :                                        Qt::PenJoinStyle joinStyle = Qt::MiterJoin,
     406                 :            :                                        Qt::PenCapStyle capStyle = Qt::FlatCap,
     407                 :            :                                        double offset = 0.0,
     408                 :            :                                        const QVector<qreal> *dashPattern = nullptr );
     409                 :            : 
     410                 :            :     /**
     411                 :            :      * Create ogr feature style string for brush
     412                 :            :      * \param fillColr fill color
     413                 :            :     */
     414                 :            :     static QString ogrFeatureStyleBrush( const QColor &fillColr );
     415                 :            : 
     416                 :            :     static void createRotationElement( QDomDocument &doc, QDomElement &element, const QString &rotationFunc );
     417                 :            :     static bool rotationFromSldElement( QDomElement &element, QString &rotationFunc );
     418                 :            : 
     419                 :            :     static void createOpacityElement( QDomDocument &doc, QDomElement &element, const QString &alphaFunc );
     420                 :            :     static bool opacityFromSldElement( QDomElement &element, QString &alphaFunc );
     421                 :            : 
     422                 :            :     static void createDisplacementElement( QDomDocument &doc, QDomElement &element, QPointF offset );
     423                 :            :     static bool displacementFromSldElement( QDomElement &element, QPointF &offset );
     424                 :            : 
     425                 :            :     /**
     426                 :            :      * \brief Creates a SE 1.1 anchor point element as a child of the specified element
     427                 :            :      * \param doc The document
     428                 :            :      * \param element The parent element
     429                 :            :      * \param anchor An anchor specification, with values between 0 and 1
     430                 :            :      */
     431                 :            :     static void createAnchorPointElement( QDomDocument &doc, QDomElement &element, QPointF anchor );
     432                 :            : 
     433                 :            :     static void createOnlineResourceElement( QDomDocument &doc, QDomElement &element, const QString &path, const QString &format );
     434                 :            :     static bool onlineResourceFromSldElement( QDomElement &element, QString &path, QString &format );
     435                 :            : 
     436                 :            :     static void createGeometryElement( QDomDocument &doc, QDomElement &element, const QString &geomFunc );
     437                 :            :     static bool geometryFromSldElement( QDomElement &element, QString &geomFunc );
     438                 :            : 
     439                 :            :     /**
     440                 :            :      * Creates a OGC Expression element based on the provided function expression
     441                 :            :      * \param doc The document owning the element
     442                 :            :      * \param element The element parent
     443                 :            :      * \param function The expression to be encoded
     444                 :            :      */
     445                 :            :     static bool createExpressionElement( QDomDocument &doc, QDomElement &element, const QString &function );
     446                 :            :     static bool createFunctionElement( QDomDocument &doc, QDomElement &element, const QString &function );
     447                 :            :     static bool functionFromSldElement( QDomElement &element, QString &function );
     448                 :            : 
     449                 :            :     static QDomElement createSvgParameterElement( QDomDocument &doc, const QString &name, const QString &value );
     450                 :            :     static QgsStringMap getSvgParameterList( QDomElement &element );
     451                 :            : 
     452                 :            :     static QDomElement createVendorOptionElement( QDomDocument &doc, const QString &name, const QString &value );
     453                 :            :     static QgsStringMap getVendorOptionList( QDomElement &element );
     454                 :            : 
     455                 :            :     //! Parses the properties from XML and returns a map
     456                 :            :     static QVariantMap parseProperties( const QDomElement &element );
     457                 :            :     //! Saves the map of properties to XML
     458                 :            :     static void saveProperties( QVariantMap props, QDomDocument &doc, QDomElement &element );
     459                 :            : 
     460                 :            :     //! Reads a collection of symbols from XML and returns them in a map. Caller is responsible for deleting returned symbols.
     461                 :            :     static QgsSymbolMap loadSymbols( QDomElement &element, const QgsReadWriteContext &context ) SIP_FACTORY;
     462                 :            :     //! Writes a collection of symbols to XML with specified tagName for the top-level element
     463                 :            :     static QDomElement saveSymbols( QgsSymbolMap &symbols, const QString &tagName, QDomDocument &doc, const QgsReadWriteContext &context );
     464                 :            : 
     465                 :            :     static void clearSymbolMap( QgsSymbolMap &symbols );
     466                 :            : 
     467                 :            :     /**
     468                 :            :      * Creates new mime data from a \a symbol.
     469                 :            :      * This also sets the mime color data to match the symbol's color, so that copied symbols
     470                 :            :      * can be paste in places where a color is expected.
     471                 :            :      * \see symbolFromMimeData()
     472                 :            :      * \since QGIS 3.0
     473                 :            :      */
     474                 :            :     static QMimeData *symbolToMimeData( const QgsSymbol *symbol ) SIP_FACTORY;
     475                 :            : 
     476                 :            :     /**
     477                 :            :      * Attempts to parse \a mime data as a symbol. A new symbol instance will be returned
     478                 :            :      * if the data was successfully converted to a symbol.
     479                 :            :      * \see symbolToMimeData()
     480                 :            :      * \since QGIS 3.0
     481                 :            :      */
     482                 :            :     static QgsSymbol *symbolFromMimeData( const QMimeData *data ) SIP_FACTORY;
     483                 :            : 
     484                 :            :     /**
     485                 :            :      * Creates a color ramp from the settings encoded in an XML element
     486                 :            :      * \param element DOM element
     487                 :            :      * \returns new color ramp. Caller takes responsibility for deleting the returned value.
     488                 :            :      * \see saveColorRamp()
     489                 :            :      */
     490                 :            :     static QgsColorRamp *loadColorRamp( QDomElement &element ) SIP_FACTORY;
     491                 :            : 
     492                 :            :     /**
     493                 :            :      * Encodes a color ramp's settings to an XML element
     494                 :            :      * \param name name of ramp
     495                 :            :      * \param ramp color ramp to save
     496                 :            :      * \param doc XML document
     497                 :            :      * \returns DOM element representing state of color ramp
     498                 :            :      * \see loadColorRamp()
     499                 :            :      */
     500                 :            :     static QDomElement saveColorRamp( const QString &name, QgsColorRamp *ramp, QDomDocument &doc );
     501                 :            : 
     502                 :            :     /**
     503                 :            :      * Saves a color ramp to a QVariantMap, wrapped in a QVariant.
     504                 :            :      * You can use QgsXmlUtils::writeVariant to save it to an XML document.
     505                 :            :      *
     506                 :            :      * \see loadColorRamp( const QVariant &value )
     507                 :            :      */
     508                 :            :     static QVariant colorRampToVariant( const QString &name, QgsColorRamp *ramp );
     509                 :            : 
     510                 :            :     /**
     511                 :            :      * Load a color ramp from a QVariantMap, wrapped in a QVariant.
     512                 :            :      * You can use QgsXmlUtils::readVariant to load it from an XML document.
     513                 :            :      *
     514                 :            :      * \see colorRampToVariant()
     515                 :            :      */
     516                 :            :     static QgsColorRamp *loadColorRamp( const QVariant &value ) SIP_FACTORY;
     517                 :            : 
     518                 :            :     /**
     519                 :            :      * Returns a friendly display name for a color
     520                 :            :      * \param color source color
     521                 :            :      * \returns display name for color
     522                 :            :      * \since QGIS 2.5
     523                 :            :      */
     524                 :            :     static QString colorToName( const QColor &color );
     525                 :            : 
     526                 :            :     /**
     527                 :            :      * Attempts to parse a string as a list of colors using a variety of common formats, including hex
     528                 :            :      * codes, rgb and rgba strings.
     529                 :            :      * \param colorStr string representing the color list
     530                 :            :      * \returns list of parsed colors
     531                 :            :      * \since QGIS 2.5
     532                 :            :      */
     533                 :            :     static QList< QColor > parseColorList( const QString &colorStr );
     534                 :            : 
     535                 :            :     /**
     536                 :            :      * Creates mime data from a color. Sets both the mime data's color data, and the
     537                 :            :      * mime data's text with the color's hex code.
     538                 :            :      * \param color color to encode as mime data
     539                 :            :      * \see colorFromMimeData
     540                 :            :      * \since QGIS 2.5
     541                 :            :      */
     542                 :            :     static QMimeData *colorToMimeData( const QColor &color ) SIP_FACTORY;
     543                 :            : 
     544                 :            :     /**
     545                 :            :      * Attempts to parse mime data as a color
     546                 :            :      * \param data mime data to parse
     547                 :            :      * \param hasAlpha will be set to TRUE if mime data was interpreted as a color containing
     548                 :            :      * an explicit alpha value
     549                 :            :      * \returns valid color if mimedata could be interpreted as a color, otherwise an invalid color
     550                 :            :      * \since QGIS 2.5
     551                 :            :      */
     552                 :            :     static QColor colorFromMimeData( const QMimeData *data, bool &hasAlpha SIP_OUT );
     553                 :            : 
     554                 :            :     /**
     555                 :            :      * Attempts to parse mime data as a list of named colors
     556                 :            :      * \param data mime data to parse
     557                 :            :      * \returns list of parsed colors
     558                 :            :      * \since QGIS 2.5
     559                 :            :      */
     560                 :            :     static QgsNamedColorList colorListFromMimeData( const QMimeData *data );
     561                 :            : 
     562                 :            :     /**
     563                 :            :      * Creates mime data from a list of named colors
     564                 :            :      * \param colorList list of named colors
     565                 :            :      * \param allFormats set to TRUE to include additional mime formats, include text/plain and application/x-color
     566                 :            :      * \returns mime data containing encoded colors
     567                 :            :      * \since QGIS 2.5
     568                 :            :      */
     569                 :            :     static QMimeData *colorListToMimeData( const QgsNamedColorList &colorList, bool allFormats = true ) SIP_FACTORY;
     570                 :            : 
     571                 :            :     /**
     572                 :            :      * Exports colors to a gpl GIMP palette file
     573                 :            :      * \param file destination file
     574                 :            :      * \param paletteName name of palette, which is stored in gpl file
     575                 :            :      * \param colors colors to export
     576                 :            :      * \returns TRUE if export was successful
     577                 :            :      * \see importColorsFromGpl
     578                 :            :      */
     579                 :            :     static bool saveColorsToGpl( QFile &file, const QString &paletteName, const QgsNamedColorList &colors );
     580                 :            : 
     581                 :            :     /**
     582                 :            :      * Imports colors from a gpl GIMP palette file
     583                 :            :      * \param file source gpl file
     584                 :            :      * \param ok will be TRUE if file was successfully read
     585                 :            :      * \param name will be set to palette name from gpl file, if present
     586                 :            :      * \returns list of imported colors
     587                 :            :      * \see saveColorsToGpl
     588                 :            :      */
     589                 :            :     static QgsNamedColorList importColorsFromGpl( QFile &file, bool &ok, QString &name );
     590                 :            : 
     591                 :            :     /**
     592                 :            :      * Attempts to parse a string as a color using a variety of common formats, including hex
     593                 :            :      * codes, rgb and rgba strings.
     594                 :            :      * \param colorStr string representing the color
     595                 :            :      * \param strictEval set to TRUE for stricter color parsing rules
     596                 :            :      * \returns parsed color
     597                 :            :      * \since QGIS 2.3
     598                 :            :      */
     599                 :            :     static QColor parseColor( const QString &colorStr, bool strictEval = false );
     600                 :            : 
     601                 :            :     /**
     602                 :            :      * Attempts to parse a string as a color using a variety of common formats, including hex
     603                 :            :      * codes, rgb and rgba, hsl and hsla strings.
     604                 :            :      * \param colorStr string representing the color
     605                 :            :      * \param containsAlpha if colorStr contains an explicit alpha value then containsAlpha will be set to TRUE
     606                 :            :      * \param strictEval set to TRUE for stricter color parsing rules
     607                 :            :      * \returns parsed color
     608                 :            :      * \since QGIS 2.3
     609                 :            :      */
     610                 :            :     static QColor parseColorWithAlpha( const QString &colorStr, bool &containsAlpha, bool strictEval = false );
     611                 :            : 
     612                 :            :     /**
     613                 :            :      * Multiplies opacity of image pixel values with a (global) transparency value.
     614                 :            :      */
     615                 :            :     static void multiplyImageOpacity( QImage *image, qreal opacity );
     616                 :            : 
     617                 :            :     //! Blurs an image in place, e.g. creating Qt-independent drop shadows
     618                 :            :     static void blurImageInPlace( QImage &image, QRect rect, int radius, bool alphaOnly );
     619                 :            : 
     620                 :            :     /**
     621                 :            :      * Converts a QColor into a premultiplied ARGB QColor value using a specified alpha value
     622                 :            :      * \since QGIS 2.3
     623                 :            :      */
     624                 :            :     static void premultiplyColor( QColor &rgb, int alpha );
     625                 :            : 
     626                 :            :     //! Sorts the passed list in requested order
     627                 :            :     static void sortVariantList( QList<QVariant> &list, Qt::SortOrder order );
     628                 :            :     //! Returns a point on the line from startPoint to directionPoint that is a certain distance away from the starting point
     629                 :            :     static QPointF pointOnLineWithDistance( QPointF startPoint, QPointF directionPoint, double distance );
     630                 :            : 
     631                 :            :     //! Returns a list of all available svg files
     632                 :            :     static QStringList listSvgFiles();
     633                 :            : 
     634                 :            :     //! Returns a list of svg files at the specified directory
     635                 :            :     static QStringList listSvgFilesAt( const QString &directory );
     636                 :            : 
     637                 :            :     /**
     638                 :            :      * Determines an SVG symbol's path from its \a name.
     639                 :            :      * If \a name is not an absolute path the file is scanned for in the SVG paths specified
     640                 :            :      * in settings svg/searchPathsForSVG.
     641                 :            :      * \see svgSymbolPathToName()
     642                 :            :      */
     643                 :            :     static QString svgSymbolNameToPath( const QString &name, const QgsPathResolver &pathResolver );
     644                 :            : 
     645                 :            :     /**
     646                 :            :      * Determines an SVG symbol's name from its \a path.
     647                 :            :      * \see svgSymbolNameToPath()
     648                 :            :      */
     649                 :            :     static QString svgSymbolPathToName( const QString &path, const QgsPathResolver &pathResolver );
     650                 :            : 
     651                 :            :     //! Calculate the centroid point of a QPolygonF
     652                 :            :     static QPointF polygonCentroid( const QPolygonF &points );
     653                 :            : 
     654                 :            :     //! Calculate a point on the surface of a QPolygonF
     655                 :            :     static QPointF polygonPointOnSurface( const QPolygonF &points, const QVector<QPolygonF> *rings = nullptr );
     656                 :            : 
     657                 :            :     //! Calculate whether a point is within of a QPolygonF
     658                 :            :     static bool pointInPolygon( const QPolygonF &points, QPointF point );
     659                 :            : 
     660                 :            :     /**
     661                 :            :      * Returns the total length of a \a polyline.
     662                 :            :      *
     663                 :            :      * \since QGIS 3.20
     664                 :            :      */
     665                 :            :     static double polylineLength( const QPolygonF &polyline );
     666                 :            : 
     667                 :            :     /**
     668                 :            :      * Returns the substring of a \a polyline which starts at \a startOffset from the beginning of the line
     669                 :            :      * and ends at \a endOffset from the start of the line.
     670                 :            :      *
     671                 :            :      * If \a startOffset is less than 0, then the start point will be calculated by subtracting that distance
     672                 :            :      * from the end of the line. Similarly, if \a endOffset is less than zero then the end point will be subtracted
     673                 :            :      * from the end of the line.
     674                 :            :      *
     675                 :            :      * May return an empty linestring if the substring is zero length.
     676                 :            :      *
     677                 :            :      * \since QGIS 3.16
     678                 :            :      */
     679                 :            :     static QPolygonF polylineSubstring( const QPolygonF &polyline, double startOffset, double endOffset );
     680                 :            : 
     681                 :            :     /**
     682                 :            :      * Returns TRUE if the angle formed by the line \a p1 - \a p2 - \a p3 forms a "sharp" corner.
     683                 :            :      *
     684                 :            :      * Sharp corners form an angle which exceeds a 45 degree threshold.
     685                 :            :      *
     686                 :            :      * \since QGIS 3.16
     687                 :            :      */
     688                 :            :     static bool isSharpCorner( QPointF p1, QPointF p2, QPointF p3 );
     689                 :            : 
     690                 :            :     /**
     691                 :            :      * Appends a polyline \a line to an existing \a target polyline.
     692                 :            :      *
     693                 :            :      * Any duplicate points at the start \a line which match the end point from \a target will be skipped.
     694                 :            :      *
     695                 :            :      * \since QGIS 3.16
     696                 :            :      */
     697                 :            :     static void appendPolyline( QPolygonF &target, const QPolygonF &line );
     698                 :            : 
     699                 :            :     /**
     700                 :            :      * Returns a new valid expression instance for given field or expression string.
     701                 :            :      * If the input is not a valid expression, it is assumed that it is a field name and gets properly quoted.
     702                 :            :      * If the string is empty, returns NULLPTR.
     703                 :            :      * This is useful when accepting input which could be either a non-quoted field name or expression.
     704                 :            :      * \since QGIS 2.2
     705                 :            :      */
     706                 :            :     static QgsExpression *fieldOrExpressionToExpression( const QString &fieldOrExpression ) SIP_FACTORY;
     707                 :            : 
     708                 :            :     /**
     709                 :            :      * Returns a field name if the whole expression is just a name of the field .
     710                 :            :      *  Returns full expression string if the expression is more complex than just one field.
     711                 :            :      *  Using just expression->expression() method may return quoted field name, but that is not
     712                 :            :      *  wanted for saving (due to backward compatibility) or display in GUI.
     713                 :            :      * \since QGIS 2.2
     714                 :            :      */
     715                 :            :     static QString fieldOrExpressionFromExpression( QgsExpression *expression );
     716                 :            : 
     717                 :            :     /**
     718                 :            :      * Computes a sequence of about 'classes' equally spaced round values
     719                 :            :      *  which cover the range of values from 'minimum' to 'maximum'.
     720                 :            :      *  The values are chosen so that they are 1, 2 or 5 times a power of 10.
     721                 :            :      * \since QGIS 2.10
     722                 :            :      */
     723                 :            :     static QList<double> prettyBreaks( double minimum, double maximum, int classes );
     724                 :            : 
     725                 :            :     /**
     726                 :            :      * Rescales the given size based on the uomScale found in the props, if any is found, otherwise
     727                 :            :      *  returns the value un-modified
     728                 :            :      * \since QGIS 3.0
     729                 :            :      */
     730                 :            :     static double rescaleUom( double size, QgsUnitTypes::RenderUnit unit, const QVariantMap &props );
     731                 :            : 
     732                 :            :     /**
     733                 :            :      * Rescales the given point based on the uomScale found in the props, if any is found, otherwise
     734                 :            :      *  returns a copy of the original point
     735                 :            :      * \since QGIS 3.0
     736                 :            :      */
     737                 :            :     static QPointF rescaleUom( QPointF point, QgsUnitTypes::RenderUnit unit, const QVariantMap &props ) SIP_PYNAME( rescalePointUom );
     738                 :            : 
     739                 :            :     /**
     740                 :            :      * Rescales the given array based on the uomScale found in the props, if any is found, otherwise
     741                 :            :      *  returns a copy of the original point
     742                 :            :      * \since QGIS 3.0
     743                 :            :      */
     744                 :            :     static QVector<qreal> rescaleUom( const QVector<qreal> &array, QgsUnitTypes::RenderUnit unit, const QVariantMap &props ) SIP_PYNAME( rescaleArrayUom );
     745                 :            : 
     746                 :            :     /**
     747                 :            :      * Checks if the properties contain scaleMinDenom and scaleMaxDenom, if available, they are added into the SE Rule element
     748                 :            :      * \since QGIS 3.0
     749                 :            :      */
     750                 :            :     static void applyScaleDependency( QDomDocument &doc, QDomElement &ruleElem, QVariantMap &props );
     751                 :            : 
     752                 :            :     /**
     753                 :            :       * Merges the local scale limits, if any, with the ones already in the map, if any
     754                 :            :       * \since QGIS 3.0
     755                 :            :       */
     756                 :            :     static void mergeScaleDependencies( double mScaleMinDenom, double mScaleMaxDenom, QVariantMap &props );
     757                 :            : 
     758                 :            :     /**
     759                 :            :      * Encodes a reference to a parametric SVG into SLD, as a succession of parametric SVG using URL parameters,
     760                 :            :      * a fallback SVG without parameters, and a final fallback as a mark with the right colors and stroke for systems
     761                 :            :      * that cannot do SVG at all
     762                 :            :      * \since QGIS 3.0
     763                 :            :      */
     764                 :            :     static void parametricSvgToSld( QDomDocument &doc, QDomElement &graphicElem,
     765                 :            :                                     const QString &path,
     766                 :            :                                     const QColor &fillColor, double size, const QColor &strokeColor, double strokeWidth );
     767                 :            : 
     768                 :            :     /**
     769                 :            :      * Encodes a reference to a parametric SVG into a path with parameters according to the SVG Parameters spec
     770                 :            :      * \since QGIS 3.0
     771                 :            :      */
     772                 :            :     static QString getSvgParametricPath( const QString &basePath, const QColor &fillColor, const QColor &strokeColor, double strokeWidth );
     773                 :            : 
     774                 :            :     /**
     775                 :            :      * Converts a set of symbol layer id to a set of pointers to actual symbol layers carried by the feature renderer.
     776                 :            :      * \since QGIS 3.12
     777                 :            :      */
     778                 :            :     static QSet<const QgsSymbolLayer *> toSymbolLayerPointers( QgsFeatureRenderer *renderer, const QSet<QgsSymbolLayerId> &symbolLayerIds );
     779                 :            : 
     780                 :            :     /**
     781                 :            :      * \brief Creates a new symbol with size restricted to min/max size if original size is out of min/max range
     782                 :            :      * \param s the original symbol
     783                 :            :      * \param minSize the minimum size in mm
     784                 :            :      * \param maxSize the maximum size in mm
     785                 :            :      * \param context the render context
     786                 :            :      * \param width expected width, can be changed by the function
     787                 :            :      * \param height expected height, can be changed by this function
     788                 :            :      * \return 0 if size is within minSize/maxSize range. New symbol if size was out of min/max range. Caller takes ownership
     789                 :            :      */
     790                 :            :     static QgsSymbol *restrictedSizeSymbol( const QgsSymbol *s, double minSize, double maxSize, QgsRenderContext *context, double &width, double &height );
     791                 :            : 
     792                 :            :     /**
     793                 :            :      * Evaluates a map of properties using the given \a context and returns a variant map with evaluated expressions from the properties.
     794                 :            :      * \since QGIS 3.18
     795                 :            :      */
     796                 :            :     static QgsStringMap evaluatePropertiesMap( const QMap<QString, QgsProperty> &propertiesMap, const QgsExpressionContext &context );
     797                 :            : };
     798                 :            : 
     799                 :            : class QPolygonF;
     800                 :            : 
     801                 :            : //! calculate geometry shifted by a specified distance
     802                 :            : QList<QPolygonF> offsetLine( QPolygonF polyline, double dist, QgsWkbTypes::GeometryType geometryType ) SIP_SKIP;
     803                 :            : 
     804                 :            : #endif
     805                 :            : 
     806                 :            : 

Generated by: LCOV version 1.14