QGIS API Documentation 3.99.0-Master (d270888f95f)
Loading...
Searching...
No Matches
qgsrendercontext.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsrendercontext.cpp
3 --------------------
4 begin : March 16, 2008
5 copyright : (C) 2008 by Marco Hugentobler
6 email : marco dot hugentobler at karto dot baug dot ethz dot ch
7 ***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
18
19#include "qgsrendercontext.h"
20
21#include "qgselevationmap.h"
24#include "qgslogger.h"
25#include "qgsmapsettings.h"
26#include "qgssymbollayer.h"
27#include "qgsunittypes.h"
28
29#include <QString>
30
31using namespace Qt::StringLiterals;
32
33#define POINTS_TO_MM 2.83464567
34#define INCH_TO_MM 25.4
35
37 : mFlags( Qgis::RenderContextFlag::DrawEditingInfo | Qgis::RenderContextFlag::UseAdvancedEffects | Qgis::RenderContextFlag::DrawSelection | Qgis::RenderContextFlag::UseRenderingOptimization )
38{
39 mVectorSimplifyMethod.setSimplifyHints( Qgis::VectorRenderingSimplificationFlag::NoSimplification );
40 // For RenderMetersInMapUnits support, when rendering in Degrees, the Ellipsoid must be set
41 // - for Previews/Icons the default Extent can be used
42 mDistanceArea.setEllipsoid( mDistanceArea.sourceCrs().ellipsoidAcronym() );
43}
44
46
49 //****** IMPORTANT! editing this? make sure you update the move constructor too! *****
50 , mFlags( rh.mFlags )
51 , mRasterizedRenderingPolicy( rh.mRasterizedRenderingPolicy )
52 , mPainter( rh.mPainter )
53 , mPreviewRenderPainter( rh.mPreviewRenderPainter )
54 , mMaskPainter( rh.mMaskPainter )
55
56 // TODO -- these were NOT being copied, but it's unclear if that was intentional or a bug??
57 , mMaskIdProvider( nullptr )
58 , mCurrentMaskId( -1 )
59
60 , mIsGuiPreview( rh.mIsGuiPreview )
61 , mCoordTransform( rh.mCoordTransform )
62 , mDistanceArea( rh.mDistanceArea )
63 , mExtent( rh.mExtent )
64 , mOriginalMapExtent( rh.mOriginalMapExtent )
65 , mMapToPixel( rh.mMapToPixel )
66 , mRenderingStopped( rh.mRenderingStopped )
67 , mFeedback( rh.mFeedback )
68 , mScaleFactor( rh.mScaleFactor )
69 , mDpiTarget( rh.mDpiTarget )
70 , mRendererScale( rh.mRendererScale )
71 , mSymbologyReferenceScale( rh.mSymbologyReferenceScale )
72 , mLabelingEngine( rh.mLabelingEngine )
73 , mLabelSink( rh.mLabelSink )
74 , mSelectionColor( rh.mSelectionColor )
75 , mVectorSimplifyMethod( rh.mVectorSimplifyMethod )
76 , mExpressionContext( rh.mExpressionContext )
77 //****** IMPORTANT! editing this? make sure you update the move constructor too! *****
78 , mGeometry( rh.mGeometry )
79 , mFeatureFilterProvider( rh.mFeatureFilterProvider ? rh.mFeatureFilterProvider->clone() : nullptr )
80 , mSegmentationTolerance( rh.mSegmentationTolerance )
81 , mSegmentationToleranceType( rh.mSegmentationToleranceType )
82 , mTransformContext( rh.mTransformContext )
83 , mPathResolver( rh.mPathResolver )
84 , mTextRenderFormat( rh.mTextRenderFormat )
85 , mRenderedFeatureHandlers( rh.mRenderedFeatureHandlers )
86 , mHasRenderedFeatureHandlers( rh.mHasRenderedFeatureHandlers )
87 , mCustomProperties( rh.mCustomProperties )
88 , mDisabledSymbolLayers()
89 , mClippingRegions( rh.mClippingRegions )
90 , mFeatureClipGeometry( rh.mFeatureClipGeometry )
91 , mTextureOrigin( rh.mTextureOrigin )
92 , mZRange( rh.mZRange )
93 , mSize( rh.mSize )
94 , mDevicePixelRatio( rh.mDevicePixelRatio )
95 , mImageFormat( rh.mImageFormat )
96 , mRendererUsage( rh.mRendererUsage )
97 , mFrameRate( rh.mFrameRate )
98 , mCurrentFrame( rh.mCurrentFrame )
99 , mSymbolLayerClippingGeometries( rh.mSymbolLayerClippingGeometries )
100 , mMaskRenderSettings( rh.mMaskRenderSettings )
101#ifdef QGISDEBUG
102 , mHasTransformContext( rh.mHasTransformContext )
103#endif
104 , mElevationMap( rh.mElevationMap )
105 //****** IMPORTANT! editing this? make sure you update the move constructor too! *****
106{
107}
108
111 , mFlags( rh.mFlags )
112 , mRasterizedRenderingPolicy( rh.mRasterizedRenderingPolicy )
113 , mPainter( rh.mPainter )
114 , mPreviewRenderPainter( rh.mPreviewRenderPainter )
115 , mMaskPainter( std::move( rh.mMaskPainter ) )
116 , mMaskIdProvider( rh.mMaskIdProvider )
117 , mCurrentMaskId( rh.mCurrentMaskId )
118 , mIsGuiPreview( rh.mIsGuiPreview )
119 , mCoordTransform( std::move( rh.mCoordTransform ) )
120 , mDistanceArea( std::move( rh.mDistanceArea ) )
121 , mExtent( std::move( rh.mExtent ) )
122 , mOriginalMapExtent( std::move( rh.mOriginalMapExtent ) )
123 , mMapToPixel( std::move( rh.mMapToPixel ) )
124 , mRenderingStopped( rh.mRenderingStopped )
125 , mFeedback( rh.mFeedback )
126 , mScaleFactor( rh.mScaleFactor )
127 , mDpiTarget( rh.mDpiTarget )
128 , mRendererScale( rh.mRendererScale )
129 , mSymbologyReferenceScale( rh.mSymbologyReferenceScale )
130 , mLabelingEngine( rh.mLabelingEngine )
131 , mLabelSink( rh.mLabelSink )
132 , mSelectionColor( std::move( rh.mSelectionColor ) )
133 , mVectorSimplifyMethod( std::move( rh.mVectorSimplifyMethod ) )
134 , mExpressionContext( std::move( rh.mExpressionContext ) )
135 , mGeometry( std::move( rh.mGeometry ) )
136 , mFeatureFilterProvider( std::move( rh.mFeatureFilterProvider ) )
137 , mSegmentationTolerance( rh.mSegmentationTolerance )
138 , mSegmentationToleranceType( rh.mSegmentationToleranceType )
139 , mTransformContext( std::move( rh.mTransformContext ) )
140 , mPathResolver( std::move( rh.mPathResolver ) )
141 , mTextRenderFormat( rh.mTextRenderFormat )
142 , mRenderedFeatureHandlers( std::move( rh.mRenderedFeatureHandlers ) )
143 , mHasRenderedFeatureHandlers( rh.mHasRenderedFeatureHandlers )
144 , mCustomProperties( std::move( rh.mCustomProperties ) )
145 , mDisabledSymbolLayers( std::move( rh.mDisabledSymbolLayers ) )
146 , mClippingRegions( std::move( rh.mClippingRegions ) )
147 , mFeatureClipGeometry( std::move( rh.mFeatureClipGeometry ) )
148 , mTextureOrigin( std::move( rh.mTextureOrigin ) )
149 , mZRange( std::move( rh.mZRange ) )
150 , mSize( std::move( rh.mSize ) )
151 , mDevicePixelRatio( rh.mDevicePixelRatio )
152 , mImageFormat( rh.mImageFormat )
153 , mRendererUsage( rh.mRendererUsage )
154 , mFrameRate( rh.mFrameRate )
155 , mCurrentFrame( rh.mCurrentFrame )
156 , mSymbolLayerClippingGeometries( std::move( rh.mSymbolLayerClippingGeometries ) )
157 , mMaskRenderSettings( std::move( rh.mMaskRenderSettings ) )
158#ifdef QGISDEBUG
159 , mHasTransformContext( rh.mHasTransformContext )
160#endif
161 , mElevationMap( rh.mElevationMap )
162{
163
164}
165
167{
168 if ( &rh == this )
169 return *this;
170
171 //****** IMPORTANT! editing this? make sure you update the move assignment operator too! *****
172 mFlags = rh.mFlags;
173 mRasterizedRenderingPolicy = rh.mRasterizedRenderingPolicy;
174 mPainter = rh.mPainter;
175 mPreviewRenderPainter = rh.mPreviewRenderPainter;
176 mMaskPainter = rh.mMaskPainter;
177 // TODO -- these were NOT being copied, but it's unclear if that was intentional or a bug??
178 // mMaskIdProvider
179 // mCurrentMaskId
180 mIsGuiPreview = rh.mIsGuiPreview;
181 mCoordTransform = rh.mCoordTransform;
182 mExtent = rh.mExtent;
183 mOriginalMapExtent = rh.mOriginalMapExtent;
184 mMapToPixel = rh.mMapToPixel;
185 mRenderingStopped = rh.mRenderingStopped;
186 mFeedback = rh.mFeedback;
187 mScaleFactor = rh.mScaleFactor;
188 mDpiTarget = rh.mDpiTarget;
189 mRendererScale = rh.mRendererScale;
190 mSymbologyReferenceScale = rh.mSymbologyReferenceScale;
191 mLabelingEngine = rh.mLabelingEngine;
192 mLabelSink = rh.mLabelSink;
193 mSelectionColor = rh.mSelectionColor;
194 mVectorSimplifyMethod = rh.mVectorSimplifyMethod;
195 mExpressionContext = rh.mExpressionContext;
196 mGeometry = rh.mGeometry;
197 mFeatureFilterProvider.reset( rh.mFeatureFilterProvider ? rh.mFeatureFilterProvider->clone() : nullptr );
198 mSegmentationTolerance = rh.mSegmentationTolerance;
199 //****** IMPORTANT! editing this? make sure you update the move assignment operator too! *****
200 mSegmentationToleranceType = rh.mSegmentationToleranceType;
201 mDistanceArea = rh.mDistanceArea;
202 mTransformContext = rh.mTransformContext;
203 mPathResolver = rh.mPathResolver;
204 mTextRenderFormat = rh.mTextRenderFormat;
205 mRenderedFeatureHandlers = rh.mRenderedFeatureHandlers;
206 mHasRenderedFeatureHandlers = rh.mHasRenderedFeatureHandlers;
207 mCustomProperties = rh.mCustomProperties;
208 mClippingRegions = rh.mClippingRegions;
209 mFeatureClipGeometry = rh.mFeatureClipGeometry;
210 mTextureOrigin = rh.mTextureOrigin;
211 mZRange = rh.mZRange;
212 mSize = rh.mSize;
213 mDevicePixelRatio = rh.mDevicePixelRatio;
214 mImageFormat = rh.mImageFormat;
216 mRendererUsage = rh.mRendererUsage;
217 mFrameRate = rh.mFrameRate;
218 mCurrentFrame = rh.mCurrentFrame;
219 mSymbolLayerClippingGeometries = rh.mSymbolLayerClippingGeometries;
220 mMaskRenderSettings = rh.mMaskRenderSettings;
221 if ( isTemporal() )
223#ifdef QGISDEBUG
224 mHasTransformContext = rh.mHasTransformContext;
225#endif
226 mElevationMap = rh.elevationMap();
227 //****** IMPORTANT! editing this? make sure you update the move assignment operator too! *****
228 return *this;
229}
230
232{
233 if ( &rh == this )
234 return *this;
235
236 mFlags = rh.mFlags;
237 mRasterizedRenderingPolicy = rh.mRasterizedRenderingPolicy;
238 mPainter = rh.mPainter;
239 mPreviewRenderPainter = rh.mPreviewRenderPainter;
240 mMaskPainter = std::move( rh.mMaskPainter );
241 mMaskIdProvider = rh.mMaskIdProvider;
242 mCurrentMaskId = rh.mCurrentMaskId;
243 mIsGuiPreview = rh.mIsGuiPreview;
244 mCoordTransform = std::move( rh.mCoordTransform );
245 mExtent = std::move( rh.mExtent );
246 mOriginalMapExtent = std::move( rh.mOriginalMapExtent );
247 mMapToPixel = std::move( rh.mMapToPixel );
248 mRenderingStopped = rh.mRenderingStopped;
249 mFeedback = rh.mFeedback;
250 mScaleFactor = rh.mScaleFactor;
251 mDpiTarget = rh.mDpiTarget;
252 mRendererScale = rh.mRendererScale;
253 mSymbologyReferenceScale = rh.mSymbologyReferenceScale;
254 mLabelingEngine = rh.mLabelingEngine;
255 mLabelSink = rh.mLabelSink;
256 mSelectionColor = rh.mSelectionColor;
257 mVectorSimplifyMethod = std::move( rh.mVectorSimplifyMethod );
258 mExpressionContext = std::move( rh.mExpressionContext );
259 mGeometry = rh.mGeometry;
260 mFeatureFilterProvider = std::move( rh.mFeatureFilterProvider );
261 mSegmentationTolerance = rh.mSegmentationTolerance;
262 mSegmentationToleranceType = rh.mSegmentationToleranceType;
263 mDistanceArea = std::move( rh.mDistanceArea );
264 mTransformContext = std::move( rh.mTransformContext );
265 mPathResolver = std::move( rh.mPathResolver );
266 mTextRenderFormat = rh.mTextRenderFormat;
267 mRenderedFeatureHandlers = std::move( rh.mRenderedFeatureHandlers );
268 mHasRenderedFeatureHandlers = rh.mHasRenderedFeatureHandlers;
269 mCustomProperties = std::move( rh.mCustomProperties );
270 mClippingRegions = std::move( rh.mClippingRegions );
271 mFeatureClipGeometry = std::move( rh.mFeatureClipGeometry );
272 mTextureOrigin = std::move( rh.mTextureOrigin );
273 mZRange = std::move( rh.mZRange );
274 mSize = std::move( rh.mSize );
275 mDevicePixelRatio = rh.mDevicePixelRatio;
276 mImageFormat = rh.mImageFormat;
277 setIsTemporal( rh.isTemporal() );
278 mRendererUsage = rh.mRendererUsage;
279 mFrameRate = rh.mFrameRate;
280 mCurrentFrame = rh.mCurrentFrame;
281 mSymbolLayerClippingGeometries = std::move( rh.mSymbolLayerClippingGeometries );
282 mMaskRenderSettings = std::move( rh.mMaskRenderSettings );
283 if ( isTemporal() )
284 setTemporalRange( rh.temporalRange() );
285#ifdef QGISDEBUG
286 mHasTransformContext = rh.mHasTransformContext;
287#endif
288 mElevationMap = rh.mElevationMap;
289
290 return *this;
291}
292
294{
295 QgsRenderContext context;
296 context.setPainter( painter );
297 if ( painter && painter->device() )
298 {
299 context.setScaleFactor( painter->device()->physicalDpiX() / 25.4 );
300 }
301 else
302 {
303 context.setScaleFactor( 3.465 ); //assume 88 dpi as standard value
304 }
305
306 if ( painter && painter->renderHints() & QPainter::Antialiasing )
308 if ( painter && painter->renderHints() & QPainter::SmoothPixmapTransform )
310 if ( painter && painter->renderHints() & QPainter::LosslessImageRendering )
312
313 return context;
314}
315
317{
318 if ( !painter )
319 painter = mPainter;
320
321 if ( !painter )
322 return;
323
324 painter->setRenderHint( QPainter::Antialiasing, mFlags & Qgis::RenderContextFlag::Antialiasing );
325 painter->setRenderHint( QPainter::LosslessImageRendering, mFlags & Qgis::RenderContextFlag::LosslessImageRendering );
326 painter->setRenderHint( QPainter::SmoothPixmapTransform, mFlags & Qgis::RenderContextFlag::HighQualityImageTransforms );
327}
328
330{
331#ifdef QGISDEBUG
332 if ( !mHasTransformContext )
333 QgsDebugMsgLevel( u"No QgsCoordinateTransformContext context set for transform"_s, 4 );
334#endif
335 return mTransformContext;
336}
337
339{
340 mTransformContext = context;
341#ifdef QGISDEBUG
342 mHasTransformContext = true;
343#endif
344}
345
347{
348 mFeedback = feedback;
349}
350
352{
353 return mFeedback;
354}
355
357{
358 mFlags = flags;
359 matchRasterizedRenderingPolicyToFlags();
360}
361
363{
364 if ( on )
365 mFlags |= flag;
366 else
367 mFlags &= ~( static_cast< int >( flag ) );
368 matchRasterizedRenderingPolicyToFlags();
369}
370
372{
373 return mFlags;
374}
375
377{
378 return mFlags.testFlag( flag );
379}
380
382{
384 QgsRectangle extent = mapSettings.visibleExtent();
385 extent.grow( mapSettings.extentBuffer() );
386 ctx.setMapToPixel( mapSettings.mapToPixel() );
387 ctx.setExtent( extent );
388 ctx.setMapExtent( mapSettings.visibleExtent() );
394 ctx.setSelectionColor( mapSettings.selectionColor() );
408
410
411 ctx.setScaleFactor( mapSettings.outputDpi() / 25.4 ); // = pixels per mm
412 ctx.setDpiTarget( mapSettings.dpiTarget() >= 0.0 ? mapSettings.dpiTarget() : -1.0 );
413 ctx.setRendererScale( mapSettings.scale() );
414 ctx.setExpressionContext( mapSettings.expressionContext() );
417 ctx.mDistanceArea.setSourceCrs( mapSettings.destinationCrs(), mapSettings.transformContext() );
418 ctx.mDistanceArea.setEllipsoid( mapSettings.ellipsoid() );
419 ctx.setTransformContext( mapSettings.transformContext() );
420 ctx.setPathResolver( mapSettings.pathResolver() );
421 ctx.setTextRenderFormat( mapSettings.textRenderFormat() );
422 ctx.setVectorSimplifyMethod( mapSettings.simplifyMethod() );
423 ctx.mRenderedFeatureHandlers = mapSettings.renderedFeatureHandlers();
424 ctx.mHasRenderedFeatureHandlers = !mapSettings.renderedFeatureHandlers().isEmpty();
425 //this flag is only for stopping during the current rendering progress,
426 //so must be false at every new render operation
427 ctx.setRenderingStopped( false );
428 ctx.mCustomProperties = mapSettings.customRenderingFlags();
429 ctx.setIsTemporal( mapSettings.isTemporal() );
430 if ( ctx.isTemporal() )
431 ctx.setTemporalRange( mapSettings.temporalRange() );
432
433 ctx.setZRange( mapSettings.zRange() );
434 ctx.setOutputSize( mapSettings.outputSize() );
435 ctx.setDevicePixelRatio( mapSettings.devicePixelRatio() );
436 ctx.setImageFormat( mapSettings.outputImageFormat() );
437
438 ctx.mClippingRegions = mapSettings.clippingRegions();
439
440 ctx.setMaskSettings( mapSettings.maskSettings() );
441
442 ctx.mRendererUsage = mapSettings.rendererUsage();
443 ctx.mFrameRate = mapSettings.frameRate();
444 ctx.mCurrentFrame = mapSettings.currentFrame();
445
446 const QStringList layerIds = mapSettings.layerIds( true );
447 if ( !layerIds.empty() )
448 ctx.setCustomProperty( u"visible_layer_ids"_s, layerIds );
449
450 return ctx;
451}
452
454{
455 return mRasterizedRenderingPolicy != Qgis::RasterizedRenderingPolicy::Default;
456}
457
459{
460 return mRasterizedRenderingPolicy != Qgis::RasterizedRenderingPolicy::ForceVector;
461}
462
464{
466
467 if ( enabled && mRasterizedRenderingPolicy == Qgis::RasterizedRenderingPolicy::ForceVector )
468 {
469 mRasterizedRenderingPolicy = Qgis::RasterizedRenderingPolicy::PreferVector;
470 }
471 else if ( !enabled )
472 {
473 mRasterizedRenderingPolicy = Qgis::RasterizedRenderingPolicy::ForceVector;
474 }
475}
476
478{
479 return mFlags.testFlag( Qgis::RenderContextFlag::DrawEditingInfo );
480}
481
483{
484 return mFlags.testFlag( Qgis::RenderContextFlag::DrawSelection );
485}
486
488{
489 mCoordTransform = t;
490}
491
496
498{
500 if ( force && mRasterizedRenderingPolicy == Qgis::RasterizedRenderingPolicy::Default )
501 {
502 mRasterizedRenderingPolicy = Qgis::RasterizedRenderingPolicy::PreferVector;
503 }
504 else if ( !force )
505 {
506 switch ( mRasterizedRenderingPolicy )
507 {
509 break;
510
513 mRasterizedRenderingPolicy = Qgis::RasterizedRenderingPolicy::Default;
514 break;
515 }
516 }
517}
518
523
528
533
535{
536 if ( ffp )
537 {
538 mFeatureFilterProvider.reset( ffp->clone() );
539 }
540 else
541 {
542 mFeatureFilterProvider.reset( nullptr );
543 }
544}
545
547{
548 return mFeatureFilterProvider.get();
549}
550
552{
553 double conversionFactor = 1.0;
554 bool isMapUnitHack = false;
555 switch ( unit )
556 {
558 conversionFactor = mScaleFactor;
559 break;
560
562 conversionFactor = mScaleFactor / POINTS_TO_MM;
563 break;
564
566 conversionFactor = mScaleFactor * INCH_TO_MM;
567 break;
568
570 {
571 if ( mMapToPixel.isValid() )
572 size = convertMetersToMapUnits( size );
574 // Fall through to RenderMapUnits with size in meters converted to size in MapUnits
575 [[fallthrough]];
576 }
578 {
579 if ( mMapToPixel.isValid() )
580 {
581 const double mup = scale.computeMapUnitsPerPixel( *this );
582 if ( mup > 0 )
583 {
584 conversionFactor = 1.0 / mup;
585 }
586 else
587 {
588 conversionFactor = 1.0;
589 }
590 }
591 else
592 {
593 // invalid map to pixel. A size in map units can't be calculated, so treat the size as points
594 // and clamp it to a reasonable range. It's the best we can do in this situation!
595 isMapUnitHack = true;
596 conversionFactor = mScaleFactor / POINTS_TO_MM;
597 }
598 break;
599 }
601 conversionFactor = 1.0;
602 break;
603
606 //no sensible value
607 conversionFactor = 1.0;
608 break;
609 }
610
611 double convertedSize = size * conversionFactor;
612
613 if ( unit == Qgis::RenderUnit::MapUnits )
614 {
615 //check max/min size
616 if ( scale.minSizeMMEnabled )
617 convertedSize = std::max( convertedSize, scale.minSizeMM * mScaleFactor );
618 if ( scale.maxSizeMMEnabled )
619 convertedSize = std::min( convertedSize, scale.maxSizeMM * mScaleFactor );
620 }
621
622 if ( isMapUnitHack )
623 {
624 // since we are arbitrarily treating map units as mm, we need to clamp to an (arbitrary!) reasonable range.
625 convertedSize = std::clamp( convertedSize, 10.0, 100.0 );
626 }
627 else
628 {
629 const double symbologyReferenceScaleFactor = mSymbologyReferenceScale > 0 ? mSymbologyReferenceScale / mRendererScale : 1;
630 convertedSize *= symbologyReferenceScaleFactor;
631 }
632
634 {
635 // apply property based constraints in order to optimise symbol preview rendering
636 switch ( property )
637 {
639 break;
640
642 // excessively large shadow offset in symbol preview icons is undesirable -- it pushes the shadow outside of view
643 convertedSize = std::min( convertedSize, 100.0 );
644 break;
646 // excessively large blur in symbol preview icons is too slow to calculate
647 convertedSize = std::min<double>( convertedSize, 30 );
648 break;
650 // excessively large glow spread in symbol preview icons is too slow to calculate
651 convertedSize = std::min<double>( convertedSize, 50 );
652 break;
653 }
654 }
655
656 return convertedSize;
657}
658
660{
661 double conversionFactor = 1.0;
662 // NOLINTBEGIN(bugprone-branch-clone)
663 switch ( unit )
664 {
666 conversionFactor = 1 / mScaleFactor;
667 break;
668
670 conversionFactor = POINTS_TO_MM / mScaleFactor;
671 break;
672
674 conversionFactor = 1 / ( mScaleFactor * INCH_TO_MM );
675 break;
676
678 {
679 if ( mMapToPixel.isValid() )
680 size = size / convertMetersToMapUnits( 1 );
681 // Fall through to RenderMapUnits with size in meters converted to size in MapUnits
682 [[fallthrough]];
683 }
685 {
686 if ( mMapToPixel.isValid() )
687 {
688 const double mup = mapToPixel().mapUnitsPerPixel();;
689 if ( mup > 0 )
690 {
691 conversionFactor = mup / 1.0;
692 }
693 else
694 {
695 conversionFactor = 1.0;
696 }
697 }
698 else
699 {
700 // invalid map to pixel. A size in map units can't be calculated, so treat the size as points.
701 // It's the best we can do in this situation!
702 conversionFactor = POINTS_TO_MM / mScaleFactor;
703 }
704 break;
705 }
707 conversionFactor = 1.0;
708 break;
709
712 //no sensible value
713 conversionFactor = 1.0;
714 break;
715 }
716 // NOLINTEND(bugprone-branch-clone)
717
718 return size * conversionFactor;
719}
720
721double QgsRenderContext::convertToMapUnits( double size, Qgis::RenderUnit unit, const QgsMapUnitScale &scale ) const
722{
723 const double mup = mMapToPixel.mapUnitsPerPixel();
724
725 const double symbologyReferenceScaleFactor = mSymbologyReferenceScale > 0 ? mSymbologyReferenceScale / mRendererScale : 1;
726
727 switch ( unit )
728 {
730 {
731 size = convertMetersToMapUnits( size );
732 // Fall through to RenderMapUnits with values of meters converted to MapUnits
733 [[fallthrough]];
734 }
736 {
737 // check scale
738 double minSizeMU = std::numeric_limits<double>::lowest();
739 if ( scale.minSizeMMEnabled )
740 {
741 minSizeMU = scale.minSizeMM * mScaleFactor * mup;
742 }
743 if ( !qgsDoubleNear( scale.minScale, 0.0 ) )
744 {
745 minSizeMU = std::max( minSizeMU, size * ( mRendererScale / scale.minScale ) );
746 }
747 size = std::max( size, minSizeMU );
748
749 double maxSizeMU = std::numeric_limits<double>::max();
750 if ( scale.maxSizeMMEnabled )
751 {
752 maxSizeMU = scale.maxSizeMM * mScaleFactor * mup;
753 }
754 if ( !qgsDoubleNear( scale.maxScale, 0.0 ) )
755 {
756 maxSizeMU = std::min( maxSizeMU, size * ( mRendererScale / scale.maxScale ) );
757 }
758 size = std::min( size, maxSizeMU );
759
760 return size;
761 }
763 {
764 return size * mScaleFactor * mup / symbologyReferenceScaleFactor;
765 }
767 {
768 return size * mScaleFactor * mup / POINTS_TO_MM / symbologyReferenceScaleFactor;
769 }
771 {
772 return size * mScaleFactor * mup * INCH_TO_MM / symbologyReferenceScaleFactor;
773 }
775 {
776 return size * mup / symbologyReferenceScaleFactor;
777 }
778
781 //no sensible value
782 return 0.0;
783 }
784 return 0.0;
785}
786
787double QgsRenderContext::convertFromMapUnits( double sizeInMapUnits, Qgis::RenderUnit outputUnit ) const
788{
789 const double mup = mMapToPixel.mapUnitsPerPixel();
790 const double symbologyReferenceScaleFactor = mSymbologyReferenceScale > 0 ? mSymbologyReferenceScale / mRendererScale : 1;
791
792 switch ( outputUnit )
793 {
795 {
796 return sizeInMapUnits / convertMetersToMapUnits( 1.0 );
797 }
799 {
800 return sizeInMapUnits;
801 }
803 {
804 return sizeInMapUnits / ( mScaleFactor * mup ) * symbologyReferenceScaleFactor;
805 }
807 {
808 return sizeInMapUnits / ( mScaleFactor * mup / POINTS_TO_MM ) * symbologyReferenceScaleFactor;
809 }
811 {
812 return sizeInMapUnits / ( mScaleFactor * mup * INCH_TO_MM ) * symbologyReferenceScaleFactor;
813 }
815 {
816 return sizeInMapUnits / mup * symbologyReferenceScaleFactor;
817 }
818
821 //no sensible value
822 return 0.0;
823 }
824 return 0.0;
825}
826
827double QgsRenderContext::convertMetersToMapUnits( double meters ) const
828{
829 switch ( mDistanceArea.sourceCrs().mapUnits() )
830 {
832 return meters;
834 {
835 if ( mExtent.isNull() )
836 {
837 // we don't have an extent to calculate exactly -- so just use a very rough approximation
839 }
840
841 QgsPointXY pointCenter = mExtent.center();
842 // The Extent is in the sourceCrs(), when different from destinationCrs()
843 // - the point must be transformed, since DistanceArea uses the destinationCrs()
844 // Note: the default QgsCoordinateTransform() : authid() will return an empty String
845 if ( !mCoordTransform.isShortCircuited() )
846 {
847 try
848 {
849 pointCenter = mCoordTransform.transform( pointCenter );
850 }
851 catch ( const QgsCsException & )
852 {
853 QgsDebugError( u"QgsRenderContext::convertMetersToMapUnits(): failed to reproject pointCenter"_s );
854 // what should we return;.. ?
855 return meters;
856 }
857 }
858
859 const int multiplier = meters < 0 ? -1 : 1;
860 return multiplier * mDistanceArea.measureLineProjected( pointCenter, std::fabs( meters ) );
861 }
910 return ( meters * QgsUnitTypes::fromUnitToUnitFactor( Qgis::DistanceUnit::Meters, mDistanceArea.sourceCrs().mapUnits() ) );
911 }
912 return meters;
913}
914
915QList<QgsRenderedFeatureHandlerInterface *> QgsRenderContext::renderedFeatureHandlers() const
916{
917 return mRenderedFeatureHandlers;
918}
919
920QList<QgsMapClippingRegion> QgsRenderContext::clippingRegions() const
921{
922 return mClippingRegions;
923}
924
926{
927 return mFeatureClipGeometry;
928}
929
931{
932 mFeatureClipGeometry = geometry;
933}
934
936{
937 return mTextureOrigin;
938}
939
940void QgsRenderContext::setTextureOrigin( const QPointF &origin )
941{
942 mTextureOrigin = origin;
943}
944
946{
947 mMaskRenderSettings = settings;
948}
949
951{
952 return mZRange;
953}
954
956{
957 mZRange = range;
958}
959
961{
962 return mSize;
963}
964
966{
967 mSize = size;
968}
969
971{
972 return mDevicePixelRatio;
973}
974
976{
977 mDevicePixelRatio = ratio;
978}
979
981{
982 return outputSize() * mDevicePixelRatio;
983}
984
986{
987 return mRasterizedRenderingPolicy;
988}
989
991{
992 mRasterizedRenderingPolicy = policy;
993 switch ( mRasterizedRenderingPolicy )
994 {
996 mFlags.setFlag( Qgis::RenderContextFlag::ForceVectorOutput, false );
997 mFlags.setFlag( Qgis::RenderContextFlag::UseAdvancedEffects, true );
998 break;
1000 mFlags.setFlag( Qgis::RenderContextFlag::ForceVectorOutput, true );
1001 mFlags.setFlag( Qgis::RenderContextFlag::UseAdvancedEffects, true );
1002 break;
1004 mFlags.setFlag( Qgis::RenderContextFlag::ForceVectorOutput, true );
1005 mFlags.setFlag( Qgis::RenderContextFlag::UseAdvancedEffects, false );
1006 break;
1007 }
1008}
1009
1011{
1012 return mFrameRate;
1013}
1014
1016{
1017 mFrameRate = rate;
1018}
1019
1021{
1022 return mCurrentFrame;
1023}
1024
1026{
1027 mCurrentFrame = frame;
1028}
1029
1031{
1032 return mElevationMap;
1033}
1034
1036{
1037 mElevationMap = map;
1038}
1039
1040void QgsRenderContext::matchRasterizedRenderingPolicyToFlags()
1041{
1042 if ( !mFlags.testFlag( Qgis::RenderContextFlag::ForceVectorOutput )
1043 && mFlags.testFlag( Qgis::RenderContextFlag::UseAdvancedEffects ) )
1044 mRasterizedRenderingPolicy = Qgis::RasterizedRenderingPolicy::Default;
1045 else if ( mFlags.testFlag( Qgis::RenderContextFlag::ForceVectorOutput )
1046 && mFlags.testFlag( Qgis::RenderContextFlag::UseAdvancedEffects ) )
1047 mRasterizedRenderingPolicy = Qgis::RasterizedRenderingPolicy::PreferVector;
1048 else if ( mFlags.testFlag( Qgis::RenderContextFlag::ForceVectorOutput )
1049 && !mFlags.testFlag( Qgis::RenderContextFlag::UseAdvancedEffects ) )
1050 mRasterizedRenderingPolicy = Qgis::RasterizedRenderingPolicy::ForceVector;
1051}
1052
1053void QgsRenderContext::addSymbolLayerClipPath( const QString &symbolLayerId, QPainterPath path )
1054{
1056 if ( !geometry.isEmpty() )
1057 addSymbolLayerClipGeometry( symbolLayerId, geometry );
1058}
1059
1060QList<QPainterPath> QgsRenderContext::symbolLayerClipPaths( const QString &symbolLayerId ) const
1061{
1062 const QVector<QgsGeometry> geometries = symbolLayerClipGeometries( symbolLayerId );
1063 QList<QPainterPath> res;
1064 res.reserve( geometries.size() );
1065 for ( const QgsGeometry &geometry : geometries )
1066 {
1067 res << geometry.constGet()->asQPainterPath();
1068 }
1069 return res;
1070}
1071
1072void QgsRenderContext::addSymbolLayerClipGeometry( const QString &symbolLayerId, const QgsGeometry &geometry )
1073{
1074 if ( geometry.isMultipart() )
1075 {
1076 mSymbolLayerClippingGeometries[ symbolLayerId ].append( geometry.asGeometryCollection() );
1077 }
1078 else
1079 {
1080 mSymbolLayerClippingGeometries[ symbolLayerId ].append( geometry );
1081 }
1082}
1083
1084bool QgsRenderContext::symbolLayerHasClipGeometries( const QString &symbolLayerId ) const
1085{
1086 auto it = mSymbolLayerClippingGeometries.constFind( symbolLayerId );
1087 if ( it == mSymbolLayerClippingGeometries.constEnd() )
1088 return false;
1089 return !it.value().isEmpty();
1090}
1091
1092QVector<QgsGeometry> QgsRenderContext::symbolLayerClipGeometries( const QString &symbolLayerId ) const
1093{
1094 return mSymbolLayerClippingGeometries[ symbolLayerId ];
1095}
1096
1097void QgsRenderContext::setDisabledSymbolLayers( const QSet<const QgsSymbolLayer *> &symbolLayers )
1098{
1099 mDisabledSymbolLayers.clear();
1100 for ( const QgsSymbolLayer *symbolLayer : symbolLayers )
1101 mDisabledSymbolLayers << symbolLayer->id();
1102}
1103
1104void QgsRenderContext::setDisabledSymbolLayersV2( const QSet<QString> &symbolLayers )
1105{
1106 mDisabledSymbolLayers = symbolLayers;
1107}
1108
1109QSet<const QgsSymbolLayer *> QgsRenderContext::disabledSymbolLayers() const
1110{
1111 return QSet<const QgsSymbolLayer *>();
1112}
1113
1115{
1116 return mDisabledSymbolLayers;
1117}
1118
1120{
1121 return !mDisabledSymbolLayers.contains( layer->id() );
1122}
Provides global constants and enumerations for use throughout the application.
Definition qgis.h:59
RasterizedRenderingPolicy
Policies controlling when rasterisation of content during renders is permitted.
Definition qgis.h:2761
@ Default
Allow raster-based rendering in situations where it is required for correct rendering or where it wil...
Definition qgis.h:2762
@ PreferVector
Prefer vector-based rendering, when the result will still be visually near-identical to a raster-base...
Definition qgis.h:2763
@ ForceVector
Always force vector-based rendering, even when the result will be visually different to a raster-base...
Definition qgis.h:2764
RenderSubcomponentProperty
Rendering subcomponent properties.
Definition qgis.h:3111
@ ShadowOffset
Shadow offset.
Definition qgis.h:3113
@ GlowSpread
Glow spread size.
Definition qgis.h:3115
@ Generic
Generic subcomponent property.
Definition qgis.h:3112
@ NoSimplification
No simplification can be applied.
Definition qgis.h:3088
@ YardsBritishSears1922Truncated
British yards (Sears 1922 truncated).
Definition qgis.h:5125
@ Feet
Imperial feet.
Definition qgis.h:5088
@ MilesUSSurvey
US Survey miles.
Definition qgis.h:5132
@ LinksBritishSears1922
British links (Sears 1922).
Definition qgis.h:5120
@ YardsBritishBenoit1895A
British yards (Benoit 1895 A).
Definition qgis.h:5123
@ LinksBritishBenoit1895A
British links (Benoit 1895 A).
Definition qgis.h:5117
@ Centimeters
Centimeters.
Definition qgis.h:5093
@ YardsIndian1975
Indian yards (1975).
Definition qgis.h:5131
@ FeetUSSurvey
US Survey feet.
Definition qgis.h:5115
@ Millimeters
Millimeters.
Definition qgis.h:5094
@ FeetBritishSears1922
British feet (Sears 1922).
Definition qgis.h:5108
@ YardsClarkes
Clarke's yards.
Definition qgis.h:5127
@ YardsIndian
Indian yards.
Definition qgis.h:5128
@ FeetBritishBenoit1895B
British feet (Benoit 1895 B).
Definition qgis.h:5106
@ Miles
Terrestrial miles.
Definition qgis.h:5091
@ LinksUSSurvey
US Survey links.
Definition qgis.h:5122
@ Meters
Meters.
Definition qgis.h:5086
@ ChainsUSSurvey
US Survey chains.
Definition qgis.h:5102
@ FeetClarkes
Clarke's feet.
Definition qgis.h:5109
@ Unknown
Unknown distance unit.
Definition qgis.h:5135
@ Yards
Imperial yards.
Definition qgis.h:5090
@ FeetBritish1936
British feet (1936).
Definition qgis.h:5104
@ FeetIndian1962
Indian feet (1962).
Definition qgis.h:5113
@ YardsBritishSears1922
British yards (Sears 1922).
Definition qgis.h:5126
@ FeetIndian1937
Indian feet (1937).
Definition qgis.h:5112
@ YardsIndian1937
Indian yards (1937).
Definition qgis.h:5129
@ Degrees
Degrees, for planar geographic CRS distance measurements.
Definition qgis.h:5092
@ ChainsBritishBenoit1895B
British chains (Benoit 1895 B).
Definition qgis.h:5098
@ LinksBritishSears1922Truncated
British links (Sears 1922 truncated).
Definition qgis.h:5119
@ ChainsBritishBenoit1895A
British chains (Benoit 1895 A).
Definition qgis.h:5097
@ YardsBritishBenoit1895B
British yards (Benoit 1895 B).
Definition qgis.h:5124
@ FeetBritish1865
British feet (1865).
Definition qgis.h:5103
@ YardsIndian1962
Indian yards (1962).
Definition qgis.h:5130
@ FeetBritishSears1922Truncated
British feet (Sears 1922 truncated).
Definition qgis.h:5107
@ MetersGermanLegal
German legal meter.
Definition qgis.h:5134
@ LinksBritishBenoit1895B
British links (Benoit 1895 B).
Definition qgis.h:5118
@ ChainsInternational
International chains.
Definition qgis.h:5096
@ Inches
Inches.
Definition qgis.h:5095
@ Fathoms
Fathoms.
Definition qgis.h:5133
@ LinksInternational
International links.
Definition qgis.h:5116
@ ChainsBritishSears1922Truncated
British chains (Sears 1922 truncated).
Definition qgis.h:5099
@ FeetIndian
Indian (geodetic) feet.
Definition qgis.h:5111
@ NauticalMiles
Nautical miles.
Definition qgis.h:5089
@ ChainsClarkes
Clarke's chains.
Definition qgis.h:5101
@ LinksClarkes
Clarke's links.
Definition qgis.h:5121
@ ChainsBritishSears1922
British chains (Sears 1922).
Definition qgis.h:5100
@ Kilometers
Kilometers.
Definition qgis.h:5087
@ FeetIndian1975
Indian feet (1975).
Definition qgis.h:5114
@ FeetGoldCoast
Gold Coast feet.
Definition qgis.h:5110
@ FeetBritishBenoit1895A
British feet (Benoit 1895 A).
Definition qgis.h:5105
QFlags< RenderContextFlag > RenderContextFlags
Render context flags.
Definition qgis.h:2832
RenderUnit
Rendering size units.
Definition qgis.h:5255
@ Percentage
Percentage of another measurement (e.g., canvas size, feature size).
Definition qgis.h:5259
@ Millimeters
Millimeters.
Definition qgis.h:5256
@ Points
Points (e.g., for font sizes).
Definition qgis.h:5260
@ Unknown
Mixed or unknown units.
Definition qgis.h:5262
@ MapUnits
Map units.
Definition qgis.h:5257
@ Pixels
Pixels.
Definition qgis.h:5258
@ Inches
Inches.
Definition qgis.h:5261
@ MetersInMapUnits
Meters value as Map units.
Definition qgis.h:5263
RenderContextFlag
Flags which affect rendering operations.
Definition qgis.h:2806
@ DrawEditingInfo
Enable drawing of vertex markers for layers in editing mode.
Definition qgis.h:2807
@ RenderSymbolPreview
The render is for a symbol preview only and map based properties may not be available,...
Definition qgis.h:2818
@ DrawSymbolBounds
Draw bounds of symbols (for debugging/testing).
Definition qgis.h:2812
@ RenderPreviewJob
Render is a 'canvas preview' render, and shortcuts should be taken to ensure fast rendering.
Definition qgis.h:2816
@ RenderMapTile
Draw map such that there are no problems between adjacent tiles.
Definition qgis.h:2813
@ RecordProfile
Enable run-time profiling while rendering.
Definition qgis.h:2826
@ RenderLayerTree
The render is for a layer tree display where map based properties are not available and where avoidan...
Definition qgis.h:2829
@ UseRenderingOptimization
Enable vector simplification and other rendering optimizations.
Definition qgis.h:2810
@ ForceVectorOutput
Vector graphics should not be cached and drawn as raster images.
Definition qgis.h:2808
@ RenderPartialOutput
Whether to make extra effort to update map image with partially rendered layers (better for interacti...
Definition qgis.h:2815
@ LosslessImageRendering
Render images losslessly whenever possible, instead of the default lossy jpeg rendering used for some...
Definition qgis.h:2819
@ AlwaysUseGlobalMasks
When applying clipping paths for selective masking, always use global ("entire map") paths,...
Definition qgis.h:2827
@ DrawSelection
Whether vector selections should be shown in the rendered map.
Definition qgis.h:2811
@ Antialiasing
Use antialiasing while drawing.
Definition qgis.h:2814
@ SkipSymbolRendering
Disable symbol rendering while still drawing labels if enabled.
Definition qgis.h:2825
@ Render3DMap
Render is for a 3D map.
Definition qgis.h:2821
@ UseAdvancedEffects
Enable layer opacity and blending effects.
Definition qgis.h:2809
@ HighQualityImageTransforms
Enable high quality image transformations, which results in better appearance of scaled or rotated ra...
Definition qgis.h:2824
@ RenderBlocking
Render and load remote sources in the same thread to ensure rendering remote sources (svg and images)...
Definition qgis.h:2817
@ DrawEditingInfo
Enable drawing of vertex markers for layers in editing mode.
Definition qgis.h:2776
@ DrawSymbolBounds
Draw bounds of symbols (for debugging/testing).
Definition qgis.h:2782
@ RenderPreviewJob
Render is a 'canvas preview' render, and shortcuts should be taken to ensure fast rendering.
Definition qgis.h:2785
@ RenderMapTile
Draw map such that there are no problems between adjacent tiles.
Definition qgis.h:2783
@ RecordProfile
Enable run-time profiling while rendering.
Definition qgis.h:2792
@ UseRenderingOptimization
Enable vector simplification and other rendering optimizations.
Definition qgis.h:2780
@ ForceVectorOutput
Vector graphics should not be cached and drawn as raster images.
Definition qgis.h:2777
@ RenderPartialOutput
Whether to make extra effort to update map image with partially rendered layers (better for interacti...
Definition qgis.h:2784
@ LosslessImageRendering
Render images losslessly whenever possible, instead of the default lossy jpeg rendering used for some...
Definition qgis.h:2787
@ AlwaysUseGlobalMasks
When applying clipping paths for selective masking, always use global ("entire map") paths,...
Definition qgis.h:2793
@ DrawSelection
Whether vector selections should be shown in the rendered map.
Definition qgis.h:2781
@ Antialiasing
Enable anti-aliasing for map rendering.
Definition qgis.h:2775
@ SkipSymbolRendering
Disable symbol rendering while still drawing labels if enabled.
Definition qgis.h:2790
@ Render3DMap
Render is for a 3D map.
Definition qgis.h:2788
@ UseAdvancedEffects
Enable layer opacity and blending effects.
Definition qgis.h:2778
@ HighQualityImageTransforms
Enable high quality image transformations, which results in better appearance of scaled or rotated ra...
Definition qgis.h:2789
@ RenderBlocking
Render and load remote sources in the same thread to ensure rendering remote sources (svg and images)...
Definition qgis.h:2786
Contains information about the context in which a coordinate transform is executed.
Handles coordinate transforms between two coordinate systems.
Custom exception class for Coordinate Reference System related exceptions.
void setSourceCrs(const QgsCoordinateReferenceSystem &crs, const QgsCoordinateTransformContext &context)
Sets source spatial reference system crs.
bool setEllipsoid(const QString &ellipsoid)
Sets the ellipsoid by its acronym.
QgsRange which stores a range of double values.
Definition qgsrange.h:236
Stores a digital elevation model in a raster image which may get updated as a part of the map layer r...
Abstract interface for use by classes that filter the features or attributes of a layer.
virtual QgsFeatureFilterProvider * clone() const =0
Create a clone of the feature filter provider.
Base class for feedback objects to be used for cancellation of something running in a worker thread.
Definition qgsfeedback.h:44
static QgsGeometry painterPathToGeometry(const QPainterPath &path)
Converts a painter path to a QgsGeometry.
A geometry is the spatial representation of a feature.
Contains configuration for rendering maps.
Qgis::RendererUsage rendererUsage() const
Returns the rendering usage.
double scale() const
Returns the calculated map scale.
double segmentationTolerance() const
Gets the segmentation tolerance applied when rendering curved geometries.
QgsDoubleRange zRange() const
Returns the range of z-values which will be visible in the map.
const QgsVectorSimplifyMethod & simplifyMethod() const
Returns the simplification settings to use when rendering vector layers.
QList< QgsRenderedFeatureHandlerInterface * > renderedFeatureHandlers() const
Returns the list of rendered feature handlers to use while rendering the map settings.
QStringList layerIds(bool expandGroupLayers=false) const
Returns the list of layer IDs which will be rendered in the map.
double dpiTarget() const
Returns the target DPI (dots per inch) to be taken into consideration when rendering.
long long currentFrame() const
Returns the current frame number of the map, for maps which are part of an animation.
const QgsMapToPixel & mapToPixel() const
float devicePixelRatio() const
Returns the device pixel ratio.
QSize outputSize() const
Returns the size of the resulting map image, in pixels.
QImage::Format outputImageFormat() const
format of internal QImage, default QImage::Format_ARGB32_Premultiplied
double extentBuffer() const
Returns the buffer in map units to use around the visible extent for rendering symbols whose correspo...
double frameRate() const
Returns the frame rate of the map (in frames per second), for maps which are part of an animation.
QColor selectionColor() const
Returns the color that is used for drawing of selected vector features.
QgsAbstractGeometry::SegmentationToleranceType segmentationToleranceType() const
Gets segmentation tolerance type (maximum angle or maximum difference between curve and approximation...
QgsRectangle visibleExtent() const
Returns the actual extent derived from requested extent that takes output image size into account.
QVariantMap customRenderingFlags() const
Returns any custom rendering flags.
QString ellipsoid() const
Returns ellipsoid's acronym.
Qgis::TextRenderFormat textRenderFormat() const
Returns the text render format, which dictates how text is rendered (e.g.
double outputDpi() const
Returns the DPI (dots per inch) used for conversion between real world units (e.g.
bool testFlag(Qgis::MapSettingsFlag flag) const
Check whether a particular flag is enabled.
QList< QgsMapClippingRegion > clippingRegions() const
Returns the list of clipping regions to apply to the map.
Qgis::RasterizedRenderingPolicy rasterizedRenderingPolicy() const
Returns the policy controlling when rasterisation of content during renders is permitted.
const QgsPathResolver & pathResolver() const
Returns the path resolver for conversion between relative and absolute paths during rendering operati...
QgsCoordinateReferenceSystem destinationCrs() const
Returns the destination coordinate reference system for the map render.
const QgsExpressionContext & expressionContext() const
Gets the expression context.
const QgsMaskRenderSettings & maskSettings() const
Returns a reference to the mask render settings, which control how masks are drawn and behave during ...
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context, which stores various information regarding which datum tran...
double mapUnitsPerPixel() const
Returns the current map units per pixel.
Struct for storing maximum and minimum scales for measurements in map units.
double computeMapUnitsPerPixel(const QgsRenderContext &c) const
Computes a map units per pixel scaling factor, respecting the minimum and maximum scales set for the ...
bool minSizeMMEnabled
Whether the minimum size in mm should be respected.
double maxScale
The maximum scale, or 0.0 if unset.
double minScale
The minimum scale, or 0.0 if unset.
double maxSizeMM
The maximum size in millimeters, or 0.0 if unset.
bool maxSizeMMEnabled
Whether the maximum size in mm should be respected.
double minSizeMM
The minimum size in millimeters, or 0.0 if unset.
Contains settings regarding how masks are calculated and handled during a map render.
Represents a 2D point.
Definition qgspointxy.h:62
A rectangle specified with double values.
Q_DECL_DEPRECATED void setForceVectorOutput(bool force)
Sets whether rendering operations should use vector operations instead of any faster raster shortcuts...
void setMapExtent(const QgsRectangle &extent)
Sets the original extent of the map being rendered.
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.
void setRenderingStopped(bool stopped)
Sets whether the rendering operation has been stopped and any ongoing rendering should be canceled im...
void setCoordinateTransform(const QgsCoordinateTransform &t)
Sets the current coordinate transform for the context.
double convertToMapUnits(double size, Qgis::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale()) const
Converts a size from the specified units to map units.
void setShowSelection(bool showSelection)
Sets whether vector selections should be shown in the rendered map.
void setDrawEditingInformation(bool b)
Sets whether edit markers should be drawn during the render operation.
Q_DECL_DEPRECATED bool useAdvancedEffects() const
Returns true if advanced effects such as blend modes such be used.
void setScaleFactor(double factor)
Sets the scaling factor for the render to convert painter units to physical sizes.
void setImageFormat(QImage::Format format)
Sets QImage format which should be used for QImages created during rendering.
double convertFromPainterUnits(double size, Qgis::RenderUnit unit) const
Converts a size from painter units (pixels) to the specified render unit.
void setSegmentationToleranceType(QgsAbstractGeometry::SegmentationToleranceType type)
Sets segmentation tolerance type (maximum angle or maximum difference between curve and approximation...
QSet< QString > disabledSymbolLayersV2() const
When rendering a map layer in a second pass (for selective masking), some symbol layers may be disabl...
void setDevicePixelRatio(float ratio)
Sets the device pixel ratio.
Q_DECL_DEPRECATED void setUseAdvancedEffects(bool enabled)
Used to enable or disable advanced effects such as blend modes.
void setCurrentFrame(long long frame)
Sets the current frame of the map, for maps which are part of an animation.
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 setMaskSettings(const QgsMaskRenderSettings &settings)
Sets the mask render settings, which control how masks are drawn and behave during render operations.
void setPainterFlagsUsingContext(QPainter *painter=nullptr) const
Sets relevant flags on a destination painter, using the flags and settings currently defined for the ...
void setTextRenderFormat(Qgis::TextRenderFormat format)
Sets the text render format, which dictates how text is rendered (e.g.
void setVectorSimplifyMethod(const QgsVectorSimplifyMethod &simplifyMethod)
Sets the simplification setting to use when rendering vector layers.
double convertFromMapUnits(double sizeInMapUnits, Qgis::RenderUnit outputUnit) const
Converts a size from map units to the specified units.
QgsCoordinateTransformContext transformContext() const
Returns the context's coordinate transform context, which stores various information regarding which ...
QSize outputSize() const
Returns the size of the resulting rendered image, in pixels.
QgsGeometry featureClipGeometry() const
Returns the geometry to use to clip features at render time.
QgsElevationMap * elevationMap() const
Returns the destination elevation map for the render operation.
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.
Q_DECL_DEPRECATED bool forceVectorOutput() const
Returns true if rendering operations should use vector operations instead of any faster raster shortc...
Q_DECL_DEPRECATED void setDisabledSymbolLayers(const QSet< const QgsSymbolLayer * > &symbolLayers)
When rendering a map layer in a second pass (for selective masking), some symbol layers may be disabl...
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 setDpiTarget(double dpi)
Sets the targeted dpi for rendering.
~QgsRenderContext() override
void setPathResolver(const QgsPathResolver &resolver)
Sets the path resolver for conversion between relative and absolute paths during rendering operations...
float devicePixelRatio() const
Returns the device pixel ratio.
void setFeedback(QgsFeedback *feedback)
Attach a feedback object that can be queried regularly during rendering to check if rendering should ...
Q_DECL_DEPRECATED void addSymbolLayerClipPath(const QString &symbolLayerId, QPainterPath path)
Add a clip path to be applied to the symbolLayer before rendering.
void setFeatureClipGeometry(const QgsGeometry &geometry)
Sets a geometry to use to clip features at render time.
void setDisabledSymbolLayersV2(const QSet< QString > &symbolLayers)
When rendering a map layer in a second pass (for selective masking), some symbol layers may be disabl...
const QgsFeatureFilterProvider * featureFilterProvider() const
Gets the filter feature provider used for additional filtering of rendered features.
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.
bool showSelection() const
Returns true if vector selections should be shown in the rendered map.
QList< QgsMapClippingRegion > clippingRegions() const
Returns the list of clipping regions to apply during the render.
void setFrameRate(double rate)
Sets the frame rate of the map (in frames per second), 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 setTransformContext(const QgsCoordinateTransformContext &context)
Sets the context's coordinate transform context, which stores various information regarding which dat...
void setFlags(Qgis::RenderContextFlags flags)
Set combination of flags that will be used for rendering.
void setExtent(const QgsRectangle &extent)
When rendering a map layer, calling this method sets the "clipping" extent for the layer (in the laye...
void setMapToPixel(const QgsMapToPixel &mtp)
Sets the context's map to pixel transform, which transforms between map coordinates and device coordi...
Q_DECL_DEPRECATED QSet< const QgsSymbolLayer * > disabledSymbolLayers() const
When rendering a map layer in a second pass (for selective masking), some symbol layers may be disabl...
void setOutputSize(QSize size)
Sets the size of the resulting rendered image, in pixels.
void setCustomProperty(const QString &property, const QVariant &value)
Sets a custom rendering property.
QgsFeedback * feedback() const
Returns the feedback object that can be queried regularly during rendering to check if rendering shou...
QPointF textureOrigin() const
Returns the texture origin, which should be used as a brush transform when rendering using QBrush obj...
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.
QgsDoubleRange zRange() const
Returns the range of z-values which should be rendered.
bool isSymbolLayerEnabled(const QgsSymbolLayer *layer) const
When rendering a map layer in a second pass (for selective masking), some symbol layers may be disabl...
QSize deviceOutputSize() const
Returns the device output size of the render.
QVector< QgsGeometry > symbolLayerClipGeometries(const QString &symbolLayerId) const
Returns clipping geometries to be applied to the symbolLayer before rendering.
static QgsRenderContext fromMapSettings(const QgsMapSettings &mapSettings)
create initialized QgsRenderContext instance from given QgsMapSettings
bool drawEditingInformation() const
Returns true if edit markers should be drawn during the render operation.
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.
void setUseRenderingOptimization(bool enabled)
Sets whether the rendering optimization (geometry simplification) should be executed.
void setRendererScale(double scale)
Sets the renderer map scale.
void setZRange(const QgsDoubleRange &range)
Sets the range of z-values which should be rendered.
double convertMetersToMapUnits(double meters) const
Convert meter distances to active MapUnit values for QgsUnitTypes::RenderMetersInMapUnits.
void addSymbolLayerClipGeometry(const QString &symbolLayerId, const QgsGeometry &geometry)
Add a clip geometry to be applied to the symbolLayer before rendering.
Qgis::RenderContextFlags flags() const
Returns combination of flags used for rendering.
Q_DECL_DEPRECATED QList< QPainterPath > symbolLayerClipPaths(const QString &symbolLayerId) const
Returns clip paths to be applied to the symbolLayer before rendering.
const QgsAbstractGeometry * geometry() const
Returns pointer to the unsegmentized geometry.
void setElevationMap(QgsElevationMap *map)
Sets the destination elevation map for the render operation.
QgsRenderContext & operator=(const QgsRenderContext &rh)
bool useRenderingOptimization() const
Returns true if the rendering optimization (geometry simplification) can be executed.
void setSelectionColor(const QColor &color)
Sets the color to use when rendering selected features.
void setSegmentationTolerance(double tolerance)
Sets the segmentation tolerance applied when rendering curved geometries.
void setFeatureFilterProvider(const QgsFeatureFilterProvider *ffp)
Set a filter feature provider used for additional filtering of rendered features.
Abstract base class for symbol layers.
QString id() const
Returns symbol layer identifier This id is unique in the whole project.
const QgsDateTimeRange & temporalRange() const
Returns the datetime range for the object.
QgsTemporalRangeObject(bool enabled=false)
Constructor QgsTemporalRangeObject.
bool isTemporal() const
Returns true if the object's temporal range is enabled, and the object will be filtered when renderin...
void setIsTemporal(bool enabled)
Sets whether the temporal range is enabled (i.e.
void setTemporalRange(const QgsDateTimeRange &range)
Sets the temporal range for the object.
static Q_INVOKABLE double fromUnitToUnitFactor(Qgis::DistanceUnit fromUnit, Qgis::DistanceUnit toUnit)
Returns the conversion factor between the specified distance units.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference).
Definition qgis.h:6900
#define QgsDebugMsgLevel(str, level)
Definition qgslogger.h:63
#define QgsDebugError(str)
Definition qgslogger.h:59
#define INCH_TO_MM
#define POINTS_TO_MM