43 #include <QSvgRenderer> 
   44 #include <QDomDocument> 
   45 #include <QDomElement> 
   53     Qt::PenJoinStyle penJoinStyle )
 
   54   : mBrushStyle( style )
 
   55   , mStrokeColor( strokeColor )
 
   56   , mStrokeStyle( strokeStyle )
 
   57   , mStrokeWidth( strokeWidth )
 
   58   , mPenJoinStyle( penJoinStyle )
 
  102 void QgsSimpleFillSymbolLayer::applyDataDefinedSymbology( 
QgsSymbolRenderContext &context, QBrush &brush, QPen &pen, QPen &selPen )
 
  120     if ( !exprVal.isNull() )
 
  127     penColor.setAlphaF( context.
opacity() * penColor.alphaF() );
 
  128     pen.setColor( penColor );
 
  134     if ( !exprVal.isNull() )
 
  136       double width = exprVal.toDouble( &ok );
 
  140         pen.setWidthF( width );
 
  141         selPen.setWidthF( width );
 
  178   if ( props.contains( QStringLiteral( 
"color" ) ) )
 
  180   if ( props.contains( QStringLiteral( 
"style" ) ) )
 
  182   if ( props.contains( QStringLiteral( 
"color_border" ) ) )
 
  187   else if ( props.contains( QStringLiteral( 
"outline_color" ) ) )
 
  191   else if ( props.contains( QStringLiteral( 
"line_color" ) ) )
 
  196   if ( props.contains( QStringLiteral( 
"style_border" ) ) )
 
  201   else if ( props.contains( QStringLiteral( 
"outline_style" ) ) )
 
  205   else if ( props.contains( QStringLiteral( 
"line_style" ) ) )
 
  209   if ( props.contains( QStringLiteral( 
"width_border" ) ) )
 
  212     strokeWidth = props[QStringLiteral( 
"width_border" )].toDouble();
 
  214   else if ( props.contains( QStringLiteral( 
"outline_width" ) ) )
 
  216     strokeWidth = props[QStringLiteral( 
"outline_width" )].toDouble();
 
  218   else if ( props.contains( QStringLiteral( 
"line_width" ) ) )
 
  220     strokeWidth = props[QStringLiteral( 
"line_width" )].toDouble();
 
  222   if ( props.contains( QStringLiteral( 
"offset" ) ) )
 
  224   if ( props.contains( QStringLiteral( 
"joinstyle" ) ) )
 
  229   if ( props.contains( QStringLiteral( 
"border_width_unit" ) ) )
 
  233   else if ( props.contains( QStringLiteral( 
"outline_width_unit" ) ) )
 
  237   else if ( props.contains( QStringLiteral( 
"line_width_unit" ) ) )
 
  241   if ( props.contains( QStringLiteral( 
"offset_unit" ) ) )
 
  244   if ( props.contains( QStringLiteral( 
"border_width_map_unit_scale" ) ) )
 
  246   if ( props.contains( QStringLiteral( 
"offset_map_unit_scale" ) ) )
 
  249   sl->restoreOldDataDefinedProperties( props );
 
  257   return QStringLiteral( 
"SimpleFill" );
 
  269     selColor.setAlphaF( context.
opacity() );
 
  326 #ifndef QT_NO_PRINTER 
  327   if ( 
mBrush.style() == Qt::SolidPattern || 
mBrush.style() == Qt::NoBrush || !
dynamic_cast<QPrinter *
>( p->device() ) )
 
  334 #ifndef QT_NO_PRINTER 
  341     p->setPen( Qt::NoPen );
 
  345     p->setBrush( Qt::NoBrush );
 
  363   map[QStringLiteral( 
"outline_width" )] = QString::number( 
mStrokeWidth );
 
  391   QDomElement symbolizerElem = doc.createElement( QStringLiteral( 
"se:PolygonSymbolizer" ) );
 
  392   if ( !props.value( QStringLiteral( 
"uom" ), QString() ).toString().isEmpty() )
 
  393     symbolizerElem.setAttribute( QStringLiteral( 
"uom" ), props.value( QStringLiteral( 
"uom" ), QString() ).toString() );
 
  394   element.appendChild( symbolizerElem );
 
  402     QDomElement fillElem = doc.createElement( QStringLiteral( 
"se:Fill" ) );
 
  403     symbolizerElem.appendChild( fillElem );
 
  410     QDomElement strokeElem = doc.createElement( QStringLiteral( 
"se:Stroke" ) );
 
  411     symbolizerElem.appendChild( strokeElem );
 
  426   symbolStyle.append( 
';' );
 
  435   Qt::BrushStyle fillStyle;
 
  439   QDomElement fillElem = element.firstChildElement( QStringLiteral( 
"Fill" ) );
 
  442   QDomElement strokeElem = element.firstChildElement( QStringLiteral( 
"Stroke" ) );
 
  448   QString uom = element.attribute( QStringLiteral( 
"uom" ), QString() );
 
  454   sl->setOutputUnit( QgsUnitTypes::RenderUnit::RenderPixels );
 
  463   return penBleed + offsetBleed;
 
  524   : mGradientColorType( colorType )
 
  525   , mGradientType( gradientType )
 
  526   , mCoordinateMode( coordinateMode )
 
  527   , mGradientSpread( spread )
 
  528   , mReferencePoint1( QPointF( 0.5, 0 ) )
 
  529   , mReferencePoint2( QPointF( 0.5, 1 ) )
 
  550   bool refPoint1IsCentroid = 
false;
 
  552   bool refPoint2IsCentroid = 
false;
 
  557   if ( props.contains( QStringLiteral( 
"type" ) ) )
 
  558     type = 
static_cast< GradientType >( props[QStringLiteral( 
"type" )].toInt() );
 
  559   if ( props.contains( QStringLiteral( 
"coordinate_mode" ) ) )
 
  561   if ( props.contains( QStringLiteral( 
"spread" ) ) )
 
  563   if ( props.contains( QStringLiteral( 
"color_type" ) ) )
 
  564     colorType = 
static_cast< GradientColorType >( props[QStringLiteral( 
"color_type" )].toInt() );
 
  565   if ( props.contains( QStringLiteral( 
"gradient_color" ) ) )
 
  570   else if ( props.contains( QStringLiteral( 
"color" ) ) )
 
  574   if ( props.contains( QStringLiteral( 
"gradient_color2" ) ) )
 
  579   if ( props.contains( QStringLiteral( 
"reference_point1" ) ) )
 
  581   if ( props.contains( QStringLiteral( 
"reference_point1_iscentroid" ) ) )
 
  582     refPoint1IsCentroid = props[QStringLiteral( 
"reference_point1_iscentroid" )].toInt();
 
  583   if ( props.contains( QStringLiteral( 
"reference_point2" ) ) )
 
  585   if ( props.contains( QStringLiteral( 
"reference_point2_iscentroid" ) ) )
 
  586     refPoint2IsCentroid = props[QStringLiteral( 
"reference_point2_iscentroid" )].toInt();
 
  587   if ( props.contains( QStringLiteral( 
"angle" ) ) )
 
  588     angle = props[QStringLiteral( 
"angle" )].toDouble();
 
  590   if ( props.contains( QStringLiteral( 
"offset" ) ) )
 
  607   if ( props.contains( QStringLiteral( 
"offset_unit" ) ) )
 
  609   if ( props.contains( QStringLiteral( 
"offset_map_unit_scale" ) ) )
 
  612   sl->setReferencePoint1IsCentroid( refPoint1IsCentroid );
 
  614   sl->setReferencePoint2IsCentroid( refPoint2IsCentroid );
 
  615   sl->setAngle( 
angle );
 
  617     sl->setColorRamp( gradientRamp );
 
  619   sl->restoreOldDataDefinedProperties( props );
 
  632   return QStringLiteral( 
"GradientFill" );
 
  635 void QgsGradientFillSymbolLayer::applyDataDefinedSymbology( 
QgsSymbolRenderContext &context, 
const QPolygonF &points )
 
  680       if ( currentType == QObject::tr( 
"linear" ) )
 
  684       else if ( currentType == QObject::tr( 
"radial" ) )
 
  688       else if ( currentType == QObject::tr( 
"conical" ) )
 
  702       if ( currentCoordMode == QObject::tr( 
"feature" ) )
 
  706       else if ( currentCoordMode == QObject::tr( 
"viewport" ) )
 
  720       if ( currentSpread == QObject::tr( 
"pad" ) )
 
  724       else if ( currentSpread == QObject::tr( 
"repeat" ) )
 
  728       else if ( currentSpread == QObject::tr( 
"reflect" ) )
 
  775   if ( refPoint1IsCentroid || refPoint2IsCentroid )
 
  780     QRectF bbox = points.boundingRect();
 
  781     double centroidX = ( centroid.x() - bbox.left() ) / bbox.width();
 
  782     double centroidY = ( centroid.y() - bbox.top() ) / bbox.height();
 
  784     if ( refPoint1IsCentroid )
 
  786       refPoint1X = centroidX;
 
  787       refPoint1Y = centroidY;
 
  789     if ( refPoint2IsCentroid )
 
  791       refPoint2X = centroidX;
 
  792       refPoint2Y = centroidY;
 
  798                  spread, QPointF( refPoint1X, refPoint1Y ), QPointF( refPoint2X, refPoint2Y ), 
angle );
 
  801 QPointF QgsGradientFillSymbolLayer::rotateReferencePoint( QPointF refPoint, 
double angle )
 
  806   QLineF refLine = QLineF( QPointF( 0.5, 0.5 ), refPoint );
 
  808   refLine.setAngle( refLine.angle() + 
angle );
 
  810   QPointF rotatedReferencePoint = refLine.p2();
 
  812   if ( rotatedReferencePoint.x() > 1 )
 
  813     rotatedReferencePoint.setX( 1 );
 
  814   if ( rotatedReferencePoint.x() < 0 )
 
  815     rotatedReferencePoint.setX( 0 );
 
  816   if ( rotatedReferencePoint.y() > 1 )
 
  817     rotatedReferencePoint.setY( 1 );
 
  818   if ( rotatedReferencePoint.y() < 0 )
 
  819     rotatedReferencePoint.setY( 0 );
 
  821   return rotatedReferencePoint;
 
  825     const QColor &color, 
const QColor &color2, GradientColorType gradientColorType,
 
  827     GradientCoordinateMode coordinateMode, GradientSpread gradientSpread,
 
  828     QPointF referencePoint1, QPointF referencePoint2, 
const double angle )
 
  833   QColor fillColor2 = 
color2;
 
  834   fillColor2.setAlphaF( context.
opacity() * fillColor2.alphaF() );
 
  845       gradient = QLinearGradient( rotatedReferencePoint1, rotatedReferencePoint2 );
 
  848       gradient = QRadialGradient( rotatedReferencePoint1, QLineF( rotatedReferencePoint1, rotatedReferencePoint2 ).length() );
 
  851       gradient = QConicalGradient( rotatedReferencePoint1, QLineF( rotatedReferencePoint1, rotatedReferencePoint2 ).
angle() );
 
  857       gradient.setCoordinateMode( QGradient::ObjectBoundingMode );
 
  860       gradient.setCoordinateMode( QGradient::StretchToDeviceMode );
 
  866       gradient.setSpread( QGradient::PadSpread );
 
  869       gradient.setSpread( QGradient::ReflectSpread );
 
  872       gradient.setSpread( QGradient::RepeatSpread );
 
  888     gradient.setColorAt( 1.0, fillColor2 );
 
  892   brush = QBrush( gradient );
 
  899     selColor.setAlphaF( context.
opacity() );
 
  916   applyDataDefinedSymbology( context, points );
 
  919   p->setPen( Qt::NoPen );
 
  953   map[QStringLiteral( 
"type" )] = QString::number( 
mGradientType );
 
  954   map[QStringLiteral( 
"coordinate_mode" )] = QString::number( 
mCoordinateMode );
 
  960   map[QStringLiteral( 
"angle" )] = QString::number( 
mAngle );
 
  966 #if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) 
 1032     int blurRadius, 
bool useWholeShape, 
double maxDistance )
 
 1033   : mBlurRadius( blurRadius )
 
 1034   , mUseWholeShape( useWholeShape )
 
 1035   , mMaxDistance( maxDistance )
 
 1036   , mColorType( colorType )
 
 1055   if ( props.contains( QStringLiteral( 
"color_type" ) ) )
 
 1059   if ( props.contains( QStringLiteral( 
"shapeburst_color" ) ) )
 
 1064   else if ( props.contains( QStringLiteral( 
"color" ) ) )
 
 1069   if ( props.contains( QStringLiteral( 
"shapeburst_color2" ) ) )
 
 1074   else if ( props.contains( QStringLiteral( 
"gradient_color2" ) ) )
 
 1078   if ( props.contains( QStringLiteral( 
"blur_radius" ) ) )
 
 1080     blurRadius = props[QStringLiteral( 
"blur_radius" )].toInt();
 
 1082   if ( props.contains( QStringLiteral( 
"use_whole_shape" ) ) )
 
 1084     useWholeShape = props[QStringLiteral( 
"use_whole_shape" )].toInt();
 
 1086   if ( props.contains( QStringLiteral( 
"max_distance" ) ) )
 
 1088     maxDistance = props[QStringLiteral( 
"max_distance" )].toDouble();
 
 1090   if ( props.contains( QStringLiteral( 
"offset" ) ) )
 
 1109   if ( props.contains( QStringLiteral( 
"offset_unit" ) ) )
 
 1113   if ( props.contains( QStringLiteral( 
"distance_unit" ) ) )
 
 1117   if ( props.contains( QStringLiteral( 
"offset_map_unit_scale" ) ) )
 
 1121   if ( props.contains( QStringLiteral( 
"distance_map_unit_scale" ) ) )
 
 1125   if ( props.contains( QStringLiteral( 
"ignore_rings" ) ) )
 
 1127     sl->setIgnoreRings( props[QStringLiteral( 
"ignore_rings" )].toInt() );
 
 1131     sl->setColorRamp( gradientRamp );
 
 1134   sl->restoreOldDataDefinedProperties( props );
 
 1136   return sl.release();
 
 1141   return QStringLiteral( 
"ShapeburstFill" );
 
 1146   if ( mGradientRamp.get() == ramp )
 
 1149   mGradientRamp.reset( ramp );
 
 1152 void QgsShapeburstFillSymbolLayer::applyDataDefinedSymbology( 
QgsSymbolRenderContext &context, QColor &color, QColor &color2, 
int &blurRadius, 
bool &useWholeShape,
 
 1153     double &maxDistance, 
bool &ignoreRings )
 
 1210     selColor.setAlphaF( context.
opacity() );
 
 1211   mSelBrush = QBrush( selColor );
 
 1230     p->setBrush( mSelBrush );
 
 1231     QPointF 
offset = mOffset;
 
 1266   int outputPixelMaxDist = 0;
 
 1274   std::unique_ptr< QgsGradientColorRamp > twoColorGradientRamp;
 
 1277     twoColorGradientRamp = std::make_unique< QgsGradientColorRamp >( color1, 
color2 );
 
 1281   p->setPen( QPen( Qt::NoPen ) );
 
 1286   int pointsWidth = 
static_cast< int >( std::round( points.boundingRect().width() ) );
 
 1287   int pointsHeight = 
