Skip to content

Commit

Permalink
[map canvas] Fix preview jobs for rotated map canvas
Browse files Browse the repository at this point in the history
  • Loading branch information
nirvn authored and nyalldawson committed Mar 3, 2025
1 parent 9036541 commit 866c3ca
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 22 deletions.
41 changes: 22 additions & 19 deletions src/gui/qgsmapcanvas.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1006,7 +1006,7 @@ void QgsMapCanvas::previewJobFinished()

if ( mMap )
{
mMap->addPreviewImage( job->renderedImage(), job->mapSettings().extent() );
mMap->addPreviewImage( job->renderedImage(), job->mapSettings().visibleExtent() );
mPreviewJobs.removeAll( job );

int number = job->property( "number" ).toInt();
Expand Down Expand Up @@ -3517,37 +3517,40 @@ const QgsLabelingEngineSettings &QgsMapCanvas::labelingEngineSettings() const
void QgsMapCanvas::startPreviewJobs()
{
stopPreviewJobs(); //just in case still running

//canvas preview jobs aren't compatible with rotation
// TODO fix this
if ( !qgsDoubleNear( mSettings.rotation(), 0.0 ) )
return;

schedulePreviewJob( 0 );
}

void QgsMapCanvas::startPreviewJob( int number )
{
QgsRectangle mapRect = mSettings.visibleExtent();

if ( number == 4 )
number += 1;

int j = number / 3;
int i = number % 3;

QgsMapSettings mapSettings = mSettings;
mapSettings.setRotation( 0 );
const QgsRectangle mapRect = mapSettings.visibleExtent();
QgsPointXY jobCenter = mapRect.center();
const double dx = ( i - 1 ) * mapRect.width();
const double dy = ( 1 - j ) * mapRect.height();
if ( !qgsDoubleNear( mSettings.rotation(), 0.0 ) )
{
const double radians = mSettings.rotation() * M_PI / 180;
const double rdx = dx * cos( radians ) - dy * sin( radians );
const double rdy = dy * cos( radians ) + dx * sin( radians );
jobCenter.setX( jobCenter.x() + rdx );
jobCenter.setY( jobCenter.y() + rdy );
}
else
{
jobCenter.setX( jobCenter.x() + dx );
jobCenter.setY( jobCenter.y() + dy );
}
const QgsRectangle jobExtent = QgsRectangle::fromCenterAndSize( jobCenter, mapRect.width(), mapRect.height() );

//copy settings, only update extent
QgsMapSettings jobSettings = mSettings;

double dx = ( i - 1 ) * mapRect.width();
double dy = ( 1 - j ) * mapRect.height();
QgsRectangle jobExtent = mapRect;

jobExtent.setXMaximum( jobExtent.xMaximum() + dx );
jobExtent.setXMinimum( jobExtent.xMinimum() + dx );
jobExtent.setYMaximum( jobExtent.yMaximum() + dy );
jobExtent.setYMinimum( jobExtent.yMinimum() + dy );

jobSettings.setExtent( jobExtent );
jobSettings.setFlag( Qgis::MapSettingsFlag::DrawLabeling, false );
jobSettings.setFlag( Qgis::MapSettingsFlag::RenderPreviewJob, true );
Expand Down
8 changes: 5 additions & 3 deletions src/gui/qgsmapcanvasmap.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -83,9 +83,11 @@ void QgsMapCanvasMap::paint( QPainter *painter )
QList<QPair<QImage, QgsRectangle>>::const_iterator imIt = mPreviewImages.constBegin();
for ( ; imIt != mPreviewImages.constEnd(); ++imIt )
{
const QPointF ul = toCanvasCoordinates( QgsPoint( imIt->second.xMinimum() + offsetX, imIt->second.yMaximum() + offsetY ) );
const QPointF lr = toCanvasCoordinates( QgsPoint( imIt->second.xMaximum() + offsetX, imIt->second.yMinimum() + offsetY ) );
painter->drawImage( QRectF( ul.x(), ul.y(), lr.x() - ul.x(), lr.y() - ul.y() ), imIt->first, QRect( 0, 0, imIt->first.width(), imIt->first.height() ) );
const QgsPointXY extentCenter = imIt->second.center();
const QPointF canvasCenter = toCanvasCoordinates( QgsPoint( extentCenter.x() + offsetX, extentCenter.y() + offsetY ) );
const double imageWidth = imIt->first.width();
const double imageHeight = imIt->first.height();
painter->drawImage( QRectF( canvasCenter.x() - imageWidth / 2, canvasCenter.y() - imageHeight / 2, imageWidth, imageHeight ), imIt->first, QRect( 0, 0, imIt->first.width(), imIt->first.height() ) );
}

if ( scale )
Expand Down

0 comments on commit 866c3ca

Please sign in to comment.