44 #include <QSvgRenderer>
45 #include <QDomDocument>
46 #include <QDomElement>
54 Qt::PenJoinStyle penJoinStyle )
55 : mBrushStyle( style )
56 , mStrokeColor( strokeColor )
57 , mStrokeStyle( strokeStyle )
58 , mStrokeWidth( strokeWidth )
59 , mPenJoinStyle( penJoinStyle )
103 void QgsSimpleFillSymbolLayer::applyDataDefinedSymbology(
QgsSymbolRenderContext &context, QBrush &brush, QPen &pen, QPen &selPen )
121 if ( !exprVal.isNull() )
128 penColor.setAlphaF( context.
opacity() * penColor.alphaF() );
129 pen.setColor( penColor );
135 if ( !exprVal.isNull() )
137 double width = exprVal.toDouble( &ok );
141 pen.setWidthF( width );
142 selPen.setWidthF( width );
179 if ( props.contains( QStringLiteral(
"color" ) ) )
181 if ( props.contains( QStringLiteral(
"style" ) ) )
183 if ( props.contains( QStringLiteral(
"color_border" ) ) )
188 else if ( props.contains( QStringLiteral(
"outline_color" ) ) )
192 else if ( props.contains( QStringLiteral(
"line_color" ) ) )
197 if ( props.contains( QStringLiteral(
"style_border" ) ) )
202 else if ( props.contains( QStringLiteral(
"outline_style" ) ) )
206 else if ( props.contains( QStringLiteral(
"line_style" ) ) )
210 if ( props.contains( QStringLiteral(
"width_border" ) ) )
213 strokeWidth = props[QStringLiteral(
"width_border" )].toDouble();
215 else if ( props.contains( QStringLiteral(
"outline_width" ) ) )
217 strokeWidth = props[QStringLiteral(
"outline_width" )].toDouble();
219 else if ( props.contains( QStringLiteral(
"line_width" ) ) )
221 strokeWidth = props[QStringLiteral(
"line_width" )].toDouble();
223 if ( props.contains( QStringLiteral(
"offset" ) ) )
225 if ( props.contains( QStringLiteral(
"joinstyle" ) ) )
230 if ( props.contains( QStringLiteral(
"border_width_unit" ) ) )
234 else if ( props.contains( QStringLiteral(
"outline_width_unit" ) ) )
238 else if ( props.contains( QStringLiteral(
"line_width_unit" ) ) )
242 if ( props.contains( QStringLiteral(
"offset_unit" ) ) )
245 if ( props.contains( QStringLiteral(
"border_width_map_unit_scale" ) ) )
247 if ( props.contains( QStringLiteral(
"offset_map_unit_scale" ) ) )
250 sl->restoreOldDataDefinedProperties( props );
258 return QStringLiteral(
"SimpleFill" );
270 selColor.setAlphaF( context.
opacity() );
327 #ifndef QT_NO_PRINTER
328 if (
mBrush.style() == Qt::SolidPattern ||
mBrush.style() == Qt::NoBrush || !
dynamic_cast<QPrinter *
>( p->device() ) )
335 #ifndef QT_NO_PRINTER
342 p->setPen( Qt::NoPen );
346 p->setBrush( Qt::NoBrush );
364 map[QStringLiteral(
"outline_width" )] = QString::number(
mStrokeWidth );
392 QDomElement symbolizerElem = doc.createElement( QStringLiteral(
"se:PolygonSymbolizer" ) );
393 if ( !props.value( QStringLiteral(
"uom" ), QString() ).toString().isEmpty() )
394 symbolizerElem.setAttribute( QStringLiteral(
"uom" ), props.value( QStringLiteral(
"uom" ), QString() ).toString() );
395 element.appendChild( symbolizerElem );
403 QDomElement fillElem = doc.createElement( QStringLiteral(
"se:Fill" ) );
404 symbolizerElem.appendChild( fillElem );
411 QDomElement strokeElem = doc.createElement( QStringLiteral(
"se:Stroke" ) );
412 symbolizerElem.appendChild( strokeElem );
427 symbolStyle.append(
';' );
436 Qt::BrushStyle fillStyle;
440 QDomElement fillElem = element.firstChildElement( QStringLiteral(
"Fill" ) );
443 QDomElement strokeElem = element.firstChildElement( QStringLiteral(
"Stroke" ) );
449 QString uom = element.attribute( QStringLiteral(
"uom" ), QString() );
455 sl->setOutputUnit( QgsUnitTypes::RenderUnit::RenderPixels );
464 return penBleed + offsetBleed;
525 : mGradientColorType( colorType )
526 , mGradientType( gradientType )
527 , mCoordinateMode( coordinateMode )
528 , mGradientSpread( spread )
529 , mReferencePoint1( QPointF( 0.5, 0 ) )
530 , mReferencePoint2( QPointF( 0.5, 1 ) )
551 bool refPoint1IsCentroid =
false;
553 bool refPoint2IsCentroid =
false;
558 if ( props.contains( QStringLiteral(
"type" ) ) )
559 type =
static_cast< GradientType >( props[QStringLiteral(
"type" )].toInt() );
560 if ( props.contains( QStringLiteral(
"coordinate_mode" ) ) )
562 if ( props.contains( QStringLiteral(
"spread" ) ) )
564 if ( props.contains( QStringLiteral(
"color_type" ) ) )
565 colorType =
static_cast< GradientColorType >( props[QStringLiteral(
"color_type" )].toInt() );
566 if ( props.contains( QStringLiteral(
"gradient_color" ) ) )
571 else if ( props.contains( QStringLiteral(
"color" ) ) )
575 if ( props.contains( QStringLiteral(
"gradient_color2" ) ) )
580 if ( props.contains( QStringLiteral(
"reference_point1" ) ) )
582 if ( props.contains( QStringLiteral(
"reference_point1_iscentroid" ) ) )
583 refPoint1IsCentroid = props[QStringLiteral(
"reference_point1_iscentroid" )].toInt();
584 if ( props.contains( QStringLiteral(
"reference_point2" ) ) )
586 if ( props.contains( QStringLiteral(
"reference_point2_iscentroid" ) ) )
587 refPoint2IsCentroid = props[QStringLiteral(
"reference_point2_iscentroid" )].toInt();
588 if ( props.contains( QStringLiteral(
"angle" ) ) )
589 angle = props[QStringLiteral(
"angle" )].toDouble();
591 if ( props.contains( QStringLiteral(
"offset" ) ) )
608 if ( props.contains( QStringLiteral(
"offset_unit" ) ) )
610 if ( props.contains( QStringLiteral(
"offset_map_unit_scale" ) ) )
613 sl->setReferencePoint1IsCentroid( refPoint1IsCentroid );
615 sl->setReferencePoint2IsCentroid( refPoint2IsCentroid );
616 sl->setAngle(
angle );
618 sl->setColorRamp( gradientRamp );
620 sl->restoreOldDataDefinedProperties( props );
633 return QStringLiteral(
"GradientFill" );
636 void QgsGradientFillSymbolLayer::applyDataDefinedSymbology(
QgsSymbolRenderContext &context,
const QPolygonF &points )
681 if ( currentType == QObject::tr(
"linear" ) )
685 else if ( currentType == QObject::tr(
"radial" ) )
689 else if ( currentType == QObject::tr(
"conical" ) )
703 if ( currentCoordMode == QObject::tr(
"feature" ) )
707 else if ( currentCoordMode == QObject::tr(
"viewport" ) )
721 if ( currentSpread == QObject::tr(
"pad" ) )
725 else if ( currentSpread == QObject::tr(
"repeat" ) )
729 else if ( currentSpread == QObject::tr(
"reflect" ) )
776 if ( refPoint1IsCentroid || refPoint2IsCentroid )
781 QRectF bbox = points.boundingRect();
782 double centroidX = (
centroid.
x() - bbox.left() ) / bbox.width();
783 double centroidY = (
centroid.
y() - bbox.top() ) / bbox.height();
785 if ( refPoint1IsCentroid )
787 refPoint1X = centroidX;
788 refPoint1Y = centroidY;
790 if ( refPoint2IsCentroid )
792 refPoint2X = centroidX;
793 refPoint2Y = centroidY;
799 spread, QPointF( refPoint1X, refPoint1Y ), QPointF( refPoint2X, refPoint2Y ),
angle );
802 QPointF QgsGradientFillSymbolLayer::rotateReferencePoint( QPointF refPoint,
double angle )
807 QLineF refLine = QLineF( QPointF( 0.5, 0.5 ), refPoint );
809 refLine.setAngle( refLine.angle() +
angle );
811 QPointF rotatedReferencePoint = refLine.p2();
813 if ( rotatedReferencePoint.x() > 1 )
814 rotatedReferencePoint.setX( 1 );
815 if ( rotatedReferencePoint.x() < 0 )
816 rotatedReferencePoint.setX( 0 );
817 if ( rotatedReferencePoint.y() > 1 )
818 rotatedReferencePoint.setY( 1 );
819 if ( rotatedReferencePoint.y() < 0 )
820 rotatedReferencePoint.setY( 0 );
822 return rotatedReferencePoint;
826 const QColor &color,
const QColor &color2, GradientColorType gradientColorType,
828 GradientCoordinateMode coordinateMode, GradientSpread gradientSpread,
829 QPointF referencePoint1, QPointF referencePoint2,
const double angle )
834 QColor fillColor2 =
color2;
835 fillColor2.setAlphaF( context.
opacity() * fillColor2.alphaF() );
846 gradient = QLinearGradient( rotatedReferencePoint1, rotatedReferencePoint2 );
849 gradient = QRadialGradient( rotatedReferencePoint1, QLineF( rotatedReferencePoint1, rotatedReferencePoint2 ).length() );
852 gradient = QConicalGradient( rotatedReferencePoint1, QLineF( rotatedReferencePoint1, rotatedReferencePoint2 ).
angle() );
858 gradient.setCoordinateMode( QGradient::ObjectBoundingMode );
861 gradient.setCoordinateMode( QGradient::StretchToDeviceMode );
867 gradient.setSpread( QGradient::PadSpread );
870 gradient.setSpread( QGradient::ReflectSpread );
873 gradient.setSpread( QGradient::RepeatSpread );
889 gradient.setColorAt( 1.0, fillColor2 );
893 brush = QBrush( gradient );
900 selColor.setAlphaF( context.
opacity() );
917 applyDataDefinedSymbology( context, points );
920 p->setPen( Qt::NoPen );
954 map[QStringLiteral(
"type" )] = QString::number(
mGradientType );
955 map[QStringLiteral(
"coordinate_mode" )] = QString::number(
mCoordinateMode );
961 map[QStringLiteral(
"angle" )] = QString::number(
mAngle );
967 #if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
1033 int blurRadius,
bool useWholeShape,
double maxDistance )
1034 : mBlurRadius( blurRadius )
1035 , mUseWholeShape( useWholeShape )
1036 , mMaxDistance( maxDistance )
1037 , mColorType( colorType )
1056 if ( props.contains( QStringLiteral(
"color_type" ) ) )
1060 if ( props.contains( QStringLiteral(
"shapeburst_color" ) ) )
1065 else if ( props.contains( QStringLiteral(
"color" ) ) )
1070 if ( props.contains( QStringLiteral(
"shapeburst_color2" ) ) )
1075 else if ( props.contains( QStringLiteral(
"gradient_color2" ) ) )
1079 if ( props.contains( QStringLiteral(
"blur_radius" ) ) )
1081 blurRadius = props[QStringLiteral(
"blur_radius" )].toInt();
1083 if ( props.contains( QStringLiteral(
"use_whole_shape" ) ) )
1085 useWholeShape = props[QStringLiteral(
"use_whole_shape" )].toInt();
1087 if ( props.contains( QStringLiteral(
"max_distance" ) ) )
1089 maxDistance = props[QStringLiteral(
"max_distance" )].toDouble();
1091 if ( props.contains( QStringLiteral(
"offset" ) ) )
1110 if ( props.contains( QStringLiteral(
"offset_unit" ) ) )
1114 if ( props.contains( QStringLiteral(
"distance_unit" ) ) )
1118 if ( props.contains( QStringLiteral(
"offset_map_unit_scale" ) ) )
1122 if ( props.contains( QStringLiteral(
"distance_map_unit_scale" ) ) )
1126 if ( props.contains( QStringLiteral(
"ignore_rings" ) ) )
1128 sl->setIgnoreRings( props[QStringLiteral(
"ignore_rings" )].toInt() );
1132 sl->setColorRamp( gradientRamp );
1135 sl->restoreOldDataDefinedProperties( props );
1137 return sl.release();
1142 return QStringLiteral(
"ShapeburstFill" );
1147 if ( mGradientRamp.get() == ramp )
1150 mGradientRamp.reset( ramp );
1153 void QgsShapeburstFillSymbolLayer::applyDataDefinedSymbology(
QgsSymbolRenderContext &context, QColor &color, QColor &color2,
int &blurRadius,
bool &useWholeShape,
1154 double &maxDistance,
bool &ignoreRings )
1211 selColor.setAlphaF( context.
opacity() );
1212 mSelBrush = QBrush( selColor );
1231 p->setBrush( mSelBrush );
1232 QPointF
offset = mOffset;
1267 int outputPixelMaxDist = 0;
1275 std::unique_ptr< QgsGradientColorRamp > twoColorGradientRamp;
1278 twoColorGradientRamp = std::make_unique< QgsGradientColorRamp >( color1,
color2 );
1282 p->setPen( QPen( Qt::NoPen ) );
1287 int pointsWidth =
static_cast< int >( std::round( points.boundingRect().width() ) );
1288 int pointsHeight =
static_cast< int >( std::round( points.boundingRect().height() ) );
1289 int imWidth = pointsWidth + ( sideBuffer * 2 );
1290 int imHeight = pointsHeight + ( sideBuffer * 2 );
1296 std::unique_ptr< QImage > fillImage = std::make_unique< QImage >( imWidth,
1297 imHeight, QImage::Format_ARGB32_Premultiplied );
1298 if ( fillImage->isNull() )
1308 std::unique_ptr< QImage > alphaImage = std::make_unique< QImage >( fillImage->width(), fillImage->height(), QImage::Format_ARGB32_Premultiplied );
1309 if ( alphaImage->isNull() )
1321 fillImage->fill( Qt::black );
1327 alphaImage->fill( Qt::transparent );
1333 QPainter imgPainter;
1334 imgPainter.begin( alphaImage.get() );
1335 imgPainter.setRenderHint( QPainter::Antialiasing,
true );
1336 imgPainter.setBrush( QBrush( Qt::white ) );
1337 imgPainter.setPen( QPen( Qt::black ) );
1338 imgPainter.translate( -points.boundingRect().left() + sideBuffer, - points.boundingRect().top() + sideBuffer );
1347 imgPainter.begin( fillImage.get() );
1350 imgPainter.drawImage( 0, 0, *alphaImage );
1357 imgPainter.setBrush( QBrush( Qt::white ) );
1358 imgPainter.setPen( QPen( Qt::black ) );
1359 imgPainter.translate( -points.boundingRect().left() + sideBuffer, - points.boundingRect().top() + sideBuffer );
1368 double *dtArray = distanceTransform( fillImage.get(), context.
renderContext() );
1388 imgPainter.begin( fillImage.get() );
1389 imgPainter.setCompositionMode( QPainter::CompositionMode_DestinationIn );
1390 imgPainter.drawImage( 0, 0, *alphaImage );
1398 QPointF
offset = mOffset;
1415 p->drawImage( points.boundingRect().left() - sideBuffer, points.boundingRect().top() - sideBuffer, *fillImage );
1426 void QgsShapeburstFillSymbolLayer::distanceTransform1d(
double *f,
int n,
int *v,
double *z,
double *d )
1432 for (
int q = 1; q <= n - 1; q++ )
1434 double s = ( ( f[q] + q * q ) - ( f[v[k]] + ( v[k] * v[k] ) ) ) / ( 2 * q - 2 * v[k] );
1438 s = ( ( f[q] + q * q ) - ( f[v[k]] + ( v[k] * v[k] ) ) ) / ( 2 * q - 2 * v[k] );
1447 for (
int q = 0; q <= n - 1; q++ )
1449 while ( z[k + 1] < q )
1451 d[q] = ( q - v[k] ) * ( q - v[k] ) + f[v[k]];
1456 void QgsShapeburstFillSymbolLayer::distanceTransform2d(
double *im,
int width,
int height,
QgsRenderContext &context )
1458 int maxDimension = std::max( width, height );
1459 double *f =
new double[ maxDimension ];
1460 int *v =
new int[ maxDimension ];
1461 double *z =
new double[ maxDimension + 1 ];
1462 double *d =
new double[ maxDimension ];
1465 for (
int x = 0; x < width; x++ )
1470 for (
int y = 0; y < height; y++ )
1472 f[y] = im[ x + y * width ];
1474 distanceTransform1d( f, height, v, z, d );
1475 for (
int y = 0; y < height; y++ )
1477 im[ x + y * width ] = d[y];
1482 for (
int y = 0; y < height; y++ )
1487 for (
int x = 0; x < width; x++ )
1489 f[x] = im[ x + y * width ];
1491 distanceTransform1d( f, width, v, z, d );
1492 for (
int x = 0; x < width; x++ )
1494 im[ x + y * width ] = d[x];
1505 double *QgsShapeburstFillSymbolLayer::distanceTransform( QImage *im,
QgsRenderContext &context )
1507 int width = im->width();
1508 int height = im->height();
1510 double *dtArray =
new double[width * height];
1515 for (
int heightIndex = 0; heightIndex < height; ++heightIndex )
1520 const QRgb *scanLine =
reinterpret_cast< const QRgb *
>( im->constScanLine( heightIndex ) );
1521 for (
int widthIndex = 0; widthIndex < width; ++widthIndex )
1523 tmpRgb = scanLine[widthIndex];
1524 if ( qRed( tmpRgb ) == 0 )
1532 dtArray[ idx ] =
INF;
1539 distanceTransform2d( dtArray, width, height, context );
1544 void QgsShapeburstFillSymbolLayer::dtArrayToQImage(
double *array, QImage *im,
QgsColorRamp *ramp,
QgsRenderContext &context,
bool useWholeShape,
int maxPixelDistance )
1546 int width = im->width();
1547 int height = im->height();
1550 double maxDistanceValue;
1555 double dtMaxValue = array[0];
1556 for (
int i = 1; i < ( width * height ); ++i )
1558 if ( array[i] > dtMaxValue )
1560 dtMaxValue = array[i];
1565 maxDistanceValue = std::sqrt( dtMaxValue );
1570 maxDistanceValue = maxPixelDistance;
1575 double squaredVal = 0;
1578 for (
int heightIndex = 0; heightIndex < height; ++heightIndex )
1583 QRgb *scanLine =
reinterpret_cast< QRgb *
>( im->scanLine( heightIndex ) );
1584 for (
int widthIndex = 0; widthIndex < width; ++widthIndex )
1587 squaredVal = array[idx];
1590 if ( maxDistanceValue > 0 )
1592 pixVal = squaredVal > 0 ? std::min( ( std::sqrt( squaredVal ) / maxDistanceValue ), 1.0 ) : 0;
1601 scanLine[widthIndex] = qPremultiply( ramp->
color( pixVal ).rgba() );
1612 map[QStringLiteral(
"color_type" )] = QString::number( mColorType );
1613 map[QStringLiteral(
"blur_radius" )] = QString::number( mBlurRadius );
1614 map[QStringLiteral(
"use_whole_shape" )] = QString::number( mUseWholeShape );
1615 map[QStringLiteral(
"max_distance" )] = QString::number( mMaxDistance );
1618 map[QStringLiteral(
"ignore_rings" )] = QString::number( mIgnoreRings );
1622 if ( mGradientRamp )
1624 #if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
1625 map.unite( mGradientRamp->properties() );
1627 map.insert( mGradientRamp->properties() );
1636 std::unique_ptr< QgsShapeburstFillSymbolLayer > sl = std::make_unique< QgsShapeburstFillSymbolLayer >(
mColor, mColor2, mColorType, mBlurRadius, mUseWholeShape, mMaxDistance );
1637 if ( mGradientRamp )
1639 sl->setColorRamp( mGradientRamp->clone() );
1641 sl->setDistanceUnit( mDistanceUnit );
1642 sl->setDistanceMapUnitScale( mDistanceMapUnitScale );
1643 sl->setIgnoreRings( mIgnoreRings );
1644 sl->setOffset( mOffset );
1645 sl->setOffsetUnit( mOffsetUnit );
1646 sl->setOffsetMapUnitScale( mOffsetMapUnitScale );
1649 return sl.release();
1654 double offsetBleed = context.
convertToPainterUnits( std::max( std::fabs( mOffset.x() ), std::fabs( mOffset.y() ) ), mOffsetUnit, mOffsetMapUnitScale );
1665 mDistanceUnit = unit;
1671 if ( mDistanceUnit == mOffsetUnit )
1673 return mDistanceUnit;
1686 mDistanceMapUnitScale = scale;
1687 mOffsetMapUnitScale = scale;
1692 if ( mDistanceMapUnitScale == mOffsetMapUnitScale )
1694 return mDistanceMapUnitScale;
1720 p->setPen( QPen( Qt::NoPen ) );
1722 QTransform bkTransform =
mBrush.transform();
1726 QTransform t =
mBrush.transform();
1727 t.translate( leftCorner.x(), leftCorner.y() );
1728 mBrush.setTransform( t );
1734 p->setBrush( QBrush( selColor ) );
1740 QTransform t =
mBrush.transform();
1742 mBrush.setTransform( t );
1751 for (
auto ringIt = rings->constBegin(); ringIt != rings->constEnd(); ++ringIt )
1758 mBrush.setTransform( bkTransform );
1815 double subLayerBleed =
mStroke->symbolLayer( 0 )->estimateMaxBleed( context );
1816 return subLayerBleed;
1837 return QColor( Qt::black );
1844 return Qt::SolidLine;
1848 return Qt::SolidLine;
1852 return mStroke->dxfPenStyle();
1861 attr.unite(
mStroke->usedAttributes( context ) );
1884 , mPatternWidth( width )
1888 mColor = QColor( 255, 255, 255 );
1894 , mPatternWidth( width )
1895 , mSvgData( svgData )
1900 mColor = QColor( 255, 255, 255 );
1902 setDefaultSvgParams();
1910 mPatternWidthUnit = unit;
1911 mSvgStrokeWidthUnit = unit;
1913 mStroke->setOutputUnit( unit );
1919 if ( mPatternWidthUnit != unit || mSvgStrokeWidthUnit != unit ||
mStrokeWidthUnit != unit )
1929 mPatternWidthMapUnitScale = scale;
1930 mSvgStrokeWidthMapUnitScale = scale;
1937 mPatternWidthMapUnitScale == mSvgStrokeWidthMapUnitScale &&
1940 return mPatternWidthMapUnitScale;
1950 mSvgFilePath = svgPath;
1951 setDefaultSvgParams();
1961 if (
properties.contains( QStringLiteral(
"width" ) ) )
1963 width =
properties[QStringLiteral(
"width" )].toDouble();
1965 if (
properties.contains( QStringLiteral(
"svgFile" ) ) )
1969 if (
properties.contains( QStringLiteral(
"angle" ) ) )
1974 std::unique_ptr< QgsSVGFillSymbolLayer > symbolLayer;
1977 symbolLayer = std::make_unique< QgsSVGFillSymbolLayer >(
svgFilePath, width,
angle );
1981 if (
properties.contains( QStringLiteral(
"data" ) ) )
1983 data = QByteArray::fromHex(
properties[QStringLiteral(
"data" )].toString().toLocal8Bit() );
1985 symbolLayer = std::make_unique< QgsSVGFillSymbolLayer >( data, width,
angle );
1989 if (
properties.contains( QStringLiteral(
"svgFillColor" ) ) )
1994 else if (
properties.contains( QStringLiteral(
"color" ) ) )
1998 if (
properties.contains( QStringLiteral(
"svgOutlineColor" ) ) )
2003 else if (
properties.contains( QStringLiteral(
"outline_color" ) ) )
2007 else if (
properties.contains( QStringLiteral(
"line_color" ) ) )
2011 if (
properties.contains( QStringLiteral(
"svgOutlineWidth" ) ) )
2014 symbolLayer->setSvgStrokeWidth(
properties[QStringLiteral(
"svgOutlineWidth" )].toDouble() );
2016 else if (
properties.contains( QStringLiteral(
"outline_width" ) ) )
2018 symbolLayer->setSvgStrokeWidth(
properties[QStringLiteral(
"outline_width" )].toDouble() );
2020 else if (
properties.contains( QStringLiteral(
"line_width" ) ) )
2022 symbolLayer->setSvgStrokeWidth(
properties[QStringLiteral(
"line_width" )].toDouble() );
2026 if (
properties.contains( QStringLiteral(
"pattern_width_unit" ) ) )
2030 if (
properties.contains( QStringLiteral(
"pattern_width_map_unit_scale" ) ) )
2034 if (
properties.contains( QStringLiteral(
"svg_outline_width_unit" ) ) )
2038 if (
properties.contains( QStringLiteral(
"svg_outline_width_map_unit_scale" ) ) )
2042 if (
properties.contains( QStringLiteral(
"outline_width_unit" ) ) )
2046 if (
properties.contains( QStringLiteral(
"outline_width_map_unit_scale" ) ) )
2051 if (
properties.contains( QStringLiteral(
"parameters" ) ) )
2057 symbolLayer->restoreOldDataDefinedProperties(
properties );
2059 return symbolLayer.release();
2064 QVariantMap::iterator it =
properties.find( QStringLiteral(
"svgFile" ) );
2076 return QStringLiteral(
"SVGFill" );
2079 void QgsSVGFillSymbolLayer::applyPattern( QBrush &brush,
const QString &svgFilePath,
double patternWidth,
QgsUnitTypes::RenderUnit patternWidthUnit,
2080 const QColor &svgFillColor,
const QColor &svgStrokeColor,
double svgStrokeWidth,
2084 if ( mSvgViewBox.isNull() )
2091 if (
static_cast< int >( size ) < 1.0 || 10000.0 < size )
2093 brush.setTextureImage( QImage() );
2097 bool fitsInCache =
true;
2105 double hwRatio = 1.0;
2106 if ( patternPict.width() > 0 )
2108 hwRatio =
static_cast< double >( patternPict.height() ) /
static_cast< double >( patternPict.width() );
2110 patternImage = QImage(
static_cast< int >( size ),
static_cast< int >( size * hwRatio ), QImage::Format_ARGB32_Premultiplied );
2111 patternImage.fill( 0 );
2113 QPainter p( &patternImage );
2114 p.drawPicture( QPointF( size / 2, size * hwRatio / 2 ), patternPict );
2117 QTransform brushTransform;
2120 QImage transparentImage = patternImage.copy();
2122 brush.setTextureImage( transparentImage );
2126 brush.setTextureImage( patternImage );
2128 brush.setTransform( brushTransform );
2136 applyPattern(
mBrush, mSvgFilePath, mPatternWidth, mPatternWidthUnit,
mColor, mSvgStrokeColor, mSvgStrokeWidth, mSvgStrokeWidthUnit, context, mPatternWidthMapUnitScale, mSvgStrokeWidthMapUnitScale, evaluatedParameters );
2155 if ( !mSvgFilePath.isEmpty() )
2157 map.insert( QStringLiteral(
"svgFile" ), mSvgFilePath );
2161 map.insert( QStringLiteral(
"data" ), QString( mSvgData.toHex() ) );
2164 map.insert( QStringLiteral(
"width" ), QString::number( mPatternWidth ) );
2165 map.insert( QStringLiteral(
"angle" ), QString::number(
mAngle ) );
2170 map.insert( QStringLiteral(
"outline_width" ), QString::number( mSvgStrokeWidth ) );
2187 std::unique_ptr< QgsSVGFillSymbolLayer > clonedLayer;
2188 if ( !mSvgFilePath.isEmpty() )
2190 clonedLayer = std::make_unique< QgsSVGFillSymbolLayer >( mSvgFilePath, mPatternWidth,
mAngle );
2191 clonedLayer->setSvgFillColor(
mColor );
2192 clonedLayer->setSvgStrokeColor( mSvgStrokeColor );
2193 clonedLayer->setSvgStrokeWidth( mSvgStrokeWidth );
2197 clonedLayer = std::make_unique< QgsSVGFillSymbolLayer >( mSvgData, mPatternWidth,
mAngle );
2200 clonedLayer->setPatternWidthUnit( mPatternWidthUnit );
2201 clonedLayer->setPatternWidthMapUnitScale( mPatternWidthMapUnitScale );
2202 clonedLayer->setSvgStrokeWidthUnit( mSvgStrokeWidthUnit );
2203 clonedLayer->setSvgStrokeWidthMapUnitScale( mSvgStrokeWidthMapUnitScale );
2207 clonedLayer->setParameters( mParameters );
2211 clonedLayer->setSubSymbol(
mStroke->clone() );
2215 return clonedLayer.release();
2220 QDomElement symbolizerElem = doc.createElement( QStringLiteral(
"se:PolygonSymbolizer" ) );
2221 if ( !props.value( QStringLiteral(
"uom" ), QString() ).toString().isEmpty() )
2222 symbolizerElem.setAttribute( QStringLiteral(
"uom" ), props.value( QStringLiteral(
"uom" ), QString() ).toString() );
2223 element.appendChild( symbolizerElem );
2227 QDomElement fillElem = doc.createElement( QStringLiteral(
"se:Fill" ) );
2228 symbolizerElem.appendChild( fillElem );
2230 QDomElement graphicFillElem = doc.createElement( QStringLiteral(
"se:GraphicFill" ) );
2231 fillElem.appendChild( graphicFillElem );
2233 QDomElement graphicElem = doc.createElement( QStringLiteral(
"se:Graphic" ) );
2234 graphicFillElem.appendChild( graphicElem );
2236 if ( !mSvgFilePath.isEmpty() )
2247 symbolizerElem.appendChild( doc.createComment( QStringLiteral(
"SVG from data not implemented yet" ) ) );
2253 double angle = props.value( QStringLiteral(
"angle" ), QStringLiteral(
"0" ) ).toDouble( &ok );
2256 angleFunc = QStringLiteral(
"%1 + %2" ).arg( props.value( QStringLiteral(
"angle" ), QStringLiteral(
"0" ) ).toString() ).arg(
mAngle );
2269 mStroke->toSld( doc, element, props );
2281 QString path, mimeType;
2283 Qt::PenStyle penStyle;
2284 double size, strokeWidth;
2286 QDomElement fillElem = element.firstChildElement( QStringLiteral(
"Fill" ) );
2287 if ( fillElem.isNull() )
2290 QDomElement graphicFillElem = fillElem.firstChildElement( QStringLiteral(
"GraphicFill" ) );
2291 if ( graphicFillElem.isNull() )
2294 QDomElement graphicElem = graphicFillElem.firstChildElement( QStringLiteral(
"Graphic" ) );
2295 if ( graphicElem.isNull() )
2301 if ( mimeType != QLatin1String(
"image/svg+xml" ) )
2306 QString uom = element.attribute( QStringLiteral(
"uom" ) );
2315 double d = angleFunc.toDouble( &ok );
2320 std::unique_ptr< QgsSVGFillSymbolLayer > sl = std::make_unique< QgsSVGFillSymbolLayer >( path, size,
angle );
2321 sl->setOutputUnit( QgsUnitTypes::RenderUnit::RenderPixels );
2324 sl->setSvgStrokeWidth( strokeWidth );
2327 QDomElement strokeElem = element.firstChildElement( QStringLiteral(
"Stroke" ) );
2328 if ( !strokeElem.isNull() )
2339 return sl.release();
2357 double width = mPatternWidth;
2363 QString svgFile = mSvgFilePath;
2382 double strokeWidth = mSvgStrokeWidth;
2391 mSvgStrokeWidthUnit, context, mPatternWidthMapUnitScale, mSvgStrokeWidthMapUnitScale, evaluatedParameters );
2395 void QgsSVGFillSymbolLayer::storeViewBox()
2397 if ( !mSvgData.isEmpty() )
2399 QSvgRenderer r( mSvgData );
2402 mSvgViewBox = r.viewBoxF();
2407 mSvgViewBox = QRectF();
2410 void QgsSVGFillSymbolLayer::setDefaultSvgParams()
2412 if ( mSvgFilePath.isEmpty() )
2417 bool hasFillParam, hasFillOpacityParam, hasStrokeParam, hasStrokeWidthParam, hasStrokeOpacityParam;
2418 bool hasDefaultFillColor, hasDefaultFillOpacity, hasDefaultStrokeColor, hasDefaultStrokeWidth, hasDefaultStrokeOpacity;
2419 QColor defaultFillColor, defaultStrokeColor;
2420 double defaultStrokeWidth, defaultFillOpacity, defaultStrokeOpacity;
2422 hasFillOpacityParam, hasDefaultFillOpacity, defaultFillOpacity,
2423 hasStrokeParam, hasDefaultStrokeColor, defaultStrokeColor,
2424 hasStrokeWidthParam, hasDefaultStrokeWidth, defaultStrokeWidth,
2425 hasStrokeOpacityParam, hasDefaultStrokeOpacity, defaultStrokeOpacity );
2427 double newFillOpacity = hasFillOpacityParam ?
mColor.alphaF() : 1.0;
2428 double newStrokeOpacity = hasStrokeOpacityParam ? mSvgStrokeColor.alphaF() : 1.0;
2430 if ( hasDefaultFillColor )
2432 mColor = defaultFillColor;
2433 mColor.setAlphaF( newFillOpacity );
2435 if ( hasDefaultFillOpacity )
2437 mColor.setAlphaF( defaultFillOpacity );
2439 if ( hasDefaultStrokeColor )
2441 mSvgStrokeColor = defaultStrokeColor;
2442 mSvgStrokeColor.setAlphaF( newStrokeOpacity );
2444 if ( hasDefaultStrokeOpacity )
2446 mSvgStrokeColor.setAlphaF( defaultStrokeOpacity );
2448 if ( hasDefaultStrokeWidth )
2450 mSvgStrokeWidth = defaultStrokeWidth;
2469 delete mFillLineSymbol;
2486 return mFillLineSymbol ? mFillLineSymbol->
color() :
mColor;
2501 delete mFillLineSymbol;
2502 mFillLineSymbol = lineSymbol;
2513 return mFillLineSymbol;
2519 if ( mFillLineSymbol )
2541 mDistanceUnit = unit;
2542 mLineWidthUnit = unit;
2549 if ( mDistanceUnit != unit || mLineWidthUnit != unit || mOffsetUnit != unit )
2566 mDistanceMapUnitScale = scale;
2567 mLineWidthMapUnitScale = scale;
2568 mOffsetMapUnitScale = scale;
2574 mDistanceMapUnitScale == mLineWidthMapUnitScale &&
2575 mLineWidthMapUnitScale == mOffsetMapUnitScale )
2577 return mDistanceMapUnitScale;
2584 std::unique_ptr< QgsLinePatternFillSymbolLayer > patternLayer = std::make_unique< QgsLinePatternFillSymbolLayer >();
2590 QColor
color( Qt::black );
2593 if (
properties.contains( QStringLiteral(
"lineangle" ) ) )
2598 else if (
properties.contains( QStringLiteral(
"angle" ) ) )
2602 patternLayer->setLineAngle(
lineAngle );
2604 if (
properties.contains( QStringLiteral(
"distance" ) ) )
2608 patternLayer->setDistance(
distance );
2610 if (
properties.contains( QStringLiteral(
"linewidth" ) ) )
2615 else if (
properties.contains( QStringLiteral(
"outline_width" ) ) )
2619 else if (
properties.contains( QStringLiteral(
"line_width" ) ) )
2623 patternLayer->setLineWidth(
lineWidth );
2625 if (
properties.contains( QStringLiteral(
"color" ) ) )
2629 else if (
properties.contains( QStringLiteral(
"outline_color" ) ) )
2633 else if (
properties.contains( QStringLiteral(
"line_color" ) ) )
2637 patternLayer->setColor(
color );
2639 if (
properties.contains( QStringLiteral(
"offset" ) ) )
2643 patternLayer->setOffset(
offset );
2646 if (
properties.contains( QStringLiteral(
"distance_unit" ) ) )
2650 if (
properties.contains( QStringLiteral(
"distance_map_unit_scale" ) ) )
2654 if (
properties.contains( QStringLiteral(
"line_width_unit" ) ) )
2658 else if (
properties.contains( QStringLiteral(
"outline_width_unit" ) ) )
2662 if (
properties.contains( QStringLiteral(
"line_width_map_unit_scale" ) ) )
2666 if (
properties.contains( QStringLiteral(
"offset_unit" ) ) )
2670 if (
properties.contains( QStringLiteral(
"offset_map_unit_scale" ) ) )
2674 if (
properties.contains( QStringLiteral(
"outline_width_unit" ) ) )
2678 if (
properties.contains( QStringLiteral(
"outline_width_map_unit_scale" ) ) )
2683 patternLayer->restoreOldDataDefinedProperties(
properties );
2685 return patternLayer.release();
2690 return QStringLiteral(
"LinePatternFill" );
2693 void QgsLinePatternFillSymbolLayer::applyPattern(
const QgsSymbolRenderContext &context, QBrush &brush,
double lineAngle,
double distance )
2695 mBrush.setTextureImage( QImage() );
2697 if ( !mFillLineSymbol )
2702 std::unique_ptr< QgsLineSymbol > fillLineSymbol( mFillLineSymbol->
clone() );
2703 if ( !fillLineSymbol )
2718 outputPixelOffset = std::fmod( outputPixelOffset, outputPixelDist );
2719 if ( outputPixelOffset > outputPixelDist / 2.0 )
2720 outputPixelOffset -= outputPixelDist;
2724 double outputPixelBleed = 0;
2725 double outputPixelInterval = 0;
2726 for (
int i = 0; i < fillLineSymbol->symbolLayerCount(); i++ )
2730 outputPixelBleed = std::max( outputPixelBleed, outputPixelLayerBleed );
2733 if ( markerLineLayer )
2742 outputPixelInterval = std::max( outputPixelInterval, outputPixelLayerInterval );
2746 if ( outputPixelInterval > 0 )
2750 double intervalScale = std::round( outputPixelInterval ) / outputPixelInterval;
2751 outputPixelInterval = std::round( outputPixelInterval );
2753 for (
int i = 0; i < fillLineSymbol->symbolLayerCount(); i++ )
2758 if ( markerLineLayer )
2772 height = outputPixelDist;
2773 width = outputPixelInterval > 0 ? outputPixelInterval : height;
2777 width = outputPixelDist;
2778 height = outputPixelInterval > 0 ? outputPixelInterval : width;
2782 height = outputPixelDist / std::cos(
lineAngle * M_PI / 180 );
2783 width = outputPixelDist / std::sin(
lineAngle * M_PI / 180 );
2786 lineAngle = 180 * std::atan2(
static_cast< double >( height ),
static_cast< double >( width ) ) / M_PI;
2792 height = std::abs( height );
2793 width = std::abs( width );
2795 outputPixelDist = std::abs( height * std::cos(
lineAngle * M_PI / 180 ) );
2799 int offsetHeight =
static_cast< int >( std::round( outputPixelOffset / std::cos(
lineAngle * M_PI / 180 ) ) );
2800 outputPixelOffset = offsetHeight * std::cos(
lineAngle * M_PI / 180 );
2809 int bufferMulti =
static_cast< int >( std::max( std::ceil( outputPixelBleed / width ), std::ceil( outputPixelBleed / width ) ) );
2813 bufferMulti = std::max( bufferMulti, 1 );
2815 int xBuffer = width * bufferMulti;
2816 int yBuffer = height * bufferMulti;
2817 int innerWidth = width;
2818 int innerHeight = height;
2819 width += 2 * xBuffer;
2820 height += 2 * yBuffer;
2823 if ( width > 10000 || height > 10000 || width == 0 || height == 0 )
2828 QImage patternImage( width, height, QImage::Format_ARGB32 );
2829 patternImage.fill( 0 );
2831 QPointF p1, p2, p3, p4, p5, p6;
2834 p1 = QPointF( 0, yBuffer );
2835 p2 = QPointF( width, yBuffer );
2836 p3 = QPointF( 0, yBuffer + innerHeight );
2837 p4 = QPointF( width, yBuffer + innerHeight );
2841 p1 = QPointF( xBuffer, height );
2842 p2 = QPointF( xBuffer, 0 );
2843 p3 = QPointF( xBuffer + innerWidth, height );
2844 p4 = QPointF( xBuffer + innerWidth, 0 );
2848 dx = outputPixelDist * std::cos( ( 90 -
lineAngle ) * M_PI / 180.0 );
2849 dy = outputPixelDist * std::sin( ( 90 -
lineAngle ) * M_PI / 180.0 );
2850 p1 = QPointF( 0, height );
2851 p2 = QPointF( width, 0 );
2852 p3 = QPointF( -dx, height - dy );
2853 p4 = QPointF( width - dx, -dy );
2854 p5 = QPointF( dx, height + dy );
2855 p6 = QPointF( width + dx, dy );
2859 dx = outputPixelDist * std::cos( ( 90 -
lineAngle ) * M_PI / 180.0 );
2860 dy = outputPixelDist * std::sin( ( 90 -
lineAngle ) * M_PI / 180.0 );
2861 p1 = QPointF( width, 0 );
2862 p2 = QPointF( 0, height );
2863 p3 = QPointF( width - dx, -dy );
2864 p4 = QPointF( -dx, height - dy );
2865 p5 = QPointF( width + dx, dy );
2866 p6 = QPointF( dx, height + dy );
2870 dy = outputPixelDist * std::cos( ( 180 -
lineAngle ) * M_PI / 180 );
2871 dx = outputPixelDist * std::sin( ( 180 -
lineAngle ) * M_PI / 180 );
2872 p1 = QPointF( 0, 0 );
2873 p2 = QPointF( width, height );
2874 p5 = QPointF( dx, -dy );
2875 p6 = QPointF( width + dx, height - dy );
2876 p3 = QPointF( -dx, dy );
2877 p4 = QPointF( width - dx, height + dy );
2881 dy = outputPixelDist * std::cos( ( 180 -
lineAngle ) * M_PI / 180 );
2882 dx = outputPixelDist * std::sin( ( 180 -
lineAngle ) * M_PI / 180 );
2883 p1 = QPointF( width, height );
2884 p2 = QPointF( 0, 0 );
2885 p5 = QPointF( width + dx, height - dy );
2886 p6 = QPointF( dx, -dy );
2887 p3 = QPointF( width - dx, height + dy );
2888 p4 = QPointF( -dx, dy );
2895 p3 = QPointF( tempPt.x(), tempPt.y() );
2897 p4 = QPointF( tempPt.x(), tempPt.y() );
2899 p5 = QPointF( tempPt.x(), tempPt.y() );
2901 p6 = QPointF( tempPt.x(), tempPt.y() );
2905 p1 = QPointF( tempPt.x(), tempPt.y() );
2907 p2 = QPointF( tempPt.x(), tempPt.y() );
2910 QPainter p( &patternImage );
2914 p.setRenderHint( QPainter::Antialiasing,
false );
2915 QPen pen( QColor( Qt::black ) );
2916 pen.setWidthF( 0.1 );
2917 pen.setCapStyle( Qt::FlatCap );
2922 QPolygon polygon = QPolygon() << QPoint( 0, 0 ) << QPoint( width - 1, 0 ) << QPoint( width - 1, height - 1 ) << QPoint( 0, height - 1 ) << QPoint( 0, 0 );
2923 p.drawPolygon( polygon );
2925 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 );
2926 p.drawPolygon( polygon );
2932 p.setRenderHint( QPainter::Antialiasing,
true );
2944 fillLineSymbol->startRender( lineRenderContext, context.
fields() );
2946 QVector<QPolygonF> polygons;
2947 polygons.append( QPolygonF() << p1 << p2 );
2948 polygons.append( QPolygonF() << p3 << p4 );
2951 polygons.append( QPolygonF() << p5 << p6 );
2954 for (
const QPolygonF &polygon : std::as_const( polygons ) )
2956 fillLineSymbol->renderPolyline( polygon, context.
feature(), lineRenderContext, -1, context.
selected() );
2959 fillLineSymbol->stopRender( lineRenderContext );
2963 patternImage = patternImage.copy( xBuffer, yBuffer, patternImage.width() - 2 * xBuffer, patternImage.height() - 2 * yBuffer );
2968 QImage transparentImage = patternImage.copy();
2970 brush.setTextureImage( transparentImage );
2974 brush.setTextureImage( patternImage );
2977 QTransform brushTransform;
2978 brush.setTransform( brushTransform );
2983 applyPattern( context,
mBrush, mLineAngle, mDistance );
2985 if ( mFillLineSymbol )
2993 if ( mFillLineSymbol )
3002 map.insert( QStringLiteral(
"angle" ), QString::number( mLineAngle ) );
3003 map.insert( QStringLiteral(
"distance" ), QString::number( mDistance ) );
3004 map.insert( QStringLiteral(
"line_width" ), QString::number( mLineWidth ) );
3006 map.insert( QStringLiteral(
"offset" ), QString::number( mOffset ) );
3021 if ( mFillLineSymbol )
3032 QDomElement symbolizerElem = doc.createElement( QStringLiteral(
"se:PolygonSymbolizer" ) );
3033 if ( !props.value( QStringLiteral(
"uom" ), QString() ).toString().isEmpty() )
3034 symbolizerElem.setAttribute( QStringLiteral(
"uom" ), props.value( QStringLiteral(
"uom" ), QString() ).toString() );
3035 element.appendChild( symbolizerElem );
3040 QDomElement fillElem = doc.createElement( QStringLiteral(
"se:Fill" ) );
3041 symbolizerElem.appendChild( fillElem );
3043 QDomElement graphicFillElem = doc.createElement( QStringLiteral(
"se:GraphicFill" ) );
3044 fillElem.appendChild( graphicFillElem );
3046 QDomElement graphicElem = doc.createElement( QStringLiteral(
"se:Graphic" ) );
3047 graphicFillElem.appendChild( graphicElem );
3050 QColor lineColor = mFillLineSymbol ? mFillLineSymbol->
color() : QColor();
3051 double lineWidth = mFillLineSymbol ? mFillLineSymbol->
width() : 0.0;
3059 double angle = props.value( QStringLiteral(
"angle" ), QStringLiteral(
"0" ) ).toDouble( &ok );
3062 angleFunc = QStringLiteral(
"%1 + %2" ).arg( props.value( QStringLiteral(
"angle" ), QStringLiteral(
"0" ) ).toString() ).arg( mLineAngle );
3066 angleFunc = QString::number(
angle + mLineAngle );
3071 QPointF lineOffset( std::sin( mLineAngle ) * mOffset, std::cos( mLineAngle ) * mOffset );
3078 QString featureStyle;
3079 featureStyle.append(
"Brush(" );
3080 featureStyle.append( QStringLiteral(
"fc:%1" ).arg(
mColor.name() ) );
3081 featureStyle.append( QStringLiteral(
",bc:%1" ).arg( QLatin1String(
"#00000000" ) ) );
3082 featureStyle.append(
",id:\"ogr-brush-2\"" );
3083 featureStyle.append( QStringLiteral(
",a:%1" ).arg( mLineAngle ) );
3084 featureStyle.append( QStringLiteral(
",s:%1" ).arg( mLineWidth * widthScaleFactor ) );
3085 featureStyle.append(
",dx:0mm" );
3086 featureStyle.append( QStringLiteral(
",dy:%1mm" ).arg( mDistance * widthScaleFactor ) );
3087 featureStyle.append(
')' );
3088 return featureStyle;
3119 Qt::PenStyle lineStyle;
3121 QDomElement fillElem = element.firstChildElement( QStringLiteral(
"Fill" ) );
3122 if ( fillElem.isNull() )
3125 QDomElement graphicFillElem = fillElem.firstChildElement( QStringLiteral(
"GraphicFill" ) );
3126 if ( graphicFillElem.isNull() )
3129 QDomElement graphicElem = graphicFillElem.firstChildElement( QStringLiteral(
"Graphic" ) );
3130 if ( graphicElem.isNull() )
3136 if ( name != QLatin1String(
"horline" ) )
3144 double d = angleFunc.toDouble( &ok );
3153 offset = std::sqrt( std::pow( vectOffset.x(), 2 ) + std::pow( vectOffset.y(), 2 ) );
3156 QString uom = element.attribute( QStringLiteral(
"uom" ) );
3160 std::unique_ptr< QgsLinePatternFillSymbolLayer > sl = std::make_unique< QgsLinePatternFillSymbolLayer >();
3161 sl->setOutputUnit( QgsUnitTypes::RenderUnit::RenderPixels );
3162 sl->setColor( lineColor );
3164 sl->setLineAngle(
angle );
3166 sl->setDistance( size );
3169 QDomElement strokeElem = element.firstChildElement( QStringLiteral(
"Stroke" ) );
3170 if ( !strokeElem.isNull() )
3181 return sl.release();
3268 std::unique_ptr< QgsPointPatternFillSymbolLayer > layer = std::make_unique< QgsPointPatternFillSymbolLayer >();
3269 if (
properties.contains( QStringLiteral(
"distance_x" ) ) )
3271 layer->setDistanceX(
properties[QStringLiteral(
"distance_x" )].toDouble() );
3273 if (
properties.contains( QStringLiteral(
"distance_y" ) ) )
3275 layer->setDistanceY(
properties[QStringLiteral(
"distance_y" )].toDouble() );
3277 if (
properties.contains( QStringLiteral(
"displacement_x" ) ) )
3279 layer->setDisplacementX(
properties[QStringLiteral(
"displacement_x" )].toDouble() );
3281 if (
properties.contains( QStringLiteral(
"displacement_y" ) ) )
3283 layer->setDisplacementY(
properties[QStringLiteral(
"displacement_y" )].toDouble() );
3285 if (
properties.contains( QStringLiteral(
"offset_x" ) ) )
3287 layer->setOffsetX(
properties[QStringLiteral(
"offset_x" )].toDouble() );
3289 if (
properties.contains( QStringLiteral(
"offset_y" ) ) )
3291 layer->setOffsetY(
properties[QStringLiteral(
"offset_y" )].toDouble() );
3294 if (
properties.contains( QStringLiteral(
"distance_x_unit" ) ) )
3298 if (
properties.contains( QStringLiteral(
"distance_x_map_unit_scale" ) ) )
3302 if (
properties.contains( QStringLiteral(
"distance_y_unit" ) ) )
3306 if (
properties.contains( QStringLiteral(
"distance_y_map_unit_scale" ) ) )
3310 if (
properties.contains( QStringLiteral(
"displacement_x_unit" ) ) )
3314 if (
properties.contains( QStringLiteral(
"displacement_x_map_unit_scale" ) ) )
3318 if (
properties.contains( QStringLiteral(
"displacement_y_unit" ) ) )
3322 if (
properties.contains( QStringLiteral(
"displacement_y_map_unit_scale" ) ) )
3326 if (
properties.contains( QStringLiteral(
"offset_x_unit" ) ) )
3330 if (
properties.contains( QStringLiteral(
"offset_x_map_unit_scale" ) ) )
3334 if (
properties.contains( QStringLiteral(
"offset_y_unit" ) ) )
3338 if (
properties.contains( QStringLiteral(
"offset_y_map_unit_scale" ) ) )
3343 if (
properties.contains( QStringLiteral(
"outline_width_unit" ) ) )
3347 if (
properties.contains( QStringLiteral(
"outline_width_map_unit_scale" ) ) )
3352 layer->restoreOldDataDefinedProperties(
properties );
3354 return layer.release();
3359 return QStringLiteral(
"PointPatternFill" );
3362 void QgsPointPatternFillSymbolLayer::applyPattern(
const QgsSymbolRenderContext &context, QBrush &brush,
double distanceX,
double distanceY,
3363 double displacementX,
double displacementY,
double offsetX,
double offsetY )
3373 if ( width > 10000 || height > 10000 )
3376 brush.setTextureImage( img );
3380 QImage patternImage( width, height, QImage::Format_ARGB32 );
3381 patternImage.fill( 0 );
3382 if ( patternImage.isNull() )
3384 brush.setTextureImage( QImage() );
3389 QPainter p( &patternImage );
3411 for (
double currentX = -width; currentX <= width * 2.0; currentX += width )
3413 for (
double currentY = -height; currentY <= height * 2.0; currentY += height )
3422 for (
double currentX = -width; currentX <= width * 2.0; currentX += width )
3424 for (
double currentY = -height / 2.0; currentY <= height * 2.0; currentY += height )
3430 for (
double currentX = -width / 2.0; currentX <= width * 2.0; currentX += width )
3432 for (
double currentY = -height; currentY <= height * 2.0; currentY += height / 2.0 )
3434 mMarkerSymbol->
renderPoint( QPointF( currentX + widthOffset + ( std::fmod( currentY, height ) != 0 ? displacementPixelX : 0 ), currentY + heightOffset - displacementPixelY ), context.
feature(), pointRenderContext );
3443 QImage transparentImage = patternImage.copy();
3445 brush.setTextureImage( transparentImage );
3449 brush.setTextureImage( patternImage );
3451 QTransform brushTransform;
3452 brush.setTransform( brushTransform );
3461 if ( mRenderUsingMarkers )
3479 if ( mRenderUsingMarkers )
3492 if ( !mRenderUsingMarkers )
3554 p->setPen( QPen( Qt::NoPen ) );
3559 p->setBrush( QBrush( selColor ) );
3570 path.addPolygon( points );
3573 for (
const QPolygonF &ring : *rings )
3575 path.addPolygon( ring );
3578 p->setClipPath( path, Qt::IntersectClip );
3580 const double left = points.boundingRect().left() - 2 * width;
3581 const double top = points.boundingRect().top() - 2 * height;
3582 const double right = points.boundingRect().right() + 2 * width;
3583 const double bottom = points.boundingRect().bottom() + 2 * height;
3593 bool alternateColumn =
false;
3594 int currentCol = -3;
3595 for (
double currentX = left; currentX <= right; currentX += width, alternateColumn = !alternateColumn )
3597 if ( needsExpressionContext )
3600 bool alternateRow =
false;
3601 const double columnX = currentX + widthOffset;
3602 int currentRow = -3;
3603 for (
double currentY = top; currentY <= bottom; currentY += height, alternateRow = !alternateRow )
3605 double y = currentY + heightOffset;
3608 x += displacementPixelX;
3610 if ( !alternateColumn )
3611 y -= displacementPixelY;
3613 if ( needsExpressionContext )
3630 for (
auto ringIt = rings->constBegin(); ringIt != rings->constEnd(); ++ringIt )
3643 map.insert( QStringLiteral(
"distance_x" ), QString::number(
mDistanceX ) );
3644 map.insert( QStringLiteral(
"distance_y" ), QString::number(
mDistanceY ) );
3645 map.insert( QStringLiteral(
"displacement_x" ), QString::number(
mDisplacementX ) );
3646 map.insert( QStringLiteral(
"displacement_y" ), QString::number(
mDisplacementY ) );
3647 map.insert( QStringLiteral(
"offset_x" ), QString::number(
mOffsetX ) );
3648 map.insert( QStringLiteral(
"offset_y" ), QString::number(
mOffsetY ) );
3682 QDomElement symbolizerElem = doc.createElement( QStringLiteral(
"se:PolygonSymbolizer" ) );
3683 if ( !props.value( QStringLiteral(
"uom" ), QString() ).toString().isEmpty() )
3684 symbolizerElem.setAttribute( QStringLiteral(
"uom" ), props.value( QStringLiteral(
"uom" ), QString() ).toString() );
3685 element.appendChild( symbolizerElem );
3690 QDomElement fillElem = doc.createElement( QStringLiteral(
"se:Fill" ) );
3691 symbolizerElem.appendChild( fillElem );
3693 QDomElement graphicFillElem = doc.createElement( QStringLiteral(
"se:GraphicFill" ) );
3694 fillElem.appendChild( graphicFillElem );
3701 symbolizerElem.appendChild( distanceElem );
3706 markerLayer->writeSldMarker( doc, graphicFillElem, props );
3710 QString errorMsg = QStringLiteral(
"QgsMarkerSymbolLayer expected, %1 found. Skip it." ).arg( layer->
layerType() );
3711 graphicFillElem.appendChild( doc.createComment( errorMsg ) );
3715 QString errorMsg = QStringLiteral(
"Missing point pattern symbol layer. Skip it." );
3716 graphicFillElem.appendChild( doc.createComment( errorMsg ) );
3845 std::unique_ptr< QgsCentroidFillSymbolLayer > sl = std::make_unique< QgsCentroidFillSymbolLayer >();
3847 if (
properties.contains( QStringLiteral(
"point_on_surface" ) ) )
3848 sl->setPointOnSurface(
properties[QStringLiteral(
"point_on_surface" )].toInt() != 0 );
3849 if (
properties.contains( QStringLiteral(
"point_on_all_parts" ) ) )
3850 sl->setPointOnAllParts(
properties[QStringLiteral(
"point_on_all_parts" )].toInt() != 0 );
3851 if (
properties.contains( QStringLiteral(
"clip_points" ) ) )
3852 sl->setClipPoints(
properties[QStringLiteral(
"clip_points" )].toInt() != 0 );
3853 if (
properties.contains( QStringLiteral(
"clip_on_current_part_only" ) ) )
3854 sl->setClipOnCurrentPartOnly(
properties[QStringLiteral(
"clip_on_current_part_only" )].toInt() != 0 );
3856 sl->restoreOldDataDefinedProperties(
properties );
3858 return sl.release();
3863 return QStringLiteral(
"CentroidFill" );
3893 part.exterior = points;
3895 part.rings = *rings;
3902 mCurrentParts << part;
3907 const double prevOpacity =
mMarker->opacity();
3910 mMarker->setOpacity( prevOpacity );
3917 mCurrentParts.clear();
3924 const double prevOpacity =
mMarker->opacity();
3927 render( context, mCurrentParts, feature,
false );
3929 mMarker->setOpacity( prevOpacity );
3932 void QgsCentroidFillSymbolLayer::render(
QgsRenderContext &context,
const QVector<QgsCentroidFillSymbolLayer::Part> &parts,
const QgsFeature &feature,
bool selected )
3941 QVector< QgsGeometry > geometryParts;
3942 geometryParts.reserve( parts.size() );
3943 QPainterPath globalPath;
3946 int maxAreaPartIdx = 0;
3948 for (
int i = 0; i < parts.size(); i++ )
3950 const Part part = parts[i];
3953 if ( !geom.
isNull() && !part.rings.empty() )
3955 QgsPolygon *poly = qgsgeometry_cast< QgsPolygon * >( geom.
get() );
3959 int area = poly->
area();
3961 if ( area > maxArea )
3971 globalPath.addPolygon( part.exterior );
3972 for (
const QPolygonF &ring : part.rings )
3974 globalPath.addPolygon( ring );
3979 for (
int i = 0; i < parts.size(); i++ )
3984 const Part part = parts[i];
3992 path.addPolygon( part.exterior );
3993 for (
const QPolygonF &ring : part.rings )
3995 path.addPolygon( ring );
4004 context.
painter()->setClipPath( path );
4024 map[QStringLiteral(
"point_on_surface" )] = QString::number(
mPointOnSurface );
4025 map[QStringLiteral(
"point_on_all_parts" )] = QString::number(
mPointOnAllParts );
4026 map[QStringLiteral(
"clip_points" )] = QString::number(
mClipPoints );
4033 std::unique_ptr< QgsCentroidFillSymbolLayer > x = std::make_unique< QgsCentroidFillSymbolLayer >();
4036 x->setSubSymbol(
mMarker->clone() );
4051 mMarker->toSld( doc, element, props );
4062 std::unique_ptr< QgsMarkerSymbol > marker(
new QgsMarkerSymbol( layers ) );
4064 std::unique_ptr< QgsCentroidFillSymbolLayer > sl = std::make_unique< QgsCentroidFillSymbolLayer >();
4065 sl->setSubSymbol( marker.release() );
4066 sl->setPointOnAllParts(
false );
4067 return sl.release();
4094 attributes.unite(
mMarker->usedAttributes( context ) );
4117 mMarker->setOutputUnit( unit );
4134 return mMarker->usesMapUnits();
4143 mMarker->setMapUnitScale( scale );
4151 return mMarker->mapUnitScale();
4161 , mImageFilePath( imageFilePath )
4177 if (
properties.contains( QStringLiteral(
"imageFile" ) ) )
4179 imagePath =
properties[QStringLiteral(
"imageFile" )].toString();
4181 if (
properties.contains( QStringLiteral(
"coordinate_mode" ) ) )
4185 if (
properties.contains( QStringLiteral(
"alpha" ) ) )
4187 alpha =
properties[QStringLiteral(
"alpha" )].toDouble();
4189 if (
properties.contains( QStringLiteral(
"offset" ) ) )
4193 if (
properties.contains( QStringLiteral(
"angle" ) ) )
4197 if (
properties.contains( QStringLiteral(
"width" ) ) )
4201 std::unique_ptr< QgsRasterFillSymbolLayer > symbolLayer = std::make_unique< QgsRasterFillSymbolLayer >( imagePath );
4202 symbolLayer->setCoordinateMode( mode );
4203 symbolLayer->setOpacity( alpha );
4204 symbolLayer->setOffset(
offset );
4205 symbolLayer->setAngle(
angle );
4206 symbolLayer->setWidth(
width );
4207 if (
properties.contains( QStringLiteral(
"offset_unit" ) ) )
4211 if (
properties.contains( QStringLiteral(
"offset_map_unit_scale" ) ) )
4215 if (
properties.contains( QStringLiteral(
"width_unit" ) ) )
4219 if (
properties.contains( QStringLiteral(
"width_map_unit_scale" ) ) )
4224 symbolLayer->restoreOldDataDefinedProperties(
properties );
4226 return symbolLayer.release();
4231 QVariantMap::iterator it =
properties.find( QStringLiteral(
"imageFile" ) );
4235 it.value() = pathResolver.
writePath( it.value().toString() );
4237 it.value() = pathResolver.
readPath( it.value().toString() );
4249 return QStringLiteral(
"RasterFill" );
4260 QPointF
offset = mOffset;
4276 if ( mCoordinateMode ==
Feature )
4278 QRectF boundingRect = points.boundingRect();
4279 mBrush.setTransform(
mBrush.transform().translate( boundingRect.left() -
mBrush.transform().dx(),
4280 boundingRect.top() -
mBrush.transform().dy() ) );
4292 applyPattern(
mBrush, mImageFilePath, mWidth, mOpacity * context.
opacity(), context );
4303 map[QStringLiteral(
"imageFile" )] = mImageFilePath;
4304 map[QStringLiteral(
"coordinate_mode" )] = QString::number( mCoordinateMode );
4305 map[QStringLiteral(
"alpha" )] = QString::number( mOpacity );
4309 map[QStringLiteral(
"angle" )] = QString::number(
mAngle );
4310 map[QStringLiteral(
"width" )] = QString::number( mWidth );
4318 std::unique_ptr< QgsRasterFillSymbolLayer > sl = std::make_unique< QgsRasterFillSymbolLayer >( mImageFilePath );
4319 sl->setCoordinateMode( mCoordinateMode );
4320 sl->setOpacity( mOpacity );
4321 sl->setOffset( mOffset );
4322 sl->setOffsetUnit( mOffsetUnit );
4323 sl->setOffsetMapUnitScale( mOffsetMapUnitScale );
4325 sl->setWidth( mWidth );
4326 sl->setWidthUnit( mWidthUnit );
4327 sl->setWidthMapUnitScale( mWidthMapUnitScale );
4330 return sl.release();
4335 return context.
convertToPainterUnits( std::max( std::fabs( mOffset.x() ), std::fabs( mOffset.y() ) ), mOffsetUnit, mOffsetMapUnitScale );
4346 mImageFilePath = imagePath;
4351 mCoordinateMode = mode;
4369 if ( !hasWidthExpression && !hasAngleExpression && !hasOpacityExpression && !hasFileExpression )
4375 if ( hasAngleExpression )
4383 if ( !hasWidthExpression && !hasOpacityExpression && !hasFileExpression )
4388 double width = mWidth;
4389 if ( hasWidthExpression )
4395 if ( hasOpacityExpression )
4400 QString file = mImageFilePath;
4401 if ( hasFileExpression )
4414 void QgsRasterFillSymbolLayer::applyPattern( QBrush &brush,
const QString &imageFilePath,
const double width,
const double alpha,
const QgsSymbolRenderContext &context )
4427 if ( size.isEmpty() )
4430 size.setWidth( (
width * size.width() ) / 100.0 );
4433 if (
static_cast< int >( size.width() ) < 1 || 10000.0 < size.width() )
4437 size.setHeight( 0 );
4445 brush.setTextureImage( img );
4454 : mCountMethod( method )
4455 , mPointCount( pointCount )
4456 , mDensityArea( densityArea )
4467 const int pointCount =
properties.value( QStringLiteral(
"point_count" ), QStringLiteral(
"10" ) ).toInt();
4468 const double densityArea =
properties.value( QStringLiteral(
"density_area" ), QStringLiteral(
"250.0" ) ).toDouble();
4470 unsigned long seed = 0;
4471 if (
properties.contains( QStringLiteral(
"seed" ) ) )
4477 std::random_device rd;
4478 std::mt19937 mt(
seed == 0 ? rd() :
seed );
4479 std::uniform_int_distribution<> uniformDist( 1, 999999999 );
4480 seed = uniformDist( mt );
4485 if (
properties.contains( QStringLiteral(
"density_area_unit" ) ) )
4487 if (
properties.contains( QStringLiteral(
"density_area_unit_scale" ) ) )
4490 if (
properties.contains( QStringLiteral(
"clip_points" ) ) )
4492 sl->setClipPoints(
properties[QStringLiteral(
"clip_points" )].toInt() );
4495 return sl.release();
4500 return QStringLiteral(
"RandomMarkerFill" );
4505 mMarker->setColor(
color );
4511 return mMarker ? mMarker->color() :
mColor;
4527 part.exterior = points;
4529 part.rings = *rings;
4531 if ( mRenderingFeature )
4535 mFeatureSymbolOpacity = context.
opacity();
4536 mCurrentParts << part;
4541 const double prevOpacity = mMarker->opacity();
4542 mMarker->setOpacity( mMarker->opacity() * context.
opacity() );
4544 mMarker->setOpacity( prevOpacity );
4548 void QgsRandomMarkerFillSymbolLayer::render(
QgsRenderContext &context,
const QVector<QgsRandomMarkerFillSymbolLayer::Part> &parts,
const QgsFeature &feature,
bool selected )
4557 QVector< QgsGeometry > geometryParts;
4558 geometryParts.reserve( parts.size() );
4561 for (
const Part &part : parts )
4564 if ( !geom.
isNull() && !part.rings.empty() )
4566 QgsPolygon *poly = qgsgeometry_cast< QgsPolygon * >( geom.
get() );
4567 for (
const QPolygonF &ring : part.rings )
4574 geom = geom.
buffer( 0, 0 );
4576 geometryParts << geom;
4580 path.addPolygon( part.exterior );
4581 for (
const QPolygonF &ring : part.rings )
4583 path.addPolygon( ring );
4593 context.
painter()->setClipPath( path );
4597 int count = mPointCount;
4604 switch ( mCountMethod )
4616 count = std::max( 0.0, std::ceil( count * ( geom.
area() /
densityArea ) ) );
4623 unsigned long seed = mSeed;
4634 std::sort( randomPoints.begin(), randomPoints.end(), [](
const QgsPointXY & a,
const QgsPointXY & b )->bool
4636 return a.y() < b.y();
4647 for (
const QgsPointXY &p : std::as_const( randomPoints ) )
4649 if ( needsExpressionContext )
4651 mMarker->renderPoint( QPointF( p.x(), p.y() ), feature.
isValid() ? &feature :
nullptr, context, -1, selected );
4665 map.insert( QStringLiteral(
"count_method" ), QString::number(
static_cast< int >( mCountMethod ) ) );
4666 map.insert( QStringLiteral(
"point_count" ), QString::number( mPointCount ) );
4667 map.insert( QStringLiteral(
"density_area" ), QString::number( mDensityArea ) );
4670 map.insert( QStringLiteral(
"seed" ), QString::number( mSeed ) );
4671 map.insert( QStringLiteral(
"clip_points" ), QString::number( mClipPoints ) );
4677 std::unique_ptr< QgsRandomMarkerFillSymbolLayer > res = std::make_unique< QgsRandomMarkerFillSymbolLayer >( mPointCount, mCountMethod, mDensityArea, mSeed );
4680 res->setDensityAreaUnit( mDensityAreaUnit );
4681 res->setDensityAreaUnitScale( mDensityAreaUnitScale );
4682 res->mClipPoints = mClipPoints;
4683 res->setSubSymbol( mMarker->clone() );
4686 return res.release();
4696 return mMarker.get();
4708 mColor = mMarker->color();
4717 attributes.unite( mMarker->usedAttributes( context ) );
4726 if ( mMarker && mMarker->hasDataDefinedProperties() )
4763 return mCountMethod;
4768 mCountMethod = method;
4773 return mDensityArea;
4778 mDensityArea = area;
4783 mRenderingFeature =
true;
4784 mCurrentParts.clear();
4789 mRenderingFeature =
false;
4791 const double prevOpacity = mMarker->opacity();
4792 mMarker->setOpacity( mMarker->opacity() * mFeatureSymbolOpacity );
4794 render( context, mCurrentParts, feature,
false );
4796 mFeatureSymbolOpacity = 1;
4797 mMarker->setOpacity( prevOpacity );
4805 mMarker->setOutputUnit( unit );
4813 return mMarker->outputUnit();
4822 return mMarker->usesMapUnits();
4831 mMarker->setMapUnitScale( scale );
4839 return mMarker->mapUnitScale();
@ RenderingSubSymbol
Set whenever a sub-symbol of a parent symbol is currently being rendered. Can be used during symbol a...
@ LosslessImageRendering
Render images losslessly whenever possible, instead of the default lossy jpeg rendering used for some...
@ Antialiasing
Use antialiasing while drawing.
@ RenderBlocking
Render and load remote sources in the same thread to ensure rendering remote sources (svg and images)...
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.
bool isCanceled() const SIP_HOLDGIL
Tells whether the operation has been canceled already.
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(Qgis::GeometryValidityFlags flags=Qgis::GeometryValidityFlags()) 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, double targetDpi=96, 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, QgsFeedback *feedback=nullptr)
Multiplies opacity of image pixel values by a factor.
static void stackBlur(QImage &image, int radius, bool alphaOnly=false, QgsFeedback *feedback=nullptr)
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 the 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 ...
double convertToPainterUnits(double size, QgsUnitTypes::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale(), Qgis::RenderSubcomponentProperty property=Qgis::RenderSubcomponentProperty::Generic) const
Converts a size from the specified units to painter units (pixels).
bool forceVectorOutput() const
Returns true if rendering operations should use vector operations instead of any faster raster shortc...
void setFlag(Qgis::RenderContextFlag flag, bool on=true)
Enable or disable a particular flag (other flags are not affected)
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...
QgsFeedback * feedback() const
Returns the feedback object that can be queried regularly during rendering to check if rendering shou...
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.
void setRendererScale(double scale)
Sets the renderer map scale.
Qgis::RenderContextFlags flags() const
Returns combination of flags used for rendering.
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)
CORE_EXPORT QgsMeshVertex centroid(const QgsMeshFace &face, const QVector< QgsMeshVertex > &vertices)
Returns the centroid of the face.
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.