static_cast< int >( std::round( points.boundingRect().height() ) );
 
 1288   int imWidth = pointsWidth + ( sideBuffer * 2 );
 
 1289   int imHeight = pointsHeight + ( sideBuffer * 2 );
 
 1290   std::unique_ptr< QImage > fillImage = std::make_unique< QImage >( imWidth,
 
 1291                                         imHeight, QImage::Format_ARGB32_Premultiplied );
 
 1292   if ( fillImage->isNull() )
 
 1299   std::unique_ptr< QImage > alphaImage = std::make_unique< QImage >( fillImage->width(), fillImage->height(), QImage::Format_ARGB32_Premultiplied );
 
 1300   if ( alphaImage->isNull() )
 
 1309   fillImage->fill( Qt::black );
 
 1312   alphaImage->fill( Qt::transparent );
 
 1315   QPainter imgPainter;
 
 1316   imgPainter.begin( alphaImage.get() );
 
 1317   imgPainter.setRenderHint( QPainter::Antialiasing, 
true );
 
 1318   imgPainter.setBrush( QBrush( Qt::white ) );
 
 1319   imgPainter.setPen( QPen( Qt::black ) );
 
 1320   imgPainter.translate( -points.boundingRect().left() + sideBuffer, - points.boundingRect().top() + sideBuffer );
 
 1326   imgPainter.begin( fillImage.get() );
 
 1329     imgPainter.drawImage( 0, 0, *alphaImage );
 
 1336     imgPainter.setBrush( QBrush( Qt::white ) );
 
 1337     imgPainter.setPen( QPen( Qt::black ) );
 
 1338     imgPainter.translate( -points.boundingRect().left() + sideBuffer, - points.boundingRect().top() + sideBuffer );
 
 1344   double *dtArray = distanceTransform( fillImage.get(), context.
renderContext() );
 
 1364   imgPainter.begin( fillImage.get() );
 
 1365   imgPainter.setCompositionMode( QPainter::CompositionMode_DestinationIn );
 
 1366   imgPainter.drawImage( 0, 0, *alphaImage );
 
 1374   QPointF 
offset = mOffset;
 
 1391   p->drawImage( points.boundingRect().left() - sideBuffer, points.boundingRect().top() - sideBuffer, *fillImage );
 
 1402 void QgsShapeburstFillSymbolLayer::distanceTransform1d( 
double *f, 
int n, 
int *v, 
double *z, 
double *d )
 
 1408   for ( 
int q = 1; q <= n - 1; q++ )
 
 1410     double s  = ( ( f[q] + q * q ) - ( f[v[k]] + ( v[k] * v[k] ) ) ) / ( 2 * q - 2 * v[k] );
 
 1414       s  = ( ( f[q] + q * q ) - ( f[v[k]] + ( v[k] * v[k] ) ) ) / ( 2 * q - 2 * v[k] );
 
 1423   for ( 
int q = 0; q <= n - 1; q++ )
 
 1425     while ( z[k + 1] < q )
 
 1427     d[q] = ( q - v[k] ) * ( q - v[k] ) + f[v[k]];
 
 1432 void QgsShapeburstFillSymbolLayer::distanceTransform2d( 
double *im, 
int width, 
int height, 
QgsRenderContext &context )
 
 1434   int maxDimension = std::max( width, height );
 
 1435   double *f = 
new double[ maxDimension ];
 
 1436   int *v = 
new int[ maxDimension ];
 
 1437   double *z = 
new double[ maxDimension + 1 ];
 
 1438   double *d = 
new double[ maxDimension ];
 
 1441   for ( 
int x = 0; x < width; x++ )
 
 1446     for ( 
int y = 0; y < height; y++ )
 
 1448       f[y] = im[ x + y * width ];
 
 1450     distanceTransform1d( f, height, v, z, d );
 
 1451     for ( 
int y = 0; y < height; y++ )
 
 1453       im[ x + y * width ] = d[y];
 
 1458   for ( 
int y = 0; y < height; y++ )
 
 1463     for ( 
int x = 0; x < width; x++ )
 
 1465       f[x] = im[  x + y * width ];
 
 1467     distanceTransform1d( f, width, v, z, d );
 
 1468     for ( 
int x = 0; x < width; x++ )
 
 1470       im[  x + y * width ] = d[x];
 
 1481 double *QgsShapeburstFillSymbolLayer::distanceTransform( QImage *im, 
QgsRenderContext &context )
 
 1483   int width = im->width();
 
 1484   int height = im->height();
 
 1486   double *dtArray = 
new double[width * height];
 
 1491   for ( 
int heightIndex = 0; heightIndex < height; ++heightIndex )
 
 1496     const QRgb *scanLine = 
reinterpret_cast< const QRgb * 
>( im->constScanLine( heightIndex ) );
 
 1497     for ( 
int widthIndex = 0; widthIndex < width; ++widthIndex )
 
 1499       tmpRgb = scanLine[widthIndex];
 
 1500       if ( qRed( tmpRgb ) == 0 )
 
 1508         dtArray[ idx ] = 
INF;
 
 1515   distanceTransform2d( dtArray, width, height, context );
 
 1520 void QgsShapeburstFillSymbolLayer::dtArrayToQImage( 
double *array, QImage *im, 
QgsColorRamp *ramp, 
QgsRenderContext &context, 
bool useWholeShape, 
int maxPixelDistance )
 
 1522   int width = im->width();
 
 1523   int height = im->height();
 
 1526   double maxDistanceValue;
 
 1531     double dtMaxValue = array[0];
 
 1532     for ( 
int i = 1; i < ( width * height ); ++i )
 
 1534       if ( array[i] > dtMaxValue )
 
 1536         dtMaxValue = array[i];
 
 1541     maxDistanceValue = std::sqrt( dtMaxValue );
 
 1546     maxDistanceValue = maxPixelDistance;
 
 1551   double squaredVal = 0;
 
 1554   for ( 
int heightIndex = 0; heightIndex < height; ++heightIndex )
 
 1559     QRgb *scanLine = 
reinterpret_cast< QRgb * 
>( im->scanLine( heightIndex ) );
 
 1560     for ( 
int widthIndex = 0; widthIndex < width; ++widthIndex )
 
 1563       squaredVal = array[idx];
 
 1566       if ( maxDistanceValue > 0 )
 
 1568         pixVal = squaredVal > 0 ? std::min( ( std::sqrt( squaredVal ) / maxDistanceValue ), 1.0 ) : 0;
 
 1577       scanLine[widthIndex] = qPremultiply( ramp->
color( pixVal ).rgba() );
 
 1588   map[QStringLiteral( 
"color_type" )] = QString::number( mColorType );
 
 1589   map[QStringLiteral( 
"blur_radius" )] = QString::number( mBlurRadius );
 
 1590   map[QStringLiteral( 
"use_whole_shape" )] = QString::number( mUseWholeShape );
 
 1591   map[QStringLiteral( 
"max_distance" )] = QString::number( mMaxDistance );
 
 1594   map[QStringLiteral( 
"ignore_rings" )] = QString::number( mIgnoreRings );
 
 1598   if ( mGradientRamp )
 
 1600 #if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) 
 1601     map.unite( mGradientRamp->properties() );
 
 1603     map.insert( mGradientRamp->properties() );
 
 1612   std::unique_ptr< QgsShapeburstFillSymbolLayer > sl = std::make_unique< QgsShapeburstFillSymbolLayer >( 
mColor, mColor2, mColorType, mBlurRadius, mUseWholeShape, mMaxDistance );
 
 1613   if ( mGradientRamp )
 
 1615     sl->setColorRamp( mGradientRamp->clone() );
 
 1617   sl->setDistanceUnit( mDistanceUnit );
 
 1618   sl->setDistanceMapUnitScale( mDistanceMapUnitScale );
 
 1619   sl->setIgnoreRings( mIgnoreRings );
 
 1620   sl->setOffset( mOffset );
 
 1621   sl->setOffsetUnit( mOffsetUnit );
 
 1622   sl->setOffsetMapUnitScale( mOffsetMapUnitScale );
 
 1625   return sl.release();
 
 1630   double offsetBleed = context.
convertToPainterUnits( std::max( std::fabs( mOffset.x() ), std::fabs( mOffset.y() ) ), mOffsetUnit, mOffsetMapUnitScale );
 
 1641   mDistanceUnit = unit;
 
 1647   if ( mDistanceUnit == mOffsetUnit )
 
 1649     return mDistanceUnit;
 
 1662   mDistanceMapUnitScale = scale;
 
 1663   mOffsetMapUnitScale = scale;
 
 1668   if ( mDistanceMapUnitScale == mOffsetMapUnitScale )
 
 1670     return mDistanceMapUnitScale;
 
 1696   p->setPen( QPen( Qt::NoPen ) );
 
 1698   QTransform bkTransform = 
mBrush.transform();
 
 1702     QTransform t = 
mBrush.transform();
 
 1703     t.translate( leftCorner.x(), leftCorner.y() );
 
 1704     mBrush.setTransform( t );
 
 1710     p->setBrush( QBrush( selColor ) );
 
 1716     QTransform t = 
mBrush.transform();
 
 1718     mBrush.setTransform( t );
 
 1727       for ( 
auto ringIt = rings->constBegin(); ringIt != rings->constEnd(); ++ringIt )
 
 1734   mBrush.setTransform( bkTransform );
 
 1791     double subLayerBleed = 
mStroke->symbolLayer( 0 )->estimateMaxBleed( context );
 
 1792     return subLayerBleed;
 
 1813     return QColor( Qt::black );
 
 1820   return Qt::SolidLine;
 
 1824     return Qt::SolidLine;
 
 1828     return mStroke->dxfPenStyle();
 
 1837     attr.unite( 
mStroke->usedAttributes( context ) );
 
 1860   , mPatternWidth( width )
 
 1864   mColor = QColor( 255, 255, 255 );
 
 1870   , mPatternWidth( width )
 
 1871   , mSvgData( svgData )
 
 1876   mColor = QColor( 255, 255, 255 );
 
 1878   setDefaultSvgParams();
 
 1886   mPatternWidthUnit = unit;
 
 1887   mSvgStrokeWidthUnit = unit;
 
 1889   mStroke->setOutputUnit( unit );
 
 1895   if ( mPatternWidthUnit != unit || mSvgStrokeWidthUnit != unit || 
mStrokeWidthUnit != unit )
 
 1905   mPatternWidthMapUnitScale = scale;
 
 1906   mSvgStrokeWidthMapUnitScale = scale;
 
 1913        mPatternWidthMapUnitScale == mSvgStrokeWidthMapUnitScale &&
 
 1916     return mPatternWidthMapUnitScale;
 
 1926   mSvgFilePath = svgPath;
 
 1927   setDefaultSvgParams();
 
 1937   if ( 
properties.contains( QStringLiteral( 
"width" ) ) )
 
 1939     width = 
properties[QStringLiteral( 
"width" )].toDouble();
 
 1941   if ( 
properties.contains( QStringLiteral( 
"svgFile" ) ) )
 
 1945   if ( 
properties.contains( QStringLiteral( 
"angle" ) ) )
 
 1950   std::unique_ptr< QgsSVGFillSymbolLayer > symbolLayer;
 
 1953     symbolLayer = std::make_unique< QgsSVGFillSymbolLayer >( 
svgFilePath, width, 
angle );
 
 1957     if ( 
properties.contains( QStringLiteral( 
"data" ) ) )
 
 1959       data = QByteArray::fromHex( 
properties[QStringLiteral( 
"data" )].toString().toLocal8Bit() );
 
 1961     symbolLayer = std::make_unique< QgsSVGFillSymbolLayer >( data, width, 
angle );
 
 1965   if ( 
properties.contains( QStringLiteral( 
"svgFillColor" ) ) )
 
 1970   else if ( 
properties.contains( QStringLiteral( 
"color" ) ) )
 
 1974   if ( 
properties.contains( QStringLiteral( 
"svgOutlineColor" ) ) )
 
 1979   else if ( 
properties.contains( QStringLiteral( 
"outline_color" ) ) )
 
 1983   else if ( 
properties.contains( QStringLiteral( 
"line_color" ) ) )
 
 1987   if ( 
properties.contains( QStringLiteral( 
"svgOutlineWidth" ) ) )
 
 1990     symbolLayer->setSvgStrokeWidth( 
properties[QStringLiteral( 
"svgOutlineWidth" )].toDouble() );
 
 1992   else if ( 
properties.contains( QStringLiteral( 
"outline_width" ) ) )
 
 1994     symbolLayer->setSvgStrokeWidth( 
properties[QStringLiteral( 
"outline_width" )].toDouble() );
 
 1996   else if ( 
properties.contains( QStringLiteral( 
"line_width" ) ) )
 
 1998     symbolLayer->setSvgStrokeWidth( 
properties[QStringLiteral( 
"line_width" )].toDouble() );
 
 2002   if ( 
properties.contains( QStringLiteral( 
"pattern_width_unit" ) ) )
 
 2006   if ( 
properties.contains( QStringLiteral( 
"pattern_width_map_unit_scale" ) ) )
 
 2010   if ( 
properties.contains( QStringLiteral( 
"svg_outline_width_unit" ) ) )
 
 2014   if ( 
properties.contains( QStringLiteral( 
"svg_outline_width_map_unit_scale" ) ) )
 
 2018   if ( 
properties.contains( QStringLiteral( 
"outline_width_unit" ) ) )
 
 2022   if ( 
properties.contains( QStringLiteral( 
"outline_width_map_unit_scale" ) ) )
 
 2027   if ( 
properties.contains( QStringLiteral( 
"parameters" ) ) )
 
 2033   symbolLayer->restoreOldDataDefinedProperties( 
properties );
 
 2035   return symbolLayer.release();
 
 2040   QVariantMap::iterator it = 
