38#include <QCoreApplication>
39#include <QDomDocument>
43#include <QImageReader>
44#include <QNetworkReply>
45#include <QNetworkRequest>
47#include <QSvgRenderer>
50#include "moc_qgslayoutitempicture.cpp"
94 const bool prevSmoothTransform = painter->testRenderHint( QPainter::RenderHint::SmoothPixmapTransform );
96 painter->setRenderHint( QPainter::RenderHint::SmoothPixmapTransform,
true );
101 double boundRectWidthMM;
102 double boundRectHeightMM;
106 boundRectWidthMM = mPictureWidth;
107 boundRectHeightMM = mPictureHeight;
108 imageRect = QRect( 0, 0, mImage.width(), mImage.height() );
112 boundRectWidthMM = rect().width();
113 boundRectHeightMM = rect().height();
114 imageRect = QRect( 0, 0, mImage.width(), mImage.height() );
118 boundRectWidthMM = rect().width();
119 boundRectHeightMM = rect().height();
120 const int imageRectWidthPixels = mImage.width();
121 const int imageRectHeightPixels = mImage.height();
122 imageRect = clippedImageRect( boundRectWidthMM, boundRectHeightMM,
123 QSize( imageRectWidthPixels, imageRectHeightPixels ) );
127 boundRectWidthMM = rect().width();
128 boundRectHeightMM = rect().height();
134 if ( mResizeMode ==
Zoom )
140 painter->translate( rect().width() / 2.0, rect().height() / 2.0 );
141 painter->rotate( mPictureRotation );
142 painter->translate( -boundRectWidthMM / 2.0, -boundRectHeightMM / 2.0 );
147 const double diffX = rect().width() - boundRectWidthMM;
148 const double diffY = rect().height() - boundRectHeightMM;
152 switch ( mPictureAnchor )
170 switch ( mPictureAnchor )
188 painter->translate( dX, dY );
195 painter->translate( rect().width() / 2.0, rect().height() / 2.0 );
196 painter->rotate( mPictureRotation );
197 painter->translate( -boundRectWidthMM / 2.0, -boundRectHeightMM / 2.0 );
203 mSVG.render( painter, QRectF( 0, 0, boundRectWidthMM, boundRectHeightMM ) );
207 painter->drawImage( QRectF( 0, 0, boundRectWidthMM, boundRectHeightMM ), mImage, imageRect );
210 painter->setRenderHint( QPainter::RenderHint::SmoothPixmapTransform, prevSmoothTransform );
215 const QSizeF currentPictureSize = pictureSize();
216 QSizeF newSize = targetSize;
219 mPictureWidth = targetSize.width();
220 mPictureHeight = targetSize.height();
224 if ( mResizeMode ==
ZoomResizeFrame && !rect().isEmpty() && !( currentPictureSize.isEmpty() ) )
226 QSizeF targetImageSize;
229 targetImageSize = currentPictureSize;
235 tr.rotate( mPictureRotation );
236 const QRectF rotatedBounds = tr.mapRect( QRectF( 0, 0, currentPictureSize.width(), currentPictureSize.height() ) );
237 targetImageSize = QSizeF( rotatedBounds.width(), rotatedBounds.height() );
242 if ( std::fabs( rect().width() - targetSize.width() ) <
243 std::fabs( rect().height() - targetSize.height() ) )
245 newSize.setHeight( targetImageSize.height() * newSize.width() / targetImageSize.width() );
249 newSize.setWidth( targetImageSize.width() * newSize.height() / targetImageSize.height() );
254 if ( !( currentPictureSize.isEmpty() ) )
257 newSize.setWidth( sizeMM.
width() * 25.4 /
mLayout->renderContext().dpi() );
258 newSize.setHeight( sizeMM.
height() * 25.4 /
mLayout->renderContext().dpi() );
266 QRectF( 0, 0, newSize.width(), newSize.height() ), mPictureRotation );
267 mPictureWidth = rotatedImageRect.width();
268 mPictureHeight = rotatedImageRect.height();
272 mPictureWidth = newSize.width();
273 mPictureHeight = newSize.height();
276 if ( newSize != targetSize )
285QRect QgsLayoutItemPicture::clippedImageRect(
double &boundRectWidthMM,
double &boundRectHeightMM, QSize imageRectPixels )
287 const int boundRectWidthPixels = boundRectWidthMM *
mLayout->renderContext().dpi() / 25.4;
288 const int boundRectHeightPixels = boundRectHeightMM *
mLayout->renderContext().dpi() / 25.4;
291 boundRectWidthMM = boundRectWidthPixels * 25.4 /
mLayout->renderContext().dpi();
292 boundRectHeightMM = boundRectHeightPixels * 25.4 /
mLayout->renderContext().dpi();
299 switch ( mPictureAnchor )
309 leftClip = ( imageRectPixels.width() - boundRectWidthPixels ) / 2;
314 leftClip = imageRectPixels.width() - boundRectWidthPixels;
319 switch ( mPictureAnchor )
329 topClip = ( imageRectPixels.height() - boundRectHeightPixels ) / 2;
334 topClip = imageRectPixels.height() - boundRectHeightPixels;
338 return QRect( leftClip, topClip, boundRectWidthPixels, boundRectHeightPixels );
348 QVariant source( mSourcePath );
351 mHasExpressionError =
false;
357 source = sourceProperty.
value( *evalContext, source, &ok );
358 if ( !ok || !source.canConvert( QMetaType::QString ) )
360 mHasExpressionError =
true;
367 else if ( source.userType() != QMetaType::Type::QByteArray )
369 source = source.toString().trimmed();
370 QgsDebugMsgLevel( QStringLiteral(
"exprVal PictureSource:%1" ).arg( source.toString() ), 2 );
374 loadPicture( source );
377void QgsLayoutItemPicture::loadRemotePicture(
const QString &url )
387 loop.exec( QEventLoop::ExcludeUserInputEvents );
389 QNetworkReply *reply = fetcher.
reply();
392 QImageReader imageReader( reply );
393 imageReader.setAutoTransform(
true );
395 if ( imageReader.format() ==
"pdf" )
404 const QSize sizeAt72Dpi = imageReader.size();
405 const QSize sizeAtTargetDpi = sizeAt72Dpi *
mLayout->renderContext().dpi() / 72;
406 imageReader.setScaledSize( sizeAtTargetDpi );
409 mImage = imageReader.read();
418void QgsLayoutItemPicture::loadLocalPicture(
const QString &path )
421 pic.setFileName( path );
429 const QFileInfo sourceFileInfo( pic );
430 const QString sourceFileSuffix = sourceFileInfo.suffix();
431 if ( sourceFileSuffix.compare( QLatin1String(
"svg" ), Qt::CaseInsensitive ) == 0 )
441 1.0, 0,
false, evaluatedParameters );
442 mSVG.load( svgContent );
443 if ( mSVG.isValid() )
446 const QRect viewBox = mSVG.viewBox();
447 mDefaultSvgSize.setWidth( viewBox.width() );
448 mDefaultSvgSize.setHeight( viewBox.height() );
458 QImageReader imageReader( pic.fileName() );
459 imageReader.setAutoTransform(
true );
461 if ( imageReader.format() ==
"pdf" )
470 const QSize sizeAt72Dpi = imageReader.size();
471 const QSize sizeAtTargetDpi = sizeAt72Dpi *
mLayout->renderContext().dpi() / 72;
472 imageReader.setScaledSize( sizeAtTargetDpi );
475 if ( imageReader.read( &mImage ) )
487void QgsLayoutItemPicture::loadPictureUsingCache(
const QString &path )
489 if ( path.isEmpty() )
492 mSVG.load( QByteArray() );
503 bool fitsInCache =
false;
504 bool isMissing =
false;
506 if ( mImage.isNull() || isMissing )
523 mSVG.load( svgContent );
527 const QRect viewBox = mSVG.viewBox();
528 mDefaultSvgSize.setWidth( viewBox.width() );
529 mDefaultSvgSize.setHeight( viewBox.height() );
540void QgsLayoutItemPicture::updateNorthArrowRotation(
double rotation )
546void QgsLayoutItemPicture::loadPicture(
const QVariant &data )
548 mIsMissingImage =
false;
549 QVariant imageData( data );
550 mEvaluatedPath = data.toString();
554 const QByteArray base64 = mEvaluatedPath.mid( 7 ).toLocal8Bit();
555 imageData = QByteArray::fromBase64( base64, QByteArray::OmitTrailingEquals );
558 if ( imageData.userType() == QMetaType::Type::QByteArray )
560 if ( mImage.loadFromData( imageData.toByteArray() ) )
568 loadRemotePicture( mEvaluatedPath );
573 loadLocalPicture( mEvaluatedPath );
577 loadPictureUsingCache( mEvaluatedPath );
586 else if ( mHasExpressionError || !mEvaluatedPath.isEmpty() )
589 mIsMissingImage =
true;
592 const QString badFile( QStringLiteral(
":/images/composer/missing_image.png" ) );
593 QImageReader imageReader( badFile );
594 if ( imageReader.read( &mImage ) )
599 const QString badFile( QStringLiteral(
":/images/composer/missing_image.svg" ) );
600 mSVG.load( badFile );
601 if ( mSVG.isValid() )
604 const QRect viewBox = mSVG.viewBox();
605 mDefaultSvgSize.setWidth( viewBox.width() );
606 mDefaultSvgSize.setHeight( viewBox.height() );
616QSizeF QgsLayoutItemPicture::pictureSize()
620 return mDefaultSvgSize;
624 return QSizeF( mImage.width(), mImage.height() );
628 return QSizeF( 0, 0 );
634 return mIsMissingImage;
639 return mEvaluatedPath;
644 const QVariantMap parameters =
mCustomProperties.value( QStringLiteral(
"svg-dynamic-parameters" ), QVariantMap() ).toMap();
651 mCustomProperties.setValue( QStringLiteral(
"svg-dynamic-parameters" ), variantMap );
655void QgsLayoutItemPicture::shapeChanged()
667 const double oldRotation = mPictureRotation;
668 mPictureRotation = rotation;
669 const QSizeF currentPictureSize = pictureSize();
672 if ( !mLoaded || currentPictureSize == QSizeF( 0, 0 ) )
675 if ( mResizeMode ==
Zoom )
679 mPictureWidth = rotatedImageRect.width();
680 mPictureHeight = rotatedImageRect.height();
685 const QRectF oldRect = QRectF( pos().x(), pos().y(), rect().width(), rect().height() );
692 tr.rotate( mPictureRotation );
693 QRectF newRect = tr.mapRect( QRectF( 0, 0, rotatedImageRect.width(), rotatedImageRect.height() ) );
696 newRect.moveCenter( oldRect.center() );
706 mNorthArrowHandler->setLinkedMap( map );
743 mOriginalMode = format;
756 QString imagePath = mSourcePath;
760 if ( imagePath.endsWith( QLatin1String(
".svg" ), Qt::CaseInsensitive ) )
763 imagePath = pathResolver.
writePath( imagePath );
765 elem.setAttribute( QStringLiteral(
"file" ), imagePath );
766 elem.setAttribute( QStringLiteral(
"pictureWidth" ), QString::number( mPictureWidth ) );
767 elem.setAttribute( QStringLiteral(
"pictureHeight" ), QString::number( mPictureHeight ) );
768 elem.setAttribute( QStringLiteral(
"resizeMode" ), QString::number(
static_cast< int >( mResizeMode ) ) );
769 elem.setAttribute( QStringLiteral(
"anchorPoint" ), QString::number(
static_cast< int >( mPictureAnchor ) ) );
772 elem.setAttribute( QStringLiteral(
"svgBorderWidth" ), QString::number( mSvgStrokeWidth ) );
773 elem.setAttribute( QStringLiteral(
"mode" ),
static_cast< int >( mOriginalMode ) );
776 elem.setAttribute( QStringLiteral(
"pictureRotation" ), QString::number( mPictureRotation ) );
777 if ( !mNorthArrowHandler->linkedMap() )
779 elem.setAttribute( QStringLiteral(
"mapUuid" ), QString() );
783 elem.setAttribute( QStringLiteral(
"mapUuid" ), mNorthArrowHandler->linkedMap()->uuid() );
785 elem.setAttribute( QStringLiteral(
"northMode" ), mNorthArrowHandler->northMode() );
786 elem.setAttribute( QStringLiteral(
"northOffset" ), mNorthArrowHandler->northOffset() );
792 mPictureWidth = itemElem.attribute( QStringLiteral(
"pictureWidth" ), QStringLiteral(
"10" ) ).toDouble();
793 mPictureHeight = itemElem.attribute( QStringLiteral(
"pictureHeight" ), QStringLiteral(
"10" ) ).toDouble();
800 mSvgStrokeWidth = itemElem.attribute( QStringLiteral(
"svgBorderWidth" ), QStringLiteral(
"0.2" ) ).toDouble();
802 mMode = mOriginalMode;
804 const QDomNodeList composerItemList = itemElem.elementsByTagName( QStringLiteral(
"ComposerItem" ) );
805 if ( !composerItemList.isEmpty() )
807 const QDomElement composerItemElem = composerItemList.at( 0 ).toElement();
809 if ( !
qgsDoubleNear( composerItemElem.attribute( QStringLiteral(
"rotation" ), QStringLiteral(
"0" ) ).toDouble(), 0.0 ) )
812 mPictureRotation = composerItemElem.attribute( QStringLiteral(
"rotation" ), QStringLiteral(
"0" ) ).toDouble();
816 mDefaultSvgSize = QSize( 0, 0 );
818 if ( itemElem.hasAttribute( QStringLiteral(
"sourceExpression" ) ) )
821 const QString sourceExpression = itemElem.attribute( QStringLiteral(
"sourceExpression" ), QString() );
822 const QString useExpression = itemElem.attribute( QStringLiteral(
"useExpression" ) );
823 bool expressionActive;
824 expressionActive = ( useExpression.compare( QLatin1String(
"true" ), Qt::CaseInsensitive ) == 0 );
829 QString imagePath = itemElem.attribute( QStringLiteral(
"file" ) );
833 if ( imagePath.endsWith( QLatin1String(
".svg" ), Qt::CaseInsensitive ) )
836 imagePath = pathResolver.
readPath( imagePath );
838 mSourcePath = imagePath;
841 if ( !
qgsDoubleNear( itemElem.attribute( QStringLiteral(
"pictureRotation" ), QStringLiteral(
"0" ) ).toDouble(), 0.0 ) )
843 mPictureRotation = itemElem.attribute( QStringLiteral(
"pictureRotation" ), QStringLiteral(
"0" ) ).toDouble();
848 mNorthArrowHandler->setNorthOffset( itemElem.attribute( QStringLiteral(
"northOffset" ), QStringLiteral(
"0" ) ).toDouble() );
850 mNorthArrowHandler->setLinkedMap(
nullptr );
851 mRotationMapUuid = itemElem.attribute( QStringLiteral(
"mapUuid" ) );
858 return mNorthArrowHandler->linkedMap();
873 return mNorthArrowHandler->northOffset();
878 mNorthArrowHandler->setNorthOffset( offset );
883 mPictureAnchor = anchor;
889 mSvgFillColor = color;
895 mSvgStrokeColor = color;
901 mSvgStrokeWidth = width;
907 if ( mOriginalMode ==
mode )
910 mOriginalMode =
mode;
917 if ( !
mLayout || mRotationMapUuid.isEmpty() )
919 mNorthArrowHandler->setLinkedMap(
nullptr );
923 mNorthArrowHandler->setLinkedMap( qobject_cast< QgsLayoutItemMap * >(
mLayout->itemByUuid( mRotationMapUuid,
true ) ) );
@ Millimeters
Millimeters.
PictureFormat
Picture formats.
@ Unknown
Invalid or unknown image type.
@ Antialiasing
Use antialiasing when drawing items.
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
static QgsImageCache * imageCache()
Returns the application's image cache, used for caching resampled versions of raster images.
static QgsSvgCache * svgCache()
Returns the application's SVG cache, used for caching SVG images and handling parameter replacement w...
static QColor colorFromString(const QString &string)
Decodes a string into a color value.
static QString colorToString(const QColor &color)
Encodes a color into a string value.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
QgsFeature feature() const
Convenience function for retrieving the feature for the context, if set.
bool isValid() const
Returns the validity of this feature.
QImage pathAsImage(const QString &path, const QSize size, const bool keepAspectRatio, const double opacity, bool &fitsInCache, bool blocking=false, double targetDpi=96, int frameNumber=-1, bool *isMissing=nullptr)
Returns the specified path rendered as an image.
void setResizeMode(QgsLayoutItemPicture::ResizeMode mode)
Sets the resize mode used for drawing the picture within the item bounds.
void setMode(Qgis::PictureFormat mode)
Sets the current picture mode (image format).
void setSvgDynamicParameters(const QMap< QString, QgsProperty > ¶meters)
Sets the SVG dynamic parameters.
QMap< QString, QgsProperty > svgDynamicParameters() const
Returns the SVG dynamic parameters.
QString picturePath() const
Returns the path of the source image.
void setPictureAnchor(QgsLayoutItem::ReferencePoint anchor)
Sets the picture's anchor point, which controls how it is placed within the picture item's frame.
void setNorthMode(NorthMode mode)
Sets the mode used to align the picture to a map's North.
double northOffset() const
Returns the offset added to the picture's rotation from a map's North.
QgsLayoutItemPicture(QgsLayout *layout)
Constructor for QgsLayoutItemPicture, with the specified parent layout.
void setLinkedMap(QgsLayoutItemMap *map)
Sets the map object for rotation.
void setPicturePath(const QString &path, Qgis::PictureFormat format=Qgis::PictureFormat::Unknown)
Sets the source path of the image (may be svg or a raster format).
void setPictureRotation(double rotation)
Sets the picture rotation within the item bounds, in degrees clockwise.
bool isMissingImage() const
Returns true if the source image is missing and the picture cannot be rendered.
bool writePropertiesToElement(QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context) const override
Stores item state within an XML DOM element.
bool readPropertiesFromElement(const QDomElement &element, const QDomDocument &document, const QgsReadWriteContext &context) override
Sets item state from a DOM element.
void setSvgStrokeWidth(double width)
Sets the stroke width (in layout units) used for parametrized SVG files.
QgsLayoutItemMap * linkedMap() const
Returns the linked rotation map, if set.
void pictureRotationChanged(double newRotation)
Emitted on picture rotation change.
void draw(QgsLayoutItemRenderContext &context) override
Draws the item's contents using the specified item render context.
static QgsLayoutItemPicture * create(QgsLayout *layout)
Returns a new picture item for the specified layout.
Qgis::PictureFormat mode() const
Returns the current picture mode (image format), FormatUnknown if given picture format is unknown.
NorthMode
Method for syncing rotation to a map's North direction.
void finalizeRestoreFromXml() override
Called after all pending items have been restored from XML.
QString evaluatedPath() const
Returns the current evaluated picture path, which includes the result of data defined path overrides.
QSizeF applyItemSizeConstraint(QSizeF targetSize) override
Applies any item-specific size constraint handling to a given targetSize in layout units.
void setSvgStrokeColor(const QColor &color)
Sets the stroke color used for parametrized SVG files.
int type() const override
void refreshDataDefinedProperty(QgsLayoutObject::DataDefinedProperty property=QgsLayoutObject::DataDefinedProperty::AllProperties) override
QIcon icon() const override
Returns the item's icon.
void refreshPicture(const QgsExpressionContext *context=nullptr)
Recalculates the source image (if using an expression for picture's source) and reloads and redraws t...
NorthMode northMode() const
Returns the mode used to align the picture to a map's North.
void setSvgFillColor(const QColor &color)
Sets the fill color used for parametrized SVG files.
void recalculateSize()
Forces a recalculation of the picture's frame size.
ResizeMode
Controls how pictures are scaled within the item's frame.
@ FrameToImageSize
Sets size of frame to match original size of image without scaling.
@ ZoomResizeFrame
Enlarges image to fit frame, then resizes frame to fit resultant image.
@ Clip
Draws image at original size and clips any portion which falls outside frame.
@ Stretch
Stretches image to fit frame, ignores aspect ratio.
@ Zoom
Enlarges image to fit frame while maintaining aspect ratio of picture.
void setNorthOffset(double offset)
Sets the offset added to the picture's rotation from a map's North.
@ LayoutPicture
Picture item.
Contains settings and helpers relating to a render of a QgsLayoutItem.
QgsRenderContext & renderContext()
Returns a reference to the context's render context.
virtual void refreshDataDefinedProperty(QgsLayoutObject::DataDefinedProperty property=QgsLayoutObject::DataDefinedProperty::AllProperties)
Refreshes a data defined property for the item by reevaluating the property's value and redrawing the...
QgsLayoutItem(QgsLayout *layout, bool manageZValue=true)
Constructor for QgsLayoutItem, with the specified parent layout.
ReferencePoint
Fixed position reference point.
@ LowerMiddle
Lower center of item.
@ MiddleLeft
Middle left of item.
@ UpperRight
Upper right corner of item.
@ LowerLeft
Lower left corner of item.
@ UpperLeft
Upper left corner of item.
@ UpperMiddle
Upper center of item.
@ MiddleRight
Middle right of item.
@ LowerRight
Lower right corner of item.
friend class QgsLayoutItemMap
QgsExpressionContext createExpressionContext() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
void sizePositionChanged()
Emitted when the item's size or position changes.
void attemptSetSceneRect(const QRectF &rect, bool includesFrame=false)
Attempts to update the item's position and size to match the passed rect in layout coordinates.
void setBackgroundEnabled(bool drawBackground)
Sets whether this item has a background drawn under it or not.
An object which handles north-arrow type behavior for layout items.
void arrowRotationChanged(double newRotation)
Emitted on arrow rotation change.
NorthMode
Method for syncing rotation to a map's North direction.
QgsObjectCustomProperties mCustomProperties
Custom properties for object.
QgsPropertyCollection mDataDefinedProperties
const QgsLayout * layout() const
Returns the layout the object is attached to.
void changed()
Emitted when the object's properties change.
QPointer< QgsLayout > mLayout
DataDefinedProperty
Data defined properties for different item types.
@ PictureSvgStrokeColor
SVG stroke color.
@ PictureSvgBackgroundColor
SVG background color.
@ PictureSource
Picture source url.
@ PictureSvgStrokeWidth
SVG stroke width.
@ AllProperties
All properties for item.
void dpiChanged()
Emitted when the context's DPI is changed.
void changed()
Emitted certain settings in the context is changed, e.g.
Provides a method of storing sizes, consisting of a width and height, for use in QGIS layouts.
double height() const
Returns the height of the size.
double width() const
Returns the width of the size.
static QRectF largestRotatedRectWithinBounds(const QRectF &originalRect, const QRectF &boundsRect, double rotation)
Calculates the largest scaled version of originalRect which fits within boundsRect,...
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true, const char *file=__builtin_FILE(), const char *function=__builtin_FUNCTION(), int line=__builtin_LINE())
Adds a message to the log instance (and creates it if necessary).
HTTP network content fetcher.
void finished()
Emitted when content has loaded.
QNetworkReply * reply()
Returns a reference to the network reply.
void fetchContent(const QUrl &url, const QString &authcfg=QString())
Fetches content from a remote URL and handles redirects.
Resolves relative paths into absolute paths and vice versa.
QString writePath(const QString &filename) const
Prepare a filename to save it to the project file.
QString readPath(const QString &filename) const
Turn filename read from the project file to an absolute path.
A store for object properties.
QString asExpression() const
Returns an expression string representing the state of the property, or an empty string if the proper...
static QVariantMap propertyMapToVariantMap(const QMap< QString, QgsProperty > &propertyMap)
Convert a map of QgsProperty to a map of QVariant This is useful to save a map of properties.
QVariant value(const QgsExpressionContext &context, const QVariant &defaultValue=QVariant(), bool *ok=nullptr) const
Calculates the current value of the property, including any transforms which are set for the property...
static QgsProperty fromExpression(const QString &expression, bool isActive=true)
Returns a new ExpressionBasedProperty created from the specified expression.
static QMap< QString, QgsProperty > variantMapToPropertyMap(const QVariantMap &variantMap)
Convert a map of QVariant to a map of QgsProperty This is useful to restore a map of properties.
A container for the context for various read/write operations on objects.
const QgsPathResolver & pathResolver() const
Returns path resolver for conversion between relative and absolute paths.
double scaleFactor() const
Returns the scaling factor for the render to convert painter units to physical sizes.
QPainter * painter()
Returns the destination QPainter for the render operation.
Scoped object for saving and restoring a QPainter object's state.
QByteArray svgContent(const QString &path, double size, const QColor &fill, const QColor &stroke, double strokeWidth, double widthScaleFactor, double fixedAspectRatio=0, bool blocking=false, const QMap< QString, QString > ¶meters=QMap< QString, QString >(), bool *isMissingImage=nullptr)
Gets the SVG content corresponding to the given path.
static QgsStringMap evaluatePropertiesMap(const QMap< QString, QgsProperty > &propertiesMap, const QgsExpressionContext &context)
Evaluates a map of properties using the given context and returns a variant map with evaluated expres...
static QString svgSymbolPathToName(const QString &path, const QgsPathResolver &pathResolver)
Determines an SVG symbol's name from its path.
static QString svgSymbolNameToPath(const QString &name, const QgsPathResolver &pathResolver)
Determines an SVG symbol's path from its name.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference).
QMap< QString, QString > QgsStringMap
#define QgsDebugMsgLevel(str, level)