20#include <QSvgGenerator>
77 : mEnabled( other.mEnabled )
78 , mSize( other.mSize )
79 , mSizeUnit( other.mSizeUnit )
80 , mSizeMapUnitScale( other.mSizeMapUnitScale )
81 , mJoinStyle( other.mJoinStyle )
82 , mFillSymbol( other.mFillSymbol ? other.mFillSymbol->clone() : nullptr )
89 mEnabled = other.mEnabled;
91 mSizeUnit = other.mSizeUnit;
92 mSizeMapUnitScale = other.mSizeMapUnitScale;
93 mJoinStyle = other.mJoinStyle;
94 mFillSymbol.reset( other.mFillSymbol ? other.mFillSymbol->clone() : nullptr );
100 return mFillSymbol.get();
105 mFillSymbol.reset( symbol );
112 QDomElement symbolBufferElem = element.ownerDocument().createElement( QStringLiteral(
"buffer" ) );
113 symbolBufferElem.setAttribute( QStringLiteral(
"enabled" ), mEnabled );
114 symbolBufferElem.setAttribute( QStringLiteral(
"size" ), mSize );
117 symbolBufferElem.setAttribute( QStringLiteral(
"joinStyle" ),
static_cast< unsigned int >( mJoinStyle ) );
121 QDomDocument document = element.ownerDocument();
123 symbolBufferElem.appendChild( fillElem );
126 element.appendChild( symbolBufferElem );
131 const QDomElement symbolBufferElem = element.firstChildElement( QStringLiteral(
"buffer" ) );
132 mEnabled = symbolBufferElem.attribute( QStringLiteral(
"enabled" ), QStringLiteral(
"0" ) ).toInt();
133 mSize = symbolBufferElem.attribute( QStringLiteral(
"size" ), QStringLiteral(
"1" ) ).toDouble();
136 mJoinStyle =
static_cast< Qt::PenJoinStyle
>( symbolBufferElem.attribute( QStringLiteral(
"joinStyle" ), QString::number( Qt::RoundJoin ) ).toUInt() );
138 const QDomElement fillSymbolElem = symbolBufferElem.firstChildElement( QStringLiteral(
"symbol" ) );
139 if ( !fillSymbolElem.isNull() )
141 mFillSymbol.reset( QgsSymbolLayerUtils::loadSymbol<QgsFillSymbol>( fillSymbolElem, context ) );
161 for (
int i = 0; i <
mLayers.count(); i++ )
167 else if ( !
mLayers.at( i )->isCompatibleWithSymbol(
this ) )
179 return _getLineString3d( context, curve, clipToExtent );
181 return _getLineString2d( context, curve, clipToExtent );
186 const unsigned int nPoints = curve.
numPoints();
190 QVector< double > pointsX;
191 QVector< double > pointsY;
192 QVector< double > pointsZ;
198 const double cw = e.
width() / 10;
199 const double ch = e.
height() / 10;
203 std::unique_ptr< QgsLineString > segmentized;
204 if (
const QgsLineString *ls = qgsgeometry_cast< const QgsLineString * >( &curve ) )
210 segmentized.reset( qgsgeometry_cast< QgsLineString * >( curve.
segmentize( ) ) );
211 lineString = segmentized.get();
219 if (
const QgsLineString *ls = qgsgeometry_cast<const QgsLineString *>( &curve ) )
221 pointsX = ls->xVector();
222 pointsY = ls->yVector();
223 pointsZ = ls->zVector();
227 std::unique_ptr< QgsLineString > segmentized;
228 segmentized.reset( qgsgeometry_cast< QgsLineString * >( curve.
segmentize( ) ) );
230 pointsX = segmentized->xVector();
231 pointsY = segmentized->yVector();
232 pointsZ = segmentized->zVector();
237 const QVector< double > preTransformPointsZ = pointsZ;
238 bool wasTransformed =
false;
242 const int nVertices = pointsX.size();
243 wasTransformed =
true;
257 const int size = pointsX.size();
259 const double *xIn = pointsX.data();
260 const double *yIn = pointsY.data();
261 const double *zIn = pointsZ.data();
263 const double *preTransformZIn = wasTransformed ? preTransformPointsZ.constData() :
nullptr;
265 double *xOut = pointsX.data();
266 double *yOut = pointsY.data();
267 double *zOut = pointsZ.data();
269 for (
int i = 0; i < size; ++i )
271 bool pointOk = std::isfinite( *xIn ) && std::isfinite( *yIn );
278 pointOk &= !wasTransformed || std::isfinite( *zIn ) || !std::isfinite( *preTransformZIn );
294 if ( preTransformZIn )
297 pointsX.resize( outSize );
298 pointsY.resize( outSize );
299 pointsZ.resize( outSize );
306 const double cw = e.
width() / 10;
307 const double ch = e.
height() / 10;
310 QVector< double > tempX;
311 QVector< double > tempY;
312 QVector< double > tempZ;
319 const int polygonSize = pointsX.size();
320 QPolygonF out( polygonSize );
321 const double *x = pointsX.constData();
322 const double *y = pointsY.constData();
323 QPointF *dest = out.data();
324 for (
int i = 0; i < polygonSize; ++i )
326 double screenX = *x++;
327 double screenY = *y++;
329 *dest++ = QPointF( screenX, screenY );
337 const unsigned int nPoints = curve.
numPoints();
347 const double cw = e.
width() / 10;
348 const double ch = e.
height() / 10;
371 pts.erase( std::remove_if( pts.begin(), pts.end(),
372 [](
const QPointF point )
374 return !std::isfinite( point.x() ) || !std::isfinite( point.y() );
381 const double cw = e.
width() / 10;
382 const double ch = e.
height() / 10;
387 QPointF *ptr = pts.data();
388 for (
int i = 0; i < pts.size(); ++i, ++ptr )
400 return _getPolygonRing3d( context, curve, clipToExtent, isExteriorRing, correctRingOrientation );
402 return _getPolygonRing2d( context, curve, clipToExtent, isExteriorRing, correctRingOrientation );
405QPolygonF QgsSymbol::_getPolygonRing3d(
QgsRenderContext &context,
const QgsCurve &curve,
const bool clipToExtent,
const bool isExteriorRing,
const bool correctRingOrientation )
410 QVector< double > pointsX;
411 QVector< double > pointsY;
412 QVector< double > pointsZ;
417 bool reverseRing =
false;
418 if ( correctRingOrientation )
431 const double cw = e.
width() / 10;
432 const double ch = e.
height() / 10;
436 std::unique_ptr< QgsLineString > segmentized;
437 if (
const QgsLineString *ls = qgsgeometry_cast< const QgsLineString * >( &curve ) )
443 segmentized.reset( qgsgeometry_cast< QgsLineString * >( curve.
segmentize( ) ) );
444 lineString = segmentized.get();
447 pointsX = lineString->
xVector();
448 pointsY = lineString->
yVector();
449 pointsZ = lineString->
zVector();
456 if (
const QgsLineString *ls = qgsgeometry_cast<const QgsLineString *>( &curve ) )
458 pointsX = ls->xVector();
459 pointsY = ls->yVector();
460 pointsZ = ls->zVector();
464 std::unique_ptr< QgsLineString > segmentized;
465 segmentized.reset( qgsgeometry_cast< QgsLineString * >( curve.
segmentize( ) ) );
467 pointsX = segmentized->xVector();
468 pointsY = segmentized->yVector();
469 pointsZ = segmentized->zVector();
475 std::reverse( pointsX.begin(), pointsX.end() );
476 std::reverse( pointsY.begin(), pointsY.end() );
477 std::reverse( pointsZ.begin(), pointsZ.end() );
481 const QVector< double > preTransformPointsZ = pointsZ;
482 bool wasTransformed =
false;
485 const int nVertices = pointsX.size();
486 wasTransformed =
true;
499 const int size = pointsX.size();
501 const double *xIn = pointsX.data();
502 const double *yIn = pointsY.data();
503 const double *zIn = pointsZ.data();
505 const double *preTransformZIn = wasTransformed ? preTransformPointsZ.constData() :
nullptr;
507 double *xOut = pointsX.data();
508 double *yOut = pointsY.data();
509 double *zOut = pointsZ.data();
511 for (
int i = 0; i < size; ++i )
513 bool pointOk = std::isfinite( *xIn ) && std::isfinite( *yIn );
519 pointOk &= !wasTransformed || std::isfinite( *zIn ) || !std::isfinite( *preTransformZIn );
535 if ( preTransformZIn )
538 pointsX.resize( outSize );
539 pointsY.resize( outSize );
540 pointsZ.resize( outSize );
547 const double cw = e.
width() / 10;
548 const double ch = e.
height() / 10;
554 const int polygonSize = pointsX.size();
555 QPolygonF out( polygonSize );
556 const double *x = pointsX.constData();
557 const double *y = pointsY.constData();
558 QPointF *dest = out.data();
559 for (
int i = 0; i < polygonSize; ++i )
561 double screenX = *x++;
562 double screenY = *y++;
564 *dest++ = QPointF( screenX, screenY );
567 if ( !out.empty() && !out.isClosed() )
574QPolygonF QgsSymbol::_getPolygonRing2d(
QgsRenderContext &context,
const QgsCurve &curve,
const bool clipToExtent,
const bool isExteriorRing,
const bool correctRingOrientation )
584 if ( correctRingOrientation )
588 std::reverse( poly.begin(), poly.end() );
590 std::reverse( poly.begin(), poly.end() );
597 const double cw = e.
width() / 10;
598 const double ch = e.
height() / 10;
617 poly.erase( std::remove_if( poly.begin(), poly.end(),
618 [](
const QPointF point )
620 return !std::isfinite( point.x() ) || !std::isfinite( point.y() );
627 const double cw = e.
width() / 10;
628 const double ch = e.
height() / 10;
633 QPointF *ptr = poly.data();
634 for (
int i = 0; i < poly.size(); ++i, ++ptr )
639 if ( !poly.empty() && !poly.isClosed() )
640 poly << poly.at( 0 );
651 holes.reserve( ringCount );
652 for (
int idx = 0; idx < ringCount; idx++ )
655 if ( !hole.isEmpty() )
656 holes.append( hole );
665 return QObject::tr(
"Marker" );
667 return QObject::tr(
"Line" );
669 return QObject::tr(
"Fill" );
671 return QObject::tr(
"Hybrid" );
695 QgsSymbol::initPropertyDefinitions();
696 return sPropertyDefinitions;
712 QgsSymbolLayerList::const_iterator it =
mLayers.constBegin();
716 for ( ; it !=
mLayers.constEnd(); ++it )
718 if ( ( *it )->outputUnit() != unit )
735 if (
layer->usesMapUnits() )
750 QgsSymbolLayerList::const_iterator it =
mLayers.constBegin();
751 if ( it ==
mLayers.constEnd() )
757 for ( ; it !=
mLayers.constEnd(); ++it )
759 if ( ( *it )->mapUnitScale() != scale )
769 const auto constMLayers =
mLayers;
772 layer->setOutputUnit( u );
778 const auto constMLayers =
mLayers;
781 layer->setMapUnitScale( scale );
819 std::unique_ptr< QgsSymbol > s;
843 s = std::make_unique< QgsMarkerSymbol >();
846 s = std::make_unique< QgsLineSymbol >();
849 s = std::make_unique< QgsFillSymbol >();
852 QgsDebugError( QStringLiteral(
"unknown layer's geometry type" ) );
870 if ( s->color().spec() == QColor::Spec::Rgb && isCmyk )
872 s->setColor( s->color().toCmyk() );
874 else if ( s->color().spec() == QColor::Spec::Cmyk && !isCmyk )
876 s->setColor( s->color().toRgb() );
894 if ( index < 0 || index >
mLayers.count() )
897 if ( !
layer || !
layer->isCompatibleWithSymbol(
this ) )
907 if ( !
layer || !
layer->isCompatibleWithSymbol(
this ) )
917 if ( index < 0 || index >=
mLayers.count() )
928 if ( index < 0 || index >=
mLayers.count() )
931 return mLayers.takeAt( index );
939 if ( oldLayer ==
layer )
942 if ( !
layer || !
layer->isCompatibleWithSymbol(
this ) )
953 Q_ASSERT_X( !mStarted,
"startRender",
"Rendering has already been started for this symbol instance!" );
968 const long long mapFrameNumber = context.
currentFrame();
969 double animationTimeSeconds = 0;
970 if ( mapFrameNumber >= 0 && context.
frameRate() > 0 )
973 animationTimeSeconds = mapFrameNumber / context.
frameRate();
978 animationTimeSeconds = QDateTime::currentMSecsSinceEpoch() / 1000.0;
982 scope->setVariable( QStringLiteral(
"symbol_frame" ), symbolFrame, true );
985 mSymbolRenderContext->setExpressionContextScope( scope.release() );
999 layer->prepareExpressions( symbolContext );
1017 layer->prepareMasks( symbolContext );
1018 layer->startRender( symbolContext );
1024 Q_ASSERT_X( mStarted,
"startRender",
"startRender was not called for this symbol instance!" );
1028 if ( mSymbolRenderContext )
1030 const auto constMLayers =
mLayers;
1036 layer->stopRender( *mSymbolRenderContext );
1045 mSymbolRenderContext.reset(
nullptr );
1054 const auto constMLayers =
mLayers;
1057 if ( !
layer->isLocked() )
1067 if ( !
layer->isLocked() )
1069 const QColor layerColor =
layer->color();
1070 if ( layerColor.isValid() )
1074 return QColor( 0, 0, 0 );
1080 std::unique_ptr< QgsRenderContext > tempContext;
1084 context = tempContext.get();
1119 if ( !customContext && expressionContext )
1123 else if ( !customContext )
1134 QPainter *originalTargetPainter =
nullptr;
1136 std::unique_ptr< QPicture > pictureForDeferredRendering;
1137 std::unique_ptr< QPainter > deferredRenderingPainter;
1140 originalTargetPainter = context->
painter();
1141 pictureForDeferredRendering = std::make_unique< QPicture >();
1142 deferredRenderingPainter = std::make_unique< QPainter >( pictureForDeferredRendering.get() );
1143 context->
setPainter( deferredRenderingPainter.get() );
1162 const QSizeF targetSize = QSizeF( size.width() - 1, size.height() - 1 );
1170 std::unique_ptr< QgsEffectPainter > effectPainter;
1171 if ( effect && effect->
enabled() )
1172 effectPainter = std::make_unique< QgsEffectPainter >( symbolContext.
renderContext(), effect );
1174 for (
const QList< QPolygonF > &poly : polys )
1176 QVector< QPolygonF > rings;
1177 rings.reserve( poly.size() );
1178 for (
int i = 1; i < poly.size(); ++i )
1179 rings << poly.at( i );
1183 effectPainter.reset();
1188 layer->drawPreviewIcon( symbolContext, size );
1194 deferredRenderingPainter->end();
1195 deferredRenderingPainter.reset();
1198 QPainter geometryPainter( &geometryPaintDevice );
1200 geometryPainter.end();
1205 context->
setPainter( originalTargetPainter );
1213 case Qt::SvgMiterJoin:
1223 case Qt::MPenJoinStyle:
1231 for (
const QList< QPolygonF > &polygon : polygons )
1233 QVector< QPolygonF > rings;
1234 for (
int i = 1; i < polygon.size(); ++i )
1235 rings << polygon.at( i );
1236 mBufferSettings->fillSymbol()->renderPolygon( polygon.value( 0 ), &rings,
nullptr, *context );
1249 if ( format.compare( QLatin1String(
"svg" ), Qt::CaseInsensitive ) == 0 )
1251 QSvgGenerator generator;
1252 generator.setFileName( path );
1253 generator.setSize( size );
1254 generator.setViewBox( QRect( 0, 0, size.width(), size.height() ) );
1256 QPainter painter( &generator );
1262 QImage image =
asImage( size );
1269 QImage image( size, QImage::Format_ARGB32_Premultiplied );
1272 QPainter p( &image );
1273 p.setRenderHint( QPainter::Antialiasing );
1274 p.setRenderHint( QPainter::SmoothPixmapTransform );
1285 QImage preview( QSize( 100, 100 ) * devicePixelRatio, QImage::Format_ARGB32_Premultiplied );
1287 preview.setDevicePixelRatio( devicePixelRatio );
1289 QPainter p( &preview );
1290 p.setRenderHint( QPainter::Antialiasing );
1291 p.translate( 0.5, 0.5 );
1295 p.setPen( QPen( Qt::gray ) );
1296 p.drawLine( QLineF( 0, 50, 100, 50 ) );
1297 p.drawLine( QLineF( 50, 0, 50, 100 ) );
1311 if ( expressionContext )
1320 poly << QPointF( 0, 50 ) << QPointF( 99, 50 );
1321 static_cast<QgsLineSymbol *
>( this )->renderPolyline( poly,
nullptr, context );
1326 polygon << QPointF( 20, 20 ) << QPointF( 80, 20 ) << QPointF( 80, 80 ) << QPointF( 20, 80 ) << QPointF( 20, 20 );
1327 static_cast<QgsFillSymbol *
>( this )->renderPolygon( polygon,
nullptr,
nullptr, context );
1331 static_cast<QgsMarkerSymbol *
>( this )->renderPoint( QPointF( 50, 50 ),
nullptr, context );
1349 t = QStringLiteral(
"MARKER" );
1352 t = QStringLiteral(
"LINE" );
1355 t = QStringLiteral(
"FILL" );
1358 Q_ASSERT(
false &&
"unknown symbol type" );
1362 for ( QgsSymbolLayerList::const_iterator it =
mLayers.begin(); it !=
mLayers.end(); ++it )
1371 props[ QStringLiteral(
"alpha" )] = QString::number(
opacity() );
1372 double scaleFactor = 1.0;
1376 for ( QgsSymbolLayerList::const_iterator it =
mLayers.begin(); it !=
mLayers.end(); ++it )
1378 ( *it )->toSld( doc, element, props );
1385 for ( QgsSymbolLayerList::const_iterator it =
mLayers.begin(); it !=
mLayers.end(); ++it )
1388 layer->setLocked( ( *it )->isLocked() );
1389 layer->setRenderingPass( ( *it )->renderingPass() );
1390 layer->setEnabled( ( *it )->enabled() );
1392 layer->setUserFlags( ( *it )->userFlags() );
1393 lst.append(
layer );
1408 if ( effect && effect->
enabled() )
1411 generatorLayer->
render( context, geometryType, points, rings );
1415 generatorLayer->
render( context, geometryType, points, rings );
1425 QgsSymbolLayerList::const_iterator sIt =
mLayers.constBegin();
1426 for ( ; sIt !=
mLayers.constEnd(); ++sIt )
1430 attributes.unite( ( *sIt )->usedAttributes( context ) );
1435 attributes.unite(
mBufferSettings->fillSymbol()->usedAttributes( context ) );
1442 mDataDefinedProperties.
setProperty( key, property );
1452 if (
layer->hasDataDefinedProperties() )
1462 if (
layer->canCauseArtifactsBetweenAdjacentTiles() )
1487class ExpressionContextScopePopper
1491 ExpressionContextScopePopper() =
default;
1493 ~ExpressionContextScopePopper()
1496 context->popScope();
1505class GeometryRestorer
1509 : mContext( context ),
1510 mGeometry( context.geometry() )
1515 mContext.setGeometry( mGeometry );
1535 GeometryRestorer geomRestorer( context );
1537 bool usingSegmentizedGeometry =
false;
1545 if ( std::isfinite( boundsOrigin.x() ) && std::isfinite( boundsOrigin.y() ) )
1560 clippingEnabled =
false;
1572 clippingEnabled =
false;
1576 clippingEnabled =
false;
1579 mSymbolRenderContext->setGeometryPartNum( 1 );
1582 ExpressionContextScopePopper scopePopper;
1583 if ( mSymbolRenderContext->expressionContextScope() )
1585 if ( needsExpressionContext )
1611 QPointF renderPoint;
1612 const QgsPoint *originalGeometry =
nullptr;
1614 QVector< PointInfo > pointsToRender;
1618 QPolygonF renderLine;
1619 const QgsCurve *originalGeometry =
nullptr;
1621 QVector< LineInfo > linesToRender;
1625 QPolygonF renderExterior;
1626 QVector< QPolygonF > renderRings;
1628 int originalPartIndex = 0;
1630 QVector< PolygonInfo > polygonsToRender;
1633 getPartGeometry = [&pointsToRender, &linesToRender, &polygonsToRender, &getPartGeometry, &context, &clippingEnabled, &markers, &feature, &usingSegmentizedGeometry,
this](
const QgsAbstractGeometry * part,
int partIndex = 0 )
1644 const bool isMultiPart = qgsgeometry_cast< const QgsGeometryCollection * >( part ) && qgsgeometry_cast< const QgsGeometryCollection * >( part )->numGeometries() > 1;
1650 if ( needsSegmentizing )
1653 if ( !segmentizedPart )
1657 temporaryGeometryContainer.
set( segmentizedPart.release() );
1658 processedGeometry = temporaryGeometryContainer.
constGet();
1659 usingSegmentizedGeometry =
true;
1664 processedGeometry = part;
1674 std::unique_ptr< QgsAbstractGeometry > simplified( simplifier.
simplify( processedGeometry ) );
1677 temporaryGeometryContainer.
set( simplified.release() );
1678 processedGeometry = temporaryGeometryContainer.
constGet();
1693 temporaryGeometryContainer.
set( clippedGeom.release() );
1694 processedGeometry = temporaryGeometryContainer.
constGet();
1701 processedGeometry = part;
1704 if ( !processedGeometry )
1707 QgsDebugError( QStringLiteral(
"No processed geometry to render for part!" ) );
1717 QgsDebugMsgLevel( QStringLiteral(
"point can be drawn only with marker symbol!" ), 2 );
1722 info.originalGeometry = qgsgeometry_cast< const QgsPoint * >( part );
1723 info.renderPoint =
_getPoint( context, *info.originalGeometry );
1724 pointsToRender << info;
1732 QgsDebugMsgLevel( QStringLiteral(
"linestring can be drawn only with line symbol!" ), 2 );
1737 info.originalGeometry = qgsgeometry_cast<const QgsCurve *>( part );
1738 info.renderLine =
_getLineString( context, *qgsgeometry_cast<const QgsCurve *>( processedGeometry ), clippingEnabled );
1739 linesToRender << info;
1749 QgsDebugMsgLevel( QStringLiteral(
"polygon can be drawn only with fill symbol!" ), 2 );
1754 info.originalGeometry = qgsgeometry_cast<const QgsCurvePolygon *>( part );
1755 info.originalPartIndex = partIndex;
1756 if ( !qgsgeometry_cast<const QgsPolygon *>( processedGeometry )->exteriorRing() )
1758 QgsDebugError( QStringLiteral(
"cannot render polygon with no exterior ring" ) );
1762 _getPolygon( info.renderExterior, info.renderRings, context, *qgsgeometry_cast<const QgsPolygon *>( processedGeometry ), clippingEnabled,
mForceRHR );
1763 polygonsToRender << info;
1769 const QgsMultiPoint *mp = qgsgeometry_cast< const QgsMultiPoint * >( processedGeometry );
1777 const QgsGeometryCollection *geomCollection = qgsgeometry_cast<const QgsGeometryCollection *>( processedGeometry );
1780 for (
unsigned int i = 0; i < num; ++i )
1785 getPartGeometry( geomCollection->
geometryN( i ), i );
1795 QgsDebugMsgLevel( QStringLiteral(
"multi-polygon can be drawn only with fill symbol!" ), 2 );
1806 std::map<double, QList<unsigned int> > thisAreaToPartNum;
1807 for (
unsigned int i = 0; i < num; ++i )
1816 std::map<double, QList<unsigned int> >::const_reverse_iterator iter = thisAreaToPartNum.rbegin();
1817 for ( ; iter != thisAreaToPartNum.rend(); ++iter )
1819 const QList<unsigned int> &listPartIndex = iter->second;
1820 for (
int idx = 0; idx < listPartIndex.size(); ++idx )
1822 const unsigned i = listPartIndex[idx];
1823 getPartGeometry( geomCollection->
geometryN( i ), i );
1832 const QgsPolyhedralSurface *polySurface = qgsgeometry_cast<const QgsPolyhedralSurface *>( processedGeometry );
1835 for (
int i = 0; i < num; ++i )
1840 getPartGeometry( polySurface->
patchN( i ), i );
1846 QgsDebugError( QStringLiteral(
"feature %1: unsupported wkb type %2/%3 for rendering" )
1847 .arg( feature.
id() )
1849 .arg(
static_cast< quint32
>( part->wkbType() ), 0, 16 ) );
1862 std::vector< int > allLayers;
1863 allLayers.reserve(
mLayers.count() );
1864 for (
int i = 0; i <
mLayers.count(); ++i )
1865 allLayers.emplace_back( i );
1867 std::vector< int > layerToRender;
1870 layerToRender = allLayers;
1877 layerToRender = allLayers;
1879 layerToRender.emplace_back(
layer );
1884 if ( needsExpressionContext )
1892 QPainter *originalTargetPainter =
nullptr;
1894 std::vector< QPicture > picturesForDeferredRendering;
1895 std::unique_ptr< QPainter > deferredRenderingPainter;
1898 originalTargetPainter = context.
painter();
1899 picturesForDeferredRendering.emplace_back( QPicture() );
1900 deferredRenderingPainter = std::make_unique< QPainter >( &picturesForDeferredRendering.front() );
1901 context.
setPainter( deferredRenderingPainter.get() );
1908 for (
const int symbolLayerIndex : layerToRender )
1910 if ( deferredRenderingPainter &&
layer != -1 && symbolLayerIndex != layerToRender.front() )
1914 deferredRenderingPainter->end();
1915 picturesForDeferredRendering.emplace_back( QPicture() );
1916 deferredRenderingPainter->begin( &picturesForDeferredRendering.back() );
1923 if ( needsExpressionContext )
1929 const bool hasClipGeometries = !maskGeometriesDisabledForSymbol
1932 QPainter *previousPainter =
nullptr;
1933 std::unique_ptr< QPicture > renderedPicture;
1934 std::unique_ptr< QPainter > picturePainter;
1935 if ( hasClipGeometries )
1937 previousPainter = context.
painter();
1938 renderedPicture = std::make_unique< QPicture >();
1939 picturePainter = std::make_unique< QPainter >( renderedPicture.get() );
1949 int geometryPartNumber = 0;
1950 for (
const PointInfo &point : std::as_const( pointsToRender ) )
1955 mSymbolRenderContext->setGeometryPartNum( geometryPartNumber + 1 );
1956 if ( needsExpressionContext )
1959 static_cast<QgsMarkerSymbol *
>( this )->renderPoint( point.renderPoint, &feature, context, symbolLayerIndex, selected );
1960 geometryPartNumber++;
1968 if ( linesToRender.empty() )
1971 int geometryPartNumber = 0;
1972 for (
const LineInfo &line : std::as_const( linesToRender ) )
1977 mSymbolRenderContext->setGeometryPartNum( geometryPartNumber + 1 );
1978 if ( needsExpressionContext )
1982 static_cast<QgsLineSymbol *
>( this )->renderPolyline( line.renderLine, &feature, context, symbolLayerIndex, selected );
1983 geometryPartNumber++;
1990 for (
const PolygonInfo &info : std::as_const( polygonsToRender ) )
1995 mSymbolRenderContext->setGeometryPartNum( info.originalPartIndex + 1 );
1996 if ( needsExpressionContext )
2000 static_cast<QgsFillSymbol *
>( this )->renderPolygon( info.renderExterior, ( !info.renderRings.isEmpty() ? &info.renderRings : nullptr ), &feature, context, symbolLayerIndex, selected );
2012 if ( hasClipGeometries )
2016 picturePainter->end();
2017 picturePainter.reset();
2020 QRectF maximalBounds = renderedPicture->boundingRect();
2021 constexpr double BOUNDS_MARGIN = 0.05;
2022 maximalBounds.adjust( -maximalBounds.width() * BOUNDS_MARGIN, -maximalBounds.height() * BOUNDS_MARGIN, maximalBounds.width() * BOUNDS_MARGIN, maximalBounds.height() * BOUNDS_MARGIN );
2024 const bool hadClipping = context.
painter()->hasClipping();
2025 const QPainterPath oldClipPath = hadClipping ? context.
painter()->clipPath() : QPainterPath();
2029 context.
painter()->drawPicture( QPointF( 0, 0 ), *renderedPicture );
2033 context.
painter()->setClipPath( oldClipPath );
2034 context.
painter()->setClipping( hadClipping );
2042 deferredRenderingPainter->end();
2043 deferredRenderingPainter.reset();
2046 QPainter geometryPainter( &geometryPaintDevice );
2049 for (
const auto &deferredPicture : picturesForDeferredRendering )
2053 geometryPainter.end();
2066 case Qt::SvgMiterJoin:
2076 case Qt::MPenJoinStyle:
2082 for (
const QList< QPolygonF > &polygon : polygons )
2084 QVector< QPolygonF > rings;
2085 for (
int i = 1; i < polygon.size(); ++i )
2086 rings << polygon.at( i );
2087 mBufferSettings->fillSymbol()->renderPolygon( polygon.value( 0 ), &rings,
nullptr, context );
2100 markers.reserve( pointsToRender.size() );
2101 for (
const PointInfo &info : std::as_const( pointsToRender ) )
2105 const QRectF bounds =
static_cast<QgsMarkerSymbol *
>( this )->bounds( info.renderPoint, context, feature );
2114 context.
painter()->setPen( Qt::red );
2115 context.
painter()->setBrush( QColor( 255, 0, 0, 100 ) );
2116 context.
painter()->drawRect( bounds );
2120 if ( drawVertexMarker && !usingSegmentizedGeometry )
2122 markers.append( info.renderPoint );
2130 for (
const LineInfo &info : std::as_const( linesToRender ) )
2138 if ( drawVertexMarker && !usingSegmentizedGeometry )
2140 markers << info.renderLine;
2148 for (
const PolygonInfo &info : std::as_const( polygonsToRender ) )
2157 if ( drawVertexMarker && !usingSegmentizedGeometry )
2159 markers << info.renderExterior;
2161 for (
const QPolygonF &hole : info.renderRings )
2181 handler->handleRenderedFeature( feature, renderedBoundsGeom, featureContext );
2184 if ( drawVertexMarker )
2188 const auto constMarkers = markers;
2189 for ( QPointF marker : constMarkers )
2191 renderVertexMarker( marker, context, currentVertexMarkerType, currentVertexMarkerSize );
2206 x = vertexPoint.
x();
2207 y = vertexPoint.
y();
2216 renderVertexMarker( mapPoint, context, currentVertexMarkerType, currentVertexMarkerSize );
2224 return mSymbolRenderContext.get();
2247void QgsSymbol::initPropertyDefinitions()
2249 if ( !sPropertyDefinitions.isEmpty() )
2252 QString origin = QStringLiteral(
"symbol" );
2274 const QList< QgsSymbolLayer * > layers =
mLayers;
2298 const QList< QgsSymbolLayer * > layers =
mLayers;
2314 mDataDefinedProperties = other->mDataDefinedProperties;
@ 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 hasCurvedSegments() const
Returns true if the geometry contains curved segments.
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.
A class to manager 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.
bool setId(const QString &id)
Sets the layer's id.
QgsMapLayer::LayerFlags flags() const
Returns the flags for this layer.
Implementation of GeometrySimplifier 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...
void setProperty(int key, const QgsProperty &property)
Adds a property to the collection and takes ownership of it.
bool prepare(const QgsExpressionContext &context=QgsExpressionContext()) const final
Prepares the collection against a specified expression context.
bool hasActiveProperties() const final
Returns true if the collection has any active properties, or false if all properties within the colle...
QSet< QString > referencedFields(const QgsExpressionContext &context=QgsExpressionContext(), bool ignoreContext=false) const final
Returns the set of any fields referenced by the active properties from the collection.
Definition for a property.
@ DoublePositive
Positive double value (including 0)
A store for object properties.
The class is used as a container of context for various read/write operations on other 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 setForceVectorOutput(bool force)
Sets whether rendering operations should use vector operations instead of any faster raster shortcuts...
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.
bool forceVectorOutput() const
Returns true if rendering operations should use vector operations instead of any faster raster shortc...
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.
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...
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 provider 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.
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.
double frameRate() const
Returns the symbol animation frame rate (in frames per second).
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 QDomElement saveSymbol(const QString &symbolName, const QgsSymbol *symbol, QDomDocument &doc, const QgsReadWriteContext &context)
Writes a symbol definition to XML.
virtual void startFeatureRender(const QgsFeature &feature, QgsRenderContext &context)
Called before the layer will be rendered for a particular feature.
bool installMasks(QgsRenderContext &context, bool recursive, const QRectF &rect=QRectF())
When rendering, install masks on context painter.
@ 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.
bool enabled() const
Returns true if symbol layer is enabled and will be drawn.
virtual void stopRender(QgsSymbolRenderContext &context)=0
Called after a set of rendering operations has finished on the supplied render context.
QString id() const
Returns symbol layer identifier This id is unique in the whole project.
virtual void stopFeatureRender(const QgsFeature &feature, QgsRenderContext &context)
Called after the layer has been rendered for a particular feature.
virtual Qgis::SymbolLayerFlags flags() const
Returns flags which control the symbol layer's behavior.
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.
Abstract base class for all rendered symbols.
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.
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.
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)
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 data sets.
QgsVectorLayer * clone() const override
Returns a new instance equivalent to this one.
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 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 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)
#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.