properties.find( QStringLiteral( 
"svgFile" ) );
 
 2052   return QStringLiteral( 
"SVGFill" );
 
 2055 void QgsSVGFillSymbolLayer::applyPattern( QBrush &brush, 
const QString &svgFilePath, 
double patternWidth, 
QgsUnitTypes::RenderUnit patternWidthUnit,
 
 2056     const QColor &svgFillColor, 
const QColor &svgStrokeColor, 
double svgStrokeWidth,
 
 2060   if ( mSvgViewBox.isNull() )
 
 2067   if ( 
static_cast< int >( size ) < 1.0 || 10000.0 < size )
 
 2069     brush.setTextureImage( QImage() );
 
 2073     bool fitsInCache = 
true;
 
 2081       double hwRatio = 1.0;
 
 2082       if ( patternPict.width() > 0 )
 
 2084         hwRatio = 
static_cast< double >( patternPict.height() ) / 
static_cast< double >( patternPict.width() );
 
 2086       patternImage = QImage( 
static_cast< int >( size ), 
static_cast< int >( size * hwRatio ), QImage::Format_ARGB32_Premultiplied );
 
 2087       patternImage.fill( 0 ); 
 
 2089       QPainter p( &patternImage );
 
 2090       p.drawPicture( QPointF( size / 2, size * hwRatio / 2 ), patternPict );
 
 2093     QTransform brushTransform;
 
 2096       QImage transparentImage = patternImage.copy();
 
 2098       brush.setTextureImage( transparentImage );
 
 2102       brush.setTextureImage( patternImage );
 
 2104     brush.setTransform( brushTransform );
 
 2112   applyPattern( 
mBrush, mSvgFilePath, mPatternWidth, mPatternWidthUnit, 
mColor, mSvgStrokeColor, mSvgStrokeWidth, mSvgStrokeWidthUnit, context, mPatternWidthMapUnitScale, mSvgStrokeWidthMapUnitScale, evaluatedParameters );
 
 2131   if ( !mSvgFilePath.isEmpty() )
 
 2133     map.insert( QStringLiteral( 
"svgFile" ), mSvgFilePath );
 
 2137     map.insert( QStringLiteral( 
"data" ), QString( mSvgData.toHex() ) );
 
 2140   map.insert( QStringLiteral( 
"width" ), QString::number( mPatternWidth ) );
 
 2141   map.insert( QStringLiteral( 
"angle" ), QString::number( 
mAngle ) );
 
 2146   map.insert( QStringLiteral( 
"outline_width" ), QString::number( mSvgStrokeWidth ) );
 
 2163   std::unique_ptr< QgsSVGFillSymbolLayer > clonedLayer;
 
 2164   if ( !mSvgFilePath.isEmpty() )
 
 2166     clonedLayer = std::make_unique< QgsSVGFillSymbolLayer >( mSvgFilePath, mPatternWidth, 
mAngle );
 
 2167     clonedLayer->setSvgFillColor( 
mColor );
 
 2168     clonedLayer->setSvgStrokeColor( mSvgStrokeColor );
 
 2169     clonedLayer->setSvgStrokeWidth( mSvgStrokeWidth );
 
 2173     clonedLayer = std::make_unique< QgsSVGFillSymbolLayer >( mSvgData, mPatternWidth, 
mAngle );
 
 2176   clonedLayer->setPatternWidthUnit( mPatternWidthUnit );
 
 2177   clonedLayer->setPatternWidthMapUnitScale( mPatternWidthMapUnitScale );
 
 2178   clonedLayer->setSvgStrokeWidthUnit( mSvgStrokeWidthUnit );
 
 2179   clonedLayer->setSvgStrokeWidthMapUnitScale( mSvgStrokeWidthMapUnitScale );
 
 2183   clonedLayer->setParameters( mParameters );
 
 2187     clonedLayer->setSubSymbol( 
mStroke->clone() );
 
 2191   return clonedLayer.release();
 
 2196   QDomElement symbolizerElem = doc.createElement( QStringLiteral( 
"se:PolygonSymbolizer" ) );
 
 2197   if ( !props.value( QStringLiteral( 
"uom" ), QString() ).toString().isEmpty() )
 
 2198     symbolizerElem.setAttribute( QStringLiteral( 
"uom" ), props.value( QStringLiteral( 
"uom" ), QString() ).toString() );
 
 2199   element.appendChild( symbolizerElem );
 
 2203   QDomElement fillElem = doc.createElement( QStringLiteral( 
"se:Fill" ) );
 
 2204   symbolizerElem.appendChild( fillElem );
 
 2206   QDomElement graphicFillElem = doc.createElement( QStringLiteral( 
"se:GraphicFill" ) );
 
 2207   fillElem.appendChild( graphicFillElem );
 
 2209   QDomElement graphicElem = doc.createElement( QStringLiteral( 
"se:Graphic" ) );
 
 2210   graphicFillElem.appendChild( graphicElem );
 
 2212   if ( !mSvgFilePath.isEmpty() )
 
 2223     symbolizerElem.appendChild( doc.createComment( QStringLiteral( 
"SVG from data not implemented yet" ) ) );
 
 2229   double angle = props.value( QStringLiteral( 
"angle" ), QStringLiteral( 
"0" ) ).toDouble( &ok );
 
 2232     angleFunc = QStringLiteral( 
"%1 + %2" ).arg( props.value( QStringLiteral( 
"angle" ), QStringLiteral( 
"0" ) ).toString() ).arg( 
mAngle );
 
 2245     mStroke->toSld( doc, element, props );
 
 2257   QString path, mimeType;
 
 2259   Qt::PenStyle penStyle;
 
 2260   double size, strokeWidth;
 
 2262   QDomElement fillElem = element.firstChildElement( QStringLiteral( 
"Fill" ) );
 
 2263   if ( fillElem.isNull() )
 
 2266   QDomElement graphicFillElem = fillElem.firstChildElement( QStringLiteral( 
"GraphicFill" ) );
 
 2267   if ( graphicFillElem.isNull() )
 
 2270   QDomElement graphicElem = graphicFillElem.firstChildElement( QStringLiteral( 
"Graphic" ) );
 
 2271   if ( graphicElem.isNull() )
 
 2277   if ( mimeType != QLatin1String( 
"image/svg+xml" ) )
 
 2282   QString uom = element.attribute( QStringLiteral( 
"uom" ) );
 
 2291     double d = angleFunc.toDouble( &ok );
 
 2296   std::unique_ptr< QgsSVGFillSymbolLayer > sl = std::make_unique< QgsSVGFillSymbolLayer >( path, size, 
angle );
 
 2297   sl->setOutputUnit( QgsUnitTypes::RenderUnit::RenderPixels );
 
 2300   sl->setSvgStrokeWidth( strokeWidth );
 
 2303   QDomElement strokeElem = element.firstChildElement( QStringLiteral( 
"Stroke" ) );
 
 2304   if ( !strokeElem.isNull() )
 
 2315   return sl.release();
 
 2333   double width = mPatternWidth;
 
 2339   QString svgFile = mSvgFilePath;
 
 2358   double strokeWidth = mSvgStrokeWidth;
 
 2367                 mSvgStrokeWidthUnit, context, mPatternWidthMapUnitScale, mSvgStrokeWidthMapUnitScale, evaluatedParameters );
 
 2371 void QgsSVGFillSymbolLayer::storeViewBox()
 
 2373   if ( !mSvgData.isEmpty() )
 
 2375     QSvgRenderer r( mSvgData );
 
 2378       mSvgViewBox = r.viewBoxF();
 
 2383   mSvgViewBox = QRectF();
 
 2386 void QgsSVGFillSymbolLayer::setDefaultSvgParams()
 
 2388   if ( mSvgFilePath.isEmpty() )
 
 2393   bool hasFillParam, hasFillOpacityParam, hasStrokeParam, hasStrokeWidthParam, hasStrokeOpacityParam;
 
 2394   bool hasDefaultFillColor, hasDefaultFillOpacity, hasDefaultStrokeColor, hasDefaultStrokeWidth, hasDefaultStrokeOpacity;
 
 2395   QColor defaultFillColor, defaultStrokeColor;
 
 2396   double defaultStrokeWidth, defaultFillOpacity, defaultStrokeOpacity;
 
 2398       hasFillOpacityParam, hasDefaultFillOpacity, defaultFillOpacity,
 
 2399       hasStrokeParam, hasDefaultStrokeColor, defaultStrokeColor,
 
 2400       hasStrokeWidthParam, hasDefaultStrokeWidth, defaultStrokeWidth,
 
 2401       hasStrokeOpacityParam, hasDefaultStrokeOpacity, defaultStrokeOpacity );
 
 2403   double newFillOpacity = hasFillOpacityParam ? 
mColor.alphaF() : 1.0;
 
 2404   double newStrokeOpacity = hasStrokeOpacityParam ? mSvgStrokeColor.alphaF() : 1.0;
 
 2406   if ( hasDefaultFillColor )
 
 2408     mColor = defaultFillColor;
 
 2409     mColor.setAlphaF( newFillOpacity );
 
 2411   if ( hasDefaultFillOpacity )
 
 2413     mColor.setAlphaF( defaultFillOpacity );
 
 2415   if ( hasDefaultStrokeColor )
 
 2417     mSvgStrokeColor = defaultStrokeColor;
 
 2418     mSvgStrokeColor.setAlphaF( newStrokeOpacity );
 
 2420   if ( hasDefaultStrokeOpacity )
 
 2422     mSvgStrokeColor.setAlphaF( defaultStrokeOpacity );
 
 2424   if ( hasDefaultStrokeWidth )
 
 2426     mSvgStrokeWidth = defaultStrokeWidth;
 
 2445   delete mFillLineSymbol;
 
 2462   return mFillLineSymbol ? mFillLineSymbol->
color() : 
mColor;
 
 2477       delete mFillLineSymbol;
 
 2478       mFillLineSymbol = lineSymbol;
 
 2489   return mFillLineSymbol;
 
 2495   if ( mFillLineSymbol )
 
 2517   mDistanceUnit = unit;
 
 2518   mLineWidthUnit = unit;
 
 2525   if ( mDistanceUnit != unit || mLineWidthUnit != unit || mOffsetUnit != unit )
 
 2542   mDistanceMapUnitScale = scale;
 
 2543   mLineWidthMapUnitScale = scale;
 
 2544   mOffsetMapUnitScale = scale;
 
 2550        mDistanceMapUnitScale == mLineWidthMapUnitScale &&
 
 2551        mLineWidthMapUnitScale == mOffsetMapUnitScale )
 
 2553     return mDistanceMapUnitScale;
 
 2560   std::unique_ptr< QgsLinePatternFillSymbolLayer > patternLayer = std::make_unique< QgsLinePatternFillSymbolLayer >();
 
 2566   QColor 
color( Qt::black );
 
 2569   if ( 
properties.contains( QStringLiteral( 
"lineangle" ) ) )
 
 2574   else if ( 
properties.contains( QStringLiteral( 
"angle" ) ) )
 
 2578   patternLayer->setLineAngle( 
lineAngle );
 
 2580   if ( 
properties.contains( QStringLiteral( 
"distance" ) ) )
 
 2584   patternLayer->setDistance( 
distance );
 
 2586   if ( 
properties.contains( QStringLiteral( 
"linewidth" ) ) )
 
 2591   else if ( 
properties.contains( QStringLiteral( 
"outline_width" ) ) )
 
 2595   else if ( 
properties.contains( QStringLiteral( 
"line_width" ) ) )
 
 2599   patternLayer->setLineWidth( 
lineWidth );
 
 2601   if ( 
properties.contains( QStringLiteral( 
"color" ) ) )
 
 2605   else if ( 
properties.contains( QStringLiteral( 
"outline_color" ) ) )
 
 2609   else if ( 
properties.contains( QStringLiteral( 
"line_color" ) ) )
 
 2613   patternLayer->setColor( 
color );
 
 2615   if ( 
properties.contains( QStringLiteral( 
"offset" ) ) )
 
 2619   patternLayer->setOffset( 
offset );
 
 2622   if ( 
properties.contains( QStringLiteral( 
"distance_unit" ) ) )
 
 2626   if ( 
properties.contains( QStringLiteral( 
"distance_map_unit_scale" ) ) )
 
 2630   if ( 
properties.contains( QStringLiteral( 
"line_width_unit" ) ) )
 
 2634   else if ( 
properties.contains( QStringLiteral( 
"outline_width_unit" ) ) )
 
 2638   if ( 
properties.contains( QStringLiteral( 
"line_width_map_unit_scale" ) ) )
 
 2642   if ( 
properties.contains( QStringLiteral( 
"offset_unit" ) ) )
 
 2646   if ( 
properties.contains( QStringLiteral( 
"offset_map_unit_scale" ) ) )
 
 2650   if ( 
properties.contains( QStringLiteral( 
"outline_width_unit" ) ) )
 
 2654   if ( 
properties.contains( QStringLiteral( 
"outline_width_map_unit_scale" ) ) )
 
 2659   patternLayer->restoreOldDataDefinedProperties( 
properties );
 
 2661   return patternLayer.release();
 
 2666   return QStringLiteral( 
"LinePatternFill" );
 
 2669 void QgsLinePatternFillSymbolLayer::applyPattern( 
const QgsSymbolRenderContext &context, QBrush &brush, 
double lineAngle, 
double distance )
 
 2671   mBrush.setTextureImage( QImage() ); 
 
 2673   if ( !mFillLineSymbol )
 
 2678   std::unique_ptr< QgsLineSymbol > fillLineSymbol( mFillLineSymbol->
clone() );
 
 2679   if ( !fillLineSymbol )
 
 2694   outputPixelOffset = std::fmod( outputPixelOffset, outputPixelDist );
 
 2695   if ( outputPixelOffset > outputPixelDist / 2.0 )
 
 2696     outputPixelOffset -= outputPixelDist;
 
 2700   double outputPixelBleed = 0;
 
 2701   double outputPixelInterval = 0; 
 
 2702   for ( 
int i = 0; i < fillLineSymbol->symbolLayerCount(); i++ )
 
 2706     outputPixelBleed = std::max( outputPixelBleed, outputPixelLayerBleed );
 
 2709     if ( markerLineLayer )
 
 2718       outputPixelInterval = std::max( outputPixelInterval, outputPixelLayerInterval );
 
 2722   if ( outputPixelInterval > 0 )
 
 2726     double intervalScale = std::round( outputPixelInterval ) / outputPixelInterval;
 
 2727     outputPixelInterval = std::round( outputPixelInterval );
 
 2729     for ( 
int i = 0; i < fillLineSymbol->symbolLayerCount(); i++ )
 
 2734       if ( markerLineLayer )
 
 2748     height = outputPixelDist;
 
 2749     width = outputPixelInterval > 0 ? outputPixelInterval : height;
 
 2753     width = outputPixelDist;
 
 2754     height = outputPixelInterval > 0 ? outputPixelInterval : width;
 
 2758     height = outputPixelDist / std::cos( 
lineAngle * M_PI / 180 ); 
 
 2759     width = outputPixelDist / std::sin( 
lineAngle * M_PI / 180 );
 
 2762     lineAngle = 180 * std::atan2( 
static_cast< double >( height ), 
static_cast< double >( width ) ) / M_PI;
 
 2768     height = std::abs( height );
 
 2769     width = std::abs( width );
 
 2771     outputPixelDist = std::abs( height * std::cos( 
lineAngle * M_PI / 180 ) );
 
 2775     int offsetHeight = 
static_cast< int >( std::round( outputPixelOffset / std::cos( 
lineAngle * M_PI / 180 ) ) );
 
 2776     outputPixelOffset = offsetHeight * std::cos( 
lineAngle * M_PI / 180 );
 
 2785   int bufferMulti = 
static_cast< int >( std::max( std::ceil( outputPixelBleed / width ), std::ceil( outputPixelBleed / width ) ) );
 
 2789   bufferMulti = std::max( bufferMulti, 1 );
 
 2791   int xBuffer = width * bufferMulti;
 
 2792   int yBuffer = height * bufferMulti;
 
 2793   int innerWidth = width;
 
 2794   int innerHeight = height;
 
 2795   width += 2 * xBuffer;
 
 2796   height += 2 * yBuffer;
 
 2799   if ( width > 10000 || height > 10000 || width == 0 || height == 0 )
 
 2804   QImage patternImage( width, height, QImage::Format_ARGB32 );
 
 2805   patternImage.fill( 0 );
 
 2807   QPointF p1, p2, p3, p4, p5, p6;
 
 2810     p1 = QPointF( 0, yBuffer );
 
 2811     p2 = QPointF( width, yBuffer );
 
 2812     p3 = QPointF( 0, yBuffer + innerHeight );
 
 2813     p4 = QPointF( width, yBuffer + innerHeight );
 
 2817     p1 = QPointF( xBuffer, height );
 
 2818     p2 = QPointF( xBuffer, 0 );
 
 2819     p3 = QPointF( xBuffer + innerWidth, height );
 
 2820     p4 = QPointF( xBuffer + innerWidth, 0 );
 
 2824     dx = outputPixelDist * std::cos( ( 90 - 
lineAngle ) * M_PI / 180.0 );
 
 2825     dy = outputPixelDist * std::sin( ( 90 - 
lineAngle ) * M_PI / 180.0 );
 
 2826     p1 = QPointF( 0, height );
 
 2827     p2 = QPointF( width, 0 );
 
 2828     p3 = QPointF( -dx, height - dy );
 
 2829     p4 = QPointF( width - dx, -dy );
 
 2830     p5 = QPointF( dx, height + dy );
 
 2831     p6 = QPointF( width + dx, dy );
 
 2835     dx = outputPixelDist * std::cos( ( 90 - 
lineAngle ) * M_PI / 180.0 );
 
 2836     dy = outputPixelDist * std::sin( ( 90 - 
lineAngle ) * M_PI / 180.0 );
 
 2837     p1 = QPointF( width, 0 );
 
 2838     p2 = QPointF( 0, height );
 
 2839     p3 = QPointF( width - dx, -dy );
 
 2840     p4 = QPointF( -dx, height - dy );
 
 2841     p5 = QPointF( width + dx, dy );
 
 2842     p6 = QPointF( dx, height + dy );
 
 2846     dy = outputPixelDist * std::cos( ( 180 - 
lineAngle ) * M_PI / 180 );
 
 2847     dx = outputPixelDist * std::sin( ( 180 - 
lineAngle ) * M_PI / 180 );
 
 2848     p1 = QPointF( 0, 0 );
 
 2849     p2 = QPointF( width, height );
 
 2850     p5 = QPointF( dx, -dy );
 
 2851     p6 = QPointF( width + dx, height - dy );
 
 2852     p3 = QPointF( -dx, dy );
 
 2853     p4 = QPointF( width - dx, height + dy );
 
 2857     dy = outputPixelDist * std::cos( ( 180 - 
lineAngle ) * M_PI / 180 );
 
 2858     dx = outputPixelDist * std::sin( ( 180 - 
lineAngle ) * M_PI / 180 );
 
 2859     p1 = QPointF( width, height );
 
 2860     p2 = QPointF( 0, 0 );
 
 2861     p5 = QPointF( width + dx, height - dy );
 
 2862     p6 = QPointF( dx, -dy );
 
 2863     p3 = QPointF( width - dx, height + dy );
 
 2864     p4 = QPointF( -dx, dy );
 
 2871     p3 = QPointF( tempPt.x(), tempPt.y() );
 
 2873     p4 = QPointF( tempPt.x(), tempPt.y() );
 
 2875     p5 = QPointF( tempPt.x(), tempPt.y() );
 
 2877     p6 = QPointF( tempPt.x(), tempPt.y() );
 
 2881     p1 = QPointF( tempPt.x(), tempPt.y() );
 
 2883     p2 = QPointF( tempPt.x(), tempPt.y() );
 
 2886   QPainter p( &patternImage );
 
 2890   p.setRenderHint( QPainter::Antialiasing, 
false ); 
 
 2891   QPen pen( QColor( Qt::black ) );
 
 2892   pen.setWidthF( 0.1 );
 
 2893   pen.setCapStyle( Qt::FlatCap );
 
 2898   QPolygon polygon = QPolygon() << QPoint( 0, 0 ) << QPoint( width - 1, 0 ) << QPoint( width - 1, height - 1 ) << QPoint( 0, height - 1 ) << QPoint( 0, 0 );
 
 2899   p.drawPolygon( polygon );
 
 2901   polygon = QPolygon() << QPoint( xBuffer, yBuffer ) << QPoint( width - xBuffer - 1, yBuffer ) << QPoint( width - xBuffer - 1, height - yBuffer - 1 ) << QPoint( xBuffer, height - yBuffer - 1 ) << QPoint( xBuffer, yBuffer );
 
 2902   p.drawPolygon( polygon );
 
 2908   p.setRenderHint( QPainter::Antialiasing, 
true );
 
 2919   fillLineSymbol->startRender( lineRenderContext, context.
fields() );
 
 2921   QVector<QPolygonF> polygons;
 
 2922   polygons.append( QPolygonF() << p1 << p2 );
 
 2923   polygons.append( QPolygonF() << p3 << p4 );
 
 2926     polygons.append( QPolygonF() << p5 << p6 );
 
 2929   for ( 
const QPolygonF &polygon : std::as_const( polygons ) )
 
 2931     fillLineSymbol->renderPolyline( polygon, context.
feature(), lineRenderContext, -1, context.
selected() );
 
 2934   fillLineSymbol->stopRender( lineRenderContext );
 
 2938   patternImage = patternImage.copy( xBuffer, yBuffer, patternImage.width() - 2 * xBuffer, patternImage.height() - 2 * yBuffer );
 
 2943     QImage transparentImage = patternImage.copy();
 
 2945     brush.setTextureImage( transparentImage );
 
 2949     brush.setTextureImage( patternImage );
 
 2952   QTransform brushTransform;
 
 2953   brush.setTransform( brushTransform );
 
 2958   applyPattern( context, 
mBrush, mLineAngle, mDistance );
 
 2960   if ( mFillLineSymbol )
 
 2968   if ( mFillLineSymbol )
 
 2977   map.insert( QStringLiteral( 
"angle" ), QString::number( mLineAngle ) );
 
 2978   map.insert( QStringLiteral( 
"distance" ), QString::number( mDistance ) );
 
 2979   map.insert( QStringLiteral( 
"line_width" ), QString::number( mLineWidth ) );
 
 2981   map.insert( QStringLiteral( 
"offset" ), QString::number( mOffset ) );
 
 2996   if ( mFillLineSymbol )
 
 3007   QDomElement symbolizerElem = doc.createElement( QStringLiteral( 
"se:PolygonSymbolizer" ) );
 
 3008   if ( !props.value( QStringLiteral( 
"uom" ), QString() ).toString().isEmpty() )
 
 3009     symbolizerElem.setAttribute( QStringLiteral( 
"uom" ), props.value( QStringLiteral( 
"uom" ), QString() ).toString() );
 
 3010   element.appendChild( symbolizerElem );
 
 3015   QDomElement fillElem = doc.createElement( QStringLiteral( 
"se:Fill" ) );
 
 3016   symbolizerElem.appendChild( fillElem );
 
 3018   QDomElement graphicFillElem = doc.createElement( QStringLiteral( 
"se:GraphicFill" ) );
 
 3019   fillElem.appendChild( graphicFillElem );
 
 3021   QDomElement graphicElem = doc.createElement( QStringLiteral( 
"se:Graphic" ) );
 
 3022   graphicFillElem.appendChild( graphicElem );
 
 3025   QColor lineColor = mFillLineSymbol ? mFillLineSymbol->
