64#include <QSvgGenerator>
79 : mEnabled( other.mEnabled )
80 , mSize( other.mSize )
81 , mSizeUnit( other.mSizeUnit )
82 , mSizeMapUnitScale( other.mSizeMapUnitScale )
83 , mJoinStyle( other.mJoinStyle )
84 , mFillSymbol( other.mFillSymbol ? other.mFillSymbol->clone() : nullptr )
94 mEnabled = other.mEnabled;
96 mSizeUnit = other.mSizeUnit;
97 mSizeMapUnitScale = other.mSizeMapUnitScale;
98 mJoinStyle = other.mJoinStyle;
99 mFillSymbol.reset( other.mFillSymbol ? other.mFillSymbol->clone() :
nullptr );
105 return mFillSymbol.get();
110 mFillSymbol.reset( symbol );
117 QDomElement symbolBufferElem = element.ownerDocument().createElement( QStringLiteral(
"buffer" ) );
118 symbolBufferElem.setAttribute( QStringLiteral(
"enabled" ), mEnabled );
119 symbolBufferElem.setAttribute( QStringLiteral(
"size" ), mSize );
122 symbolBufferElem.setAttribute( QStringLiteral(
"joinStyle" ),
static_cast< unsigned int >( mJoinStyle ) );
126 QDomDocument document = element.ownerDocument();
128 symbolBufferElem.appendChild( fillElem );
131 element.appendChild( symbolBufferElem );
136 const QDomElement symbolBufferElem = element.firstChildElement( QStringLiteral(
"buffer" ) );
137 mEnabled = symbolBufferElem.attribute( QStringLiteral(
"enabled" ), QStringLiteral(
"0" ) ).toInt();
138 mSize = symbolBufferElem.attribute( QStringLiteral(
"size" ), QStringLiteral(
"1" ) ).toDouble();
141 mJoinStyle =
static_cast< Qt::PenJoinStyle
>( symbolBufferElem.attribute( QStringLiteral(
"joinStyle" ), QString::number( Qt::RoundJoin ) ).toUInt() );
143 const QDomElement fillSymbolElem = symbolBufferElem.firstChildElement( QStringLiteral(
"symbol" ) );
144 if ( !fillSymbolElem.isNull() )
166 for (
int i = 0; i <
mLayers.count(); i++ )
172 else if ( !
mLayers.at( i )->isCompatibleWithSymbol(
this ) )
184 return _getLineString3d( context, curve, clipToExtent );
186 return _getLineString2d( context, curve, clipToExtent );
191 const unsigned int nPoints = curve.
numPoints();
195 QVector< double > pointsX;
196 QVector< double > pointsY;
197 QVector< double > pointsZ;
203 const double cw = e.
width() / 10;
204 const double ch = e.
height() / 10;
208 std::unique_ptr< QgsLineString > segmentized;
216 lineString = segmentized.get();
226 pointsX = ls->xVector();
227 pointsY = ls->yVector();
228 pointsZ = ls->zVector();
232 std::unique_ptr< QgsLineString > segmentized;
235 pointsX = segmentized->xVector();
236 pointsY = segmentized->yVector();
237 pointsZ = segmentized->zVector();
242 const QVector< double > preTransformPointsZ = pointsZ;
243 bool wasTransformed =
false;
247 const int nVertices = pointsX.size();
248 wasTransformed =
true;
254 catch ( QgsCsException & )
262 const int size = pointsX.size();
264 const double *xIn = pointsX.data();
265 const double *yIn = pointsY.data();
266 const double *zIn = pointsZ.data();
268 const double *preTransformZIn = wasTransformed ? preTransformPointsZ.constData() :
nullptr;
270 double *xOut = pointsX.data();
271 double *yOut = pointsY.data();
272 double *zOut = pointsZ.data();
274 for (
int i = 0; i < size; ++i )
276 bool pointOk = std::isfinite( *xIn ) && std::isfinite( *yIn );
283 pointOk &= !wasTransformed || std::isfinite( *zIn ) || !std::isfinite( *preTransformZIn );
299 if ( preTransformZIn )
302 pointsX.resize( outSize );
303 pointsY.resize( outSize );
304 pointsZ.resize( outSize );
310 const QgsRectangle e = context.
mapExtent();
311 const double cw = e.
width() / 10;
312 const double ch = e.
height() / 10;
315 QVector< double > tempX;
316 QVector< double > tempY;
317 QVector< double > tempZ;
324 const int polygonSize = pointsX.size();
325 QPolygonF out( polygonSize );
326 const double *x = pointsX.constData();
327 const double *y = pointsY.constData();
328 QPointF *dest = out.data();
329 for (
int i = 0; i < polygonSize; ++i )
331 double screenX = *x++;
332 double screenY = *y++;
334 *dest++ = QPointF( screenX, screenY );
342 const unsigned int nPoints = curve.
numPoints();
345 const QgsMapToPixel &mtp = context.
mapToPixel();
351 const QgsRectangle e = context.
extent();
352 const double cw = e.
width() / 10;
353 const double ch = e.
height() / 10;
369 catch ( QgsCsException & )
376 pts.erase( std::remove_if( pts.begin(), pts.end(),
377 [](
const QPointF point )
379 return !std::isfinite( point.x() ) || !std::isfinite( point.y() );
385 const QgsRectangle e = context.
mapExtent();
386 const double cw = e.
width() / 10;
387 const double ch = e.
height() / 10;
392 QPointF *ptr = pts.data();
393 for (
int i = 0; i < pts.size(); ++i, ++ptr )
405 return _getPolygonRing3d( context, curve, clipToExtent, isExteriorRing, correctRingOrientation );
407 return _getPolygonRing2d( context, curve, clipToExtent, isExteriorRing, correctRingOrientation );
410QPolygonF QgsSymbol::_getPolygonRing3d(
QgsRenderContext &context,
const QgsCurve &curve,
const bool clipToExtent,
const bool isExteriorRing,
const bool correctRingOrientation )
415 QVector< double > pointsX;
416 QVector< double > pointsY;
417 QVector< double > pointsZ;
422 bool reverseRing =
false;
423 if ( correctRingOrientation )
435 const QgsRectangle e = context.
extent();
436 const double cw = e.
width() / 10;
437 const double ch = e.
height() / 10;
440 const QgsLineString *lineString =
nullptr;
441 std::unique_ptr< QgsLineString > segmentized;
449 lineString = segmentized.get();
452 pointsX = lineString->
xVector();
453 pointsY = lineString->
yVector();
454 pointsZ = lineString->
zVector();
463 pointsX = ls->xVector();
464 pointsY = ls->yVector();
465 pointsZ = ls->zVector();
469 std::unique_ptr< QgsLineString > segmentized;
472 pointsX = segmentized->xVector();
473 pointsY = segmentized->yVector();
474 pointsZ = segmentized->zVector();
480 std::reverse( pointsX.begin(), pointsX.end() );
481 std::reverse( pointsY.begin(), pointsY.end() );
482 std::reverse( pointsZ.begin(), pointsZ.end() );
486 const QVector< double > preTransformPointsZ = pointsZ;
487 bool wasTransformed =
false;
490 const int nVertices = pointsX.size();
491 wasTransformed =
true;
496 catch ( QgsCsException & )
504 const int size = pointsX.size();
506 const double *xIn = pointsX.data();
507 const double *yIn = pointsY.data();
508 const double *zIn = pointsZ.data();
510 const double *preTransformZIn = wasTransformed ? preTransformPointsZ.constData() :
nullptr;
512 double *xOut = pointsX.data();
513 double *yOut = pointsY.data();
514 double *zOut = pointsZ.data();
516 for (
int i = 0; i < size; ++i )
518 bool pointOk = std::isfinite( *xIn ) && std::isfinite( *yIn );
524 pointOk &= !wasTransformed || std::isfinite( *zIn ) || !std::isfinite( *preTransformZIn );
540 if ( preTransformZIn )
543 pointsX.resize( outSize );
544 pointsY.resize( outSize );
545 pointsZ.resize( outSize );
551 const QgsRectangle e = context.
mapExtent();
552 const double cw = e.
width() / 10;
553 const double ch = e.
height() / 10;
559 const int polygonSize = pointsX.size();
560 QPolygonF out( polygonSize );
561 const double *x = pointsX.constData();
562 const double *y = pointsY.constData();
563 QPointF *dest = out.data();
564 for (
int i = 0; i < polygonSize; ++i )
566 double screenX = *x++;
567 double screenY = *y++;
569 *dest++ = QPointF( screenX, screenY );
572 if ( !out.empty() && !out.isClosed() )
579QPolygonF QgsSymbol::_getPolygonRing2d(
QgsRenderContext &context,
const QgsCurve &curve,
const bool clipToExtent,
const bool isExteriorRing,
const bool correctRingOrientation )
582 const QgsMapToPixel &mtp = context.
mapToPixel();
589 if ( correctRingOrientation )
593 std::reverse( poly.begin(), poly.end() );
595 std::reverse( poly.begin(), poly.end() );
601 const QgsRectangle e = context.
extent();
602 const double cw = e.
width() / 10;
603 const double ch = e.
height() / 10;
615 catch ( QgsCsException & )
622 poly.erase( std::remove_if( poly.begin(), poly.end(),
623 [](
const QPointF point )
625 return !std::isfinite( point.x() ) || !std::isfinite( point.y() );
631 const QgsRectangle e = context.
mapExtent();
632 const double cw = e.
width() / 10;
633 const double ch = e.
height() / 10;
638 QPointF *ptr = poly.data();
639 for (
int i = 0; i < poly.size(); ++i, ++ptr )
644 if ( !poly.empty() && !poly.isClosed() )
645 poly << poly.at( 0 );
656 holes.reserve( ringCount );
657 for (
int idx = 0; idx < ringCount; idx++ )
660 if ( !hole.isEmpty() )
661 holes.append( hole );
670 return QObject::tr(
"Marker" );
672 return QObject::tr(
"Line" );
674 return QObject::tr(
"Fill" );
676 return QObject::tr(
"Hybrid" );
700 QgsSymbol::initPropertyDefinitions();
701 return sPropertyDefinitions;
717 QgsSymbolLayerList::const_iterator it =
mLayers.constBegin();
721 for ( ; it !=
mLayers.constEnd(); ++it )
723 if ( ( *it )->outputUnit() != unit )
740 if (
layer->usesMapUnits() )
755 QgsSymbolLayerList::const_iterator it =
mLayers.constBegin();
756 if ( it ==
mLayers.constEnd() )
762 for ( ; it !=
mLayers.constEnd(); ++it )
764 if ( ( *it )->mapUnitScale() != scale )
774 const auto constMLayers =
mLayers;
777 layer->setOutputUnit( u );
783 const auto constMLayers =
mLayers;
786 layer->setMapUnitScale( scale );
824 std::unique_ptr< QgsSymbol > s;
848 s = std::make_unique< QgsMarkerSymbol >();
851 s = std::make_unique< QgsLineSymbol >();
854 s = std::make_unique< QgsFillSymbol >();
857 QgsDebugError( QStringLiteral(
"unknown layer's geometry type" ) );
875 if ( s->color().spec() == QColor::Spec::Rgb && isCmyk )
877 s->setColor( s->color().toCmyk() );
879 else if ( s->color().spec() == QColor::Spec::Cmyk && !isCmyk )
881 s->setColor( s->color().toRgb() );
899 if ( index < 0 || index >
mLayers.count() )
902 if ( !
layer || !
layer->isCompatibleWithSymbol(
this ) )
912 if ( !
layer || !
layer->isCompatibleWithSymbol(
this ) )
922 if ( index < 0 || index >=
mLayers.count() )
933 if ( index < 0 || index >=
mLayers.count() )
936 return mLayers.takeAt( index );
944 if ( oldLayer ==
layer )
947 if ( !
layer || !
layer->isCompatibleWithSymbol(
this ) )
958 Q_ASSERT_X( !mStarted,
"startRender",
"Rendering has already been started for this symbol instance!" );
973 const long long mapFrameNumber = context.
currentFrame();
974 double animationTimeSeconds = 0;
975 if ( mapFrameNumber >= 0 && context.
frameRate() > 0 )
978 animationTimeSeconds = mapFrameNumber / context.
frameRate();
983 animationTimeSeconds = QDateTime::currentMSecsSinceEpoch() / 1000.0;
986 const long long symbolFrame =
static_cast< long long >( std::floor( animationTimeSeconds *
mAnimationSettings.frameRate() ) );
987 scope->setVariable( QStringLiteral(
"symbol_frame" ), symbolFrame,
true );
990 mSymbolRenderContext->setExpressionContextScope( scope.release() );
1004 layer->prepareExpressions( symbolContext );
1022 layer->prepareMasks( symbolContext );
1023 layer->startRender( symbolContext );
1029 Q_ASSERT_X( mStarted,
"startRender",
"startRender was not called for this symbol instance!" );
1033 if ( mSymbolRenderContext )
1035 const auto constMLayers =
mLayers;
1041 layer->stopRender( *mSymbolRenderContext );
1050 mSymbolRenderContext.reset(
nullptr );
1059 const auto constMLayers =
mLayers;
1062 if ( !
layer->isLocked() )
1072 if ( !
layer->isLocked() )
1074 const QColor layerColor =
layer->color();
1075 if ( layerColor.isValid() )
1079 return QColor( 0, 0, 0 );
1085 std::unique_ptr< QgsRenderContext > tempContext;
1089 context = tempContext.get();
1124 if ( !customContext && expressionContext )
1128 else if ( !customContext )
1139 QPainter *originalTargetPainter =
nullptr;
1141 std::unique_ptr< QPicture > pictureForDeferredRendering;
1142 std::unique_ptr< QPainter > deferredRenderingPainter;
1145 originalTargetPainter = context->
painter();
1146 pictureForDeferredRendering = std::make_unique< QPicture >();
1147 deferredRenderingPainter = std::make_unique< QPainter >( pictureForDeferredRendering.get() );
1148 context->
setPainter( deferredRenderingPainter.get() );
1167 const QSizeF targetSize = QSizeF( size.width() - 1, size.height() - 1 );
1175 std::unique_ptr< QgsEffectPainter > effectPainter;
1176 if ( effect && effect->
enabled() )
1177 effectPainter = std::make_unique< QgsEffectPainter >( symbolContext.
renderContext(), effect );
1179 for (
const QList< QPolygonF > &poly : polys )
1181 QVector< QPolygonF > rings;
1182 rings.reserve( poly.size() );
1183 for (
int i = 1; i < poly.size(); ++i )
1184 rings << poly.at( i );
1188 effectPainter.reset();
1193 layer->drawPreviewIcon( symbolContext, size );
1199 deferredRenderingPainter->end();
1200 deferredRenderingPainter.reset();
1203 QPainter geometryPainter( &geometryPaintDevice );
1205 geometryPainter.end();
1210 context->
setPainter( originalTargetPainter );
1218 case Qt::SvgMiterJoin:
1228 case Qt::MPenJoinStyle:
1236 for (
const QList< QPolygonF > &polygon : polygons )
1238 QVector< QPolygonF > rings;
1239 for (
int i = 1; i < polygon.size(); ++i )
1240 rings << polygon.at( i );
1241 mBufferSettings->fillSymbol()->renderPolygon( polygon.value( 0 ), &rings,
nullptr, *context );
1254 if ( format.compare( QLatin1String(
"svg" ), Qt::CaseInsensitive ) == 0 )
1256 QSvgGenerator generator;
1257 generator.setFileName( path );
1258 generator.setSize( size );
1259 generator.setViewBox( QRect( 0, 0, size.width(), size.height() ) );
1261 QPainter painter( &generator );
1267 QImage image =
asImage( size );
1274 QImage image( size, QImage::Format_ARGB32_Premultiplied );
1277 QPainter p( &image );
1278 p.setRenderHint( QPainter::Antialiasing );
1279 p.setRenderHint( QPainter::SmoothPixmapTransform );
1290 QImage preview( QSize( 100, 100 ) * devicePixelRatio, QImage::Format_ARGB32_Premultiplied );
1292 preview.setDevicePixelRatio( devicePixelRatio );
1294 QPainter p( &preview );
1295 p.setRenderHint( QPainter::Antialiasing );
1296 p.translate( 0.5, 0.5 );
1300 p.setPen( QPen( Qt::gray ) );
1301 p.drawLine( QLineF( 0, 50, 100, 50 ) );
1302 p.drawLine( QLineF( 50, 0, 50, 100 ) );
1316 if ( expressionContext )
1325 poly << QPointF( 0, 50 ) << QPointF( 99, 50 );
1326 static_cast<QgsLineSymbol *
>( this )->renderPolyline( poly,
nullptr, context );
1331 polygon << QPointF( 20, 20 ) << QPointF( 80, 20 ) << QPointF( 80, 80 ) << QPointF( 20, 80 ) << QPointF( 20, 20 );
1332 static_cast<QgsFillSymbol *
>( this )->renderPolygon( polygon,
nullptr,
nullptr, context );
1336 static_cast<QgsMarkerSymbol *
>( this )->renderPoint( QPointF( 50, 50 ),
nullptr, context );
1354 t = QStringLiteral(
"MARKER" );
1357 t = QStringLiteral(
"LINE" );
1360 t = QStringLiteral(
"FILL" );
1363 Q_ASSERT(
false &&
"unknown symbol type" );
1367 for ( QgsSymbolLayerList::const_iterator it =
mLayers.begin(); it !=
mLayers.end(); ++it )
1403 for (
int i = 0; i <
mLayers.count(); ++i )
1405 if ( !
mLayers.at( i )->rendersIdenticallyTo( other->
mLayers.at( i ) ) )
1415 toSld( doc, element, context );
1421 QVariantMap props = oldProps;
1423 props[ QStringLiteral(
"alpha" )] = QString::number(
opacity() );
1424 double scaleFactor = 1.0;
1430 for ( QgsSymbolLayerList::const_iterator it =
mLayers.begin(); it !=
mLayers.end(); ++it )
1432 if ( !( *it )->toSld( doc, element, context ) )
1442 for ( QgsSymbolLayerList::const_iterator it =
mLayers.begin(); it !=
mLayers.end(); ++it )
1445 layer->setLocked( ( *it )->isLocked() );
1446 layer->setRenderingPass( ( *it )->renderingPass() );
1447 layer->setEnabled( ( *it )->enabled() );
1448 layer->setId( ( *it )->id() );
1449 layer->setUserFlags( ( *it )->userFlags() );
1450 lst.append(
layer );
1465 if ( effect && effect->
enabled() )
1468 generatorLayer->
render( context, geometryType, points, rings );
1472 generatorLayer->
render( context, geometryType, points, rings );
1481 QSet<QString> attributes = mDataDefinedProperties.referencedFields( context.
expressionContext(),
true );
1482 QgsSymbolLayerList::const_iterator sIt =
mLayers.constBegin();
1483 for ( ; sIt !=
mLayers.constEnd(); ++sIt )
1487 attributes.unite( ( *sIt )->usedAttributes( context ) );
1492 attributes.unite(
mBufferSettings->fillSymbol()->usedAttributes( context ) );
1499 mDataDefinedProperties.setProperty( key, property );
1504 if ( mDataDefinedProperties.hasActiveProperties() )
1509 if (
layer->hasDataDefinedProperties() )
1519 if (
layer->canCauseArtifactsBetweenAdjacentTiles() )
1544class ExpressionContextScopePopper
1548 ExpressionContextScopePopper() =
default;
1550 ~ExpressionContextScopePopper()
1553 context->popScope();
1556 QgsExpressionContext *context =
nullptr;
1562class GeometryRestorer
1565 GeometryRestorer( QgsRenderContext &context )
1566 : mContext( context ),
1567 mGeometry( context.geometry() )
1572 mContext.setGeometry( mGeometry );
1576 QgsRenderContext &mContext;
1577 const QgsAbstractGeometry *mGeometry;
1592 GeometryRestorer geomRestorer( context );
1594 bool usingSegmentizedGeometry =
false;
1602 if ( std::isfinite( boundsOrigin.x() ) && std::isfinite( boundsOrigin.y() ) )
1617 clippingEnabled =
false;
1629 clippingEnabled =
false;
1633 clippingEnabled =
false;
1636 mSymbolRenderContext->setGeometryPartNum( 1 );
1639 ExpressionContextScopePopper scopePopper;
1640 if ( mSymbolRenderContext->expressionContextScope() )
1642 if ( needsExpressionContext )
1668 QPointF renderPoint;
1669 const QgsPoint *originalGeometry =
nullptr;
1671 QVector< PointInfo > pointsToRender;
1675 QPolygonF renderLine;
1676 const QgsCurve *originalGeometry =
nullptr;
1678 QVector< LineInfo > linesToRender;
1682 QPolygonF renderExterior;
1683 QVector< QPolygonF > renderRings;
1685 int originalPartIndex = 0;
1687 QVector< PolygonInfo > polygonsToRender;
1690 getPartGeometry = [&pointsToRender, &linesToRender, &polygonsToRender, &getPartGeometry, &context, &clippingEnabled, &markers, &feature, &usingSegmentizedGeometry,
this](
const QgsAbstractGeometry * part,
int partIndex = 0 )
1707 if ( needsSegmentizing )
1710 if ( !segmentizedPart )
1714 temporaryGeometryContainer.
set( segmentizedPart.release() );
1715 processedGeometry = temporaryGeometryContainer.
constGet();
1716 usingSegmentizedGeometry =
true;
1721 processedGeometry = part;
1731 std::unique_ptr< QgsAbstractGeometry > simplified( simplifier.
simplify( processedGeometry ) );
1734 temporaryGeometryContainer.
set( simplified.release() );
1735 processedGeometry = temporaryGeometryContainer.
constGet();
1750 temporaryGeometryContainer.
set( clippedGeom.release() );
1751 processedGeometry = temporaryGeometryContainer.
constGet();
1758 processedGeometry = part;
1761 if ( !processedGeometry )
1764 QgsDebugError( QStringLiteral(
"No processed geometry to render for part!" ) );
1774 QgsDebugMsgLevel( QStringLiteral(
"point can be drawn only with marker symbol!" ), 2 );
1780 info.renderPoint =
_getPoint( context, *info.originalGeometry );
1781 pointsToRender << info;
1789 QgsDebugMsgLevel( QStringLiteral(
"linestring can be drawn only with line symbol!" ), 2 );
1796 linesToRender << info;
1806 QgsDebugMsgLevel( QStringLiteral(
"polygon can be drawn only with fill symbol!" ), 2 );
1812 info.originalPartIndex = partIndex;
1815 QgsDebugError( QStringLiteral(
"cannot render polygon with no exterior ring" ) );
1820 polygonsToRender << info;
1834 const QgsGeometryCollection *geomCollection = qgis::down_cast<const QgsGeometryCollection *>( processedGeometry );
1837 for (
unsigned int i = 0; i < num; ++i )
1842 getPartGeometry( geomCollection->
geometryN( i ), i );
1852 QgsDebugMsgLevel( QStringLiteral(
"multi-polygon can be drawn only with fill symbol!" ), 2 );
1858 const QgsGeometryCollection *geomCollection = qgis::down_cast<const QgsGeometryCollection *>( processedGeometry );
1863 std::map<double, QList<unsigned int> > thisAreaToPartNum;
1864 for (
unsigned int i = 0; i < num; ++i )
1873 std::map<double, QList<unsigned int> >::const_reverse_iterator iter = thisAreaToPartNum.rbegin();
1874 for ( ; iter != thisAreaToPartNum.rend(); ++iter )
1876 const QList<unsigned int> &listPartIndex = iter->second;
1877 for (
int idx = 0; idx < listPartIndex.size(); ++idx )
1879 const unsigned i = listPartIndex[idx];
1880 getPartGeometry( geomCollection->
geometryN( i ), i );
1889 const QgsPolyhedralSurface *polySurface = qgis::down_cast<const QgsPolyhedralSurface *>( processedGeometry );
1892 for (
int i = 0; i < num; ++i )
1897 getPartGeometry( polySurface->
patchN( i ), i );
1903 QgsDebugError( QStringLiteral(
"feature %1: unsupported wkb type %2/%3 for rendering" )
1904 .arg( feature.
id() )
1906 .arg(
static_cast< quint32
>( part->wkbType() ), 0, 16 ) );
1919 std::vector< int > layerToRender;
1922 layerToRender.reserve(
mLayers.count() );
1923 for (
int i = 0; i <
mLayers.count(); ++i )
1924 layerToRender.emplace_back( i );
1932 layerToRender.reserve(
mLayers.count() );
1933 for (
int i = 0; i <
mLayers.count(); ++i )
1934 layerToRender.emplace_back( i );
1938 layerToRender.emplace_back(
layer );
1944 if ( needsExpressionContext )
1952 QPainter *originalTargetPainter =
nullptr;
1954 std::vector< QPicture > picturesForDeferredRendering;
1955 std::unique_ptr< QPainter > deferredRenderingPainter;
1958 originalTargetPainter = context.
painter();
1959 picturesForDeferredRendering.emplace_back( QPicture() );
1960 deferredRenderingPainter = std::make_unique< QPainter >( &picturesForDeferredRendering.front() );
1961 context.
setPainter( deferredRenderingPainter.get() );
1968 for (
const int symbolLayerIndex : layerToRender )
1970 if ( deferredRenderingPainter &&
layer != -1 && symbolLayerIndex != layerToRender.front() )
1974 deferredRenderingPainter->end();
1975 picturesForDeferredRendering.emplace_back( QPicture() );
1976 deferredRenderingPainter->begin( &picturesForDeferredRendering.back() );
1983 if ( needsExpressionContext )
1989 const bool hasClipGeometries = !maskGeometriesDisabledForSymbol
1992 QPainter *previousPainter =
nullptr;
1993 std::unique_ptr< QPicture > renderedPicture;
1994 std::unique_ptr< QPainter > picturePainter;
1995 if ( hasClipGeometries )
1997 previousPainter = context.
painter();
1998 renderedPicture = std::make_unique< QPicture >();
1999 picturePainter = std::make_unique< QPainter >( renderedPicture.get() );
2003 symbolLayer->startFeatureRender( feature, context );
2009 int geometryPartNumber = 0;
2010 for (
const PointInfo &point : std::as_const( pointsToRender ) )
2015 mSymbolRenderContext->setGeometryPartNum( geometryPartNumber + 1 );
2016 if ( needsExpressionContext )
2019 static_cast<QgsMarkerSymbol *
>( this )->renderPoint( point.renderPoint, &feature, context, symbolLayerIndex, selected );
2020 geometryPartNumber++;
2028 if ( linesToRender.empty() )
2031 int geometryPartNumber = 0;
2032 for (
const LineInfo &line : std::as_const( linesToRender ) )
2037 mSymbolRenderContext->setGeometryPartNum( geometryPartNumber + 1 );
2038 if ( needsExpressionContext )
2042 static_cast<QgsLineSymbol *
>( this )->renderPolyline( line.renderLine, &feature, context, symbolLayerIndex, selected );
2043 geometryPartNumber++;
2050 for (
const PolygonInfo &info : std::as_const( polygonsToRender ) )
2055 mSymbolRenderContext->setGeometryPartNum( info.originalPartIndex + 1 );
2056 if ( needsExpressionContext )
2060 static_cast<QgsFillSymbol *
>( this )->renderPolygon( info.renderExterior, ( !info.renderRings.isEmpty() ? &info.renderRings :
nullptr ), &feature, context, symbolLayerIndex, selected );
2070 symbolLayer->stopFeatureRender( feature, context );
2072 if ( hasClipGeometries )
2076 picturePainter->end();
2077 picturePainter.reset();
2080 QRectF maximalBounds = renderedPicture->boundingRect();
2081 constexpr double BOUNDS_MARGIN = 0.05;
2082 maximalBounds.adjust( -maximalBounds.width() * BOUNDS_MARGIN, -maximalBounds.height() * BOUNDS_MARGIN, maximalBounds.width() * BOUNDS_MARGIN, maximalBounds.height() * BOUNDS_MARGIN );
2084 const bool hadClipping = context.
painter()->hasClipping();
2085 const QPainterPath oldClipPath = hadClipping ? context.
painter()->clipPath() : QPainterPath();
2087 const bool isMasked =
symbolLayer->installMasks( context,
false, maximalBounds );
2089 context.
painter()->drawPicture( QPointF( 0, 0 ), *renderedPicture );
2093 context.
painter()->setClipPath( oldClipPath );
2094 context.
painter()->setClipping( hadClipping );
2102 deferredRenderingPainter->end();
2103 deferredRenderingPainter.reset();
2106 QPainter geometryPainter( &geometryPaintDevice );
2109 for (
const auto &deferredPicture : picturesForDeferredRendering )
2113 geometryPainter.end();
2126 case Qt::SvgMiterJoin:
2136 case Qt::MPenJoinStyle:
2142 for (
const QList< QPolygonF > &polygon : polygons )
2144 QVector< QPolygonF > rings;
2145 for (
int i = 1; i < polygon.size(); ++i )
2146 rings << polygon.at( i );
2147 mBufferSettings->fillSymbol()->renderPolygon( polygon.value( 0 ), &rings,
nullptr, context );
2160 markers.reserve( pointsToRender.size() );
2161 for (
const PointInfo &info : std::as_const( pointsToRender ) )
2165 const QRectF bounds =
static_cast<QgsMarkerSymbol *
>( this )->bounds( info.renderPoint, context, feature );
2174 context.
painter()->setPen( Qt::red );
2175 context.
painter()->setBrush( QColor( 255, 0, 0, 100 ) );
2176 context.
painter()->drawRect( bounds );
2180 if ( drawVertexMarker && !usingSegmentizedGeometry )
2182 markers.append( info.renderPoint );
2190 for (
const LineInfo &info : std::as_const( linesToRender ) )
2198 if ( drawVertexMarker && !usingSegmentizedGeometry )
2200 markers << info.renderLine;
2208 for (
const PolygonInfo &info : std::as_const( polygonsToRender ) )
2217 if ( drawVertexMarker && !usingSegmentizedGeometry )
2219 markers << info.renderExterior;
2221 for (
const QPolygonF &hole : info.renderRings )
2241 handler->handleRenderedFeature( feature, renderedBoundsGeom, featureContext );
2244 if ( drawVertexMarker )
2248 const auto constMarkers = markers;
2249 for ( QPointF marker : constMarkers )
2251 renderVertexMarker( marker, context, currentVertexMarkerType, currentVertexMarkerSize );
2266 x = vertexPoint.
x();
2267 y = vertexPoint.
y();
2283 renderVertexMarker( mapPoint, context, currentVertexMarkerType, currentVertexMarkerSize );
2291 return mSymbolRenderContext.get();
2314void QgsSymbol::initPropertyDefinitions()
2316 if ( !sPropertyDefinitions.isEmpty() )
2319 QString origin = QStringLiteral(
"symbol" );
2335 symbolLayer->startFeatureRender( feature, context );
2341 const QList< QgsSymbolLayer * > layers =
mLayers;
2347 symbolLayer->startFeatureRender( feature, context );
2359 symbolLayer->stopFeatureRender( feature, context );
2365 const QList< QgsSymbolLayer * > layers =
mLayers;
2371 symbolLayer->stopFeatureRender( feature, context );
2381 mDataDefinedProperties = other->mDataDefinedProperties;
RasterizedRenderingPolicy
Policies controlling when rasterisation of content during renders is permitted.
@ PreferVector
Prefer vector-based rendering, when the result will still be visually near-identical to a raster-base...
@ CounterClockwise
Counter-clockwise direction.
@ Clockwise
Clockwise direction.
@ ExcludeSymbolBuffers
Do not render symbol buffers.
@ IsSymbolLayerSubSymbol
Symbol is being rendered as a sub-symbol of a QgsSymbolLayer.
@ ForceVectorRendering
Symbol must be rendered using vector methods, and optimisations like pre-rendered images must be disa...
@ DisableFeatureClipping
If present, indicates that features should never be clipped to the map extent during rendering.
@ AffectsLabeling
If present, indicates that the symbol layer will participate in the map labeling problem.
@ CanCalculateMaskGeometryPerFeature
If present, indicates that mask geometry can safely be calculated per feature for the symbol layer....
QFlags< SymbolPreviewFlag > SymbolPreviewFlags
Symbol preview flags.
GeometryType
The geometry types are used to group Qgis::WkbType in a coarse way.
JoinStyle
Join styles for buffers.
@ Bevel
Use beveled joins.
@ Round
Use rounded joins.
@ Miter
Use mitered joins.
RenderUnit
Rendering size units.
@ Millimeters
Millimeters.
@ Unknown
Mixed or unknown units.
@ DisableSymbolClippingToExtent
Force symbol clipping to map extent to be disabled in all situations. This will result in slower rend...
@ RenderSymbolPreview
The render is for a symbol preview only and map based properties may not be available,...
@ ApplyClipAfterReprojection
Feature geometry clipping to mapExtent() must be performed after the geometries are transformed using...
@ DrawSymbolBounds
Draw bounds of symbols (for debugging/testing).
@ RenderMapTile
Draw map such that there are no problems between adjacent tiles.
@ AlwaysUseGlobalMasks
When applying clipping paths for selective masking, always use global ("entire map") paths,...
@ Antialiasing
Use antialiasing while drawing.
@ HighQualityImageTransforms
Enable high quality image transformations, which results in better appearance of scaled or rotated ra...
@ FlagIncludeCrosshairsForMarkerSymbols
Include a crosshairs reference image in the background of marker symbol previews.
VertexMarkerType
Editing vertex markers, used for showing vertices during a edit operation.
QFlags< SymbolRenderHint > SymbolRenderHints
Symbol render hints.
QFlags< SymbolFlag > SymbolFlags
Symbol flags.
@ AffectsLabeling
If present, indicates that the symbol will participate in the map labeling problem.
@ MultiPolygon
MultiPolygon.
@ MultiLineString
MultiLineString.
@ GeometryCollection
GeometryCollection.
@ PolyhedralSurface
PolyhedralSurface.
@ MultiSurface
MultiSurface.
@ Forward
Forward transform (from source to destination).
Abstract base class for all geometries.
virtual const QgsAbstractGeometry * simplifiedTypeRef() const
Returns a reference to the simplest lossless representation of this geometry, e.g.
virtual QgsRectangle boundingBox() const
Returns the minimal bounding box for the geometry.
bool is3D() const
Returns true if the geometry is 3D and contains a z-value.
Qgis::WkbType wkbType() const
Returns the WKB type of the geometry.
virtual int partCount() const =0
Returns count of parts contained in the geometry.
virtual bool nextVertex(QgsVertexId &id, QgsPoint &vertex) const =0
Returns next vertex id and coordinates.
virtual QgsAbstractGeometry * clone() const =0
Clones the geometry by performing a deep copy.
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.
static QgsColorSchemeRegistry * colorSchemeRegistry()
Returns the application's color scheme registry, used for managing color schemes.
A 3-dimensional box composed of x, y, z coordinates.
static void trimPolygon(QPolygonF &pts, const QgsRectangle &clipRect)
Trims the given polygon to a rectangular box, by modifying the given polygon in place.
static QPolygonF clippedLine(const QgsCurve &curve, const QgsRectangle &clipExtent)
Takes a linestring and clips it to clipExtent.
static void clipped3dLine(const QVector< double > &xIn, const QVector< double > &yIn, const QVector< double > &zIn, QVector< double > &x, QVector< double > &y, QVector< double > &z, const QgsBox3D &clipExtent)
Takes a line with 3D coordinates and clips it to clipExtent.
static QString colorToString(const QColor &color)
Encodes a color into a string value.
Custom exception class for Coordinate Reference System related exceptions.
Curve polygon geometry type.
int numInteriorRings() const
Returns the number of interior rings contained with the curve polygon.
const QgsCurve * exteriorRing() const
Returns the curve polygon's exterior ring.
const QgsCurve * interiorRing(int i) const
Retrieves an interior ring from the curve polygon.
Abstract base class for curved geometry type.
Qgis::AngularDirection orientation() const
Returns the curve's orientation, e.g.
virtual int numPoints() const =0
Returns the number of points in the curve.
QgsCurve * segmentize(double tolerance=M_PI_2/90, SegmentationToleranceType toleranceType=MaximumAngle) const override
Returns a geometry without curves.
virtual QPolygonF asQPolygonF() const
Returns a QPolygonF representing the points.
Manages painter saving and restoring required for effect drawing.
Single scope for storing variables and functions for use within a QgsExpressionContext.
static QgsExpressionContextScope * updateSymbolScope(const QgsSymbol *symbol, QgsExpressionContextScope *symbolScope=nullptr)
Updates a symbol scope related to a QgsSymbol to an expression context.
static QList< QgsExpressionContextScope * > globalProjectLayerScopes(const QgsMapLayer *layer)
Creates a list of three scopes: global, layer's project and layer.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
static const QString EXPR_GEOMETRY_PART_COUNT
Inbuilt variable name for geometry part count variable.
static const QString EXPR_GEOMETRY_PART_NUM
Inbuilt variable name for geometry part number variable.
void appendScope(QgsExpressionContextScope *scope)
Appends a scope to the end of the context.
void appendScopes(const QList< QgsExpressionContextScope * > &scopes)
Appends a list of scopes to the end of the context.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Container of fields for a vector layer.
A fill symbol type, for rendering Polygon and MultiPolygon geometries.
int numGeometries() const
Returns the number of geometries within the collection.
const QgsAbstractGeometry * geometryN(int n) const
Returns a const reference to a geometry from within the collection.
A symbol layer subclass which alters rendered feature shapes through the use of QGIS expressions.
void render(QgsSymbolRenderContext &context, Qgis::GeometryType geometryType=Qgis::GeometryType::Unknown, const QPolygonF *points=nullptr, const QVector< QPolygonF > *rings=nullptr)
Will render this symbol layer using the context.
A paint device which converts everything renderer to a QgsGeometry representation of the rendered sha...
const QgsAbstractGeometry & geometry() const
Returns the rendered geometry.
A geometry is the spatial representation of a feature.
static QgsGeometry fromRect(const QgsRectangle &rect)
Creates a new geometry from a QgsRectangle.
static QgsGeometry collectGeometry(const QVector< QgsGeometry > &geometries)
Creates a new multipart geometry from a list of QgsGeometry objects.
static QgsGeometry fromQPolygonF(const QPolygonF &polygon)
Construct geometry from a QPolygonF.
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
void set(QgsAbstractGeometry *geometry)
Sets the underlying geometry store.
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...
bool isEmpty() const
Returns true if the geometry is empty (eg a linestring with no vertices, or a collection with no geom...
QgsRectangle boundingBox() const
Returns the bounding box of the geometry.
Does vector analysis using the GEOS library and handles import, export, and exception handling.
Represents a patch shape for use in map legends.
QList< QList< QPolygonF > > toQPolygonF(Qgis::SymbolType type, QSizeF size) const
Converts the patch shape to a set of QPolygonF objects representing how the patch should be drawn for...
Line string geometry type, with support for z-dimension and m-values.
QVector< double > xVector() const
Returns the x vertex values as a vector.
QVector< double > yVector() const
Returns the y vertex values as a vector.
QVector< double > zVector() const
Returns the z vertex values as a vector.
Abstract base class for line symbol layers.
virtual void renderPolygonStroke(const QPolygonF &points, const QVector< QPolygonF > *rings, QgsSymbolRenderContext &context)
Renders the line symbol layer along the outline of polygon, using the given render context.
A line symbol type, for rendering LineString and MultiLineString geometries.
Implementation of a geometry simplifier using the "MapToPixel" algorithm.
QgsGeometry simplify(const QgsGeometry &geometry) const override
Returns a simplified version the specified geometry.
Perform transforms between map coordinates and device coordinates.
void transformInPlace(double &x, double &y) const
Transforms map coordinates to device coordinates.
Struct for storing maximum and minimum scales for measurements in map units.
A marker symbol type, for rendering Point and MultiPoint geometries.
Multi point geometry collection.
Base class for visual effects which can be applied to QPicture drawings.
bool enabled() const
Returns whether the effect is enabled.
static void drawPicture(QPainter *painter, const QPointF &point, const QPicture &picture)
Draws a picture onto a painter, correctly applying workarounds to avoid issues with incorrect scaling...
Point geometry type, with support for z-dimension and m-values.
Polyhedral surface geometry type.
int numPatches() const
Returns the number of patches contained with the polyhedral surface.
const QgsPolygon * patchN(int i) const
Retrieves a patch from the polyhedral surface.
Qgis::ColorModel colorModel() const
Returns the project's color model.
static QgsProject * instance()
Returns the QgsProject singleton instance.
const QgsProjectStyleSettings * styleSettings() const
Returns the project's style settings, which contains settings and properties relating to how a QgsPro...
Definition for a property.
@ Opacity
Opacity (0-100).
@ DoublePositive
Positive double value (including 0).
A store for object properties.
A container for the context for various read/write operations on objects.
A rectangle specified with double values.
bool contains(const QgsRectangle &rect) const
Returns true when rectangle contains other rectangle.
Contains information about the context of a rendering operation.
void setTextureOrigin(const QPointF &origin)
Sets the texture origin, which should be used as a brush transform when rendering using QBrush object...
bool symbolLayerHasClipGeometries(const QString &symbolLayerId) const
Returns true if the symbol layer with matching ID has any associated clip geometries.
bool hasRenderedFeatureHandlers() const
Returns true if the context has any rendered feature handlers.
QgsVectorSimplifyMethod & vectorSimplifyMethod()
Returns the simplification settings to use when rendering vector layers.
double segmentationTolerance() const
Gets the segmentation tolerance applied when rendering curved geometries.
double convertToPainterUnits(double size, Qgis::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale(), Qgis::RenderSubcomponentProperty property=Qgis::RenderSubcomponentProperty::Generic) const
Converts a size from the specified units to painter units (pixels).
QPainter * painter()
Returns the destination QPainter for the render operation.
void setPainterFlagsUsingContext(QPainter *painter=nullptr) const
Sets relevant flags on a destination painter, using the flags and settings currently defined for the ...
QgsExpressionContext & expressionContext()
Gets the expression context.
void setGeometry(const QgsAbstractGeometry *geometry)
Sets pointer to original (unsegmentized) geometry.
QgsGeometry featureClipGeometry() const
Returns the geometry to use to clip features at render time.
const QgsRectangle & extent() const
When rendering a map layer, calling this method returns the "clipping" extent for the layer (in the l...
bool testFlag(Qgis::RenderContextFlag flag) const
Check whether a particular flag is enabled.
long long currentFrame() const
Returns the current frame number of the map (in frames per second), for maps which are part of an ani...
void setIsGuiPreview(bool preview)
Sets GUI preview mode.
QgsRectangle mapExtent() const
Returns the original extent of the map being rendered.
void setRasterizedRenderingPolicy(Qgis::RasterizedRenderingPolicy policy)
Sets the policy controlling when rasterisation of content during renders is permitted.
QList< QgsRenderedFeatureHandlerInterface * > renderedFeatureHandlers() const
Returns the list of rendered feature handlers to use while rendering map layers.
void setFlag(Qgis::RenderContextFlag flag, bool on=true)
Enable or disable a particular flag (other flags are not affected).
double frameRate() const
Returns the frame rate of the map, for maps which are part of an animation.
const QgsMapToPixel & mapToPixel() const
Returns the context's map to pixel transform, which transforms between map coordinates and device coo...
Qgis::RasterizedRenderingPolicy rasterizedRenderingPolicy() const
Returns the policy controlling when rasterisation of content during renders is permitted.
void setPainter(QPainter *p)
Sets the destination QPainter for the render operation.
bool isSymbolLayerEnabled(const QgsSymbolLayer *layer) const
When rendering a map layer in a second pass (for selective masking), some symbol layers may be disabl...
bool renderingStopped() const
Returns true if the rendering operation has been stopped and any ongoing rendering should be canceled...
static QgsRenderContext fromQPainter(QPainter *painter)
Creates a default render context given a pixel based QPainter destination.
void setExpressionContext(const QgsExpressionContext &context)
Sets the expression context.
QgsCoordinateTransform coordinateTransform() const
Returns the current coordinate transform for the context.
Qgis::RenderContextFlags flags() const
Returns combination of flags used for rendering.
QgsAbstractGeometry::SegmentationToleranceType segmentationToleranceType() const
Gets segmentation tolerance type (maximum angle or maximum difference between curve and approximation...
An interface for classes which provide custom handlers for features rendered as part of a map render ...
Stores properties relating to a screen.
double devicePixelRatio() const
Returns the ratio between physical pixels and device-independent pixels for the screen.
bool isValid() const
Returns true if the properties are valid.
void updateRenderContextForScreen(QgsRenderContext &context) const
Updates the settings in a render context to match the screen settings.
Renders polygons using a single fill and stroke color.
Holds SLD export options and other information related to SLD export of a QGIS layer style.
void setExtraProperties(const QVariantMap &properties)
Sets the open ended set of properties that can drive/inform the SLD encoding.
QVariantMap extraProperties() const
Returns the open ended set of properties that can drive/inform the SLD encoding.
static QgsStyle * defaultStyle(bool initialize=true)
Returns the default application-wide style.
QList< QList< QPolygonF > > defaultPatchAsQPolygonF(Qgis::SymbolType type, QSizeF size) const
Returns the default patch geometry for the given symbol type and size as a set of QPolygonF objects (...
Contains settings relating to symbol animation.
bool isAnimated() const
Returns true if the symbol is animated.
Contains settings relating to symbol buffers, which draw a "halo" effect around the symbol.
QgsFillSymbol * fillSymbol() const
Returns the fill symbol used to render the buffer.
~QgsSymbolBufferSettings()
QgsSymbolBufferSettings()
void setFillSymbol(QgsFillSymbol *symbol)
Sets the fill symbol used to render the buffer.
void writeXml(QDomElement &element, const QgsReadWriteContext &context) const
Writes the buffer settings to an XML element.
QgsSymbolBufferSettings & operator=(const QgsSymbolBufferSettings &)
void readXml(const QDomElement &element, const QgsReadWriteContext &context)
Reads the buffer settings from an XML element.
static QString encodeMapUnitScale(const QgsMapUnitScale &mapUnitScale)
static void drawVertexMarker(double x, double y, QPainter &p, Qgis::VertexMarkerType type, int markerSize)
Draws a vertex symbol at (painter) coordinates x, y.
static QgsMapUnitScale decodeMapUnitScale(const QString &str)
static QString encodeSldUom(Qgis::RenderUnit unit, double *scaleFactor)
Encodes a render unit into an SLD unit of measure string.
static QList< QList< QPolygonF > > toQPolygonF(const QgsGeometry &geometry, Qgis::SymbolType type)
Converts a geometry to a set of QPolygonF objects representing how the geometry should be drawn for a...
static std::unique_ptr< QgsSymbol > loadSymbol(const QDomElement &element, const QgsReadWriteContext &context)
Attempts to load a symbol from a DOM element.
static QDomElement saveSymbol(const QString &symbolName, const QgsSymbol *symbol, QDomDocument &doc, const QgsReadWriteContext &context)
Writes a symbol definition to XML.
Abstract base class for symbol layers.
@ LayerEnabled
Whether symbol layer is enabled.
QgsPaintEffect * paintEffect() const
Returns the current paint effect for the layer.
virtual void startRender(QgsSymbolRenderContext &context)=0
Called before a set of rendering operations commences on the supplied render context.
virtual void stopRender(QgsSymbolRenderContext &context)=0
Called after a set of rendering operations has finished on the supplied render context.
Encapsulates the context in which a symbol is being rendered.
void setSelected(bool selected)
Sets whether symbols should be rendered using the selected symbol coloring and style.
void setOriginalGeometryType(Qgis::GeometryType type)
Sets the geometry type for the original feature geometry being rendered.
void setPatchShape(const QgsLegendPatchShape &shape)
Sets the symbol patch shape, to use if rendering symbol preview icons.
QgsRenderContext & renderContext()
Returns a reference to the context's render context.
void renderUsingLayer(QgsSymbolLayer *layer, QgsSymbolRenderContext &context, Qgis::GeometryType geometryType=Qgis::GeometryType::Unknown, const QPolygonF *points=nullptr, const QVector< QPolygonF > *rings=nullptr)
Renders a context using a particular symbol layer without passing in a geometry.
Qgis::SymbolFlags mSymbolFlags
Symbol flags.
QgsSymbolLayerList cloneLayers() const
Retrieve a cloned list of all layers that make up this symbol.
void setOutputUnit(Qgis::RenderUnit unit) const
Sets the units to use for sizes and widths within the symbol.
Property
Data definable properties.
@ ExtentBuffer
Extent buffer.
QgsSymbolRenderContext * symbolRenderContext()
Returns the symbol render context.
QgsSymbolLayer * symbolLayer(int layer)
Returns the symbol layer at the specified index.
Qgis::SymbolRenderHints renderHints() const
Returns the rendering hint flags for the symbol.
void copyCommonProperties(const QgsSymbol *other)
Copies common properties from an other symbol to this symbol.
void setDataDefinedProperty(Property key, const QgsProperty &property)
Sets a data defined property for the symbol.
void renderFeature(const QgsFeature &feature, QgsRenderContext &context, int layer=-1, bool selected=false, bool drawVertexMarker=false, Qgis::VertexMarkerType currentVertexMarkerType=Qgis::VertexMarkerType::SemiTransparentCircle, double currentVertexMarkerSize=0.0)
Render a feature.
QgsPropertyCollection & dataDefinedProperties()
Returns a reference to the symbol's property collection, used for data defined overrides.
static QPolygonF _getLineString(QgsRenderContext &context, const QgsCurve &curve, bool clipToExtent=true)
Creates a line string in screen coordinates from a QgsCurve in map coordinates.
void setExtentBuffer(double extentBuffer)
Sets the symbol's extent buffer.
void stopRender(QgsRenderContext &context)
Ends the rendering process.
qreal mOpacity
Symbol opacity (in the range 0 - 1).
Q_DECL_DEPRECATED const QgsVectorLayer * mLayer
static QPolygonF _getPolygonRing(QgsRenderContext &context, const QgsCurve &curve, bool clipToExtent, bool isExteriorRing=false, bool correctRingOrientation=false)
Creates a polygon ring in screen coordinates from a QgsCurve in map coordinates.
QgsSymbolAnimationSettings & animationSettings()
Returns a reference to the symbol animation settings.
void renderVertexMarker(QPointF pt, QgsRenderContext &context, Qgis::VertexMarkerType currentVertexMarkerType, double currentVertexMarkerSize)
Render editing vertex marker at specified point.
static QPointF _getPoint(QgsRenderContext &context, const QgsPoint &point)
Creates a point in screen coordinates from a QgsPoint in map coordinates.
static const QgsPropertiesDefinition & propertyDefinitions()
Returns the symbol property definitions.
bool appendSymbolLayer(QgsSymbolLayer *layer)
Appends a symbol layer at the end of the current symbol layer list.
bool mClipFeaturesToExtent
bool usesMapUnits() const
Returns true if the symbol has any components which use map unit based sizes.
Qgis::SymbolFlags flags() const
Returns flags for the symbol.
Q_DECL_DEPRECATED void toSld(QDomDocument &doc, QDomElement &element, QVariantMap props) const
Converts the symbol to a SLD representation.
void setColor(const QColor &color) const
Sets the color for the symbol.
bool insertSymbolLayer(int index, QgsSymbolLayer *layer)
Inserts a symbol layer to specified index.
QgsMapUnitScale mapUnitScale() const
Returns the map unit scale for the symbol.
static QString symbolTypeToString(Qgis::SymbolType type)
Returns a translated string version of the specified symbol type.
qreal opacity() const
Returns the opacity for the symbol.
bool canCauseArtifactsBetweenAdjacentTiles() const
Returns true if the symbol rendering can cause visible artifacts across a single feature when the fea...
static Qgis::SymbolType symbolTypeForGeometryType(Qgis::GeometryType type)
Returns the default symbol type required for the specified geometry type.
void setMapUnitScale(const QgsMapUnitScale &scale) const
Sets the map unit scale for the symbol.
bool clipFeaturesToExtent() const
Returns whether features drawn by the symbol will be clipped to the render context's extent.
QImage bigSymbolPreviewImage(QgsExpressionContext *expressionContext=nullptr, Qgis::SymbolPreviewFlags flags=Qgis::SymbolPreviewFlag::FlagIncludeCrosshairsForMarkerSymbols, const QgsScreenProperties &screen=QgsScreenProperties())
Returns a large (roughly 100x100 pixel) preview image for the symbol.
Qgis::RenderUnit mExtentBufferSizeUnit
QgsSymbolBufferSettings * bufferSettings()
Returns the symbol buffer settings, which control an optional "halo" effect around the symbol.
QImage asImage(QSize size, QgsRenderContext *customContext=nullptr)
Returns an image of the symbol at the specified size.
static void _getPolygon(QPolygonF &pts, QVector< QPolygonF > &holes, QgsRenderContext &context, const QgsPolygon &polygon, bool clipToExtent=true, bool correctRingOrientation=false)
Creates a polygon in screen coordinates from a QgsPolygonXYin map coordinates.
QString dump() const
Returns a string dump of the symbol's properties.
bool hasDataDefinedProperties() const
Returns whether the symbol utilizes any data defined properties.
bool deleteSymbolLayer(int index)
Removes and deletes the symbol layer at the specified index.
QSet< QString > usedAttributes(const QgsRenderContext &context) const
Returns a list of attributes required to render this feature.
std::unique_ptr< QgsSymbolBufferSettings > mBufferSettings
bool changeSymbolLayer(int index, QgsSymbolLayer *layer)
Deletes the current layer at the specified index and replaces it with layer.
QgsSymbolLayer * takeSymbolLayer(int index)
Removes a symbol layer from the list and returns a pointer to it.
Qgis::SymbolRenderHints mRenderHints
QgsSymbolLayerList mLayers
void drawPreviewIcon(QPainter *painter, QSize size, QgsRenderContext *customContext=nullptr, bool selected=false, const QgsExpressionContext *expressionContext=nullptr, const QgsLegendPatchShape *patchShape=nullptr, const QgsScreenProperties &screen=QgsScreenProperties())
Draws an icon of the symbol that occupies an area given by size using the specified painter.
Q_DECL_DEPRECATED const QgsVectorLayer * layer() const
QgsSymbolAnimationSettings mAnimationSettings
void startFeatureRender(const QgsFeature &feature, QgsRenderContext &context, int layer=-1)
Called before symbol layers will be rendered for a particular feature.
QColor color() const
Returns the symbol's color.
Qgis::RenderUnit outputUnit() const
Returns the units to use for sizes and widths within the symbol.
bool rendersIdenticallyTo(const QgsSymbol *other) const
Returns true if this symbol will always render identically to an other symbol.
Qgis::SymbolType type() const
Returns the symbol's type.
QgsSymbol(Qgis::SymbolType type, const QgsSymbolLayerList &layers)
Constructor for a QgsSymbol of the specified type.
void setAnimationSettings(const QgsSymbolAnimationSettings &settings)
Sets a the symbol animation settings.
void startRender(QgsRenderContext &context, const QgsFields &fields=QgsFields())
Begins the rendering process for the symbol.
void setBufferSettings(QgsSymbolBufferSettings *settings)
Sets a the symbol buffer settings, which control an optional "halo" effect around the symbol.
Q_DECL_DEPRECATED void setLayer(const QgsVectorLayer *layer)
Sets the vector layer associated with the symbol.
double extentBuffer() const
Returns the symbol's extent buffer.
void exportImage(const QString &path, const QString &format, QSize size)
Export the symbol as an image format, to the specified path and with the given size.
void stopFeatureRender(const QgsFeature &feature, QgsRenderContext &context, int layer=-1)
Called after symbol layers have been rendered for a particular feature.
static QgsSymbol * defaultSymbol(Qgis::GeometryType geomType)
Returns a new default symbol for the specified geometry type.
static Q_INVOKABLE Qgis::RenderUnit decodeRenderUnit(const QString &string, bool *ok=nullptr)
Decodes a render unit from a string.
static Q_INVOKABLE QString encodeUnit(Qgis::DistanceUnit unit)
Encodes a distance unit to a string.
Represents a vector layer which manages a vector based dataset.
double tolerance() const
Gets the tolerance of simplification in map units. Represents the maximum distance in map units betwe...
bool forceLocalOptimization() const
Gets where the simplification executes, after fetch the geometries from provider, or when supported,...
Qgis::VectorRenderingSimplificationFlags simplifyHints() const
Gets the simplification hints of the vector layer managed.
Qgis::VectorSimplificationAlgorithm simplifyAlgorithm() const
Gets the local simplification algorithm of the vector layer managed.
static Q_INVOKABLE QString displayString(Qgis::WkbType type)
Returns a non-translated display string type for a WKB type, e.g., the geometry name used in WKT geom...
static Q_INVOKABLE bool isCurvedType(Qgis::WkbType type)
Returns true if the WKB type is a curved type or can contain curved geometries.
static Qgis::WkbType flatType(Qgis::WkbType type)
Returns the flat type for a WKB type.
Contains geos related utilities and functions.
#define Q_NOWARN_DEPRECATED_POP
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
#define Q_NOWARN_DEPRECATED_PUSH
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference).
T qgsgeometry_cast(QgsAbstractGeometry *geom)
#define QgsDebugMsgLevel(str, level)
#define QgsDebugError(str)
QMap< int, QgsPropertyDefinition > QgsPropertiesDefinition
Definition of available properties.
QList< QgsSymbolLayer * > QgsSymbolLayerList
Single variable definition for use within a QgsExpressionContextScope.
Utility class for identifying a unique vertex within a geometry.