LCOV - code coverage report
Current view: top level - core/textrenderer - qgstextbackgroundsettings.cpp (source / functions) Hit Total Coverage
Test: coverage.info.cleaned Lines: 5 490 1.0 %
Date: 2021-04-10 08:29:14 Functions: 0 0 -
Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : /***************************************************************************
       2                 :            :   qgstextbackgroundsettings.cpp
       3                 :            :   -----------------
       4                 :            :    begin                : May 2020
       5                 :            :    copyright            : (C) Nyall Dawson
       6                 :            :    email                : nyall dot dawson 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                 :            : #include "qgstextbackgroundsettings.h"
      17                 :            : #include "qgstextrenderer_p.h"
      18                 :            : #include "qgsvectorlayer.h"
      19                 :            : #include "qgspallabeling.h"
      20                 :            : #include "qgssymbollayerutils.h"
      21                 :            : #include "qgspainting.h"
      22                 :            : #include "qgstextrendererutils.h"
      23                 :            : #include "qgspainteffectregistry.h"
      24                 :            : 
      25                 :         78 : QgsTextBackgroundSettings::QgsTextBackgroundSettings()
      26                 :            : {
      27                 :         78 :   d = new QgsTextBackgroundSettingsPrivate();
      28                 :         78 : }
      29                 :            : 
      30                 :          0 : QgsTextBackgroundSettings::QgsTextBackgroundSettings( const QgsTextBackgroundSettings &other ) //NOLINT
      31                 :          0 :   : d( other.d )
      32                 :            : {
      33                 :            : 
      34                 :          0 : }
      35                 :            : 
      36                 :          0 : QgsTextBackgroundSettings &QgsTextBackgroundSettings::operator=( const QgsTextBackgroundSettings &other )  //NOLINT
      37                 :            : {
      38                 :          0 :   d = other.d;
      39                 :          0 :   return *this;
      40                 :            : }
      41                 :            : 
      42                 :         62 : QgsTextBackgroundSettings::~QgsTextBackgroundSettings() //NOLINT
      43                 :            : {
      44                 :            : 
      45                 :         62 : }
      46                 :            : 
      47                 :          0 : bool QgsTextBackgroundSettings::operator==( const QgsTextBackgroundSettings &other ) const
      48                 :            : {
      49                 :          0 :   if ( !d->enabled == other.enabled()
      50                 :          0 :        || d->type != other.type()
      51                 :          0 :        || d->svgFile != other.svgFile()
      52                 :          0 :        || d->sizeType != other.sizeType()
      53                 :          0 :        || d->size != other.size()
      54                 :          0 :        || d->sizeUnits != other.sizeUnit()
      55                 :          0 :        || d->sizeMapUnitScale != other.sizeMapUnitScale()
      56                 :          0 :        || d->rotationType != other.rotationType()
      57                 :          0 :        || d->rotation != other.rotation()
      58                 :          0 :        || d->offset != other.offset()
      59                 :          0 :        || d->offsetUnits != other.offsetUnit()
      60                 :          0 :        || d->offsetMapUnitScale != other.offsetMapUnitScale()
      61                 :          0 :        || d->radii != other.radii()
      62                 :          0 :        || d->radiiUnits != other.radiiUnit()
      63                 :          0 :        || d->radiiMapUnitScale != other.radiiMapUnitScale()
      64                 :          0 :        || d->blendMode != other.blendMode()
      65                 :          0 :        || d->fillColor != other.fillColor()
      66                 :          0 :        || d->strokeColor != other.strokeColor()
      67                 :          0 :        || d->opacity != other.opacity()
      68                 :          0 :        || d->strokeWidth != other.strokeWidth()
      69                 :          0 :        || d->strokeWidthUnits != other.strokeWidthUnit()
      70                 :          0 :        || d->strokeWidthMapUnitScale != other.strokeWidthMapUnitScale()
      71                 :          0 :        || d->joinStyle != other.joinStyle() )
      72                 :          0 :     return false;
      73                 :            : 
      74                 :          0 :   if ( static_cast< bool >( d->paintEffect ) != static_cast< bool >( other.paintEffect() )
      75                 :          0 :        || ( d->paintEffect && d->paintEffect->properties() != other.paintEffect()->properties() ) )
      76                 :          0 :     return false;
      77                 :            : 
      78                 :          0 :   if ( static_cast< bool >( d->markerSymbol ) != static_cast< bool >( other.markerSymbol() )
      79                 :          0 :        || ( d->markerSymbol && QgsSymbolLayerUtils::symbolProperties( d->markerSymbol.get() ) != QgsSymbolLayerUtils::symbolProperties( other.markerSymbol() ) ) )
      80                 :          0 :     return false;
      81                 :            : 
      82                 :          0 :   return true;
      83                 :          0 : }
      84                 :            : 
      85                 :          0 : bool QgsTextBackgroundSettings::operator!=( const QgsTextBackgroundSettings &other ) const
      86                 :            : {
      87                 :          0 :   return !( *this == other );
      88                 :            : }
      89                 :            : 
      90                 :          0 : bool QgsTextBackgroundSettings::enabled() const
      91                 :            : {
      92                 :          0 :   return d->enabled;
      93                 :            : }
      94                 :            : 
      95                 :          0 : void QgsTextBackgroundSettings::setEnabled( bool enabled )
      96                 :            : {
      97                 :          0 :   d->enabled = enabled;
      98                 :          0 : }
      99                 :            : 
     100                 :          0 : QgsTextBackgroundSettings::ShapeType QgsTextBackgroundSettings::type() const
     101                 :            : {
     102                 :          0 :   return d->type;
     103                 :            : }
     104                 :            : 
     105                 :          0 : void QgsTextBackgroundSettings::setType( QgsTextBackgroundSettings::ShapeType type )
     106                 :            : {
     107                 :          0 :   d->type = type;
     108                 :          0 : }
     109                 :            : 
     110                 :          0 : QString QgsTextBackgroundSettings::svgFile() const
     111                 :            : {
     112                 :          0 :   return d->svgFile;
     113                 :            : }
     114                 :            : 
     115                 :          0 : void QgsTextBackgroundSettings::setSvgFile( const QString &file )
     116                 :            : {
     117                 :          0 :   d->svgFile = file;
     118                 :          0 : }
     119                 :            : 
     120                 :          0 : QgsMarkerSymbol *QgsTextBackgroundSettings::markerSymbol() const
     121                 :            : {
     122                 :          0 :   return d->markerSymbol.get();
     123                 :            : }
     124                 :            : 
     125                 :          0 : void QgsTextBackgroundSettings::setMarkerSymbol( QgsMarkerSymbol *symbol )
     126                 :            : {
     127                 :          0 :   d->markerSymbol.reset( symbol );
     128                 :          0 : }
     129                 :            : 
     130                 :          0 : QgsTextBackgroundSettings::SizeType QgsTextBackgroundSettings::sizeType() const
     131                 :            : {
     132                 :          0 :   return d->sizeType;
     133                 :            : }
     134                 :            : 
     135                 :          0 : void QgsTextBackgroundSettings::setSizeType( QgsTextBackgroundSettings::SizeType type )
     136                 :            : {
     137                 :          0 :   d->sizeType = type;
     138                 :          0 : }
     139                 :            : 
     140                 :          0 : QSizeF QgsTextBackgroundSettings::size() const
     141                 :            : {
     142                 :          0 :   return d->size;
     143                 :            : }
     144                 :            : 
     145                 :          0 : void QgsTextBackgroundSettings::setSize( QSizeF size )
     146                 :            : {
     147                 :          0 :   d->size = size;
     148                 :          0 : }
     149                 :            : 
     150                 :          0 : QgsUnitTypes::RenderUnit QgsTextBackgroundSettings::sizeUnit() const
     151                 :            : {
     152                 :          0 :   return d->sizeUnits;
     153                 :            : }
     154                 :            : 
     155                 :          0 : void QgsTextBackgroundSettings::setSizeUnit( QgsUnitTypes::RenderUnit unit )
     156                 :            : {
     157                 :          0 :   d->sizeUnits = unit;
     158                 :          0 : }
     159                 :            : 
     160                 :          0 : QgsMapUnitScale QgsTextBackgroundSettings::sizeMapUnitScale() const
     161                 :            : {
     162                 :          0 :   return d->sizeMapUnitScale;
     163                 :            : }
     164                 :            : 
     165                 :          0 : void QgsTextBackgroundSettings::setSizeMapUnitScale( const QgsMapUnitScale &scale )
     166                 :            : {
     167                 :          0 :   d->sizeMapUnitScale = scale;
     168                 :          0 : }
     169                 :            : 
     170                 :          0 : QgsTextBackgroundSettings::RotationType QgsTextBackgroundSettings::rotationType() const
     171                 :            : {
     172                 :          0 :   return d->rotationType;
     173                 :            : }
     174                 :            : 
     175                 :          0 : void QgsTextBackgroundSettings::setRotationType( QgsTextBackgroundSettings::RotationType type )
     176                 :            : {
     177                 :          0 :   d->rotationType = type;
     178                 :          0 : }
     179                 :            : 
     180                 :          0 : double QgsTextBackgroundSettings::rotation() const
     181                 :            : {
     182                 :          0 :   return d->rotation;
     183                 :            : }
     184                 :            : 
     185                 :          0 : void QgsTextBackgroundSettings::setRotation( double rotation )
     186                 :            : {
     187                 :          0 :   d->rotation = rotation;
     188                 :          0 : }
     189                 :            : 
     190                 :          0 : QPointF QgsTextBackgroundSettings::offset() const
     191                 :            : {
     192                 :          0 :   return d->offset;
     193                 :            : }
     194                 :            : 
     195                 :          0 : void QgsTextBackgroundSettings::setOffset( QPointF offset )
     196                 :            : {
     197                 :          0 :   d->offset = offset;
     198                 :          0 : }
     199                 :            : 
     200                 :          0 : QgsUnitTypes::RenderUnit QgsTextBackgroundSettings::offsetUnit() const
     201                 :            : {
     202                 :          0 :   return d->offsetUnits;
     203                 :            : }
     204                 :            : 
     205                 :          0 : void QgsTextBackgroundSettings::setOffsetUnit( QgsUnitTypes::RenderUnit units )
     206                 :            : {
     207                 :          0 :   d->offsetUnits = units;
     208                 :          0 : }
     209                 :            : 
     210                 :          0 : QgsMapUnitScale QgsTextBackgroundSettings::offsetMapUnitScale() const
     211                 :            : {
     212                 :          0 :   return d->offsetMapUnitScale;
     213                 :            : }
     214                 :            : 
     215                 :          0 : void QgsTextBackgroundSettings::setOffsetMapUnitScale( const QgsMapUnitScale &scale )
     216                 :            : {
     217                 :          0 :   d->offsetMapUnitScale = scale;
     218                 :          0 : }
     219                 :            : 
     220                 :          0 : QSizeF QgsTextBackgroundSettings::radii() const
     221                 :            : {
     222                 :          0 :   return d->radii;
     223                 :            : }
     224                 :            : 
     225                 :          0 : void QgsTextBackgroundSettings::setRadii( QSizeF radii )
     226                 :            : {
     227                 :          0 :   d->radii = radii;
     228                 :          0 : }
     229                 :            : 
     230                 :          0 : QgsUnitTypes::RenderUnit QgsTextBackgroundSettings::radiiUnit() const
     231                 :            : {
     232                 :          0 :   return d->radiiUnits;
     233                 :            : }
     234                 :            : 
     235                 :          0 : void QgsTextBackgroundSettings::setRadiiUnit( QgsUnitTypes::RenderUnit units )
     236                 :            : {
     237                 :          0 :   d->radiiUnits = units;
     238                 :          0 : }
     239                 :            : 
     240                 :          0 : QgsMapUnitScale QgsTextBackgroundSettings::radiiMapUnitScale() const
     241                 :            : {
     242                 :          0 :   return d->radiiMapUnitScale;
     243                 :            : }
     244                 :            : 
     245                 :          0 : void QgsTextBackgroundSettings::setRadiiMapUnitScale( const QgsMapUnitScale &scale )
     246                 :            : {
     247                 :          0 :   d->radiiMapUnitScale = scale;
     248                 :          0 : }
     249                 :            : 
     250                 :          0 : double QgsTextBackgroundSettings::opacity() const
     251                 :            : {
     252                 :          0 :   return d->opacity;
     253                 :            : }
     254                 :            : 
     255                 :          0 : void QgsTextBackgroundSettings::setOpacity( double opacity )
     256                 :            : {
     257                 :          0 :   d->opacity = opacity;
     258                 :          0 : }
     259                 :            : 
     260                 :          0 : QPainter::CompositionMode QgsTextBackgroundSettings::blendMode() const
     261                 :            : {
     262                 :          0 :   return d->blendMode;
     263                 :            : }
     264                 :            : 
     265                 :          0 : void QgsTextBackgroundSettings::setBlendMode( QPainter::CompositionMode mode )
     266                 :            : {
     267                 :          0 :   d->blendMode = mode;
     268                 :          0 : }
     269                 :            : 
     270                 :          0 : QColor QgsTextBackgroundSettings::fillColor() const
     271                 :            : {
     272                 :          0 :   return d->fillColor;
     273                 :            : }
     274                 :            : 
     275                 :          0 : void QgsTextBackgroundSettings::setFillColor( const QColor &color )
     276                 :            : {
     277                 :          0 :   d->fillColor = color;
     278                 :          0 : }
     279                 :            : 
     280                 :          0 : QColor QgsTextBackgroundSettings::strokeColor() const
     281                 :            : {
     282                 :          0 :   return d->strokeColor;
     283                 :            : }
     284                 :            : 
     285                 :          0 : void QgsTextBackgroundSettings::setStrokeColor( const QColor &color )
     286                 :            : {
     287                 :          0 :   d->strokeColor = color;
     288                 :          0 : }
     289                 :            : 
     290                 :          0 : double QgsTextBackgroundSettings::strokeWidth() const
     291                 :            : {
     292                 :          0 :   return d->strokeWidth;
     293                 :            : }
     294                 :            : 
     295                 :          0 : void QgsTextBackgroundSettings::setStrokeWidth( double width )
     296                 :            : {
     297                 :          0 :   d->strokeWidth = width;
     298                 :          0 : }
     299                 :            : 
     300                 :          0 : QgsUnitTypes::RenderUnit QgsTextBackgroundSettings::strokeWidthUnit() const
     301                 :            : {
     302                 :          0 :   return d->strokeWidthUnits;
     303                 :            : }
     304                 :            : 
     305                 :          0 : void QgsTextBackgroundSettings::setStrokeWidthUnit( QgsUnitTypes::RenderUnit units )
     306                 :            : {
     307                 :          0 :   d->strokeWidthUnits = units;
     308                 :          0 : }
     309                 :            : 
     310                 :          0 : QgsMapUnitScale QgsTextBackgroundSettings::strokeWidthMapUnitScale() const
     311                 :            : {
     312                 :          0 :   return d->strokeWidthMapUnitScale;
     313                 :            : }
     314                 :            : 
     315                 :          0 : void QgsTextBackgroundSettings::setStrokeWidthMapUnitScale( const QgsMapUnitScale &scale )
     316                 :            : {
     317                 :          0 :   d->strokeWidthMapUnitScale = scale;
     318                 :          0 : }
     319                 :            : 
     320                 :          0 : Qt::PenJoinStyle QgsTextBackgroundSettings::joinStyle() const
     321                 :            : {
     322                 :          0 :   return d->joinStyle;
     323                 :            : }
     324                 :            : 
     325                 :          0 : void QgsTextBackgroundSettings::setJoinStyle( Qt::PenJoinStyle style )
     326                 :            : {
     327                 :          0 :   d->joinStyle = style;
     328                 :          0 : }
     329                 :            : 
     330                 :          0 : const QgsPaintEffect *QgsTextBackgroundSettings::paintEffect() const
     331                 :            : {
     332                 :          0 :   return d->paintEffect.get();
     333                 :            : }
     334                 :            : 
     335                 :          0 : void QgsTextBackgroundSettings::setPaintEffect( QgsPaintEffect *effect )
     336                 :            : {
     337                 :          0 :   d->paintEffect.reset( effect );
     338                 :          0 : }
     339                 :            : 
     340                 :          0 : void QgsTextBackgroundSettings::readFromLayer( QgsVectorLayer *layer )
     341                 :            : {
     342                 :          0 :   d->enabled = layer->customProperty( QStringLiteral( "labeling/shapeDraw" ), QVariant( false ) ).toBool();
     343                 :          0 :   d->type = static_cast< ShapeType >( layer->customProperty( QStringLiteral( "labeling/shapeType" ), QVariant( ShapeRectangle ) ).toUInt() );
     344                 :          0 :   d->svgFile = layer->customProperty( QStringLiteral( "labeling/shapeSVGFile" ), QVariant( "" ) ).toString();
     345                 :          0 :   d->sizeType = static_cast< SizeType >( layer->customProperty( QStringLiteral( "labeling/shapeSizeType" ), QVariant( SizeBuffer ) ).toUInt() );
     346                 :          0 :   d->size = QSizeF( layer->customProperty( QStringLiteral( "labeling/shapeSizeX" ), QVariant( 0.0 ) ).toDouble(),
     347                 :          0 :                     layer->customProperty( QStringLiteral( "labeling/shapeSizeY" ), QVariant( 0.0 ) ).toDouble() );
     348                 :            : 
     349                 :          0 :   if ( layer->customProperty( QStringLiteral( "labeling/shapeSizeUnit" ) ).toString().isEmpty() )
     350                 :            :   {
     351                 :          0 :     d->sizeUnits = QgsTextRendererUtils::convertFromOldLabelUnit( layer->customProperty( QStringLiteral( "labeling/shapeSizeUnits" ), 0 ).toUInt() );
     352                 :          0 :   }
     353                 :            :   else
     354                 :            :   {
     355                 :          0 :     d->sizeUnits = QgsUnitTypes::decodeRenderUnit( layer->customProperty( QStringLiteral( "labeling/shapeSizeUnit" ) ).toString() );
     356                 :            :   }
     357                 :            : 
     358                 :          0 :   if ( layer->customProperty( QStringLiteral( "labeling/shapeSizeMapUnitScale" ) ).toString().isEmpty() )
     359                 :            :   {
     360                 :            :     //fallback to older property
     361                 :          0 :     double oldMin = layer->customProperty( QStringLiteral( "labeling/shapeSizeMapUnitMinScale" ), 0.0 ).toDouble();
     362                 :          0 :     d->sizeMapUnitScale.minScale = oldMin != 0 ? 1.0 / oldMin : 0;
     363                 :          0 :     double oldMax = layer->customProperty( QStringLiteral( "labeling/shapeSizeMapUnitMaxScale" ), 0.0 ).toDouble();
     364                 :          0 :     d->sizeMapUnitScale.maxScale = oldMax != 0 ? 1.0 / oldMax : 0;
     365                 :          0 :   }
     366                 :            :   else
     367                 :            :   {
     368                 :          0 :     d->sizeMapUnitScale = QgsSymbolLayerUtils::decodeMapUnitScale( layer->customProperty( QStringLiteral( "labeling/shapeSizeMapUnitScale" ) ).toString() );
     369                 :            :   }
     370                 :          0 :   d->rotationType = static_cast< RotationType >( layer->customProperty( QStringLiteral( "labeling/shapeRotationType" ), QVariant( RotationSync ) ).toUInt() );
     371                 :          0 :   d->rotation = layer->customProperty( QStringLiteral( "labeling/shapeRotation" ), QVariant( 0.0 ) ).toDouble();
     372                 :          0 :   d->offset = QPointF( layer->customProperty( QStringLiteral( "labeling/shapeOffsetX" ), QVariant( 0.0 ) ).toDouble(),
     373                 :          0 :                        layer->customProperty( QStringLiteral( "labeling/shapeOffsetY" ), QVariant( 0.0 ) ).toDouble() );
     374                 :            : 
     375                 :          0 :   if ( layer->customProperty( QStringLiteral( "labeling/shapeOffsetUnit" ) ).toString().isEmpty() )
     376                 :            :   {
     377                 :          0 :     d->offsetUnits = QgsTextRendererUtils::convertFromOldLabelUnit( layer->customProperty( QStringLiteral( "labeling/shapeOffsetUnits" ), 0 ).toUInt() );
     378                 :          0 :   }
     379                 :            :   else
     380                 :            :   {
     381                 :          0 :     d->offsetUnits = QgsUnitTypes::decodeRenderUnit( layer->customProperty( QStringLiteral( "labeling/shapeOffsetUnit" ) ).toString() );
     382                 :            :   }
     383                 :            : 
     384                 :          0 :   if ( layer->customProperty( QStringLiteral( "labeling/shapeOffsetMapUnitScale" ) ).toString().isEmpty() )
     385                 :            :   {
     386                 :            :     //fallback to older property
     387                 :          0 :     double oldMin = layer->customProperty( QStringLiteral( "labeling/shapeOffsetMapUnitMinScale" ), 0.0 ).toDouble();
     388                 :          0 :     d->offsetMapUnitScale.minScale = oldMin != 0 ? 1.0 / oldMin : 0;
     389                 :          0 :     double oldMax = layer->customProperty( QStringLiteral( "labeling/shapeOffsetMapUnitMaxScale" ), 0.0 ).toDouble();
     390                 :          0 :     d->offsetMapUnitScale.maxScale = oldMax != 0 ? 1.0 / oldMax : 0;
     391                 :          0 :   }
     392                 :            :   else
     393                 :            :   {
     394                 :          0 :     d->offsetMapUnitScale = QgsSymbolLayerUtils::decodeMapUnitScale( layer->customProperty( QStringLiteral( "labeling/shapeOffsetMapUnitScale" ) ).toString() );
     395                 :            :   }
     396                 :          0 :   d->radii = QSizeF( layer->customProperty( QStringLiteral( "labeling/shapeRadiiX" ), QVariant( 0.0 ) ).toDouble(),
     397                 :          0 :                      layer->customProperty( QStringLiteral( "labeling/shapeRadiiY" ), QVariant( 0.0 ) ).toDouble() );
     398                 :            : 
     399                 :            : 
     400                 :          0 :   if ( layer->customProperty( QStringLiteral( "labeling/shapeRadiiUnit" ) ).toString().isEmpty() )
     401                 :            :   {
     402                 :          0 :     d->radiiUnits = QgsTextRendererUtils::convertFromOldLabelUnit( layer->customProperty( QStringLiteral( "labeling/shapeRadiiUnits" ), 0 ).toUInt() );
     403                 :          0 :   }
     404                 :            :   else
     405                 :            :   {
     406                 :          0 :     d->radiiUnits = QgsUnitTypes::decodeRenderUnit( layer->customProperty( QStringLiteral( "labeling/shapeRadiiUnit" ) ).toString() );
     407                 :            :   }
     408                 :            : 
     409                 :          0 :   if ( layer->customProperty( QStringLiteral( "labeling/shapeRadiiMapUnitScale" ) ).toString().isEmpty() )
     410                 :            :   {
     411                 :            :     //fallback to older property
     412                 :          0 :     double oldMin = layer->customProperty( QStringLiteral( "labeling/shapeRadiiMapUnitMinScale" ), 0.0 ).toDouble();
     413                 :          0 :     d->radiiMapUnitScale.minScale = oldMin != 0 ? 1.0 / oldMin : 0;
     414                 :          0 :     double oldMax = layer->customProperty( QStringLiteral( "labeling/shapeRadiiMapUnitMaxScale" ), 0.0 ).toDouble();
     415                 :          0 :     d->radiiMapUnitScale.maxScale = oldMax != 0 ? 1.0 / oldMax : 0;
     416                 :          0 :   }
     417                 :            :   else
     418                 :            :   {
     419                 :          0 :     d->radiiMapUnitScale = QgsSymbolLayerUtils::decodeMapUnitScale( layer->customProperty( QStringLiteral( "labeling/shapeRadiiMapUnitScale" ) ).toString() );
     420                 :            :   }
     421                 :          0 :   d->fillColor = QgsTextRendererUtils::readColor( layer, QStringLiteral( "labeling/shapeFillColor" ), Qt::white, true );
     422                 :          0 :   d->strokeColor = QgsTextRendererUtils::readColor( layer, QStringLiteral( "labeling/shapeBorderColor" ), Qt::darkGray, true );
     423                 :          0 :   d->strokeWidth = layer->customProperty( QStringLiteral( "labeling/shapeBorderWidth" ), QVariant( .0 ) ).toDouble();
     424                 :          0 :   if ( layer->customProperty( QStringLiteral( "labeling/shapeBorderWidthUnit" ) ).toString().isEmpty() )
     425                 :            :   {
     426                 :          0 :     d->strokeWidthUnits = QgsTextRendererUtils::convertFromOldLabelUnit( layer->customProperty( QStringLiteral( "labeling/shapeBorderWidthUnits" ), 0 ).toUInt() );
     427                 :          0 :   }
     428                 :            :   else
     429                 :            :   {
     430                 :          0 :     d->strokeWidthUnits = QgsUnitTypes::decodeRenderUnit( layer->customProperty( QStringLiteral( "labeling/shapeBorderWidthUnit" ) ).toString() );
     431                 :            :   }
     432                 :          0 :   if ( layer->customProperty( QStringLiteral( "labeling/shapeBorderWidthMapUnitScale" ) ).toString().isEmpty() )
     433                 :            :   {
     434                 :            :     //fallback to older property
     435                 :          0 :     double oldMin = layer->customProperty( QStringLiteral( "labeling/shapeBorderWidthMapUnitMinScale" ), 0.0 ).toDouble();
     436                 :          0 :     d->strokeWidthMapUnitScale.minScale = oldMin != 0 ? 1.0 / oldMin : 0;
     437                 :          0 :     double oldMax = layer->customProperty( QStringLiteral( "labeling/shapeBorderWidthMapUnitMaxScale" ), 0.0 ).toDouble();
     438                 :          0 :     d->strokeWidthMapUnitScale.maxScale = oldMax != 0 ? 1.0 / oldMax : 0;
     439                 :          0 :   }
     440                 :            :   else
     441                 :            :   {
     442                 :          0 :     d->strokeWidthMapUnitScale = QgsSymbolLayerUtils::decodeMapUnitScale( layer->customProperty( QStringLiteral( "labeling/shapeBorderWidthMapUnitScale" ) ).toString() );
     443                 :            :   }
     444                 :          0 :   d->joinStyle = static_cast< Qt::PenJoinStyle >( layer->customProperty( QStringLiteral( "labeling/shapeJoinStyle" ), QVariant( Qt::BevelJoin ) ).toUInt() );
     445                 :            : 
     446                 :          0 :   if ( layer->customProperty( QStringLiteral( "labeling/shapeOpacity" ) ).toString().isEmpty() )
     447                 :            :   {
     448                 :          0 :     d->opacity = ( 1 - layer->customProperty( QStringLiteral( "labeling/shapeTransparency" ) ).toInt() / 100.0 ); //0 -100
     449                 :          0 :   }
     450                 :            :   else
     451                 :            :   {
     452                 :          0 :     d->opacity = ( layer->customProperty( QStringLiteral( "labeling/shapeOpacity" ) ).toDouble() );
     453                 :            :   }
     454                 :          0 :   d->blendMode = QgsPainting::getCompositionMode(
     455                 :          0 :                    static_cast< QgsPainting::BlendMode >( layer->customProperty( QStringLiteral( "labeling/shapeBlendMode" ), QVariant( QgsPainting::BlendNormal ) ).toUInt() ) );
     456                 :            : 
     457                 :          0 :   if ( layer->customProperty( QStringLiteral( "labeling/shapeEffect" ) ).isValid() )
     458                 :            :   {
     459                 :          0 :     QDomDocument doc( QStringLiteral( "effect" ) );
     460                 :          0 :     doc.setContent( layer->customProperty( QStringLiteral( "labeling/shapeEffect" ) ).toString() );
     461                 :          0 :     QDomElement effectElem = doc.firstChildElement( QStringLiteral( "effect" ) ).firstChildElement( QStringLiteral( "effect" ) );
     462                 :          0 :     setPaintEffect( QgsApplication::paintEffectRegistry()->createEffect( effectElem ) );
     463                 :          0 :   }
     464                 :            :   else
     465                 :          0 :     setPaintEffect( nullptr );
     466                 :          0 : }
     467                 :            : 
     468                 :          0 : void QgsTextBackgroundSettings::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
     469                 :            : {
     470                 :          0 :   QDomElement backgroundElem = elem.firstChildElement( QStringLiteral( "background" ) );
     471                 :          0 :   d->enabled = backgroundElem.attribute( QStringLiteral( "shapeDraw" ), QStringLiteral( "0" ) ).toInt();
     472                 :          0 :   d->type = static_cast< ShapeType >( backgroundElem.attribute( QStringLiteral( "shapeType" ), QString::number( ShapeRectangle ) ).toUInt() );
     473                 :          0 :   d->svgFile = QgsSymbolLayerUtils::svgSymbolNameToPath( backgroundElem.attribute( QStringLiteral( "shapeSVGFile" ) ), context.pathResolver() );
     474                 :          0 :   d->sizeType = static_cast< SizeType >( backgroundElem.attribute( QStringLiteral( "shapeSizeType" ), QString::number( SizeBuffer ) ).toUInt() );
     475                 :          0 :   d->size = QSizeF( backgroundElem.attribute( QStringLiteral( "shapeSizeX" ), QStringLiteral( "0" ) ).toDouble(),
     476                 :          0 :                     backgroundElem.attribute( QStringLiteral( "shapeSizeY" ), QStringLiteral( "0" ) ).toDouble() );
     477                 :            : 
     478                 :          0 :   if ( !backgroundElem.hasAttribute( QStringLiteral( "shapeSizeUnit" ) ) )
     479                 :            :   {
     480                 :          0 :     d->sizeUnits = QgsTextRendererUtils::convertFromOldLabelUnit( backgroundElem.attribute( QStringLiteral( "shapeSizeUnits" ) ).toUInt() );
     481                 :          0 :   }
     482                 :            :   else
     483                 :            :   {
     484                 :          0 :     d->sizeUnits = QgsUnitTypes::decodeRenderUnit( backgroundElem.attribute( QStringLiteral( "shapeSizeUnit" ) ) );
     485                 :            :   }
     486                 :            : 
     487                 :          0 :   if ( !backgroundElem.hasAttribute( QStringLiteral( "shapeSizeMapUnitScale" ) ) )
     488                 :            :   {
     489                 :            :     //fallback to older property
     490                 :          0 :     double oldMin = backgroundElem.attribute( QStringLiteral( "shapeSizeMapUnitMinScale" ), QStringLiteral( "0" ) ).toDouble();
     491                 :          0 :     d->sizeMapUnitScale.minScale = oldMin != 0 ? 1.0 / oldMin : 0;
     492                 :          0 :     double oldMax = backgroundElem.attribute( QStringLiteral( "shapeSizeMapUnitMaxScale" ), QStringLiteral( "0" ) ).toDouble();
     493                 :          0 :     d->sizeMapUnitScale.maxScale = oldMax != 0 ? 1.0 / oldMax : 0;
     494                 :          0 :   }
     495                 :            :   else
     496                 :            :   {
     497                 :          0 :     d->sizeMapUnitScale = QgsSymbolLayerUtils::decodeMapUnitScale( backgroundElem.attribute( QStringLiteral( "shapeSizeMapUnitScale" ) ) );
     498                 :            :   }
     499                 :          0 :   d->rotationType = static_cast< RotationType >( backgroundElem.attribute( QStringLiteral( "shapeRotationType" ), QString::number( RotationSync ) ).toUInt() );
     500                 :          0 :   d->rotation = backgroundElem.attribute( QStringLiteral( "shapeRotation" ), QStringLiteral( "0" ) ).toDouble();
     501                 :          0 :   d->offset = QPointF( backgroundElem.attribute( QStringLiteral( "shapeOffsetX" ), QStringLiteral( "0" ) ).toDouble(),
     502                 :          0 :                        backgroundElem.attribute( QStringLiteral( "shapeOffsetY" ), QStringLiteral( "0" ) ).toDouble() );
     503                 :            : 
     504                 :          0 :   if ( !backgroundElem.hasAttribute( QStringLiteral( "shapeOffsetUnit" ) ) )
     505                 :            :   {
     506                 :          0 :     d->offsetUnits = QgsTextRendererUtils::convertFromOldLabelUnit( backgroundElem.attribute( QStringLiteral( "shapeOffsetUnits" ) ).toUInt() );
     507                 :          0 :   }
     508                 :            :   else
     509                 :            :   {
     510                 :          0 :     d->offsetUnits = QgsUnitTypes::decodeRenderUnit( backgroundElem.attribute( QStringLiteral( "shapeOffsetUnit" ) ) );
     511                 :            :   }
     512                 :            : 
     513                 :          0 :   if ( !backgroundElem.hasAttribute( QStringLiteral( "shapeOffsetMapUnitScale" ) ) )
     514                 :            :   {
     515                 :            :     //fallback to older property
     516                 :          0 :     double oldMin = backgroundElem.attribute( QStringLiteral( "shapeOffsetMapUnitMinScale" ), QStringLiteral( "0" ) ).toDouble();
     517                 :          0 :     d->offsetMapUnitScale.minScale = oldMin != 0 ? 1.0 / oldMin : 0;
     518                 :          0 :     double oldMax = backgroundElem.attribute( QStringLiteral( "shapeOffsetMapUnitMaxScale" ), QStringLiteral( "0" ) ).toDouble();
     519                 :          0 :     d->offsetMapUnitScale.maxScale = oldMax != 0 ? 1.0 / oldMax : 0;
     520                 :          0 :   }
     521                 :            :   else
     522                 :            :   {
     523                 :          0 :     d->offsetMapUnitScale = QgsSymbolLayerUtils::decodeMapUnitScale( backgroundElem.attribute( QStringLiteral( "shapeOffsetMapUnitScale" ) ) );
     524                 :            :   }
     525                 :          0 :   d->radii = QSizeF( backgroundElem.attribute( QStringLiteral( "shapeRadiiX" ), QStringLiteral( "0" ) ).toDouble(),
     526                 :          0 :                      backgroundElem.attribute( QStringLiteral( "shapeRadiiY" ), QStringLiteral( "0" ) ).toDouble() );
     527                 :            : 
     528                 :          0 :   if ( !backgroundElem.hasAttribute( QStringLiteral( "shapeRadiiUnit" ) ) )
     529                 :            :   {
     530                 :          0 :     d->radiiUnits = QgsTextRendererUtils::convertFromOldLabelUnit( backgroundElem.attribute( QStringLiteral( "shapeRadiiUnits" ) ).toUInt() );
     531                 :          0 :   }
     532                 :            :   else
     533                 :            :   {
     534                 :          0 :     d->radiiUnits = QgsUnitTypes::decodeRenderUnit( backgroundElem.attribute( QStringLiteral( "shapeRadiiUnit" ) ) );
     535                 :            :   }
     536                 :          0 :   if ( !backgroundElem.hasAttribute( QStringLiteral( "shapeRadiiMapUnitScale" ) ) )
     537                 :            :   {
     538                 :            :     //fallback to older property
     539                 :          0 :     double oldMin = backgroundElem.attribute( QStringLiteral( "shapeRadiiMapUnitMinScale" ), QStringLiteral( "0" ) ).toDouble();
     540                 :          0 :     d->radiiMapUnitScale.minScale = oldMin != 0 ? 1.0 / oldMin : 0;
     541                 :          0 :     double oldMax = backgroundElem.attribute( QStringLiteral( "shapeRadiiMapUnitMaxScale" ), QStringLiteral( "0" ) ).toDouble();
     542                 :          0 :     d->radiiMapUnitScale.maxScale = oldMax != 0 ? 1.0 / oldMax : 0;
     543                 :          0 :   }
     544                 :            :   else
     545                 :            :   {
     546                 :          0 :     d->radiiMapUnitScale = QgsSymbolLayerUtils::decodeMapUnitScale( backgroundElem.attribute( QStringLiteral( "shapeRadiiMapUnitScale" ) ) );
     547                 :            :   }
     548                 :          0 :   d->fillColor = QgsSymbolLayerUtils::decodeColor( backgroundElem.attribute( QStringLiteral( "shapeFillColor" ), QgsSymbolLayerUtils::encodeColor( Qt::white ) ) );
     549                 :          0 :   d->strokeColor = QgsSymbolLayerUtils::decodeColor( backgroundElem.attribute( QStringLiteral( "shapeBorderColor" ), QgsSymbolLayerUtils::encodeColor( Qt::darkGray ) ) );
     550                 :          0 :   d->strokeWidth = backgroundElem.attribute( QStringLiteral( "shapeBorderWidth" ), QStringLiteral( "0" ) ).toDouble();
     551                 :            : 
     552                 :          0 :   if ( !backgroundElem.hasAttribute( QStringLiteral( "shapeBorderWidthUnit" ) ) )
     553                 :            :   {
     554                 :          0 :     d->strokeWidthUnits = QgsTextRendererUtils::convertFromOldLabelUnit( backgroundElem.attribute( QStringLiteral( "shapeBorderWidthUnits" ) ).toUInt() );
     555                 :          0 :   }
     556                 :            :   else
     557                 :            :   {
     558                 :          0 :     d->strokeWidthUnits = QgsUnitTypes::decodeRenderUnit( backgroundElem.attribute( QStringLiteral( "shapeBorderWidthUnit" ) ) );
     559                 :            :   }
     560                 :          0 :   if ( !backgroundElem.hasAttribute( QStringLiteral( "shapeBorderWidthMapUnitScale" ) ) )
     561                 :            :   {
     562                 :            :     //fallback to older property
     563                 :          0 :     double oldMin = backgroundElem.attribute( QStringLiteral( "shapeBorderWidthMapUnitMinScale" ), QStringLiteral( "0" ) ).toDouble();
     564                 :          0 :     d->strokeWidthMapUnitScale.minScale = oldMin != 0 ? 1.0 / oldMin : 0;
     565                 :          0 :     double oldMax = backgroundElem.attribute( QStringLiteral( "shapeBorderWidthMapUnitMaxScale" ), QStringLiteral( "0" ) ).toDouble();
     566                 :          0 :     d->strokeWidthMapUnitScale.maxScale = oldMax != 0 ? 1.0 / oldMax : 0;
     567                 :          0 :   }
     568                 :            :   else
     569                 :            :   {
     570                 :          0 :     d->strokeWidthMapUnitScale = QgsSymbolLayerUtils::decodeMapUnitScale( backgroundElem.attribute( QStringLiteral( "shapeBorderWidthMapUnitScale" ) ) );
     571                 :            :   }
     572                 :          0 :   d->joinStyle = static_cast< Qt::PenJoinStyle >( backgroundElem.attribute( QStringLiteral( "shapeJoinStyle" ), QString::number( Qt::BevelJoin ) ).toUInt() );
     573                 :            : 
     574                 :          0 :   if ( !backgroundElem.hasAttribute( QStringLiteral( "shapeOpacity" ) ) )
     575                 :            :   {
     576                 :          0 :     d->opacity = ( 1 - backgroundElem.attribute( QStringLiteral( "shapeTransparency" ) ).toInt() / 100.0 ); //0 -100
     577                 :          0 :   }
     578                 :            :   else
     579                 :            :   {
     580                 :          0 :     d->opacity = ( backgroundElem.attribute( QStringLiteral( "shapeOpacity" ) ).toDouble() );
     581                 :            :   }
     582                 :            : 
     583                 :          0 :   d->blendMode = QgsPainting::getCompositionMode(
     584                 :          0 :                    static_cast< QgsPainting::BlendMode >( backgroundElem.attribute( QStringLiteral( "shapeBlendMode" ), QString::number( QgsPainting::BlendNormal ) ).toUInt() ) );
     585                 :            : 
     586                 :          0 :   QDomElement effectElem = backgroundElem.firstChildElement( QStringLiteral( "effect" ) );
     587                 :          0 :   if ( !effectElem.isNull() )
     588                 :          0 :     setPaintEffect( QgsApplication::paintEffectRegistry()->createEffect( effectElem ) );
     589                 :            :   else
     590                 :          0 :     setPaintEffect( nullptr );
     591                 :            : 
     592                 :          0 :   const QDomElement symbolElem = backgroundElem.firstChildElement( QStringLiteral( "symbol" ) );
     593                 :          0 :   if ( !symbolElem.isNull() )
     594                 :          0 :     setMarkerSymbol( QgsSymbolLayerUtils::loadSymbol< QgsMarkerSymbol >( symbolElem, context ) );
     595                 :            :   else
     596                 :          0 :     setMarkerSymbol( nullptr );
     597                 :          0 : }
     598                 :            : 
     599                 :          0 : QDomElement QgsTextBackgroundSettings::writeXml( QDomDocument &doc, const QgsReadWriteContext &context ) const
     600                 :            : {
     601                 :          0 :   QDomElement backgroundElem = doc.createElement( QStringLiteral( "background" ) );
     602                 :          0 :   backgroundElem.setAttribute( QStringLiteral( "shapeDraw" ), d->enabled );
     603                 :          0 :   backgroundElem.setAttribute( QStringLiteral( "shapeType" ), static_cast< unsigned int >( d->type ) );
     604                 :          0 :   backgroundElem.setAttribute( QStringLiteral( "shapeSVGFile" ), QgsSymbolLayerUtils::svgSymbolPathToName( d->svgFile, context.pathResolver() ) );
     605                 :          0 :   backgroundElem.setAttribute( QStringLiteral( "shapeSizeType" ), static_cast< unsigned int >( d->sizeType ) );
     606                 :          0 :   backgroundElem.setAttribute( QStringLiteral( "shapeSizeX" ), d->size.width() );
     607                 :          0 :   backgroundElem.setAttribute( QStringLiteral( "shapeSizeY" ), d->size.height() );
     608                 :          0 :   backgroundElem.setAttribute( QStringLiteral( "shapeSizeUnit" ), QgsUnitTypes::encodeUnit( d->sizeUnits ) );
     609                 :          0 :   backgroundElem.setAttribute( QStringLiteral( "shapeSizeMapUnitScale" ), QgsSymbolLayerUtils::encodeMapUnitScale( d->sizeMapUnitScale ) );
     610                 :          0 :   backgroundElem.setAttribute( QStringLiteral( "shapeRotationType" ), static_cast< unsigned int >( d->rotationType ) );
     611                 :          0 :   backgroundElem.setAttribute( QStringLiteral( "shapeRotation" ), d->rotation );
     612                 :          0 :   backgroundElem.setAttribute( QStringLiteral( "shapeOffsetX" ), d->offset.x() );
     613                 :          0 :   backgroundElem.setAttribute( QStringLiteral( "shapeOffsetY" ), d->offset.y() );
     614                 :          0 :   backgroundElem.setAttribute( QStringLiteral( "shapeOffsetUnit" ), QgsUnitTypes::encodeUnit( d->offsetUnits ) );
     615                 :          0 :   backgroundElem.setAttribute( QStringLiteral( "shapeOffsetMapUnitScale" ), QgsSymbolLayerUtils::encodeMapUnitScale( d->offsetMapUnitScale ) );
     616                 :          0 :   backgroundElem.setAttribute( QStringLiteral( "shapeRadiiX" ), d->radii.width() );
     617                 :          0 :   backgroundElem.setAttribute( QStringLiteral( "shapeRadiiY" ), d->radii.height() );
     618                 :          0 :   backgroundElem.setAttribute( QStringLiteral( "shapeRadiiUnit" ), QgsUnitTypes::encodeUnit( d->radiiUnits ) );
     619                 :          0 :   backgroundElem.setAttribute( QStringLiteral( "shapeRadiiMapUnitScale" ), QgsSymbolLayerUtils::encodeMapUnitScale( d->radiiMapUnitScale ) );
     620                 :          0 :   backgroundElem.setAttribute( QStringLiteral( "shapeFillColor" ), QgsSymbolLayerUtils::encodeColor( d->fillColor ) );
     621                 :          0 :   backgroundElem.setAttribute( QStringLiteral( "shapeBorderColor" ), QgsSymbolLayerUtils::encodeColor( d->strokeColor ) );
     622                 :          0 :   backgroundElem.setAttribute( QStringLiteral( "shapeBorderWidth" ), d->strokeWidth );
     623                 :          0 :   backgroundElem.setAttribute( QStringLiteral( "shapeBorderWidthUnit" ), QgsUnitTypes::encodeUnit( d->strokeWidthUnits ) );
     624                 :          0 :   backgroundElem.setAttribute( QStringLiteral( "shapeBorderWidthMapUnitScale" ), QgsSymbolLayerUtils::encodeMapUnitScale( d->strokeWidthMapUnitScale ) );
     625                 :          0 :   backgroundElem.setAttribute( QStringLiteral( "shapeJoinStyle" ), static_cast< unsigned int >( d->joinStyle ) );
     626                 :          0 :   backgroundElem.setAttribute( QStringLiteral( "shapeOpacity" ), d->opacity );
     627                 :          0 :   backgroundElem.setAttribute( QStringLiteral( "shapeBlendMode" ), QgsPainting::getBlendModeEnum( d->blendMode ) );
     628                 :          0 :   if ( d->paintEffect && !QgsPaintEffectRegistry::isDefaultStack( d->paintEffect.get() ) )
     629                 :          0 :     d->paintEffect->saveProperties( doc, backgroundElem );
     630                 :            : 
     631                 :          0 :   if ( d->markerSymbol )
     632                 :          0 :     backgroundElem.appendChild( QgsSymbolLayerUtils::saveSymbol( QStringLiteral( "markerSymbol" ), d->markerSymbol.get(), doc, context ) );
     633                 :            : 
     634                 :          0 :   return backgroundElem;
     635                 :          0 : }
     636                 :            : 
     637                 :          0 : void QgsTextBackgroundSettings::updateDataDefinedProperties( QgsRenderContext &context, const QgsPropertyCollection &properties )
     638                 :            : {
     639                 :          0 :   if ( properties.isActive( QgsPalLayerSettings::ShapeDraw ) )
     640                 :            :   {
     641                 :          0 :     context.expressionContext().setOriginalValueVariable( d->enabled );
     642                 :          0 :     d->enabled = properties.valueAsBool( QgsPalLayerSettings::ShapeDraw, context.expressionContext(), d->enabled );
     643                 :          0 :   }
     644                 :            : 
     645                 :          0 :   if ( properties.isActive( QgsPalLayerSettings::ShapeSizeX ) )
     646                 :            :   {
     647                 :          0 :     context.expressionContext().setOriginalValueVariable( d->size.width() );
     648                 :          0 :     d->size.setWidth( properties.valueAsDouble( QgsPalLayerSettings::ShapeSizeX, context.expressionContext(), d->size.width() ) );
     649                 :          0 :   }
     650                 :          0 :   if ( properties.isActive( QgsPalLayerSettings::ShapeSizeY ) )
     651                 :            :   {
     652                 :          0 :     context.expressionContext().setOriginalValueVariable( d->size.height() );
     653                 :          0 :     d->size.setHeight( properties.valueAsDouble( QgsPalLayerSettings::ShapeSizeY, context.expressionContext(), d->size.height() ) );
     654                 :          0 :   }
     655                 :            : 
     656                 :          0 :   QVariant exprVal = properties.value( QgsPalLayerSettings::ShapeSizeUnits, context.expressionContext() );
     657                 :          0 :   if ( exprVal.isValid() )
     658                 :            :   {
     659                 :          0 :     QString units = exprVal.toString();
     660                 :          0 :     if ( !units.isEmpty() )
     661                 :            :     {
     662                 :            :       bool ok;
     663                 :          0 :       QgsUnitTypes::RenderUnit res = QgsUnitTypes::decodeRenderUnit( units, &ok );
     664                 :          0 :       if ( ok )
     665                 :          0 :         d->sizeUnits = res;
     666                 :          0 :     }
     667                 :          0 :   }
     668                 :            : 
     669                 :          0 :   exprVal = properties.value( QgsPalLayerSettings::ShapeKind, context.expressionContext() );
     670                 :          0 :   if ( exprVal.isValid() )
     671                 :            :   {
     672                 :          0 :     const QString skind = exprVal.toString().trimmed();
     673                 :          0 :     if ( !skind.isEmpty() )
     674                 :            :     {
     675                 :          0 :       d->type = QgsTextRendererUtils::decodeShapeType( skind );
     676                 :          0 :     }
     677                 :          0 :   }
     678                 :            : 
     679                 :          0 :   exprVal = properties.value( QgsPalLayerSettings::ShapeSizeType, context.expressionContext() );
     680                 :          0 :   if ( exprVal.isValid() )
     681                 :            :   {
     682                 :          0 :     QString stype = exprVal.toString().trimmed();
     683                 :          0 :     if ( !stype.isEmpty() )
     684                 :            :     {
     685                 :          0 :       d->sizeType = QgsTextRendererUtils::decodeBackgroundSizeType( stype );
     686                 :          0 :     }
     687                 :          0 :   }
     688                 :            : 
     689                 :            :   // data defined shape SVG path?
     690                 :          0 :   context.expressionContext().setOriginalValueVariable( d->svgFile );
     691                 :          0 :   exprVal = properties.value( QgsPalLayerSettings::ShapeSVGFile, context.expressionContext() );
     692                 :          0 :   if ( exprVal.isValid() )
     693                 :            :   {
     694                 :          0 :     QString svgfile = exprVal.toString().trimmed();
     695                 :          0 :     d->svgFile = QgsSymbolLayerUtils::svgSymbolNameToPath( svgfile, context.pathResolver() );
     696                 :          0 :   }
     697                 :            : 
     698                 :          0 :   if ( properties.isActive( QgsPalLayerSettings::ShapeRotation ) )
     699                 :            :   {
     700                 :          0 :     context.expressionContext().setOriginalValueVariable( d->rotation );
     701                 :          0 :     d->rotation = properties.valueAsDouble( QgsPalLayerSettings::ShapeRotation, context.expressionContext(), d->rotation );
     702                 :          0 :   }
     703                 :          0 :   exprVal = properties.value( QgsPalLayerSettings::ShapeRotationType, context.expressionContext() );
     704                 :          0 :   if ( exprVal.isValid() )
     705                 :            :   {
     706                 :          0 :     QString rotstr = exprVal.toString().trimmed();
     707                 :          0 :     if ( !rotstr.isEmpty() )
     708                 :            :     {
     709                 :          0 :       d->rotationType = QgsTextRendererUtils::decodeBackgroundRotationType( rotstr );
     710                 :          0 :     }
     711                 :          0 :   }
     712                 :            : 
     713                 :          0 :   exprVal = properties.value( QgsPalLayerSettings::ShapeOffset, context.expressionContext() );
     714                 :          0 :   if ( exprVal.isValid() )
     715                 :            :   {
     716                 :          0 :     bool ok = false;
     717                 :          0 :     const QPointF res = QgsSymbolLayerUtils::toPoint( exprVal, &ok );
     718                 :          0 :     if ( ok )
     719                 :            :     {
     720                 :          0 :       d->offset = res;
     721                 :          0 :     }
     722                 :          0 :   }
     723                 :          0 :   exprVal = properties.value( QgsPalLayerSettings::ShapeOffsetUnits, context.expressionContext() );
     724                 :          0 :   if ( exprVal.isValid() )
     725                 :            :   {
     726                 :          0 :     QString units = exprVal.toString();
     727                 :          0 :     if ( !units.isEmpty() )
     728                 :            :     {
     729                 :            :       bool ok;
     730                 :          0 :       QgsUnitTypes::RenderUnit res = QgsUnitTypes::decodeRenderUnit( units, &ok );
     731                 :          0 :       if ( ok )
     732                 :          0 :         d->offsetUnits = res;
     733                 :          0 :     }
     734                 :          0 :   }
     735                 :            : 
     736                 :          0 :   exprVal = properties.value( QgsPalLayerSettings::ShapeRadii, context.expressionContext() );
     737                 :          0 :   if ( exprVal.isValid() )
     738                 :            :   {
     739                 :          0 :     bool ok = false;
     740                 :          0 :     const QSizeF res = QgsSymbolLayerUtils::toSize( exprVal, &ok );
     741                 :          0 :     if ( ok )
     742                 :            :     {
     743                 :          0 :       d->radii = res;
     744                 :          0 :     }
     745                 :          0 :   }
     746                 :            : 
     747                 :          0 :   exprVal = properties.value( QgsPalLayerSettings::ShapeRadiiUnits, context.expressionContext() );
     748                 :          0 :   if ( exprVal.isValid() )
     749                 :            :   {
     750                 :          0 :     QString units = exprVal.toString();
     751                 :          0 :     if ( !units.isEmpty() )
     752                 :            :     {
     753                 :            :       bool ok;
     754                 :          0 :       QgsUnitTypes::RenderUnit res = QgsUnitTypes::decodeRenderUnit( units, &ok );
     755                 :          0 :       if ( ok )
     756                 :          0 :         d->radiiUnits = res;
     757                 :          0 :     }
     758                 :          0 :   }
     759                 :            : 
     760                 :          0 :   if ( properties.isActive( QgsPalLayerSettings::ShapeOpacity ) )
     761                 :            :   {
     762                 :          0 :     context.expressionContext().setOriginalValueVariable( d->opacity * 100 );
     763                 :          0 :     d->opacity = properties.value( QgsPalLayerSettings::ShapeOpacity, context.expressionContext(), d->opacity * 100 ).toDouble() / 100.0;
     764                 :          0 :   }
     765                 :            : 
     766                 :          0 :   if ( properties.isActive( QgsPalLayerSettings::ShapeFillColor ) )
     767                 :            :   {
     768                 :          0 :     context.expressionContext().setOriginalValueVariable( QgsSymbolLayerUtils::encodeColor( d->fillColor ) );
     769                 :          0 :     d->fillColor = properties.valueAsColor( QgsPalLayerSettings::ShapeFillColor, context.expressionContext(), d->fillColor );
     770                 :          0 :   }
     771                 :          0 :   if ( properties.isActive( QgsPalLayerSettings::ShapeStrokeColor ) )
     772                 :            :   {
     773                 :          0 :     context.expressionContext().setOriginalValueVariable( QgsSymbolLayerUtils::encodeColor( d->strokeColor ) );
     774                 :          0 :     d->strokeColor = properties.valueAsColor( QgsPalLayerSettings::ShapeStrokeColor, context.expressionContext(), d->strokeColor );
     775                 :          0 :   }
     776                 :            : 
     777                 :          0 :   if ( properties.isActive( QgsPalLayerSettings::ShapeStrokeWidth ) )
     778                 :            :   {
     779                 :          0 :     context.expressionContext().setOriginalValueVariable( d->strokeWidth );
     780                 :          0 :     d->strokeWidth = properties.valueAsDouble( QgsPalLayerSettings::ShapeStrokeWidth, context.expressionContext(), d->strokeWidth );
     781                 :          0 :   }
     782                 :          0 :   exprVal = properties.value( QgsPalLayerSettings::ShapeStrokeWidthUnits, context.expressionContext() );
     783                 :          0 :   if ( exprVal.isValid() )
     784                 :            :   {
     785                 :          0 :     QString units = exprVal.toString();
     786                 :          0 :     if ( !units.isEmpty() )
     787                 :            :     {
     788                 :            :       bool ok;
     789                 :          0 :       QgsUnitTypes::RenderUnit res = QgsUnitTypes::decodeRenderUnit( units, &ok );
     790                 :          0 :       if ( ok )
     791                 :          0 :         d->strokeWidthUnits = res;
     792                 :          0 :     }
     793                 :          0 :   }
     794                 :            : 
     795                 :          0 :   if ( properties.isActive( QgsPalLayerSettings::ShapeBlendMode ) )
     796                 :            :   {
     797                 :          0 :     exprVal = properties.value( QgsPalLayerSettings::ShapeBlendMode, context.expressionContext() );
     798                 :          0 :     QString blendstr = exprVal.toString().trimmed();
     799                 :          0 :     if ( !blendstr.isEmpty() )
     800                 :          0 :       d->blendMode = QgsSymbolLayerUtils::decodeBlendMode( blendstr );
     801                 :          0 :   }
     802                 :            : 
     803                 :          0 :   if ( properties.isActive( QgsPalLayerSettings::ShapeJoinStyle ) )
     804                 :            :   {
     805                 :          0 :     exprVal = properties.value( QgsPalLayerSettings::ShapeJoinStyle, context.expressionContext() );
     806                 :          0 :     QString joinstr = exprVal.toString().trimmed();
     807                 :          0 :     if ( !joinstr.isEmpty() )
     808                 :            :     {
     809                 :          0 :       d->joinStyle = QgsSymbolLayerUtils::decodePenJoinStyle( joinstr );
     810                 :          0 :     }
     811                 :          0 :   }
     812                 :          0 : }
     813                 :            : 
     814                 :          0 : QSet<QString> QgsTextBackgroundSettings::referencedFields( const QgsRenderContext &context ) const
     815                 :            : {
     816                 :          0 :   QSet< QString > fields;
     817                 :          0 :   if ( d->markerSymbol )
     818                 :            :   {
     819                 :          0 :     fields.unite( d->markerSymbol->usedAttributes( context ) );
     820                 :          0 :   }
     821                 :          0 :   return fields;
     822                 :          0 : }

Generated by: LCOV version 1.14