color() : QColor();
 
 3026   double lineWidth = mFillLineSymbol ? mFillLineSymbol->
width() : 0.0;
 
 3034   double angle = props.value( QStringLiteral( 
"angle" ), QStringLiteral( 
"0" ) ).toDouble( &ok );
 
 3037     angleFunc = QStringLiteral( 
"%1 + %2" ).arg( props.value( QStringLiteral( 
"angle" ), QStringLiteral( 
"0" ) ).toString() ).arg( mLineAngle );
 
 3041     angleFunc = QString::number( 
angle + mLineAngle );
 
 3046   QPointF lineOffset( std::sin( mLineAngle ) * mOffset, std::cos( mLineAngle ) * mOffset );
 
 3053   QString featureStyle;
 
 3054   featureStyle.append( 
"Brush(" );
 
 3055   featureStyle.append( QStringLiteral( 
"fc:%1" ).arg( 
mColor.name() ) );
 
 3056   featureStyle.append( QStringLiteral( 
",bc:%1" ).arg( QLatin1String( 
"#00000000" ) ) ); 
 
 3057   featureStyle.append( 
",id:\"ogr-brush-2\"" );
 
 3058   featureStyle.append( QStringLiteral( 
",a:%1" ).arg( mLineAngle ) );
 
 3059   featureStyle.append( QStringLiteral( 
",s:%1" ).arg( mLineWidth * widthScaleFactor ) );
 
 3060   featureStyle.append( 
",dx:0mm" );
 
 3061   featureStyle.append( QStringLiteral( 
",dy:%1mm" ).arg( mDistance * widthScaleFactor ) );
 
 3062   featureStyle.append( 
')' );
 
 3063   return featureStyle;
 
 3094   Qt::PenStyle lineStyle;
 
 3096   QDomElement fillElem = element.firstChildElement( QStringLiteral( 
"Fill" ) );
 
 3097   if ( fillElem.isNull() )
 
 3100   QDomElement graphicFillElem = fillElem.firstChildElement( QStringLiteral( 
"GraphicFill" ) );
 
 3101   if ( graphicFillElem.isNull() )
 
 3104   QDomElement graphicElem = graphicFillElem.firstChildElement( QStringLiteral( 
"Graphic" ) );
 
 3105   if ( graphicElem.isNull() )
 
 3111   if ( name != QLatin1String( 
"horline" ) )
 
 3119     double d = angleFunc.toDouble( &ok );
 
 3128     offset = std::sqrt( std::pow( vectOffset.x(), 2 ) + std::pow( vectOffset.y(), 2 ) );
 
 3131   QString uom = element.attribute( QStringLiteral( 
"uom" ) );
 
 3135   std::unique_ptr< QgsLinePatternFillSymbolLayer > sl = std::make_unique< QgsLinePatternFillSymbolLayer >();
 
 3136   sl->setOutputUnit( QgsUnitTypes::RenderUnit::RenderPixels );
 
 3137   sl->setColor( lineColor );
 
 3139   sl->setLineAngle( 
angle );
 
 3141   sl->setDistance( size );
 
 3144   QDomElement strokeElem = element.firstChildElement( QStringLiteral( 
"Stroke" ) );
 
 3145   if ( !strokeElem.isNull() )
 
 3156   return sl.release();
 
 3243   std::unique_ptr< QgsPointPatternFillSymbolLayer > layer = std::make_unique< QgsPointPatternFillSymbolLayer >();
 
 3244   if ( 
properties.contains( QStringLiteral( 
"distance_x" ) ) )
 
 3246     layer->setDistanceX( 
properties[QStringLiteral( 
"distance_x" )].toDouble() );
 
 3248   if ( 
properties.contains( QStringLiteral( 
"distance_y" ) ) )
 
 3250     layer->setDistanceY( 
properties[QStringLiteral( 
"distance_y" )].toDouble() );
 
 3252   if ( 
properties.contains( QStringLiteral( 
"displacement_x" ) ) )
 
 3254     layer->setDisplacementX( 
properties[QStringLiteral( 
"displacement_x" )].toDouble() );
 
 3256   if ( 
properties.contains( QStringLiteral( 
"displacement_y" ) ) )
 
 3258     layer->setDisplacementY( 
properties[QStringLiteral( 
"displacement_y" )].toDouble() );
 
 3260   if ( 
properties.contains( QStringLiteral( 
"offset_x" ) ) )
 
 3262     layer->setOffsetX( 
properties[QStringLiteral( 
"offset_x" )].toDouble() );
 
 3264   if ( 
properties.contains( QStringLiteral( 
"offset_y" ) ) )
 
 3266     layer->setOffsetY( 
properties[QStringLiteral( 
"offset_y" )].toDouble() );
 
 3269   if ( 
properties.contains( QStringLiteral( 
"distance_x_unit" ) ) )
 
 3273   if ( 
properties.contains( QStringLiteral( 
"distance_x_map_unit_scale" ) ) )
 
 3277   if ( 
properties.contains( QStringLiteral( 
"distance_y_unit" ) ) )
 
 3281   if ( 
properties.contains( QStringLiteral( 
"distance_y_map_unit_scale" ) ) )
 
 3285   if ( 
properties.contains( QStringLiteral( 
"displacement_x_unit" ) ) )
 
 3289   if ( 
properties.contains( QStringLiteral( 
"displacement_x_map_unit_scale" ) ) )
 
 3293   if ( 
properties.contains( QStringLiteral( 
"displacement_y_unit" ) ) )
 
 3297   if ( 
properties.contains( QStringLiteral( 
"displacement_y_map_unit_scale" ) ) )
 
 3301   if ( 
properties.contains( QStringLiteral( 
"offset_x_unit" ) ) )
 
 3305   if ( 
properties.contains( QStringLiteral( 
"offset_x_map_unit_scale" ) ) )
 
 3309   if ( 
properties.contains( QStringLiteral( 
"offset_y_unit" ) ) )
 
 3313   if ( 
properties.contains( QStringLiteral( 
"offset_y_map_unit_scale" ) ) )
 
 3318   if ( 
properties.contains( QStringLiteral( 
"outline_width_unit" ) ) )
 
 3322   if ( 
properties.contains( QStringLiteral( 
"outline_width_map_unit_scale" ) ) )
 
 3327   layer->restoreOldDataDefinedProperties( 
properties );
 
 3329   return layer.release();
 
 3334   return QStringLiteral( 
"PointPatternFill" );
 
 3337 void QgsPointPatternFillSymbolLayer::applyPattern( 
const QgsSymbolRenderContext &context, QBrush &brush, 
double distanceX, 
double distanceY,
 
 3338     double displacementX, 
double displacementY, 
double offsetX, 
double offsetY )
 
 3348   if ( width > 10000 || height > 10000 ) 
 
 3351     brush.setTextureImage( img );
 
 3355   QImage patternImage( width, height, QImage::Format_ARGB32 );
 
 3356   patternImage.fill( 0 );
 
 3357   if ( patternImage.isNull() )
 
 3359     brush.setTextureImage( QImage() );
 
 3364     QPainter p( &patternImage );
 
 3385     for ( 
double currentX = -width; currentX <= width * 2.0; currentX += width )
 
 3387       for ( 
double currentY = -height; currentY <= height * 2.0; currentY += height )
 
 3396     for ( 
double currentX = -width; currentX <= width * 2.0; currentX += width )
 
 3398       for ( 
double currentY = -height / 2.0; currentY <= height * 2.0; currentY += height )
 
 3404     for ( 
double currentX = -width / 2.0; currentX <= width * 2.0; currentX += width )
 
 3406       for ( 
double currentY = -height; currentY <= height * 2.0; currentY += height / 2.0 )
 
 3408         mMarkerSymbol->
renderPoint( QPointF( currentX + widthOffset + ( std::fmod( currentY, height ) != 0 ? displacementPixelX : 0 ), currentY + heightOffset - displacementPixelY ), context.
feature(), pointRenderContext );
 
 3417     QImage transparentImage = patternImage.copy();
 
 3419     brush.setTextureImage( transparentImage );
 
 3423     brush.setTextureImage( patternImage );
 
 3425   QTransform brushTransform;
 
 3426   brush.setTransform( brushTransform );
 
 3435   if ( mRenderUsingMarkers )
 
 3453   if ( mRenderUsingMarkers )
 
 3466   if ( !mRenderUsingMarkers )
 
 3528   p->setPen( QPen( Qt::NoPen ) );
 
 3533     p->setBrush( QBrush( selColor ) );
 
 3540   path.addPolygon( points );
 
 3543     for ( 
const QPolygonF &ring : *rings )
 
 3545       path.addPolygon( ring );
 
 3548   p->setClipPath( path, Qt::IntersectClip );
 
 3550   const double left = points.boundingRect().left();
 
 3551   const double top = points.boundingRect().top();
 
 3552   const double right = points.boundingRect().right();
 
 3553   const double bottom = points.boundingRect().bottom();
 
 3560   bool alternateColumn = 
false;
 
 3561   int currentCol = -3; 
 
 3562   for ( 
double currentX = ( std::floor( left / width ) - 2 ) * width; currentX <= right + 2 * width; currentX += width, alternateColumn = !alternateColumn )
 
 3564     if ( needsExpressionContext )
 
 3567     bool alternateRow = 
false;
 
 3568     const double columnX = currentX + widthOffset;
 
 3569     int currentRow = -3;
 
 3570     for ( 
double currentY = ( std::floor( top / height ) - 2 ) * height; currentY <= bottom + 2 * height; currentY += height, alternateRow = !alternateRow )
 
 3572       double y = currentY + heightOffset;
 
 3575         x += displacementPixelX;
 
 3577       if ( !alternateColumn )
 
 3578         y -= displacementPixelY;
 
 3580       if ( needsExpressionContext )
 
 3597       for ( 
auto ringIt = rings->constBegin(); ringIt != rings->constEnd(); ++ringIt )
 
 3608   map.insert( QStringLiteral( 
"distance_x" ), QString::number( 
mDistanceX ) );
 
 3609   map.insert( QStringLiteral( 
"distance_y" ), QString::number( 
mDistanceY ) );
 
 3610   map.insert( QStringLiteral( 
"displacement_x" ), QString::number( 
mDisplacementX ) );
 
 3611   map.insert( QStringLiteral( 
"displacement_y" ), QString::number( 
mDisplacementY ) );
 
 3612   map.insert( QStringLiteral( 
"offset_x" ), QString::number( 
mOffsetX ) );
 
 3613   map.insert( QStringLiteral( 
"offset_y" ), QString::number( 
mOffsetY ) );
 
 3647     QDomElement symbolizerElem = doc.createElement( QStringLiteral( 
"se:PolygonSymbolizer" ) );
 
 3648     if ( !props.value( QStringLiteral( 
"uom" ), QString() ).toString().isEmpty() )
 
 3649       symbolizerElem.setAttribute( QStringLiteral( 
"uom" ), props.value( QStringLiteral( 
"uom" ), QString() ).toString() );
 
 3650     element.appendChild( symbolizerElem );
 
 3655     QDomElement fillElem = doc.createElement( QStringLiteral( 
"se:Fill" ) );
 
 3656     symbolizerElem.appendChild( fillElem );
 
 3658     QDomElement graphicFillElem = doc.createElement( QStringLiteral( 
"se:GraphicFill" ) );
 
 3659     fillElem.appendChild( graphicFillElem );
 
 3666     symbolizerElem.appendChild( distanceElem );
 
 3671       markerLayer->writeSldMarker( doc, graphicFillElem, props );
 
 3675       QString errorMsg = QStringLiteral( 
"QgsMarkerSymbolLayer expected, %1 found. Skip it." ).arg( layer->
layerType() );
 
 3676       graphicFillElem.appendChild( doc.createComment( errorMsg ) );
 
 3680       QString errorMsg = QStringLiteral( 
"Missing point pattern symbol layer. Skip it." );
 
 3681       graphicFillElem.appendChild( doc.createComment( errorMsg ) );
 
 3810   std::unique_ptr< QgsCentroidFillSymbolLayer > sl = std::make_unique< QgsCentroidFillSymbolLayer >();
 
 3812   if ( 
properties.contains( QStringLiteral( 
"point_on_surface" ) ) )
 
 3813     sl->setPointOnSurface( 
properties[QStringLiteral( 
"point_on_surface" )].toInt() != 0 );
 
 3814   if ( 
properties.contains( QStringLiteral( 
"point_on_all_parts" ) ) )
 
 3815     sl->setPointOnAllParts( 
properties[QStringLiteral( 
"point_on_all_parts" )].toInt() != 0 );
 
 3816   if ( 
properties.contains( QStringLiteral( 
"clip_points" ) ) )
 
 3817     sl->setClipPoints( 
properties[QStringLiteral( 
"clip_points" )].toInt() != 0 );
 
 3818   if ( 
properties.contains( QStringLiteral( 
"clip_on_current_part_only" ) ) )
 
 3819     sl->setClipOnCurrentPartOnly( 
properties[QStringLiteral( 
"clip_on_current_part_only" )].toInt() != 0 );
 
 3821   sl->restoreOldDataDefinedProperties( 
properties );
 
 3823   return sl.release();
 
 3828   return QStringLiteral( 
"CentroidFill" );
 
 3858   part.exterior = points;
 
 3860     part.rings = *rings;
 
 3867     mCurrentParts << part;
 
 3872     const double prevOpacity = 
mMarker->opacity();
 
 3875     mMarker->setOpacity( prevOpacity );
 
 3882   mCurrentParts.clear();
 
 3889   const double prevOpacity = 
mMarker->opacity();
 
 3892   render( context, mCurrentParts, feature, 
false );
 
 3894   mMarker->setOpacity( prevOpacity );
 
 3897 void QgsCentroidFillSymbolLayer::render( 
QgsRenderContext &context, 
const QVector<QgsCentroidFillSymbolLayer::Part> &parts, 
const QgsFeature &feature, 
bool selected )
 
 3906   QVector< QgsGeometry > geometryParts;
 
 3907   geometryParts.reserve( parts.size() );
 
 3908   QPainterPath globalPath;
 
 3911   int maxAreaPartIdx = 0;
 
 3913   for ( 
int i = 0; i < parts.size(); i++ )
 
 3915     const Part part = parts[i];
 
 3918     if ( !geom.
isNull() && !part.rings.empty() )
 
 3920       QgsPolygon *poly = qgsgeometry_cast< QgsPolygon * >( geom.
get() );
 
 3924         int area = poly->
area();
 
 3926         if ( area > maxArea )
 
 3936       globalPath.addPolygon( part.exterior );
 
 3937       for ( 
const QPolygonF &ring : part.rings )
 
 3939         globalPath.addPolygon( ring );
 
 3944   for ( 
int i = 0; i < parts.size(); i++ )
 
 3949     const Part part = parts[i];
 
 3957         path.addPolygon( part.exterior );
 
 3958         for ( 
const QPolygonF &ring : part.rings )
 
 3960           path.addPolygon( ring );
 
 3969       context.
painter()->setClipPath( path );
 
 3973     mMarker->renderPoint( centroid, feature.
isValid() ? &feature : 
nullptr, context, -1, selected );
 
 3985   map[QStringLiteral( 
"point_on_surface" )] = QString::number( 
mPointOnSurface );
 
 3986   map[QStringLiteral( 
"point_on_all_parts" )] = QString::number( 
mPointOnAllParts );
 
 3987   map[QStringLiteral( 
"clip_points" )] = QString::number( 
mClipPoints );
 
 3994   std::unique_ptr< QgsCentroidFillSymbolLayer > x = std::make_unique< QgsCentroidFillSymbolLayer >();
 
 3997   x->setSubSymbol( 
mMarker->clone() );
 
 4012   mMarker->toSld( doc, element, props );
 
 4023   std::unique_ptr< QgsMarkerSymbol > marker( 
new QgsMarkerSymbol( layers ) );
 
 4025   std::unique_ptr< QgsCentroidFillSymbolLayer > sl = std::make_unique< QgsCentroidFillSymbolLayer >();
 
 4026   sl->setSubSymbol( marker.release() );
 
 4027   sl->setPointOnAllParts( 
false );
 
 4028   return sl.release();
 
 4055     attributes.unite( 
mMarker->usedAttributes( context ) );
 
 4078     mMarker->setOutputUnit( unit );
 
 4095     return mMarker->usesMapUnits();
 
 4104     mMarker->setMapUnitScale( scale );
 
 4112     return mMarker->mapUnitScale();
 
 4122   , mImageFilePath( imageFilePath )
 
 4138   if ( 
properties.contains( QStringLiteral( 
"imageFile" ) ) )
 
 4140     imagePath = 
properties[QStringLiteral( 
"imageFile" )].toString();
 
 4142   if ( 
properties.contains( QStringLiteral( 
"coordinate_mode" ) ) )
 
 4146   if ( 
properties.contains( QStringLiteral( 
"alpha" ) ) )
 
 4148     alpha = 
properties[QStringLiteral( 
"alpha" )].toDouble();
 
 4150   if ( 
properties.contains( QStringLiteral( 
"offset" ) ) )
 
 4154   if ( 
properties.contains( QStringLiteral( 
"angle" ) ) )
 
 4158   if ( 
properties.contains( QStringLiteral( 
"width" ) ) )
 
 4162   std::unique_ptr< QgsRasterFillSymbolLayer > symbolLayer = std::make_unique< QgsRasterFillSymbolLayer >( imagePath );
 
 4163   symbolLayer->setCoordinateMode( mode );
 
 4164   symbolLayer->setOpacity( alpha );
 
 4165   symbolLayer->setOffset( 
offset );
 
 4166   symbolLayer->setAngle( 
angle );
 
 4167   symbolLayer->setWidth( 
width );
 
 4168   if ( 
properties.contains( QStringLiteral( 
"offset_unit" ) ) )
 
 4172   if ( 
properties.contains( QStringLiteral( 
"offset_map_unit_scale" ) ) )
 
 4176   if ( 
properties.contains( QStringLiteral( 
"width_unit" ) ) )
 
 4180   if ( 
properties.contains( QStringLiteral( 
"width_map_unit_scale" ) ) )
 
 4185   symbolLayer->restoreOldDataDefinedProperties( 
properties );
 
 4187   return symbolLayer.release();
 
 4192   QVariantMap::iterator it = 
properties.find( QStringLiteral( 
"imageFile" ) );
 
 4196       it.value() = pathResolver.
writePath( it.value().toString() );
 
 4198       it.value() = pathResolver.
readPath( it.value().toString() );
 
 4210   return QStringLiteral( 
"RasterFill" );
 
 4221   QPointF 
offset = mOffset;
 
 4237   if ( mCoordinateMode == 
Feature )
 
 4239     QRectF boundingRect = points.boundingRect();
 
 4240     mBrush.setTransform( 
mBrush.transform().translate( boundingRect.left() - 
mBrush.transform().dx(),
 
 4241                          boundingRect.top() - 
mBrush.transform().dy() ) );
 
 4253   applyPattern( 
mBrush, mImageFilePath, mWidth, mOpacity * context.
opacity(), context );
 
 4264   map[QStringLiteral( 
"imageFile" )] = mImageFilePath;
 
 4265   map[QStringLiteral( 
"coordinate_mode" )] = QString::number( mCoordinateMode );
 
 4266   map[QStringLiteral( 
"alpha" )] = QString::number( mOpacity );
 
 4270   map[QStringLiteral( 
"angle" )] = QString::number( 
mAngle );
 
 4271   map[QStringLiteral( 
"width" )] = QString::number( mWidth );
 
 4279   std::unique_ptr< QgsRasterFillSymbolLayer > sl = std::make_unique< QgsRasterFillSymbolLayer >( mImageFilePath );
 
 4280   sl->setCoordinateMode( mCoordinateMode );
 
 4281   sl->setOpacity( mOpacity );
 
 4282   sl->setOffset( mOffset );
 
 4283   sl->setOffsetUnit( mOffsetUnit );
 
 4284   sl->setOffsetMapUnitScale( mOffsetMapUnitScale );
 
 4286   sl->setWidth( mWidth );
 
 4287   sl->setWidthUnit( mWidthUnit );
 
 4288   sl->setWidthMapUnitScale( mWidthMapUnitScale );
 
 4291   return sl.release();
 
 4296   return context.
convertToPainterUnits( std::max( std::fabs( mOffset.x() ), std::fabs( mOffset.y() ) ), mOffsetUnit, mOffsetMapUnitScale );
 
 4307   mImageFilePath = imagePath;
 
 4312   mCoordinateMode = mode;
 
 4330   if ( !hasWidthExpression && !hasAngleExpression && !hasOpacityExpression && !hasFileExpression )
 
 4336   if ( hasAngleExpression )
 
 4344   if ( !hasWidthExpression && !hasOpacityExpression && !hasFileExpression )
 
 4349   double width = mWidth;
 
 4350   if ( hasWidthExpression )
 
 4356   if ( hasOpacityExpression )
 
 4361   QString file = mImageFilePath;
 
 4362   if ( hasFileExpression )
 
 4375 void QgsRasterFillSymbolLayer::applyPattern( QBrush &brush, 
const QString &imageFilePath, 
const double width, 
const double alpha, 
const QgsSymbolRenderContext &context )
 
 4388       if ( size.isEmpty() )
 
 4391       size.setWidth( ( 
width * size.width() ) / 100.0 );
 
 4394       if ( 
static_cast< int >( size.width() ) < 1 || 10000.0 < size.width() )
 
 4398     size.setHeight( 0 );
 
 4406   brush.setTextureImage( img );
 
 4415   : mCountMethod( method )
 
 4416   , mPointCount( pointCount )
 
 4417   , mDensityArea( densityArea )
 
 4428   const int pointCount = 
properties.value( QStringLiteral( 
"point_count" ), QStringLiteral( 
"10" ) ).toInt();
 
 4429   const double densityArea = 
properties.value( QStringLiteral( 
"density_area" ), QStringLiteral( 
"250.0" ) ).toDouble();
 
 4431   unsigned long seed = 0;
 
 4432   if ( 
properties.contains( QStringLiteral( 
"seed" ) ) )
 
 4438     std::random_device rd;
 
 4439     std::mt19937 mt( 
seed == 0 ? rd() : 
seed );
 
 4440     std::uniform_int_distribution<> uniformDist( 1, 999999999 );
 
 4441     seed = uniformDist( mt );
 
 4446   if ( 
properties.contains( QStringLiteral( 
"density_area_unit" ) ) )
 
 4448   if ( 
properties.contains( QStringLiteral( 
"density_area_unit_scale" ) ) )
 
 4451   if ( 
properties.contains( QStringLiteral( 
"clip_points" ) ) )
 
 4453     sl->setClipPoints( 
properties[QStringLiteral( 
"clip_points" )].toInt() );
 
 4456   return sl.release();
 
 4461   return QStringLiteral( 
"RandomMarkerFill" );
 
 4466   mMarker->setColor( 
color );
 
 4472   return mMarker ? mMarker->color() : 
mColor;
 
 4488   part.exterior = points;
 
 4490     part.rings = *rings;
 
 4492   if ( mRenderingFeature )
 
 4496     mFeatureSymbolOpacity = context.
opacity();
 
 4497     mCurrentParts << part;
 
 4502     const double prevOpacity = mMarker->opacity();
 
 4503     mMarker->setOpacity( mMarker->opacity() * context.
opacity() );
 
 4505     mMarker->setOpacity( prevOpacity );
 
 4509 void QgsRandomMarkerFillSymbolLayer::render( 
QgsRenderContext &context, 
const QVector<QgsRandomMarkerFillSymbolLayer::Part> &parts, 
const QgsFeature &feature, 
bool selected )
 
 4518   QVector< QgsGeometry > geometryParts;
 
 4519   geometryParts.reserve( parts.size() );
 
 4522   for ( 
const Part &part : parts )
 
 4525     if ( !geom.
isNull() && !part.rings.empty() )
 
 4527       QgsPolygon *poly = qgsgeometry_cast< QgsPolygon * >( geom.
get() );
 
 4528       for ( 
const QPolygonF &ring : part.rings )
 
 4535       geom = geom.
buffer( 0, 0 );
 
 4537     geometryParts << geom;
 
 4541       path.addPolygon( part.exterior );
 
 4542       for ( 
const QPolygonF &ring : part.rings )
 
 4544         path.addPolygon( ring );
 
 4554     context.
painter()->setClipPath( path );
 
 4558   int count = mPointCount;
 
 4565   switch ( mCountMethod )
 
 4577       count = std::max( 0.0, std::ceil( count * ( geom.
area() / 
densityArea ) ) );
 
 4584   unsigned long seed = mSeed;
 
 4595   std::sort( randomPoints.begin(), randomPoints.end(), []( 
const QgsPointXY & a, 
const QgsPointXY & b )->bool
 
 4597     return a.y() < b.y();
 
 4605   for ( 
const QgsPointXY &p : std::as_const( randomPoints ) )
 
 4607     if ( needsExpressionContext )
 
 4609     mMarker->renderPoint( QPointF( p.x(), p.y() ), feature.
isValid() ? &feature : 
nullptr, context, -1, selected );
 
 4621   map.insert( QStringLiteral( 
"count_method" ), QString::number( 
static_cast< int >( mCountMethod ) ) );
 
 4622   map.insert( QStringLiteral( 
"point_count" ), QString::number( mPointCount ) );
 
 4623   map.insert( QStringLiteral( 
"density_area" ), QString::number( mDensityArea ) );
 
 4626   map.insert( QStringLiteral( 
"seed" ), QString::number( mSeed ) );
 
 4627   map.insert( QStringLiteral( 
"clip_points" ), QString::number( mClipPoints ) );
 
 4633   std::unique_ptr< QgsRandomMarkerFillSymbolLayer > res = std::make_unique< QgsRandomMarkerFillSymbolLayer >( mPointCount, mCountMethod, mDensityArea, mSeed );
 
 4636   res->setDensityAreaUnit( mDensityAreaUnit );
 
 4637   res->setDensityAreaUnitScale( mDensityAreaUnitScale );
 
 4638   res->mClipPoints = mClipPoints;
 
 4639   res->setSubSymbol( mMarker->clone() );
 
 4642   return res.release();
 
 4652   return mMarker.get();
 
 4664   mColor = mMarker->color();
 
 4673     attributes.unite( mMarker->usedAttributes( context ) );
 
 4682   if ( mMarker && mMarker->hasDataDefinedProperties() )
 
 4719   return mCountMethod;
 
 4724   mCountMethod = method;
 
 4729   return mDensityArea;
 
 4734   mDensityArea = area;
 
 4739   mRenderingFeature = 
true;
 
 4740   mCurrentParts.clear();
 
 4745   mRenderingFeature = 
false;
 
 4747   const double prevOpacity = mMarker->opacity();
 
 4748   mMarker->setOpacity( mMarker->opacity() * mFeatureSymbolOpacity );
 
 4750   render( context, mCurrentParts, feature, 
false );
 
 4752   mFeatureSymbolOpacity = 1;
 
 4753   mMarker->setOpacity( prevOpacity );
 
 4761     mMarker->setOutputUnit( unit );
 
 4769     return mMarker->outputUnit();
 
 4778     return mMarker->usesMapUnits();
 
 4787     mMarker->setMapUnitScale( scale );
 
 4795     return mMarker->mapUnitScale();
 
QColor valueAsColor(int key, const QgsExpressionContext &context, const QColor &defaultColor=QColor(), bool *ok=nullptr) const
Calculates the current value of the property with the specified key and interprets it as a color.
int valueAsInt(int key, const QgsExpressionContext &context, int defaultValue=0, bool *ok=nullptr) const
Calculates the current value of the property with the specified key and interprets it as an integer.
bool valueAsBool(int key, const QgsExpressionContext &context, bool defaultValue=false, bool *ok=nullptr) const
Calculates the current value of the property with the specified key and interprets it as an boolean.
double valueAsDouble(int key, const QgsExpressionContext &context, double defaultValue=0.0, bool *ok=nullptr) const
Calculates the current value of the property with the specified key and interprets it as a double.
QString valueAsString(int key, const QgsExpressionContext &context, const QString &defaultString=QString(), bool *ok=nullptr) const
Calculates the current value of the property with the specified key and interprets it as a string.
static QgsImageCache * imageCache()
Returns the application's image cache, used for caching resampled versions of raster images.
static QgsSvgCache * svgCache()
Returns the application's SVG cache, used for caching SVG images and handling parameter replacement w...
static QgsSymbolLayer * createFromSld(QDomElement &element)
void setOutputUnit(QgsUnitTypes::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
QSet< QString > usedAttributes(const QgsRenderContext &context) const override
Returns the set of attributes referenced by the layer.
QVariantMap properties() const override
Should be reimplemented by subclasses to return a string map that contains the configuration informat...
QgsSymbol * subSymbol() override
Returns the symbol's sub symbol, if present.
bool setSubSymbol(QgsSymbol *symbol) override
Sets layer's subsymbol. takes ownership of the passed symbol.
void setMapUnitScale(const QgsMapUnitScale &scale) override
bool canCauseArtifactsBetweenAdjacentTiles() const override
Returns true if the symbol layer rendering can cause visible artifacts across a single feature when t...
bool pointOnSurface() const
QgsMapUnitScale mapUnitScale() const override
void startFeatureRender(const QgsFeature &feature, QgsRenderContext &context) override
Called before the layer will be rendered for a particular feature.
std::unique_ptr< QgsMarkerSymbol > mMarker
QString layerType() const override
Returns a string that represents this layer type.
void setColor(const QColor &color) override
The fill color.
bool pointOnAllParts() const
Returns whether a point is drawn for all parts or only on the biggest part of multi-part features.
void renderPolygon(const QPolygonF &points, const QVector< QPolygonF > *rings, QgsSymbolRenderContext &context) override
Renders the fill symbol layer for the polygon whose outer ring is defined by points,...
QgsFeatureId mCurrentFeatureId
void startRender(QgsSymbolRenderContext &context) override
Called before a set of rendering operations commences on the supplied render context.
bool hasDataDefinedProperties() const override
Returns true if the symbol layer (or any of its sub-symbols) contains data defined properties.
void stopFeatureRender(const QgsFeature &feature, QgsRenderContext &context) override
Called after the layer has been rendered for a particular feature.
bool usesMapUnits() const override
Returns true if the symbol layer has any components which use map unit based sizes.
bool clipPoints() const
Returns true if point markers should be clipped to the polygon boundary.
QgsCentroidFillSymbolLayer * clone() const override
Shall be reimplemented by subclasses to create a deep copy of the instance.
void toSld(QDomDocument &doc, QDomElement &element, const QVariantMap &props) const override
Saves the symbol layer as SLD.
static QgsSymbolLayer * create(const QVariantMap &properties=QVariantMap())
Creates a new QgsCentroidFillSymbolLayer using the specified properties map containing symbol propert...
QgsUnitTypes::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
~QgsCentroidFillSymbolLayer() override
void stopRender(QgsSymbolRenderContext &context) override
Called after a set of rendering operations has finished on the supplied render context.
double mFeatureSymbolOpacity
QgsCentroidFillSymbolLayer()
QColor color() const override
The fill color.
bool clipOnCurrentPartOnly() const
Returns true if point markers should be clipped to the current part boundary only.
bool mClipOnCurrentPartOnly
Abstract base class for color ramps.
virtual QColor color(double value) const =0
Returns the color corresponding to a specified value.
virtual QVariantMap properties() const =0
Returns a string map containing all the color ramp's properties.
virtual QString type() const =0
Returns a string representing the color ramp type.
virtual QgsColorRamp * clone() const =0
Creates a clone of the color ramp.
static QgsColorRamp * create(const QVariantMap &properties=QVariantMap())
Creates the symbol layer.
static QString typeString()
Returns the string identifier for QgsCptCityColorRamp.
double area() const override SIP_HOLDGIL
Returns the planar, 2-dimensional area of the geometry.
Exports QGIS layers to the DXF format.
static double mapUnitScaleFactor(double scale, QgsUnitTypes::RenderUnit symbolUnits, QgsUnitTypes::DistanceUnit mapUnits, double mapUnitsPerPixel=1.0)
Returns scale factor for conversion to map units.
QgsUnitTypes::DistanceUnit mapUnits() const
Retrieve map units.
double symbologyScale() const
Returns the reference scale for output.
RAII class to pop scope from an expression context on destruction.
Single scope for storing variables and functions for use within a QgsExpressionContext.
void addVariable(const QgsExpressionContextScope::StaticVariable &variable)
Adds a variable into the context scope.
static const QString EXPR_GEOMETRY_POINT_NUM
Inbuilt variable name for point number variable.
void setOriginalValueVariable(const QVariant &value)
Sets the original value variable value for the context.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
bool isValid() const
Returns the validity of this feature.
void _renderPolygon(QPainter *p, const QPolygonF &points, const QVector< QPolygonF > *rings, QgsSymbolRenderContext &context)
Default method to render polygon.
A geometry is the spatial representation of a feature.
QVector< QgsPointXY > randomPointsInPolygon(int count, const std::function< bool(const QgsPointXY &) > &acceptPoint, unsigned long seed=0, QgsFeedback *feedback=nullptr, int maxTriesPerPoint=0) const
Returns a list of count random points generated inside a (multi)polygon geometry (if acceptPoint is s...
static QgsGeometry fromQPolygonF(const QPolygonF &polygon)
Construct geometry from a QPolygonF.
static QgsGeometry unaryUnion(const QVector< QgsGeometry > &geometries)
Compute the unary union on a list of geometries.
QgsAbstractGeometry * get()
Returns a modifiable (non-const) reference to the underlying abstract geometry primitive.
bool isGeosValid(QgsGeometry::ValidityFlags flags=QgsGeometry::ValidityFlags()) const
Checks validity of the geometry using GEOS.
double area() const
Returns the planar, 2-dimensional area of the geometry.
QgsGeometry buffer(double distance, int segments) const
Returns a buffer region around this geometry having the given width and with a specified number of se...
Gradient color ramp, which smoothly interpolates between two colors and also supports optional extra ...
static QgsColorRamp * create(const QVariantMap &properties=QVariantMap())
Creates a new QgsColorRamp from a map of properties.
static QString typeString()
Returns the string identifier for QgsGradientColorRamp.
void addStopsToGradient(QGradient *gradient, double opacity=1)
Copy color ramp stops to a QGradient.
void setColorRamp(QgsColorRamp *ramp)
Sets the color ramp used for the gradient fill.
void setOutputUnit(QgsUnitTypes::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
QgsUnitTypes::RenderUnit mOffsetUnit
GradientCoordinateMode coordinateMode() const
Coordinate mode for gradient. Controls how the gradient stops are positioned.
QColor color2() const
Color for endpoint of gradient, only used if the gradient color type is set to SimpleTwoColor.
void renderPolygon(const QPolygonF &points, const QVector< QPolygonF > *rings, QgsSymbolRenderContext &context) override
Renders the fill symbol layer for the polygon whose outer ring is defined by points,...
void stopRender(QgsSymbolRenderContext &context) override
Called after a set of rendering operations has finished on the supplied render context.
bool canCauseArtifactsBetweenAdjacentTiles() const override
Returns true if the symbol layer rendering can cause visible artifacts across a single feature when t...
QgsGradientFillSymbolLayer * clone() const override
Shall be reimplemented by subclasses to create a deep copy of the instance.
GradientColorType mGradientColorType
QgsMapUnitScale mapUnitScale() const override
bool mReferencePoint1IsCentroid
bool usesMapUnits() const override
Returns true if the symbol layer has any components which use map unit based sizes.
GradientSpread gradientSpread() const
Gradient spread mode. Controls how the gradient behaves outside of the predefined stops.
QVariantMap properties() const override
Should be reimplemented by subclasses to return a string map that contains the configuration informat...
GradientColorType gradientColorType() const
Gradient color mode, controls how gradient color stops are created.
GradientType mGradientType
static QgsSymbolLayer * create(const QVariantMap &properties=QVariantMap())
Creates a new QgsGradientFillSymbolLayer using the specified properties map containing symbol propert...
void setMapUnitScale(const QgsMapUnitScale &scale) override
double estimateMaxBleed(const QgsRenderContext &context) const override
Returns the estimated maximum distance which the layer style will bleed outside the drawn shape when ...
GradientCoordinateMode mCoordinateMode
~QgsGradientFillSymbolLayer() override
QgsColorRamp * mGradientRamp
GradientSpread mGradientSpread
QPointF referencePoint1() const
bool mReferencePoint2IsCentroid
QgsMapUnitScale mOffsetMapUnitScale
QgsUnitTypes::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
QPointF offset() const
Returns the offset by which polygons will be translated during rendering.
void startRender(QgsSymbolRenderContext &context) override
Called before a set of rendering operations commences on the supplied render context.
QString layerType() const override
Returns a string that represents this layer type.
QgsGradientFillSymbolLayer(const QColor &color=DEFAULT_SIMPLEFILL_COLOR, const QColor &color2=Qt::white, GradientColorType gradientColorType=SimpleTwoColor, GradientType gradientType=Linear, GradientCoordinateMode coordinateMode=Feature, GradientSpread gradientSpread=Pad)
GradientType gradientType() const
Type of gradient, e.g., linear or radial.
QPointF referencePoint2() const
QSize originalSize(const QString &path, bool blocking=false) const
Returns the original size (in pixels) of the image at the specified path.
QImage pathAsImage(const QString &path, const QSize size, const bool keepAspectRatio, const double opacity, bool &fitsInCache, bool blocking=false, bool *isMissing=nullptr)
Returns the specified path rendered as an image.
Base class for polygon renderers generating texture images.
std::unique_ptr< QgsLineSymbol > mStroke
Custom stroke.
bool hasDataDefinedProperties() const override
Returns true if the symbol layer (or any of its sub-symbols) contains data defined properties.
QgsMapUnitScale mStrokeWidthMapUnitScale
double estimateMaxBleed(const QgsRenderContext &context) const override
Returns the estimated maximum distance which the layer style will bleed outside the drawn shape when ...
QSet< QString > usedAttributes(const QgsRenderContext &context) const override
Returns the set of attributes referenced by the layer.
QgsImageFillSymbolLayer()
QgsUnitTypes::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
double mStrokeWidth
Stroke width.
double dxfWidth(const QgsDxfExport &e, QgsSymbolRenderContext &context) const override
Gets line width.
void setOutputUnit(QgsUnitTypes::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
QgsMapUnitScale mapUnitScale() const override
Qt::PenStyle dxfPenStyle() const override
Gets pen style.
void setMapUnitScale(const QgsMapUnitScale &scale) override
QgsSymbol * subSymbol() override
Returns the symbol's sub symbol, if present.
bool setSubSymbol(QgsSymbol *symbol) override
Sets layer's subsymbol. takes ownership of the passed symbol.
virtual void applyDataDefinedSettings(QgsSymbolRenderContext &context)
virtual bool applyBrushTransformFromContext() const
Returns true if the image brush should be transformed using the render context's texture origin.
QColor dxfColor(QgsSymbolRenderContext &context) const override
Gets color.
void renderPolygon(const QPolygonF &points, const QVector< QPolygonF > *rings, QgsSymbolRenderContext &context) override
Renders the fill symbol layer for the polygon whose outer ring is defined by points,...
QgsUnitTypes::RenderUnit mStrokeWidthUnit
~QgsImageFillSymbolLayer() override
static void multiplyOpacity(QImage &image, double factor)
Multiplies opacity of image pixel values by a factor.
static void stackBlur(QImage &image, int radius, bool alphaOnly=false)
Performs a stack blur on an image.
A symbol fill consisting of repeated parallel lines.
QgsMapUnitScale mapUnitScale() const override
void startRender(QgsSymbolRenderContext &context) override
Called before a set of rendering operations commences on the supplied render context.
QString layerType() const override
Returns a string that represents this layer type.
QgsLinePatternFillSymbolLayer * clone() const override
Shall be reimplemented by subclasses to create a deep copy of the instance.
QgsUnitTypes::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
QColor color() const override
The fill color.
void toSld(QDomDocument &doc, QDomElement &element, const QVariantMap &props) const override
Saves the symbol layer as SLD.
double lineWidth() const
Returns the width of the line subsymbol used to render the parallel lines in the fill.
bool usesMapUnits() const override
Returns true if the symbol layer has any components which use map unit based sizes.
void setMapUnitScale(const QgsMapUnitScale &scale) override
double lineAngle() const
Returns the angle for the parallel lines used to fill the symbol.
void setOutputUnit(QgsUnitTypes::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
void setLineWidth(double w)
Sets the width of the line subsymbol used to render the parallel lines in the fill.
QSet< QString > usedAttributes(const QgsRenderContext &context) const override
Returns the set of attributes referenced by the layer.
void applyDataDefinedSettings(QgsSymbolRenderContext &context) override
bool setSubSymbol(QgsSymbol *symbol) override
Sets layer's subsymbol. takes ownership of the passed symbol.
QgsSymbol * subSymbol() override
Returns the symbol's sub symbol, if present.
bool hasDataDefinedProperties() const override
Returns true if the symbol layer (or any of its sub-symbols) contains data defined properties.
QVariantMap properties() const override
Should be reimplemented by subclasses to return a string map that contains the configuration informat...
void setColor(const QColor &c) override
The fill color.
double offset() const
Returns the offset distance for lines within the fill, which is the distance to offset the parallel l...
QgsLinePatternFillSymbolLayer()
double distance() const
Returns the distance between lines in the fill pattern.
QString ogrFeatureStyleWidth(double widthScaleFactor) const
void stopRender(QgsSymbolRenderContext &context) override
Called after a set of rendering operations has finished on the supplied render context.
~QgsLinePatternFillSymbolLayer() override
double estimateMaxBleed(const QgsRenderContext &context) const override
Returns the estimated maximum distance which the layer style will bleed outside the drawn shape when ...
static QgsSymbolLayer * createFromSld(QDomElement &element)
Creates a new QgsLinePatternFillSymbolLayer from a SLD element.
static QgsSymbolLayer * create(const QVariantMap &properties=QVariantMap())
Creates a new QgsLinePatternFillSymbolLayer from a properties map.
static QgsLineString * fromQPolygonF(const QPolygonF &polygon)
Returns a new linestring from a QPolygonF polygon input.
A line symbol type, for rendering LineString and MultiLineString geometries.
QgsLineSymbol * clone() const override
Returns a deep copy of this symbol.
double width() const
Returns the estimated width for the whole symbol, which is the maximum width of all marker symbol lay...
void setWidth(double width)
Sets the width for the whole line symbol.
Perform transforms between map coordinates and device coordinates.
double mapUnitsPerPixel() const
Returns current map units per pixel.
Struct for storing maximum and minimum scales for measurements in map units.
Line symbol layer type which draws repeating marker symbols along a line feature.
Abstract base class for marker symbol layers.
A marker symbol type, for rendering Point and MultiPoint geometries.
QgsMarkerSymbol * clone() const override
Returns a deep copy of this symbol.
void renderPoint(QPointF point, const QgsFeature *f, QgsRenderContext &context, int layer=-1, bool selected=false)
Renders the symbol at the specified point, using the given render context.
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true)
Adds a message to the log instance (and creates it if necessary).
Resolves relative paths into absolute paths and vice versa.
QString writePath(const QString &filename) const
Prepare a filename to save it to the project file.
QString readPath(const QString &filename) const
Turn filename read from the project file to an absolute path.
QgsMapUnitScale mapUnitScale() const override
QgsMarkerSymbol * mMarkerSymbol
QgsMapUnitScale mDisplacementYMapUnitScale
void stopRender(QgsSymbolRenderContext &context) override
Called after a set of rendering operations has finished on the supplied render context.
QgsMapUnitScale mDisplacementXMapUnitScale
void renderPolygon(const QPolygonF &points, const QVector< QPolygonF > *rings, QgsSymbolRenderContext &context) override
Renders the fill symbol layer for the polygon whose outer ring is defined by points,...
void setOutputUnit(QgsUnitTypes::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
QgsMapUnitScale mDistanceYMapUnitScale
QgsUnitTypes::RenderUnit mDisplacementXUnit
double displacementY() const
QgsUnitTypes::RenderUnit mDistanceYUnit
void setColor(const QColor &c) override
The fill color.
QgsUnitTypes::RenderUnit mOffsetXUnit
static QgsSymbolLayer * create(const QVariantMap &properties=QVariantMap())
Creates a new QgsPointPatternFillSymbolLayer using the specified properties map containing symbol pro...
bool hasDataDefinedProperties() const override
Returns true if the symbol layer (or any of its sub-symbols) contains data defined properties.
double offsetY() const
Returns the vertical offset values for points in the pattern.
QgsSymbol * subSymbol() override
Returns the symbol's sub symbol, if present.
QgsMapUnitScale mDistanceXMapUnitScale
void setMapUnitScale(const QgsMapUnitScale &scale) override
double estimateMaxBleed(const QgsRenderContext &context) const override
Returns the estimated maximum distance which the layer style will bleed outside the drawn shape when ...
void startRender(QgsSymbolRenderContext &context) override
Called before a set of rendering operations commences on the supplied render context.
QString layerType() const override
Returns a string that represents this layer type.
void applyDataDefinedSettings(QgsSymbolRenderContext &context) override
QgsUnitTypes::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
QVariantMap properties() const override
Should be reimplemented by subclasses to return a string map that contains the configuration informat...
QgsMapUnitScale mOffsetXMapUnitScale
QColor color() const override
The fill color.
QgsPointPatternFillSymbolLayer()
void toSld(QDomDocument &doc, QDomElement &element, const QVariantMap &props) const override
Saves the symbol layer as SLD.
double offsetX() const
Returns the horizontal offset values for points in the pattern.
bool usesMapUnits() const override
Returns true if the symbol layer has any components which use map unit based sizes.
QgsPointPatternFillSymbolLayer * clone() const override
Shall be reimplemented by subclasses to create a deep copy of the instance.
QgsUnitTypes::RenderUnit mDistanceXUnit
QgsUnitTypes::RenderUnit mOffsetYUnit
double displacementX() const
QSet< QString > usedAttributes(const QgsRenderContext &context) const override
Returns the set of attributes referenced by the layer.
~QgsPointPatternFillSymbolLayer() override
QgsMapUnitScale mOffsetYMapUnitScale
bool setSubSymbol(QgsSymbol *symbol) override
Sets layer's subsymbol. takes ownership of the passed symbol.
QgsUnitTypes::RenderUnit mDisplacementYUnit
static QgsSymbolLayer * createFromSld(QDomElement &element)
A class to represent a 2D point.
void addInteriorRing(QgsCurve *ring) override
Adds an interior ring to the geometry (takes ownership)
QVariant value(int key, const QgsExpressionContext &context, const QVariant &defaultValue=QVariant()) const override
Returns the calculated value of the property with the specified key from within the collection.
bool isActive(int key) const override
Returns true if the collection contains an active property with the specified key.
static QVariantMap propertyMapToVariantMap(const QMap< QString, QgsProperty > &propertyMap)
Convert a map of QgsProperty to a map of QVariant This is useful to save a map of properties.
static QMap< QString, QgsProperty > variantMapToPropertyMap(const QVariantMap &variantMap)
Convert a map of QVariant to a map of QgsProperty This is useful to restore a map of properties.
A fill symbol layer which places markers at random locations within polygons.
~QgsRandomMarkerFillSymbolLayer() override
int pointCount() const
Returns the count of random points to render in the fill.
bool usesMapUnits() const override
Returns true if the symbol layer has any components which use map unit based sizes.
void startFeatureRender(const QgsFeature &feature, QgsRenderContext &context) override
Called before the layer will be rendered for a particular feature.
unsigned long seed() const
Returns the random number seed to use when generating points, or 0 if a truly random sequence will be...
static QgsSymbolLayer * create(const QVariantMap &properties=QVariantMap())
Creates a new QgsRandomMarkerFillSymbolLayer using the specified properties map containing symbol pro...
void renderPolygon(const QPolygonF &points, const QVector< QPolygonF > *rings, QgsSymbolRenderContext &context) override
Renders the fill symbol layer for the polygon whose outer ring is defined by points,...
void setOutputUnit(QgsUnitTypes::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
void setCountMethod(CountMethod method)
Sets the count method used to randomly fill the polygon.
QString layerType() const override
Returns a string that represents this layer type.
QVariantMap properties() const override
Should be reimplemented by subclasses to return a string map that contains the configuration informat...
QgsRandomMarkerFillSymbolLayer * clone() const override
Shall be reimplemented by subclasses to create a deep copy of the instance.
void setMapUnitScale(const QgsMapUnitScale &scale) override
bool setSubSymbol(QgsSymbol *symbol) override
Sets layer's subsymbol. takes ownership of the passed symbol.
bool hasDataDefinedProperties() const override
Returns true if the symbol layer (or any of its sub-symbols) contains data defined properties.
void stopFeatureRender(const QgsFeature &feature, QgsRenderContext &context) override
Called after the layer has been rendered for a particular feature.
void startRender(QgsSymbolRenderContext &context) override
Called before a set of rendering operations commences on the supplied render context.
bool clipPoints() const
Returns true if point markers should be clipped to the polygon boundary.
QgsUnitTypes::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
bool canCauseArtifactsBetweenAdjacentTiles() const override
Returns true if the symbol layer rendering can cause visible artifacts across a single feature when t...
void setClipPoints(bool clipped)
Sets whether point markers should be clipped to the polygon boundary.
QgsSymbol * subSymbol() override
Returns the symbol's sub symbol, if present.
void stopRender(QgsSymbolRenderContext &context) override
Called after a set of rendering operations has finished on the supplied render context.
QColor color() const override
The fill color.
void setSeed(unsigned long seed)
Sets the random number seed to use when generating points, or 0 if a truly random sequence will be us...
QgsRandomMarkerFillSymbolLayer(int pointCount=10, CountMethod method=AbsoluteCount, double densityArea=250.0, unsigned long seed=0)
Constructor for QgsRandomMarkerFillSymbolLayer, with the specified pointCount.
QSet< QString > usedAttributes(const QgsRenderContext &context) const override
Returns the set of attributes referenced by the layer.
void setPointCount(int count)
Sets the count of random points to render in the fill.
CountMethod
Methods to define the number of points randomly filling the polygon.
@ AbsoluteCount
The point count is used as an absolute count of markers.
@ DensityBasedCount
The point count is part of a marker density count.
double densityArea() const
Returns the density area used to count the number of points to randomly fill the polygon.
void setColor(const QColor &color) override
The fill color.
void setDensityArea(double area)
Sets the density area used to count the number of points to randomly fill the polygon.
QgsMapUnitScale mapUnitScale() const override
CountMethod countMethod() const
Returns the count method used to randomly fill the polygon.
A class for filling symbols with a repeated raster image.
void applyDataDefinedSettings(QgsSymbolRenderContext &context) override
void stopRender(QgsSymbolRenderContext &context) override
Called after a set of rendering operations has finished on the supplied render context.
double width() const
Returns the width used for scaling the image used in the fill.
double estimateMaxBleed(const QgsRenderContext &context) const override
Returns the estimated maximum distance which the layer style will bleed outside the drawn shape when ...
void renderPolygon(const QPolygonF &points, const QVector< QPolygonF > *rings, QgsSymbolRenderContext &context) override
Renders the fill symbol layer for the polygon whose outer ring is defined by points,...
static QgsSymbolLayer * create(const QVariantMap &properties=QVariantMap())
Creates a new QgsRasterFillSymbolLayer from a properties map.
FillCoordinateMode
Fill coordinate modes, dictates fill tiling behavior.
@ Feature
Tiling is based on feature bounding box.
QString layerType() const override
Returns a string that represents this layer type.
QgsRasterFillSymbolLayer(const QString &imageFilePath=QString())
Constructor for QgsRasterFillSymbolLayer, using a raster fill from the specified imageFilePath.
double opacity() const
Returns the opacity for the raster image used in the fill.
~QgsRasterFillSymbolLayer() override
void setOpacity(double opacity)
Sets the opacity for the raster image used in the fill.
bool applyBrushTransformFromContext() const override
Returns true if the image brush should be transformed using the render context's texture origin.
QVariantMap properties() const override
Should be reimplemented by subclasses to return a string map that contains the configuration informat...
void startRender(QgsSymbolRenderContext &context) override
Called before a set of rendering operations commences on the supplied render context.
QString imageFilePath() const
The path to the raster image used for the fill.
void setImageFilePath(const QString &imagePath)
Sets the path to the raster image used for the fill.
static void resolvePaths(QVariantMap &properties, const QgsPathResolver &pathResolver, bool saving)
Turns relative paths in properties map to absolute when reading and vice versa when writing.
void setCoordinateMode(FillCoordinateMode mode)
Set the coordinate mode for fill.
QPointF offset() const
Returns the offset for the fill.
bool usesMapUnits() const override
Returns true if the symbol layer has any components which use map unit based sizes.
bool setSubSymbol(QgsSymbol *symbol) override
Sets layer's subsymbol. takes ownership of the passed symbol.
QgsRasterFillSymbolLayer * clone() const override
Shall be reimplemented by subclasses to create a deep copy of the instance.
Contains information about the context of a rendering operation.
void setForceVectorOutput(bool force)
Sets whether rendering operations should use vector operations instead of any faster raster shortcuts...
double scaleFactor() const
Returns the scaling factor for the render to convert painter units to physical sizes.
void setScaleFactor(double factor)
Sets the scaling factor for the render to convert painter units to physical sizes.
QPainter * painter()
Returns the destination QPainter for the render operation.
double rendererScale() const
Returns the renderer map scale.
QgsExpressionContext & expressionContext()
Gets the expression context.
const QgsMapToPixel & mapToPixel() const
Returns the context's map to pixel transform, which transforms between map coordinates and device coo...
void setPainterFlagsUsingContext(QPainter *painter=nullptr) const
Sets relevant flags on a destination painter, using the flags and settings currently defined for the ...
void setFlag(Flag flag, bool on=true)
Enable or disable a particular flag (other flags are not affected)
bool forceVectorOutput() const
Returns true if rendering operations should use vector operations instead of any faster raster shortc...
QColor selectionColor() const
Returns the color to use when rendering selected features.
void setMapToPixel(const QgsMapToPixel &mtp)
Sets the context's map to pixel transform, which transforms between map coordinates and device coordi...
@ Antialiasing
Use antialiasing while drawing.
@ RenderBlocking
Render and load remote sources in the same thread to ensure rendering remote sources (svg and images)...
@ LosslessImageRendering
Render images losslessly whenever possible, instead of the default lossy jpeg rendering used for some...
Flags flags() const
Returns combination of flags used for rendering.
QPointF textureOrigin() const
Returns the texture origin, which should be used as a brush transform when rendering using QBrush obj...
void setPainter(QPainter *p)
Sets the destination QPainter for the render operation.
bool renderingStopped() const
Returns true if the rendering operation has been stopped and any ongoing rendering should be canceled...
void setExpressionContext(const QgsExpressionContext &context)
Sets the expression context.
double convertToPainterUnits(double size, QgsUnitTypes::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale()) const
Converts a size from the specified units to painter units (pixels).
void setRendererScale(double scale)
Sets the renderer map scale.
const QgsPathResolver & pathResolver() const
Returns the path resolver for conversion between relative and absolute paths during rendering operati...
A class for filling symbols with a repeated SVG file.
QMap< QString, QgsProperty > parameters() const
Returns the dynamic SVG parameters.
void setParameters(const QMap< QString, QgsProperty > ¶meters)
Sets the dynamic SVG parameters.
QString svgFilePath() const
Returns the path to the SVG file used to render the fill.
void startRender(QgsSymbolRenderContext &context) override
Called before a set of rendering operations commences on the supplied render context.
static QgsSymbolLayer * createFromSld(QDomElement &element)
Creates a new QgsSVGFillSymbolLayer from a SLD element.
void setOutputUnit(QgsUnitTypes::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
QColor svgStrokeColor() const
Returns the stroke color used for rendering the SVG content.
bool usesMapUnits() const override
Returns true if the symbol layer has any components which use map unit based sizes.
void stopRender(QgsSymbolRenderContext &context) override
Called after a set of rendering operations has finished on the supplied render context.
const QgsMapUnitScale & svgStrokeWidthMapUnitScale() const
Returns the map unit scale for the pattern's stroke.
QgsUnitTypes::RenderUnit svgStrokeWidthUnit() const
Returns the units for the stroke width.
double svgStrokeWidth() const
Returns the stroke width used for rendering the SVG content.
QString layerType() const override
Returns a string that represents this layer type.
QgsSVGFillSymbolLayer * clone() const override
Shall be reimplemented by subclasses to create a deep copy of the instance.
QgsSVGFillSymbolLayer(const QString &svgFilePath, double width=20, double rotation=0.0)
Constructor for QgsSVGFillSymbolLayer, using the SVG picture at the specified absolute file path.
void setSvgFilePath(const QString &svgPath)
Sets the path to the SVG file to render in the fill.
static QgsSymbolLayer * create(const QVariantMap &properties=QVariantMap())
Creates a new QgsSVGFillSymbolLayer from a properties map.
QColor svgFillColor() const
Returns the fill color used for rendering the SVG content.
static void resolvePaths(QVariantMap &properties, const QgsPathResolver &pathResolver, bool saving)
Turns relative paths in properties map to absolute when reading and vice versa when writing.
const QgsMapUnitScale & patternWidthMapUnitScale() const
Returns the map unit scale for the pattern's width.
QVariantMap properties() const override
Should be reimplemented by subclasses to return a string map that contains the configuration informat...
double patternWidth() const
Returns the width of the rendered SVG content within the fill (i.e.
~QgsSVGFillSymbolLayer() override
QgsUnitTypes::RenderUnit patternWidthUnit() const
Returns the units for the width of the SVG images in the pattern.
void setMapUnitScale(const QgsMapUnitScale &scale) override
QgsUnitTypes::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
void toSld(QDomDocument &doc, QDomElement &element, const QVariantMap &props) const override
Saves the symbol layer as SLD.
void applyDataDefinedSettings(QgsSymbolRenderContext &context) override
QgsMapUnitScale mapUnitScale() const override
Scoped object for saving and restoring a QPainter object's state.
void startRender(QgsSymbolRenderContext &context) override
Called before a set of rendering operations commences on the supplied render context.
QgsShapeburstFillSymbolLayer * clone() const override
Shall be reimplemented by subclasses to create a deep copy of the instance.
~QgsShapeburstFillSymbolLayer() override
int blurRadius() const
Returns the blur radius, which controls the amount of blurring applied to the fill.
QVariantMap properties() const override
Should be reimplemented by subclasses to return a string map that contains the configuration informat...
bool usesMapUnits() const override
Returns true if the symbol layer has any components which use map unit based sizes.
void stopRender(QgsSymbolRenderContext &context) override
Called after a set of rendering operations has finished on the supplied render context.
QColor color2() const
Returns the color used for the endpoint of the shapeburst fill.
void setMapUnitScale(const QgsMapUnitScale &scale) override
QgsMapUnitScale mapUnitScale() const override
QgsShapeburstFillSymbolLayer(const QColor &color=DEFAULT_SIMPLEFILL_COLOR, const QColor &color2=Qt::white, ShapeburstColorType colorType=SimpleTwoColor, int blurRadius=0, bool useWholeShape=true, double maxDistance=5)
void renderPolygon(const QPolygonF &points, const QVector< QPolygonF > *rings, QgsSymbolRenderContext &context) override
Renders the fill symbol layer for the polygon whose outer ring is defined by points,...
bool canCauseArtifactsBetweenAdjacentTiles() const override
Returns true if the symbol layer rendering can cause visible artifacts across a single feature when t...
static QgsSymbolLayer * create(const QVariantMap &properties=QVariantMap())
Creates a new QgsShapeburstFillSymbolLayer using the specified properties map containing symbol prope...
QPointF offset() const
Returns the offset for the shapeburst fill.
bool useWholeShape() const
Returns whether the shapeburst fill is set to cover the entire shape.
ShapeburstColorType colorType() const
Returns the color mode used for the shapeburst fill.
bool ignoreRings() const
Returns whether the shapeburst fill is set to ignore polygon interior rings.
double maxDistance() const
Returns the maximum distance from the shape's boundary which is shaded.
QString layerType() const override
Returns a string that represents this layer type.
void setOutputUnit(QgsUnitTypes::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
double estimateMaxBleed(const QgsRenderContext &context) const override
Returns the estimated maximum distance which the layer style will bleed outside the drawn shape when ...
QgsUnitTypes::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
void setColorRamp(QgsColorRamp *ramp)
Sets the color ramp used to draw the shapeburst fill.
QgsSimpleFillSymbolLayer(const QColor &color=DEFAULT_SIMPLEFILL_COLOR, Qt::BrushStyle style=DEFAULT_SIMPLEFILL_STYLE, const QColor &strokeColor=DEFAULT_SIMPLEFILL_BORDERCOLOR, Qt::PenStyle strokeStyle=DEFAULT_SIMPLEFILL_BORDERSTYLE, double strokeWidth=DEFAULT_SIMPLEFILL_BORDERWIDTH, Qt::PenJoinStyle penJoinStyle=DEFAULT_SIMPLEFILL_JOINSTYLE)
double dxfWidth(const QgsDxfExport &e, QgsSymbolRenderContext &context) const override
Gets line width.
Qt::PenJoinStyle penJoinStyle() const
QColor strokeColor() const override
Gets stroke color.
QColor dxfBrushColor(QgsSymbolRenderContext &context) const override
Gets brush/fill color.
bool usesMapUnits() const override
Returns true if the symbol layer has any components which use map unit based sizes.
Qt::BrushStyle dxfBrushStyle() const override
Gets brush/fill style.
QString ogrFeatureStyle(double mmScaleFactor, double mapUnitScaleFactor) const override
void startRender(QgsSymbolRenderContext &context) override
Called before a set of rendering operations commences on the supplied render context.
QgsUnitTypes::RenderUnit mOffsetUnit
~QgsSimpleFillSymbolLayer() override
void toSld(QDomDocument &doc, QDomElement &element, const QVariantMap &props) const override
Saves the symbol layer as SLD.
double estimateMaxBleed(const QgsRenderContext &context) const override
Returns the estimated maximum distance which the layer style will bleed outside the drawn shape when ...
QgsUnitTypes::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
QColor dxfColor(QgsSymbolRenderContext &context) const override
Gets color.
QColor fillColor() const override
Gets fill color.
Qt::PenStyle strokeStyle() const
QString layerType() const override
Returns a string that represents this layer type.
double dxfAngle(QgsSymbolRenderContext &context) const override
Gets angle.
QgsMapUnitScale mOffsetMapUnitScale
double strokeWidth() const
void stopRender(QgsSymbolRenderContext &context) override
Called after a set of rendering operations has finished on the supplied render context.
Qt::PenStyle dxfPenStyle() const override
Gets pen style.
QgsMapUnitScale mStrokeWidthMapUnitScale
void renderPolygon(const QPolygonF &points, const QVector< QPolygonF > *rings, QgsSymbolRenderContext &context) override
Renders the fill symbol layer for the polygon whose outer ring is defined by points,...
QgsSimpleFillSymbolLayer * clone() const override
Shall be reimplemented by subclasses to create a deep copy of the instance.
QPointF offset()
Returns the offset by which polygons will be translated during rendering.
Qt::PenStyle mStrokeStyle
QgsMapUnitScale mapUnitScale() const override
Qt::PenJoinStyle mPenJoinStyle
Qt::BrushStyle mBrushStyle
void setOutputUnit(QgsUnitTypes::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
void setMapUnitScale(const QgsMapUnitScale &scale) override
QVariantMap properties() const override
Should be reimplemented by subclasses to return a string map that contains the configuration informat...
static QgsSymbolLayer * create(const QVariantMap &properties=QVariantMap())
Creates a new QgsSimpleFillSymbolLayer using the specified properties map containing symbol propertie...
static QgsSymbolLayer * createFromSld(QDomElement &element)
QgsUnitTypes::RenderUnit mStrokeWidthUnit
QByteArray getImageData(const QString &path, bool blocking=false) const
Gets the SVG content corresponding to the given path.
QPicture svgAsPicture(const QString &path, double size, const QColor &fill, const QColor &stroke, double strokeWidth, double widthScaleFactor, bool forceVectorOutput=false, double fixedAspectRatio=0, bool blocking=false, const QMap< QString, QString > ¶meters=QMap< QString, QString >())
Returns an SVG drawing as a QPicture.
void containsParams(const QString &path, bool &hasFillParam, QColor &defaultFillColor, bool &hasStrokeParam, QColor &defaultStrokeColor, bool &hasStrokeWidthParam, double &defaultStrokeWidth, bool blocking=false) const
Tests if an SVG file contains parameters for fill, stroke color, stroke width.
QImage svgAsImage(const QString &path, double size, const QColor &fill, const QColor &stroke, double strokeWidth, double widthScaleFactor, bool &fitsInCache, double fixedAspectRatio=0, bool blocking=false, const QMap< QString, QString > ¶meters=QMap< QString, QString >())
Returns an SVG drawing as a QImage.
static bool rotationFromSldElement(QDomElement &element, QString &rotationFunc)
static QString encodePenStyle(Qt::PenStyle style)
static Qt::PenJoinStyle decodePenJoinStyle(const QString &str)
static QString encodeMapUnitScale(const QgsMapUnitScale &mapUnitScale)
static QgsStringMap evaluatePropertiesMap(const QMap< QString, QgsProperty > &propertiesMap, const QgsExpressionContext &context)
Evaluates a map of properties using the given context and returns a variant map with evaluated expres...
static bool displacementFromSldElement(QDomElement &element, QPointF &offset)
static QColor decodeColor(const QString &str)
static QPointF polygonCentroid(const QPolygonF &points)
Calculate the centroid point of a QPolygonF.
static QString encodeBrushStyle(Qt::BrushStyle style)
static QString svgSymbolPathToName(const QString &path, const QgsPathResolver &pathResolver)
Determines an SVG symbol's name from its path.
static QPointF polygonPointOnSurface(const QPolygonF &points, const QVector< QPolygonF > *rings=nullptr)
Calculate a point on the surface of a QPolygonF.
static QPointF toPoint(const QVariant &value, bool *ok=nullptr)
Converts a value to a point.
static double rescaleUom(double size, QgsUnitTypes::RenderUnit unit, const QVariantMap &props)
Rescales the given size based on the uomScale found in the props, if any is found,...
static void multiplyImageOpacity(QImage *image, qreal opacity)
Multiplies opacity of image pixel values with a (global) transparency value.
static QgsMapUnitScale decodeMapUnitScale(const QString &str)
static QString ogrFeatureStylePen(double width, double mmScaleFactor, double mapUnitsScaleFactor, const QColor &c, Qt::PenJoinStyle joinStyle=Qt::MiterJoin, Qt::PenCapStyle capStyle=Qt::FlatCap, double offset=0.0, const QVector< qreal > *dashPattern=nullptr)
Create ogr feature style string for pen.
static bool externalGraphicFromSld(QDomElement &element, QString &path, QString &mime, QColor &color, double &size)
static void parametricSvgToSld(QDomDocument &doc, QDomElement &graphicElem, const QString &path, const QColor &fillColor, double size, const QColor &strokeColor, double strokeWidth)
Encodes a reference to a parametric SVG into SLD, as a succession of parametric SVG using URL paramet...
static bool lineFromSld(QDomElement &element, Qt::PenStyle &penStyle, QColor &color, double &width, Qt::PenJoinStyle *penJoinStyle=nullptr, Qt::PenCapStyle *penCapStyle=nullptr, QVector< qreal > *customDashPattern=nullptr, double *dashOffset=nullptr)
static QString ogrFeatureStyleBrush(const QColor &fillColr)
Create ogr feature style string for brush.
static QPointF pointOnLineWithDistance(QPointF startPoint, QPointF directionPoint, double distance)
Returns a point on the line from startPoint to directionPoint that is a certain distance away from th...
static Qt::BrushStyle decodeBrushStyle(const QString &str)
static void lineToSld(QDomDocument &doc, QDomElement &element, Qt::PenStyle penStyle, const QColor &color, double width=-1, const Qt::PenJoinStyle *penJoinStyle=nullptr, const Qt::PenCapStyle *penCapStyle=nullptr, const QVector< qreal > *customDashPattern=nullptr, double dashOffset=0.0)
static QDomElement createVendorOptionElement(QDomDocument &doc, const QString &name, const QString &value)
static double sizeInPixelsFromSldUom(const QString &uom, double size)
Returns the size scaled in pixels according to the uom attribute.
static bool wellKnownMarkerFromSld(QDomElement &element, QString &name, QColor &color, QColor &strokeColor, Qt::PenStyle &strokeStyle, double &strokeWidth, double &size)
static void createDisplacementElement(QDomDocument &doc, QDomElement &element, QPointF offset)
static QString svgSymbolNameToPath(const QString &name, const QgsPathResolver &pathResolver)
Determines an SVG symbol's path from its name.
static QString encodeColor(const QColor &color)
static bool fillFromSld(QDomElement &element, Qt::BrushStyle &brushStyle, QColor &color)
static void fillToSld(QDomDocument &doc, QDomElement &element, Qt::BrushStyle brushStyle, const QColor &color=QColor())
static void createGeometryElement(QDomDocument &doc, QDomElement &element, const QString &geomFunc)
static void wellKnownMarkerToSld(QDomDocument &doc, QDomElement &element, const QString &name, const QColor &color, const QColor &strokeColor, Qt::PenStyle strokeStyle, double strokeWidth=-1, double size=-1)
static Qt::PenStyle decodePenStyle(const QString &str)
static void createRotationElement(QDomDocument &doc, QDomElement &element, const QString &rotationFunc)
static QString encodePoint(QPointF point)
Encodes a QPointF to a string.
static QgsSymbolLayer * createMarkerLayerFromSld(QDomElement &element)
static QString encodePenJoinStyle(Qt::PenJoinStyle style)
static QPointF decodePoint(const QString &string)
Decodes a QSizeF from a string.
static QgsSymbolLayer * createLineLayerFromSld(QDomElement &element)
@ PropertyGradientReference1X
Gradient reference point 1 x.
@ PropertyShapeburstIgnoreRings
Shapeburst ignore rings.
@ PropertyGradientReference2X
Gradient reference point 2 x.
@ PropertyStrokeStyle
Stroke style (eg solid, dashed)
@ PropertyDistanceX
Horizontal distance between points.
@ PropertyFile
Filename, eg for svg files.
@ PropertyGradientType
Gradient fill type.
@ PropertyAngle
Symbol angle.
@ PropertyDistanceY
Vertical distance between points.
@ PropertyDisplacementX
Horizontal displacement.
@ PropertyGradientSpread
Gradient spread mode.
@ PropertyOffsetY
Vertical offset.
@ PropertyGradientReference1Y
Gradient reference point 1 y.
@ PropertyLineDistance
Distance between lines, or length of lines for hash line symbols.
@ PropertyBlurRadius
Shapeburst blur radius.
@ PropertyGradientReference2Y
Gradient reference point 2 y.
@ PropertyDensityArea
Density area.
@ PropertyGradientReference1IsCentroid
Gradient reference point 1 is centroid.
@ PropertyShapeburstUseWholeShape
Shapeburst use whole shape.
@ PropertyOffsetX
Horizontal offset.
@ PropertyJoinStyle
Line join style.
@ PropertyOpacity
Opacity.
@ PropertySecondaryColor
Secondary color (eg for gradient fills)
@ PropertyCoordinateMode
Gradient coordinate mode.
@ PropertyLineAngle
Line angle, or angle of hash lines for hash line symbols.
@ PropertyShapeburstMaxDistance
Shapeburst fill from edge distance.
@ PropertyOffset
Symbol offset.
@ PropertyStrokeWidth
Stroke width.
@ PropertyFillColor
Fill color.
@ PropertyClipPoints
Whether markers should be clipped to polygon boundaries.
@ PropertyPointCount
Point count.
@ PropertyRandomSeed
Random number seed.
@ PropertyFillStyle
Fill style (eg solid, dots)
@ PropertyDisplacementY
Vertical displacement.
@ PropertyStrokeColor
Stroke color.
@ PropertyGradientReference2IsCentroid
Gradient reference point 2 is centroid.
@ PropertyWidth
Symbol width.
Qgis::SymbolType type() const
static const bool SELECTION_IS_OPAQUE
Whether styles for selected features ignore symbol alpha.
virtual QColor color() const
The fill color.
virtual QSet< QString > usedAttributes(const QgsRenderContext &context) const
Returns the set of attributes referenced by the layer.
void copyDataDefinedProperties(QgsSymbolLayer *destLayer) const
Copies all data defined properties of this layer to another symbol layer.
virtual double estimateMaxBleed(const QgsRenderContext &context) const
Returns the estimated maximum distance which the layer style will bleed outside the drawn shape when ...
static const bool SELECT_FILL_BORDER
Whether fill styles for selected features also highlight symbol stroke.
virtual QColor fillColor() const
Gets fill color.
virtual QString layerType() const =0
Returns a string that represents this layer type.
virtual QColor strokeColor() const
Gets stroke color.
QgsPropertyCollection & dataDefinedProperties()
Returns a reference to the symbol layer's property collection, used for data defined overrides.
void copyPaintEffect(QgsSymbolLayer *destLayer) const
Copies paint effect of this layer to another symbol layer.
QgsPropertyCollection mDataDefinedProperties
static const bool SELECT_FILL_STYLE
Whether fill styles for selected features uses symbol layer style.
virtual bool hasDataDefinedProperties() const
Returns true if the symbol layer (or any of its sub-symbols) contains data defined properties.
QgsFields fields() const
Fields of the layer.
bool selected() const
Returns true if symbols should be rendered using the selected symbol coloring and style.
QgsRenderContext & renderContext()
Returns a reference to the context's render context.
const QgsFeature * feature() const
Returns the current feature being rendered.
void setOriginalValueVariable(const QVariant &value)
Sets the original value variable value for data defined symbology.
qreal opacity() const
Returns the opacity for the symbol.
Abstract base class for all rendered symbols.
QgsSymbolLayer * symbolLayer(int layer)
Returns the symbol layer at the specified index.
void stopRender(QgsRenderContext &context)
Ends the rendering process.
void setOutputUnit(QgsUnitTypes::RenderUnit unit)
Sets the units to use for sizes and widths within the symbol.
bool hasDataDefinedProperties() const
Returns whether the symbol utilizes any data defined properties.
QSet< QString > usedAttributes(const QgsRenderContext &context) const
Returns a list of attributes required to render this feature.
void setColor(const QColor &color)
Sets the color for the symbol.
int symbolLayerCount() const
Returns the total number of symbol layers contained in the symbol.
QColor color() const
Returns the symbol's color.
Qgis::SymbolType type() const
Returns the symbol's type.
void startRender(QgsRenderContext &context, const QgsFields &fields=QgsFields())
Begins the rendering process for the symbol.
const QgsMapUnitScale & intervalMapUnitScale() const
Returns the map unit scale for the interval between symbols.
double interval() const
Returns the interval between individual symbols.
void setInterval(double interval)
Sets the interval between individual symbols.
QgsUnitTypes::RenderUnit intervalUnit() const
Returns the units for the interval between symbols.
static Q_INVOKABLE QString encodeUnit(QgsUnitTypes::DistanceUnit unit)
Encodes a distance unit to a string.
static Q_INVOKABLE QgsUnitTypes::RenderUnit decodeRenderUnit(const QString &string, bool *ok=nullptr)
Decodes a render unit from a string.
RenderUnit
Rendering size units.
@ RenderUnknownUnit
Mixed or unknown units.
@ RenderMetersInMapUnits
Meters value as Map units.
@ RenderPercentage
Percentage of another measurement (e.g., canvas size, feature size)
@ RenderMapUnits
Map units.
double ANALYSIS_EXPORT angle(QgsPoint *p1, QgsPoint *p2, QgsPoint *p3, QgsPoint *p4)
Calculates the angle between two segments (in 2 dimension, z-values are ignored)
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
QMap< QString, QString > QgsStringMap
#define DEFAULT_SIMPLEFILL_JOINSTYLE
#define DEFAULT_SIMPLEFILL_COLOR
#define DEFAULT_SIMPLEFILL_STYLE
#define DEFAULT_SIMPLEFILL_BORDERSTYLE
#define DEFAULT_SIMPLEFILL_BORDERCOLOR
#define DEFAULT_SIMPLEFILL_BORDERWIDTH
QList< QgsSymbolLayer * > QgsSymbolLayerList
Single variable definition for use within a QgsExpressionContextScope.